UDP over IPv6 transport implemented
parent
a5a0f5fecb
commit
e511dd5b3e
|
@ -1,3 +1,8 @@
|
|||
Revision 4.1.13a
|
||||
----------------
|
||||
|
||||
- UDP over IPv6 transport implemented.
|
||||
|
||||
Revision 4.1.12a
|
||||
----------------
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ FEATURES
|
|||
* Extensible network transports framework (UDP and UNIX domain implemented)
|
||||
* Asynchronous socket-based IO API support
|
||||
* Twisted (http://twistedmatrix.com) integration
|
||||
* IPv6 transport support
|
||||
* Python eggs and py2exe friendly
|
||||
* 100% Python, works with Python 1.5 though 2.x
|
||||
* MT-safe
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
"""Implements asyncore-based UDP6 transport domain"""
|
||||
from socket import AF_INET6
|
||||
from pysnmp.carrier.asynsock.dgram.base import DgramSocketTransport
|
||||
|
||||
domainName = snmpUDP6Domain = (1, 3, 6, 1, 2, 1, 100, 1, 2)
|
||||
|
||||
class Udp6SocketTransport(DgramSocketTransport):
|
||||
sockFamily = AF_INET6
|
||||
|
||||
Udp6Transport = Udp6SocketTransport
|
|
@ -2,7 +2,7 @@
|
|||
# SNMP engine might be configured remotely (through SNMP).
|
||||
import string
|
||||
from pysnmp.carrier.asynsock import dispatch
|
||||
from pysnmp.carrier.asynsock.dgram import udp
|
||||
from pysnmp.carrier.asynsock.dgram import udp, udp6
|
||||
try:
|
||||
from pysnmp.carrier.asynsock.dgram import unix
|
||||
snmpLocalDomain = unix.snmpLocalDomain
|
||||
|
@ -21,6 +21,7 @@ from pysnmp import error
|
|||
|
||||
# Transports
|
||||
snmpUDPDomain = udp.snmpUDPDomain
|
||||
snmpUDP6Domain = udp6.snmpUDP6Domain
|
||||
|
||||
# Auth protocol
|
||||
usmHMACMD5AuthProtocol = hmacmd5.HmacMd5.serviceID
|
||||
|
@ -258,6 +259,9 @@ def addTargetAddr(
|
|||
if transportDomain == snmpUDPDomain:
|
||||
SnmpUDPAddress, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols('SNMPv2-TM', 'SnmpUDPAddress')
|
||||
transportAddress = SnmpUDPAddress(transportAddress)
|
||||
elif transportDomain == snmpUDP6Domain:
|
||||
TransportAddressIPv6, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols('TRANSPORT-ADDRESS-MIB', 'TransportAddressIPv6')
|
||||
transportAddress = TransportAddressIPv6(transportAddress)
|
||||
|
||||
snmpEngine.msgAndPduDsp.mibInstrumController.writeVars(
|
||||
((snmpTargetAddrEntry.name + (9,) + tblIdx, 'destroy'),)
|
||||
|
|
|
@ -36,6 +36,11 @@ def getTargetAddr(snmpEngine, snmpTargetAddrName):
|
|||
snmpTargetAddrTAddress = tuple(
|
||||
SnmpUDPAddress(snmpTargetAddrTAddress)
|
||||
)
|
||||
elif snmpTargetAddrTDomain == config.snmpUDP6Domain:
|
||||
TransportAddressIPv6, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols('TRANSPORT-ADDRESS-MIB', 'TransportAddressIPv6')
|
||||
snmpTargetAddrTAddress = tuple(
|
||||
TransportAddressIPv6(snmpTargetAddrTAddress)
|
||||
)
|
||||
|
||||
return ( snmpTargetAddrTDomain,
|
||||
snmpTargetAddrTAddress,
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
# by libsmi2pysnmp-0.0.9-alpha at Thu Mar 26 20:58:12 2009,
|
||||
# Python version (2, 4, 4, 'final', 0)
|
||||
|
||||
import socket
|
||||
import types
|
||||
|
||||
# Imported just in case new ASN.1 types would be created
|
||||
from pyasn1.type import constraint, namedval
|
||||
|
||||
|
@ -26,7 +29,21 @@ class TransportAddressIPv4(TextualConvention, OctetString):
|
|||
displayHint = "1d.1d.1d.1d:2d"
|
||||
subtypeSpec = OctetString.subtypeSpec+constraint.ValueSizeConstraint(6,6)
|
||||
fixedLength = 6
|
||||
pass
|
||||
|
||||
def prettyIn(self, value):
|
||||
if type(value) == types.TupleType:
|
||||
return reduce(lambda x,y: x+y, map(lambda x: chr(string.atoi(x)), string.split(value[0], '.'))) + chr((value[1] >> 8) & 0xff) + chr((value[1] & 0xff))
|
||||
else:
|
||||
return OctetString.prettyIn(self, value)
|
||||
|
||||
# Socket address syntax coercion
|
||||
def __getitem__(self, i):
|
||||
if not hasattr(self, '__tuple_value'):
|
||||
self.__tuple_value = (
|
||||
string.join(map(lambda x: str(ord(x)), self._value[:4]), '.'),
|
||||
ord(self._value[4:5]) << 8 | ord(self._value[5:6])
|
||||
)
|
||||
return self.__tuple_value[i]
|
||||
|
||||
class TransportAddressIPv4z(TextualConvention, OctetString):
|
||||
displayHint = "1d.1d.1d.1d%4d:2d"
|
||||
|
@ -38,7 +55,22 @@ class TransportAddressIPv6(TextualConvention, OctetString):
|
|||
displayHint = "0a[2x:2x:2x:2x:2x:2x:2x:2x]0a:2d"
|
||||
subtypeSpec = OctetString.subtypeSpec+constraint.ValueSizeConstraint(18,18)
|
||||
fixedLength = 18
|
||||
pass
|
||||
|
||||
def prettyIn(self, value):
|
||||
if type(value) == types.TupleType:
|
||||
return socket.inet_pton(socket.AF_INET6, value[0]) + chr((value[1] >> 8) & 0xff) + chr((value[1] & 0xff))
|
||||
else:
|
||||
return OctetString.prettyIn(self, value)
|
||||
|
||||
# Socket address syntax coercion
|
||||
def __getitem__(self, i):
|
||||
if not hasattr(self, '__tuple_value'):
|
||||
self.__tuple_value = (
|
||||
socket.inet_ntop(socket.AF_INET6, self._value[:16]),
|
||||
ord(self._value[16:17]) << 8 | ord(self._value[17:18]),
|
||||
0,
|
||||
0)
|
||||
return self.__tuple_value[i]
|
||||
|
||||
class TransportAddressIPv6z(TextualConvention, OctetString):
|
||||
displayHint = "0a[2x:2x:2x:2x:2x:2x:2x:2x%4d]0a:2d"
|
||||
|
|
Loading…
Reference in New Issue