diff options
author | elie <elie> | 2010-01-12 17:51:05 +0000 |
---|---|---|
committer | elie <elie> | 2010-01-12 17:51:05 +0000 |
commit | 2b85d47ec5b2d934b06d0230c88d02f119a042ed (patch) | |
tree | 3da386588f9f84406686282d930165c3d442e3f0 | |
parent | c0c72670e6e9cbb78830e588a4fb544366cf5d28 (diff) | |
download | pysnmp-2b85d47ec5b2d934b06d0230c88d02f119a042ed.tar.gz |
UDP over IPv6 transport implemented
-rw-r--r-- | CHANGES | 5 | ||||
-rw-r--r-- | README | 1 | ||||
-rw-r--r-- | pysnmp/carrier/asynsock/dgram/udp6.py | 10 | ||||
-rw-r--r-- | pysnmp/entity/config.py | 6 | ||||
-rw-r--r-- | pysnmp/entity/rfc3413/config.py | 5 | ||||
-rw-r--r-- | pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py | 36 |
6 files changed, 60 insertions, 3 deletions
@@ -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 diff --git a/pysnmp/carrier/asynsock/dgram/udp6.py b/pysnmp/carrier/asynsock/dgram/udp6.py new file mode 100644 index 0000000..b0b3f9b --- /dev/null +++ b/pysnmp/carrier/asynsock/dgram/udp6.py @@ -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 diff --git a/pysnmp/entity/config.py b/pysnmp/entity/config.py index 09ebbfc..c137736 100644 --- a/pysnmp/entity/config.py +++ b/pysnmp/entity/config.py @@ -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'),) diff --git a/pysnmp/entity/rfc3413/config.py b/pysnmp/entity/rfc3413/config.py index d2ca8af..3459d4c 100644 --- a/pysnmp/entity/rfc3413/config.py +++ b/pysnmp/entity/rfc3413/config.py @@ -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, diff --git a/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py b/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py index e6d89d1..5168085 100644 --- a/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py +++ b/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py @@ -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" |