diff options
Diffstat (limited to 'pysnmp/hlapi')
-rw-r--r-- | pysnmp/hlapi/transport.py | 11 | ||||
-rw-r--r-- | pysnmp/hlapi/v1arch/asyncio/cmdgen.py | 12 | ||||
-rw-r--r-- | pysnmp/hlapi/v1arch/asyncore/cmdgen.py | 1 | ||||
-rw-r--r-- | pysnmp/hlapi/v1arch/asyncore/sync/cmdgen.py | 3 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/asyncio/cmdgen.py | 65 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/asyncio/transport.py | 20 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/asyncore/cmdgen.py | 76 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/asyncore/ntforg.py | 19 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/asyncore/sync/cmdgen.py | 15 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/asyncore/sync/ntforg.py | 1 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/asyncore/transport.py | 18 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/auth.py | 68 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/lcd.py | 110 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/twisted/cmdgen.py | 99 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/twisted/ntforg.py | 22 | ||||
-rw-r--r-- | pysnmp/hlapi/v3arch/twisted/transport.py | 16 | ||||
-rw-r--r-- | pysnmp/hlapi/varbinds.py | 15 |
17 files changed, 360 insertions, 211 deletions
diff --git a/pysnmp/hlapi/transport.py b/pysnmp/hlapi/transport.py index 20471633..d75951c6 100644 --- a/pysnmp/hlapi/transport.py +++ b/pysnmp/hlapi/transport.py @@ -27,8 +27,7 @@ class AbstractTransportTarget(object): def __repr__(self): return '%s(%r, timeout=%r, retries=%r, tagList=%r)' % ( self.__class__.__name__, self.transportAddr, - self.timeout, self.retries, self.tagList - ) + self.timeout, self.retries, self.tagList) def getTransportInfo(self): return self.TRANSPORT_DOMAIN, self.transportAddr @@ -55,9 +54,11 @@ class AbstractTransportTarget(object): return self.transport def verifyDispatcherCompatibility(self, snmpEngine): - if not self.PROTO_TRANSPORT.isCompatibleWithDispatcher(snmpEngine.transportDispatcher): - raise error.PySnmpError('Transport %r is not compatible with dispatcher %r' % ( - self.PROTO_TRANSPORT, snmpEngine.transportDispatcher)) + if not self.PROTO_TRANSPORT.isCompatibleWithDispatcher( + snmpEngine.transportDispatcher): + raise error.PySnmpError( + 'Transport %r is not compatible with dispatcher ' + '%r' % (self.PROTO_TRANSPORT, snmpEngine.transportDispatcher)) def _resolveAddr(self, transportAddr): raise NotImplementedError() diff --git a/pysnmp/hlapi/v1arch/asyncio/cmdgen.py b/pysnmp/hlapi/v1arch/asyncio/cmdgen.py index 346b7c76..3e53c05b 100644 --- a/pysnmp/hlapi/v1arch/asyncio/cmdgen.py +++ b/pysnmp/hlapi/v1arch/asyncio/cmdgen.py @@ -4,18 +4,18 @@ # Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> # License: http://snmplabs.com/pysnmp/license.html # -from pysnmp.hlapi.v1arch.auth import * -from pysnmp.hlapi.varbinds import * -from pysnmp.hlapi.v1arch.asyncio.transport import * -from pysnmp.smi.rfc1902 import * -from pysnmp.proto import api - try: import asyncio except ImportError: import trollius as asyncio +from pysnmp.hlapi.v1arch.auth import * +from pysnmp.hlapi.varbinds import * +from pysnmp.hlapi.v1arch.asyncio.transport import * +from pysnmp.smi.rfc1902 import * +from pysnmp.proto import api + __all__ = ['getCmd', 'nextCmd', 'setCmd', 'bulkCmd', 'isEndOfMib'] VB_PROCESSOR = CommandGeneratorVarBinds() diff --git a/pysnmp/hlapi/v1arch/asyncore/cmdgen.py b/pysnmp/hlapi/v1arch/asyncore/cmdgen.py index e7ddadb2..3a1de67f 100644 --- a/pysnmp/hlapi/v1arch/asyncore/cmdgen.py +++ b/pysnmp/hlapi/v1arch/asyncore/cmdgen.py @@ -4,7 +4,6 @@ # Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> # License: http://snmplabs.com/pysnmp/license.html # - from pysnmp.hlapi.v1arch.auth import * from pysnmp.hlapi.v1arch.asyncore import * from pysnmp.hlapi.varbinds import * diff --git a/pysnmp/hlapi/v1arch/asyncore/sync/cmdgen.py b/pysnmp/hlapi/v1arch/asyncore/sync/cmdgen.py index a1c3366d..2961a63a 100644 --- a/pysnmp/hlapi/v1arch/asyncore/sync/cmdgen.py +++ b/pysnmp/hlapi/v1arch/asyncore/sync/cmdgen.py @@ -4,11 +4,10 @@ # Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> # License: http://snmplabs.com/pysnmp/license.html # -from pyasn1.type.univ import Null - from pysnmp.hlapi.v1arch.asyncore import cmdgen from pysnmp.hlapi.varbinds import * from pysnmp.proto.rfc1905 import endOfMibView +from pysnmp.proto.rfc1902 import Null __all__ = ['getCmd', 'nextCmd', 'setCmd', 'bulkCmd'] diff --git a/pysnmp/hlapi/v3arch/asyncio/cmdgen.py b/pysnmp/hlapi/v3arch/asyncio/cmdgen.py index 89420cb2..29d2ca63 100644 --- a/pysnmp/hlapi/v3arch/asyncio/cmdgen.py +++ b/pysnmp/hlapi/v3arch/asyncio/cmdgen.py @@ -31,6 +31,12 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # +try: + import asyncio + +except ImportError: + import trollius as asyncio + from pysnmp.hlapi.v3arch.auth import * from pysnmp.hlapi.v3arch.context import * from pysnmp.hlapi.v3arch.lcd import * @@ -40,12 +46,6 @@ from pysnmp.entity.rfc3413 import cmdgen from pysnmp.proto.api import v2c from pysnmp.smi.rfc1902 import * -try: - import asyncio - -except ImportError: - import trollius as asyncio - __all__ = ['getCmd', 'nextCmd', 'setCmd', 'bulkCmd', 'isEndOfMib'] VB_PROCESSOR = CommandGeneratorVarBinds() @@ -134,17 +134,20 @@ def getCmd(snmpEngine, authData, transportTarget, contextData, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): lookupMib, future = cbCtx + if future.cancelled(): return + try: - varBindsUnmade = VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBinds, - lookupMib) + varBindsUnmade = VB_PROCESSOR.unmakeVarBinds( + snmpEngine.cache, varBinds, lookupMib) + except Exception as e: future.set_exception(e) + else: future.set_result( - (errorIndication, errorStatus, errorIndex, varBindsUnmade) - ) + (errorIndication, errorStatus, errorIndex, varBindsUnmade)) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) @@ -157,6 +160,7 @@ def getCmd(snmpEngine, authData, transportTarget, contextData, VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, (options.get('lookupMib', True), future) ) + return future @@ -240,13 +244,17 @@ def setCmd(snmpEngine, authData, transportTarget, contextData, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): lookupMib, future = cbCtx + if future.cancelled(): return + try: - varBindsUnmade = VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBinds, - lookupMib) + varBindsUnmade = VB_PROCESSOR.unmakeVarBinds( + snmpEngine.cache, varBinds, lookupMib) + except Exception as e: future.set_exception(e) + else: future.set_result( (errorIndication, errorStatus, errorIndex, varBindsUnmade) @@ -263,6 +271,7 @@ def setCmd(snmpEngine, authData, transportTarget, contextData, VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, (options.get('lookupMib', True), future) ) + return future @@ -352,17 +361,20 @@ def nextCmd(snmpEngine, authData, transportTarget, contextData, lookupMib, future = cbCtx if future.cancelled(): return + try: - varBindsUnmade = [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, - varBindTableRow, - lookupMib) - for varBindTableRow in varBindTable] + varBindsUnmade = [ + VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBindTableRow, + lookupMib) + for varBindTableRow in varBindTable + ] + except Exception as e: future.set_exception(e) + else: future.set_result( - (errorIndication, errorStatus, errorIndex, varBindsUnmade) - ) + (errorIndication, errorStatus, errorIndex, varBindsUnmade)) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) @@ -375,6 +387,7 @@ def nextCmd(snmpEngine, authData, transportTarget, contextData, VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, (options.get('lookupMib', True), future) ) + return future @@ -491,20 +504,23 @@ def bulkCmd(snmpEngine, authData, transportTarget, contextData, errorIndication, errorStatus, errorIndex, varBindTable, cbCtx): lookupMib, future = cbCtx + if future.cancelled(): return + try: - varBindsUnmade = [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, - varBindTableRow, - lookupMib) - for varBindTableRow in varBindTable] + varBindsUnmade = [ + VB_PROCESSOR.unmakeVarBinds( + snmpEngine.cache, varBindTableRow, lookupMib) + for varBindTableRow in varBindTable + ] + except Exception as e: future.set_exception(e) else: future.set_result( - (errorIndication, errorStatus, errorIndex, varBindsUnmade) - ) + (errorIndication, errorStatus, errorIndex, varBindsUnmade)) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) @@ -517,4 +533,5 @@ def bulkCmd(snmpEngine, authData, transportTarget, contextData, VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, (options.get('lookupMib', True), future) ) + return future diff --git a/pysnmp/hlapi/v3arch/asyncio/transport.py b/pysnmp/hlapi/v3arch/asyncio/transport.py index 0b795163..f897de09 100644 --- a/pysnmp/hlapi/v3arch/asyncio/transport.py +++ b/pysnmp/hlapi/v3arch/asyncio/transport.py @@ -56,11 +56,11 @@ class UdpTransportTarget(AbstractTransportTarget): def _resolveAddr(self, transportAddr): try: - return socket.getaddrinfo(transportAddr[0], - transportAddr[1], - socket.AF_INET, - socket.SOCK_DGRAM, - socket.IPPROTO_UDP)[0][4][:2] + return socket.getaddrinfo( + transportAddr[0], transportAddr[1], + socket.AF_INET, socket.SOCK_DGRAM, + socket.IPPROTO_UDP)[0][4][:2] + except socket.gaierror as exc: raise PySnmpError('Bad IPv4/UDP transport address %s: %s' % ( '@'.join([str(x) for x in transportAddr]), exc)) @@ -116,11 +116,11 @@ class Udp6TransportTarget(AbstractTransportTarget): def _resolveAddr(self, transportAddr): try: - return socket.getaddrinfo(transportAddr[0], - transportAddr[1], - socket.AF_INET6, - socket.SOCK_DGRAM, - socket.IPPROTO_UDP)[0][4][:2] + return socket.getaddrinfo( + transportAddr[0], transportAddr[1], + socket.AF_INET6, socket.SOCK_DGRAM, + socket.IPPROTO_UDP)[0][4][:2] + except socket.gaierror as exc: raise PySnmpError('Bad IPv6/UDP transport address %s: %s' % ( '@'.join([str(x) for x in transportAddr]), exc)) diff --git a/pysnmp/hlapi/v3arch/asyncore/cmdgen.py b/pysnmp/hlapi/v3arch/asyncore/cmdgen.py index 6446bce5..e11e040e 100644 --- a/pysnmp/hlapi/v3arch/asyncore/cmdgen.py +++ b/pysnmp/hlapi/v3arch/asyncore/cmdgen.py @@ -113,24 +113,26 @@ def getCmd(snmpEngine, authData, transportTarget, contextData, def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): + lookupMib, cbFun, cbCtx = cbCtx + if cbFun: + varBinds = VB_PROCESSOR.unmakeVarBinds( + snmpEngine.cache, varBinds, lookupMib) + return cbFun(snmpEngine, sendRequestHandle, errorIndication, - errorStatus, errorIndex, - VB_PROCESSOR.unmakeVarBinds( - snmpEngine.cache, varBinds, lookupMib - ), cbCtx) + errorStatus, errorIndex, varBinds, cbCtx) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + return cmdgen.GetCommandGenerator().sendVarBinds( snmpEngine, addrName, contextData.contextEngineId, - contextData.contextName, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, + contextData.contextName, varBinds, __cbFun, (options.get('lookupMib', True), - options.get('cbFun'), options.get('cbCtx')) - ) + options.get('cbFun'), options.get('cbCtx'))) def setCmd(snmpEngine, authData, transportTarget, contextData, @@ -226,22 +228,25 @@ def setCmd(snmpEngine, authData, transportTarget, contextData, def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): + lookupMib, cbFun, cbCtx = cbCtx + + varBinds = VB_PROCESSOR.unmakeVarBinds( + snmpEngine.cache, varBinds, lookupMib) + return cbFun(snmpEngine, sendRequestHandle, errorIndication, - errorStatus, errorIndex, - VB_PROCESSOR.unmakeVarBinds( - snmpEngine.cache, varBinds, lookupMib - ), cbCtx) + errorStatus, errorIndex, varBinds, cbCtx) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + return cmdgen.SetCommandGenerator().sendVarBinds( snmpEngine, addrName, contextData.contextEngineId, - contextData.contextName, VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), + contextData.contextName, varBinds, __cbFun, (options.get('lookupMib', True), - options.get('cbFun'), options.get('cbCtx')) - ) + options.get('cbFun'), options.get('cbCtx'))) def nextCmd(snmpEngine, authData, transportTarget, contextData, @@ -338,23 +343,26 @@ def nextCmd(snmpEngine, authData, transportTarget, contextData, def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBindTable, cbCtx): + lookupMib, cbFun, cbCtx = cbCtx + + varBindTable = [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, + varBindTableRow, lookupMib) + for varBindTableRow in varBindTable] + return cbFun(snmpEngine, sendRequestHandle, errorIndication, - errorStatus, errorIndex, - [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBindTableRow, lookupMib) for varBindTableRow in - varBindTable], - cbCtx) + errorStatus, errorIndex, varBindTable, cbCtx) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + return cmdgen.NextCommandGenerator().sendVarBinds( - snmpEngine, addrName, - contextData.contextEngineId, contextData.contextName, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), - __cbFun, (options.get('lookupMib', True), - options.get('cbFun'), options.get('cbCtx')) - ) + snmpEngine, addrName, contextData.contextEngineId, + contextData.contextName, varBinds, __cbFun, + (options.get('lookupMib', True), options.get('cbFun'), + options.get('cbCtx'))) def bulkCmd(snmpEngine, authData, transportTarget, contextData, @@ -481,19 +489,23 @@ def bulkCmd(snmpEngine, authData, transportTarget, contextData, def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBindTable, cbCtx): + lookupMib, cbFun, cbCtx = cbCtx + + varBindTable = [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, + varBindTableRow, lookupMib) + for varBindTableRow in varBindTable] + return cbFun(snmpEngine.cache, sendRequestHandle, errorIndication, - errorStatus, errorIndex, - [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBindTableRow, lookupMib) for varBindTableRow in - varBindTable], cbCtx) + errorStatus, errorIndex, varBindTable, cbCtx) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + return cmdgen.BulkCommandGenerator().sendVarBinds( snmpEngine, addrName, contextData.contextEngineId, contextData.contextName, nonRepeaters, maxRepetitions, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, - (options.get('lookupMib', True), - options.get('cbFun'), options.get('cbCtx')) - ) + varBinds, __cbFun, (options.get('lookupMib', True), + options.get('cbFun'), options.get('cbCtx'))) diff --git a/pysnmp/hlapi/v3arch/asyncore/ntforg.py b/pysnmp/hlapi/v3arch/asyncore/ntforg.py index 7df0bc08..2e714c08 100644 --- a/pysnmp/hlapi/v3arch/asyncore/ntforg.py +++ b/pysnmp/hlapi/v3arch/asyncore/ntforg.py @@ -152,22 +152,23 @@ def sendNotification(snmpEngine, authData, transportTarget, contextData, # noinspection PyShadowingNames def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): + lookupMib, cbFun, cbCtx = cbCtx + + varBinds = VB_PROCESSOR.unmakeVarBinds( + snmpEngine.cache, varBinds, lookupMib) + return cbFun and cbFun( snmpEngine, sendRequestHandle, errorIndication, - errorStatus, errorIndex, - VB_PROCESSOR.unmakeVarBinds( - snmpEngine.cache, varBinds, lookupMib - ), cbCtx - ) + errorStatus, errorIndex, varBinds, cbCtx) notifyName = LCD.configure(snmpEngine, authData, transportTarget, notifyType, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + return ntforg.NotificationOriginator().sendVarBinds( snmpEngine, notifyName, contextData.contextEngineId, contextData.contextName, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, - (options.get('lookupMib', True), - options.get('cbFun'), options.get('cbCtx')) - ) + varBinds, __cbFun, (options.get('lookupMib', True), + options.get('cbFun'), options.get('cbCtx'))) diff --git a/pysnmp/hlapi/v3arch/asyncore/sync/cmdgen.py b/pysnmp/hlapi/v3arch/asyncore/sync/cmdgen.py index c0e7a379..6165fa33 100644 --- a/pysnmp/hlapi/v3arch/asyncore/sync/cmdgen.py +++ b/pysnmp/hlapi/v3arch/asyncore/sync/cmdgen.py @@ -108,6 +108,7 @@ def getCmd(snmpEngine, authData, transportTarget, contextData, errorStatus = cbCtx['errorStatus'] errorIndex = cbCtx['errorIndex'] varBinds = cbCtx['varBinds'] + else: errorIndication = errorStatus = errorIndex = None varBinds = [] @@ -214,6 +215,7 @@ def setCmd(snmpEngine, authData, transportTarget, contextData, errorStatus = cbCtx['errorStatus'] errorIndex = cbCtx['errorIndex'] varBinds = cbCtx['varBinds'] + else: errorIndication = errorStatus = errorIndex = None varBinds = [] @@ -363,6 +365,7 @@ def nextCmd(snmpEngine, authData, transportTarget, contextData, if errorIndication: yield (errorIndication, errorStatus, errorIndex, varBinds) return + elif errorStatus: if errorStatus == 2: # Hide SNMPv1 noSuchName error which leaks in here @@ -371,6 +374,7 @@ def nextCmd(snmpEngine, authData, transportTarget, contextData, errorIndex = errorIndex.clone(0) yield (errorIndication, errorStatus, errorIndex, varBinds) return + else: stopFlag = True @@ -570,8 +574,10 @@ def bulkCmd(snmpEngine, authData, transportTarget, contextData, if errorIndication: yield (errorIndication, errorStatus, errorIndex, varBindTable and varBindTable[0] or []) + if errorIndication != errind.requestTimedOut: return + elif errorStatus: if errorStatus == 2: # Hide SNMPv1 noSuchName error which leaks in here @@ -580,26 +586,35 @@ def bulkCmd(snmpEngine, authData, transportTarget, contextData, errorIndex = errorIndex.clone(0) yield (errorIndication, errorStatus, errorIndex, varBindTable and varBindTable[0] or []) return + else: for row in range(len(varBindTable)): stopFlag = True + if len(varBindTable[row]) != len(initialVars): varBindTable = row and varBindTable[:row - 1] or [] break + for col in range(len(varBindTable[row])): name, val = varBindTable[row][col] + if row: previousVarBinds = varBindTable[row - 1] + if nullVarBinds[col]: varBindTable[row][col] = previousVarBinds[col][0], endOfMibView continue + stopFlag = False + if isinstance(val, Null): varBindTable[row][col] = previousVarBinds[col][0], endOfMibView nullVarBinds[col] = True + if not lexicographicMode and not initialVars[col].isPrefixOf(name): varBindTable[row][col] = previousVarBinds[col][0], endOfMibView nullVarBinds[col] = True + if stopFlag: varBindTable = row and varBindTable[:row - 1] or [] break diff --git a/pysnmp/hlapi/v3arch/asyncore/sync/ntforg.py b/pysnmp/hlapi/v3arch/asyncore/sync/ntforg.py index 2cff18df..b26e2e4a 100644 --- a/pysnmp/hlapi/v3arch/asyncore/sync/ntforg.py +++ b/pysnmp/hlapi/v3arch/asyncore/sync/ntforg.py @@ -143,6 +143,7 @@ def sendNotification(snmpEngine, authData, transportTarget, contextData, errorStatus = cbCtx.get('errorStatus') errorIndex = cbCtx.get('errorIndex') varBinds = cbCtx.get('varBinds', []) + else: errorIndication = errorStatus = errorIndex = None varBinds = [] diff --git a/pysnmp/hlapi/v3arch/asyncore/transport.py b/pysnmp/hlapi/v3arch/asyncore/transport.py index 2cae2d7d..3e03b6af 100644 --- a/pysnmp/hlapi/v3arch/asyncore/transport.py +++ b/pysnmp/hlapi/v3arch/asyncore/transport.py @@ -53,11 +53,10 @@ class UdpTransportTarget(AbstractTransportTarget): def _resolveAddr(self, transportAddr): try: - return socket.getaddrinfo(transportAddr[0], - transportAddr[1], - socket.AF_INET, - socket.SOCK_DGRAM, - socket.IPPROTO_UDP)[0][4][:2] + return socket.getaddrinfo( + transportAddr[0], transportAddr[1], socket.AF_INET, + socket.SOCK_DGRAM, socket.IPPROTO_UDP)[0][4][:2] + except socket.gaierror as exc: raise error.PySnmpError('Bad IPv4/UDP transport address %s: %s' % ( '@'.join([str(x) for x in transportAddr]), exc)) @@ -111,11 +110,10 @@ class Udp6TransportTarget(AbstractTransportTarget): def _resolveAddr(self, transportAddr): try: - return socket.getaddrinfo(transportAddr[0], - transportAddr[1], - socket.AF_INET6, - socket.SOCK_DGRAM, - socket.IPPROTO_UDP)[0][4][:2] + return socket.getaddrinfo( + transportAddr[0], transportAddr[1], socket.AF_INET6, + socket.SOCK_DGRAM, socket.IPPROTO_UDP)[0][4][:2] + except socket.gaierror as exc: raise error.PySnmpError('Bad IPv6/UDP transport address %s: %s' % ( '@'.join([str(x) for x in transportAddr]), exc)) diff --git a/pysnmp/hlapi/v3arch/auth.py b/pysnmp/hlapi/v3arch/auth.py index 7c232221..18b4b328 100644 --- a/pysnmp/hlapi/v3arch/auth.py +++ b/pysnmp/hlapi/v3arch/auth.py @@ -174,48 +174,60 @@ class CommunityData(object): def __init__(self, communityIndex, communityName=None, mpModel=None, contextEngineId=None, contextName=None, tag=None, securityName=None): + if mpModel is not None: self.mpModel = mpModel self.securityModel = mpModel + 1 + self.contextEngineId = contextEngineId + if contextName is not None: self.contextName = contextName + if tag is not None: self.tag = tag + # a single arg is considered as a community name if communityName is None: communityName, communityIndex = communityIndex, None + self.communityName = communityName + # Autogenerate communityIndex if not specified if communityIndex is None: - self.communityIndex = self.securityName = 's%s' % hash( + self.securityName = 's%s' % hash( (self.communityName, self.mpModel, self.contextEngineId, - self.contextName, self.tag) - ) + self.contextName, self.tag)) + + self.communityIndex = self.securityName + else: self.communityIndex = communityIndex - self.securityName = securityName is not None and securityName or communityIndex + + if securityName is None: + self.securityName = communityIndex + + else: + self.securityName = securityName def __hash__(self): raise TypeError('%s is not hashable' % self.__class__.__name__) def __repr__(self): - return '%s(communityIndex=%r, communityName=<COMMUNITY>, mpModel=%r, contextEngineId=%r, contextName=%r, tag=%r, securityName=%r)' % ( - self.__class__.__name__, - self.communityIndex, - self.mpModel, - self.contextEngineId, - self.contextName, - self.tag, - self.securityName - ) + return ('%s(communityIndex=%r, communityName=<COMMUNITY>, mpModel=%r, ' + 'contextEngineId=%r, contextName=%r, tag=%r, securityName=' + '%r)') % (self.__class__.__name__, self.communityIndex, + self.mpModel, self.contextEngineId, self.contextName, + self.tag, self.securityName) def clone(self, communityIndex=None, communityName=None, mpModel=None, contextEngineId=None, contextName=None, tag=None, securityName=None): + # a single arg is considered as a community name if communityName is None: communityName, communityIndex = communityIndex, None + return self.__class__( communityIndex, communityName is None and self.communityName or communityName, @@ -223,8 +235,7 @@ class CommunityData(object): contextEngineId is None and self.contextEngineId or contextEngineId, contextName is None and self.contextName or contextName, tag is None and self.tag or tag, - securityName is None and self.securityName or securityName - ) + securityName is None and self.securityName or securityName) class UsmUserData(object): @@ -306,28 +317,38 @@ class UsmUserData(object): authProtocol=None, privProtocol=None, securityEngineId=None, securityName=None): + self.userName = userName + if securityName is None: self.securityName = userName + else: self.securityName = securityName if authKey is not None: self.authKey = authKey + if authProtocol is None: self.authProtocol = config.USM_AUTH_HMAC96_MD5 + else: self.authProtocol = authProtocol + if self.securityLevel != 'authPriv': self.securityLevel = 'authNoPriv' if privKey is not None: self.privKey = privKey + if self.authProtocol == config.USM_AUTH_NONE: raise error.PySnmpError('Privacy implies authenticity') + self.securityLevel = 'authPriv' + if privProtocol is None: self.privProtocol = config.USM_PRIV_CBC56_DES + else: self.privProtocol = privProtocol @@ -337,19 +358,19 @@ class UsmUserData(object): raise TypeError('%s is not hashable' % self.__class__.__name__) def __repr__(self): - return '%s(userName=%r, authKey=<AUTHKEY>, privKey=<PRIVKEY>, authProtocol=%r, privProtocol=%r, securityEngineId=%r, securityName=%r)' % ( - self.__class__.__name__, - self.userName, - self.authProtocol, - self.privProtocol, + return ('%s(userName=%r, authKey=<AUTHKEY>, privKey=<PRIVKEY>, ' + 'authProtocol=%r, privProtocol=%r, securityEngineId=%r, ' + 'securityName=%r)') % ( + self.__class__.__name__, self.userName, + self.authProtocol, self.privProtocol, self.securityEngineId is None and '<DEFAULT>' or self.securityEngineId, - self.securityName - ) + self.securityName) def clone(self, userName=None, authKey=None, privKey=None, authProtocol=None, privProtocol=None, securityEngineId=None, securityName=None): + return self.__class__( userName is None and self.userName or userName, authKey is None and self.authKey or authKey, @@ -357,5 +378,4 @@ class UsmUserData(object): authProtocol is None and self.authProtocol or authProtocol, privProtocol is None and self.privProtocol or privProtocol, securityEngineId is None and self.securityEngineId or securityEngineId, - securityName=securityName is None and self.securityName or securityName - ) + securityName=securityName is None and self.securityName or securityName) diff --git a/pysnmp/hlapi/v3arch/lcd.py b/pysnmp/hlapi/v3arch/lcd.py index b3397b0c..0e1eb9c5 100644 --- a/pysnmp/hlapi/v3arch/lcd.py +++ b/pysnmp/hlapi/v3arch/lcd.py @@ -21,10 +21,13 @@ class AbstractLcdConfigurator(object): def _getCache(self, snmpEngine): cacheId = self.__class__.__name__ + cache = snmpEngine.getUserContext(cacheId) + if cache is None: cache = dict([(x, {}) for x in self.cacheKeys]) snmpEngine.setUserContext(**{cacheId: cache}) + return cache def configure(self, snmpEngine, *args, **kwargs): @@ -37,8 +40,10 @@ class AbstractLcdConfigurator(object): class CommandGeneratorLcdConfigurator(AbstractLcdConfigurator): cacheKeys = ['auth', 'parm', 'tran', 'addr'] - def configure(self, snmpEngine, authData, transportTarget, contextName, **options): + def configure(self, snmpEngine, authData, transportTarget, + contextName, **options): cache = self._getCache(snmpEngine) + if isinstance(authData, CommunityData): if authData.communityIndex not in cache['auth']: config.addV1System( @@ -50,9 +55,12 @@ class CommandGeneratorLcdConfigurator(AbstractLcdConfigurator): authData.tag, authData.securityName ) + cache['auth'][authData.communityIndex] = authData + elif isinstance(authData, UsmUserData): authDataKey = authData.userName, authData.securityEngineId + if authDataKey not in cache['auth']: config.addV3User( snmpEngine, @@ -62,37 +70,48 @@ class CommandGeneratorLcdConfigurator(AbstractLcdConfigurator): authData.securityEngineId, securityName=authData.securityName ) + cache['auth'][authDataKey] = authData + else: raise error.PySnmpError('Unsupported authentication object') paramsKey = (authData.securityName, authData.securityLevel, authData.mpModel) + if paramsKey in cache['parm']: paramsName, useCount = cache['parm'][paramsKey] + cache['parm'][paramsKey] = paramsName, useCount + 1 + else: paramsName = 'p%s' % self.nextID() config.addTargetParams( snmpEngine, paramsName, authData.securityName, authData.securityLevel, authData.mpModel ) + cache['parm'][paramsKey] = paramsName, 1 if transportTarget.TRANSPORT_DOMAIN in cache['tran']: transport, useCount = cache['tran'][transportTarget.TRANSPORT_DOMAIN] transportTarget.verifyDispatcherCompatibility(snmpEngine) + cache['tran'][transportTarget.TRANSPORT_DOMAIN] = transport, useCount + 1 + elif config.getTransport(snmpEngine, transportTarget.TRANSPORT_DOMAIN): transportTarget.verifyDispatcherCompatibility(snmpEngine) + else: transport = transportTarget.openClientMode() + config.addTransport( snmpEngine, transportTarget.TRANSPORT_DOMAIN, transport ) + cache['tran'][transportTarget.TRANSPORT_DOMAIN] = transport, 1 transportKey = (paramsName, transportTarget.TRANSPORT_DOMAIN, @@ -105,8 +124,10 @@ class CommandGeneratorLcdConfigurator(AbstractLcdConfigurator): if transportKey in cache['addr']: addrName, useCount = cache['addr'][transportKey] cache['addr'][transportKey] = addrName, useCount + 1 + else: addrName = 'a%s' % self.nextID() + config.addTargetAddr( snmpEngine, addrName, transportTarget.TRANSPORT_DOMAIN, @@ -116,23 +137,30 @@ class CommandGeneratorLcdConfigurator(AbstractLcdConfigurator): transportTarget.retries, transportTarget.tagList ) + cache['addr'][transportKey] = addrName, 1 return addrName, paramsName def unconfigure(self, snmpEngine, authData=None, contextName=null, **options): cache = self._getCache(snmpEngine) + if authData: if isinstance(authData, CommunityData): authDataKey = authData.communityIndex + elif isinstance(authData, UsmUserData): authDataKey = authData.userName, authData.securityEngineId + else: raise error.PySnmpError('Unsupported authentication object') + if authDataKey in cache['auth']: authDataKeys = (authDataKey,) + else: raise error.PySnmpError('Unknown authData %s' % (authData,)) + else: authDataKeys = list(cache['auth'].keys()) @@ -140,35 +168,44 @@ class CommandGeneratorLcdConfigurator(AbstractLcdConfigurator): for authDataKey in authDataKeys: authDataX = cache['auth'][authDataKey] + del cache['auth'][authDataKey] + if isinstance(authDataX, CommunityData): config.delV1System( snmpEngine, authDataX.communityIndex ) + elif isinstance(authDataX, UsmUserData): config.delV3User( snmpEngine, authDataX.userName, authDataX.securityEngineId ) + else: raise error.PySnmpError('Unsupported authentication object') paramsKey = (authDataX.securityName, authDataX.securityLevel, authDataX.mpModel) + if paramsKey in cache['parm']: paramsName, useCount = cache['parm'][paramsKey] + useCount -= 1 + if useCount: cache['parm'][paramsKey] = paramsName, useCount + else: del cache['parm'][paramsKey] - config.delTargetParams( - snmpEngine, paramsName - ) + + config.delTargetParams(snmpEngine, paramsName) + paramsNames.add(paramsName) + else: raise error.PySnmpError('Unknown target %s' % (paramsKey,)) @@ -176,22 +213,30 @@ class CommandGeneratorLcdConfigurator(AbstractLcdConfigurator): for addrKey in addrKeys: addrName, useCount = cache['addr'][addrKey] + useCount -= 1 + if useCount: cache['addr'][addrKey] = addrName, useCount + else: config.delTargetAddr(snmpEngine, addrName) + del cache['addr'][addrKey] + addrNames.add(addrKey) if addrKey[1] in cache['tran']: transport, useCount = cache['tran'][addrKey[1]] + if useCount > 1: useCount -= 1 cache['tran'][addrKey[1]] = transport, useCount + else: config.delTransport(snmpEngine, addrKey[1]) transport.closeTransport() + del cache['tran'][addrKey[1]] return addrNames, paramsNames @@ -204,6 +249,7 @@ class NotificationOriginatorLcdConfigurator(AbstractLcdConfigurator): def configure(self, snmpEngine, authData, transportTarget, notifyType, contextName, **options): cache = self._getCache(snmpEngine) + notifyName = None # Create matching transport tags if not given by user. Not good! @@ -211,79 +257,97 @@ class NotificationOriginatorLcdConfigurator(AbstractLcdConfigurator): transportTarget.tagList = str( hash((authData.securityName, transportTarget.transportAddr)) ) + if isinstance(authData, CommunityData) and not authData.tag: authData.tag = transportTarget.tagList.split()[0] addrName, paramsName = self._cmdGenLcdCfg.configure( snmpEngine, authData, transportTarget, contextName, **options) + tagList = transportTarget.tagList.split() + if not tagList: tagList = [''] + for tag in tagList: notifyNameKey = paramsName, tag, notifyType + if notifyNameKey in cache['name']: notifyName, paramsName, useCount = cache['name'][notifyNameKey] + cache['name'][notifyNameKey] = notifyName, paramsName, useCount + 1 + else: notifyName = 'n%s' % self.nextID() + config.addNotificationTarget( - snmpEngine, - notifyName, - paramsName, - tag, - notifyType - ) + snmpEngine, notifyName, paramsName, tag, notifyType) + cache['name'][notifyNameKey] = notifyName, paramsName, 1 + authDataKey = authData.securityName, authData.securityModel, authData.securityLevel, contextName + if authDataKey in cache['auth']: authDataX, subTree, useCount = cache['auth'][authDataKey] + cache['auth'][authDataKey] = authDataX, subTree, useCount + 1 + else: subTree = (1, 3, 6) - config.addVacmUser(snmpEngine, - authData.securityModel, - authData.securityName, - authData.securityLevel, - (), (), subTree, contextName=contextName) + + config.addVacmUser( + snmpEngine,authData.securityModel, authData.securityName, + authData.securityLevel, (), (), subTree, + contextName=contextName) + cache['auth'][authDataKey] = authData, subTree, 1 return notifyName def unconfigure(self, snmpEngine, authData=None, contextName=null, **options): cache = self._getCache(snmpEngine) + if authData: authDataKey = authData.securityName, authData.securityModel, authData.securityLevel, contextName + if authDataKey in cache['auth']: authDataKeys = (authDataKey,) + else: raise error.PySnmpError('Unknown authData %s' % (authData,)) + else: authDataKeys = tuple(cache['auth']) addrNames, paramsNames = self._cmdGenLcdCfg.unconfigure( snmpEngine, authData, contextName, **options) - notifyAndParamsNames = [(cache['name'][x], x) for x in cache['name'].keys() if x[0] in paramsNames] + notifyAndParamsNames = [ + (cache['name'][x], x) for x in cache['name'].keys() + if x[0] in paramsNames + ] for (notifyName, paramsName, useCount), notifyNameKey in notifyAndParamsNames: useCount -= 1 + if useCount: cache['name'][notifyNameKey] = notifyName, paramsName, useCount + else: - config.delNotificationTarget( - snmpEngine, notifyName, paramsName - ) + config.delNotificationTarget(snmpEngine, notifyName, paramsName) del cache['name'][notifyNameKey] for authDataKey in authDataKeys: authDataX, subTree, useCount = cache['auth'][authDataKey] + useCount -= 1 + if useCount: cache['auth'][authDataKey] = authDataX, subTree, useCount + else: config.delTrapUser( - snmpEngine, authDataX.securityModel, - authDataX.securityName, authDataX.securityLevel, - subTree - ) + snmpEngine, authDataX.securityModel, authDataX.securityName, + authDataX.securityLevel, subTree) + del cache['auth'][authDataKey] diff --git a/pysnmp/hlapi/v3arch/twisted/cmdgen.py b/pysnmp/hlapi/v3arch/twisted/cmdgen.py index 91cfdab2..528c92df 100644 --- a/pysnmp/hlapi/v3arch/twisted/cmdgen.py +++ b/pysnmp/hlapi/v3arch/twisted/cmdgen.py @@ -110,38 +110,41 @@ def getCmd(snmpEngine, authData, transportTarget, contextData, ... >>> react(run) (0, 0, [ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.1.1.0')), DisplayString('SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m'))]) - >>> - """ def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): + lookupMib, deferred = cbCtx + if errorIndication: deferred.errback(Failure(errorIndication)) + else: try: - varBindsUnmade = VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBinds, lookupMib) + varBinds = VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBinds, lookupMib) except Exception as e: deferred.errback(Failure(e)) else: - deferred.callback((errorStatus, errorIndex, varBindsUnmade)) + deferred.callback((errorStatus, errorIndex, varBinds)) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + deferred = Deferred() cmdgen.GetCommandGenerator().sendVarBinds( snmpEngine, addrName, contextData.contextEngineId, - contextData.contextName, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, - (options.get('lookupMib', True), deferred) - ) + contextData.contextName, varBinds, __cbFun, + (options.get('lookupMib', True), deferred)) + return deferred + def setCmd(snmpEngine, authData, transportTarget, contextData, *varBinds, **options): """Performs SNMP SET query. @@ -227,38 +230,41 @@ def setCmd(snmpEngine, authData, transportTarget, contextData, ... >>> react(run) (0, 0, [ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.1.1.0')), DisplayString('Linux i386'))]) - >>> - """ def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): + lookupMib, deferred = cbCtx + if errorIndication: deferred.errback(Failure(errorIndication)) + else: try: - varBindsUnmade = VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBinds, lookupMib) + varBinds = VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, varBinds, lookupMib) except Exception as e: deferred.errback(Failure(e)) else: - deferred.callback((errorStatus, errorIndex, varBindsUnmade)) + deferred.callback((errorStatus, errorIndex, varBinds)) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + deferred = Deferred() cmdgen.SetCommandGenerator().sendVarBinds( snmpEngine, addrName, contextData.contextEngineId, - contextData.contextName, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, - (options.get('lookupMib', True), deferred) - ) + contextData.contextName, varBinds, __cbFun, + (options.get('lookupMib', True), deferred)) + return deferred + def nextCmd(snmpEngine, authData, transportTarget, contextData, *varBinds, **options): """Performs SNMP GETNEXT query. @@ -352,44 +358,49 @@ def nextCmd(snmpEngine, authData, transportTarget, contextData, ... >>> react(run) (0, 0, [[ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.1.1.0')), DisplayString('SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m'))]]) - >>> - """ def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBindTable, cbCtx): + lookupMib, deferred = cbCtx - if (options.get('ignoreNonIncreasingOid', False) and - errorIndication and isinstance(errorIndication, errind.OidNotIncreasing)): + + if (options.get('ignoreNonIncreasingOid', False) and errorIndication + and isinstance(errorIndication, errind.OidNotIncreasing)): errorIndication = None + if errorIndication: deferred.errback(Failure(errorIndication)) + else: try: - varBindsUnmade = [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, - varBindTableRow, - lookupMib) - for varBindTableRow in varBindTable] + varBindTable = [ + VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, + varBindTableRow, lookupMib) + for varBindTableRow in varBindTable + ] except Exception as e: deferred.errback(Failure(e)) else: - deferred.callback((errorStatus, errorIndex, varBindsUnmade)) + deferred.callback((errorStatus, errorIndex, varBindTable)) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + deferred = Deferred() cmdgen.NextCommandGenerator().sendVarBinds( snmpEngine, addrName, contextData.contextEngineId, - contextData.contextName, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), __cbFun, - (options.get('lookupMib', True), deferred) - ) + contextData.contextName, varBinds, __cbFun, + (options.get('lookupMib', True), deferred)) + return deferred + def bulkCmd(snmpEngine, authData, transportTarget, contextData, nonRepeaters, maxRepetitions, *varBinds, **options): """Performs SNMP GETBULK query. @@ -511,41 +522,45 @@ def bulkCmd(snmpEngine, authData, transportTarget, contextData, ... >>> react(run) (0, 0, [[ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.1.1.0')), DisplayString('SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m'))], [ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.1.2.0')), ObjectIdentifier('1.3.6.1.4.1.424242.1.1'))]]) - >>> - """ def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBindTable, cbCtx): + lookupMib, deferred = cbCtx - if options.get('ignoreNonIncreasingOid', False) and errorIndication and \ - isinstance(errorIndication, errind.OidNotIncreasing): + + if (options.get('ignoreNonIncreasingOid', False) and errorIndication + and isinstance(errorIndication, errind.OidNotIncreasing)): errorIndication = None + if errorIndication: deferred.errback(Failure(errorIndication)) + else: try: - varBindsUnmade = [VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, - varBindTableRow, - lookupMib) - for varBindTableRow in varBindTable] + varBindTable = [ + VB_PROCESSOR.unmakeVarBinds(snmpEngine.cache, + varBindTableRow, lookupMib) + for varBindTableRow in varBindTable + ] except Exception as e: deferred.errback(Failure(e)) else: - deferred.callback((errorStatus, errorIndex, varBindsUnmade)) + deferred.callback((errorStatus, errorIndex, varBindTable)) addrName, paramsName = LCD.configure( snmpEngine, authData, transportTarget, contextData.contextName) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + deferred = Deferred() cmdgen.BulkCommandGenerator().sendVarBinds( snmpEngine, addrName, contextData.contextEngineId, contextData.contextName, nonRepeaters, maxRepetitions, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), - __cbFun, - (options.get('lookupMib', True), deferred) - ) + varBinds, __cbFun, (options.get('lookupMib', True), + deferred)) + return deferred diff --git a/pysnmp/hlapi/v3arch/twisted/ntforg.py b/pysnmp/hlapi/v3arch/twisted/ntforg.py index 5243c66f..3ea2aa59 100644 --- a/pysnmp/hlapi/v3arch/twisted/ntforg.py +++ b/pysnmp/hlapi/v3arch/twisted/ntforg.py @@ -21,6 +21,7 @@ __all__ = ['sendNotification'] VB_PROCESSOR = NotificationOriginatorVarBinds() LCD = NotificationOriginatorLcdConfigurator() + def sendNotification(snmpEngine, authData, transportTarget, contextData, notifyType, *varBinds, **options): """Sends SNMP notification. @@ -145,27 +146,26 @@ def sendNotification(snmpEngine, authData, transportTarget, contextData, ... >>> react(run) (0, 0, []) - >>> - """ def __cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): + lookupMib, deferred = cbCtx if errorIndication: deferred.errback(Failure(errorIndication)) + else: try: - varBindsUnmade = VB_PROCESSOR.unmakeVarBinds( - snmpEngine.cache, varBinds, lookupMib - ) + varBinds = VB_PROCESSOR.unmakeVarBinds( + snmpEngine.cache, varBinds, lookupMib) except Exception as e: deferred.errback(Failure(e)) else: - deferred.callback((errorStatus, errorIndex, varBindsUnmade)) + deferred.callback((errorStatus, errorIndex, varBinds)) notifyName = LCD.configure(snmpEngine, authData, transportTarget, notifyType, contextData.contextName) @@ -173,15 +173,13 @@ def sendNotification(snmpEngine, authData, transportTarget, contextData, def __trapFun(deferred): deferred.callback((0, 0, [])) + varBinds = VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds) + deferred = Deferred() ntforg.NotificationOriginator().sendVarBinds( - snmpEngine, - notifyName, - contextData.contextEngineId, - contextData.contextName, - VB_PROCESSOR.makeVarBinds(snmpEngine.cache, varBinds), - __cbFun, + snmpEngine, notifyName, contextData.contextEngineId, + contextData.contextName, varBinds, __cbFun, (options.get('lookupMib', True), deferred) ) diff --git a/pysnmp/hlapi/v3arch/twisted/transport.py b/pysnmp/hlapi/v3arch/twisted/transport.py index 11119fc4..71b0337a 100644 --- a/pysnmp/hlapi/v3arch/twisted/transport.py +++ b/pysnmp/hlapi/v3arch/twisted/transport.py @@ -12,6 +12,7 @@ from pysnmp.hlapi.transport import AbstractTransportTarget __all__ = ['UdpTransportTarget'] + class UdpTransportTarget(AbstractTransportTarget): """Creates UDP/IPv4 configuration entry and initialize socket API if needed. @@ -43,18 +44,17 @@ class UdpTransportTarget(AbstractTransportTarget): >>> from pysnmp.hlapi.twisted import UdpTransportTarget >>> UdpTransportTarget(('demo.snmplabs.com', 161)) UdpTransportTarget(('195.218.195.228', 161), timeout=1, retries=5, tagList='') - >>> - """ TRANSPORT_DOMAIN = udp.DOMAIN_NAME PROTO_TRANSPORT = udp.UdpTwistedTransport def _resolveAddr(self, transportAddr): try: - return socket.getaddrinfo(transportAddr[0], - transportAddr[1], - socket.AF_INET, - socket.SOCK_DGRAM, - socket.IPPROTO_UDP)[0][4][:2] + return socket.getaddrinfo( + transportAddr[0], transportAddr[1], socket.AF_INET, + socket.SOCK_DGRAM, socket.IPPROTO_UDP)[0][4][:2] + except socket.gaierror as exc: - raise PySnmpError('Bad IPv4/UDP transport address %s: %s' % ('@'.join([str(x) for x in transportAddr]), exc)) + raise PySnmpError( + 'Bad IPv4/UDP transport address %s: ' + '%s' % ('@'.join(str(x) for x in transportAddr), exc)) diff --git a/pysnmp/hlapi/varbinds.py b/pysnmp/hlapi/varbinds.py index d3742a75..0eed7e50 100644 --- a/pysnmp/hlapi/varbinds.py +++ b/pysnmp/hlapi/varbinds.py @@ -38,7 +38,9 @@ class CommandGeneratorVarBinds(MibViewControllerManager): varBind = ObjectType(*varBind) elif isinstance(varBind[0][0], tuple): # legacy - varBind = ObjectType(ObjectIdentity(varBind[0][0][0], varBind[0][0][1], *varBind[0][1:]), varBind[1]) + varBind = ObjectType( + ObjectIdentity(varBind[0][0][0], varBind[0][0][1], + *varBind[0][1:]), varBind[1]) else: varBind = ObjectType(ObjectIdentity(varBind[0]), varBind[1]) @@ -50,7 +52,10 @@ class CommandGeneratorVarBinds(MibViewControllerManager): def unmakeVarBinds(self, userCache, varBinds, lookupMib=True): if lookupMib: mibViewController = self.getMibViewController(userCache) - varBinds = [ObjectType(ObjectIdentity(x[0]), x[1]).resolveWithMib(mibViewController) for x in varBinds] + varBinds = [ + ObjectType(ObjectIdentity(x[0]), + x[1]).resolveWithMib(mibViewController) + for x in varBinds] return varBinds @@ -85,5 +90,9 @@ class NotificationOriginatorVarBinds(MibViewControllerManager): def unmakeVarBinds(self, userCache, varBinds, lookupMib=False): if lookupMib: mibViewController = self.getMibViewController(userCache) - varBinds = [ObjectType(ObjectIdentity(x[0]), x[1]).resolveWithMib(mibViewController) for x in varBinds] + varBinds = [ + ObjectType(ObjectIdentity(x[0]), + x[1]).resolveWithMib(mibViewController) + for x in varBinds] + return varBinds |