diff options
author | elie <elie> | 2014-06-16 16:41:05 +0000 |
---|---|---|
committer | elie <elie> | 2014-06-16 16:41:05 +0000 |
commit | db4648fcfaf69b309ae5869100c86421b7e068c2 (patch) | |
tree | 414de9e519263cc1807126155e4e8f2e6e18b169 | |
parent | 95629ecefb5390431a05ff18f7091b99fe67b340 (diff) | |
download | pysnmp-db4648fcfaf69b309ae5869100c86421b7e068c2.tar.gz |
major re-write aiming at:
* base Twisted layer upon the latest native SNMPv3 apps API
* introduce new, improved API which is in-line with native SNMPv3 apps API
* avoid unnecessary and confusing inheritance
-rw-r--r-- | pysnmp/entity/rfc3413/twisted/cmdgen.py | 187 | ||||
-rw-r--r-- | pysnmp/entity/rfc3413/twisted/ntforg.py | 80 |
2 files changed, 169 insertions, 98 deletions
diff --git a/pysnmp/entity/rfc3413/twisted/cmdgen.py b/pysnmp/entity/rfc3413/twisted/cmdgen.py index aabc8e5..d57a824 100644 --- a/pysnmp/entity/rfc3413/twisted/cmdgen.py +++ b/pysnmp/entity/rfc3413/twisted/cmdgen.py @@ -2,111 +2,136 @@ from twisted.internet import defer from pysnmp.entity.rfc3413 import cmdgen from pyasn1.compat.octets import null -def _cbFun(sendRequestHandle, errorIndication, +def _cbFun(snmpEngine, sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): - cbCtx.callback((errorIndication, errorStatus, errorIndex, varBinds)) - -class GetCommandGenerator(cmdgen.GetCommandGenerator): - def sendReq( - self, - snmpEngine, - addrName, - varBinds, - contextEngineId=None, - contextName=null - ): - df = defer.Deferred() - cmdgen.GetCommandGenerator.sendReq( - self, - snmpEngine, - addrName, - varBinds, - _cbFun, - df, - contextEngineId, - contextName - ) - return df - -class SetCommandGenerator(cmdgen.SetCommandGenerator): - def sendReq( - self, - snmpEngine, - addrName, - varBinds, - contextEngineId=None, - contextName=null - ): - df = defer.Deferred() - cmdgen.SetCommandGenerator.sendReq( - self, - snmpEngine, - addrName, - varBinds, - _cbFun, - df, - contextEngineId, - contextName - ) - return df - -def _cbFunWithDeferred(sendRequestHandle, errorIndication, - errorStatus, errorIndex, varBinds, cbCtx): df = cbCtx['df'] df.callback( - (errorIndication, errorStatus, errorIndex, varBinds) - ) + (snmpEngine, errorIndication, errorStatus, errorIndex, varBinds) + ) # Callback function may return another deferred to indicate # it wishes to continue MIB walk. if isinstance(df.result, defer.Deferred): cbCtx['df'] = df.result return 1 # continue walking -class NextCommandGenerator(cmdgen.NextCommandGenerator): - def sendReq( - self, - snmpEngine, - addrName, - varBinds, - contextEngineId=None, - contextName=null - ): +class AbstractCommandGenerator: + commandGenerator = None + + def sendVarBinds(self, snmpEngine, targetName, + contextEngineId, contextName, varBinds): df = defer.Deferred() - cmdgen.NextCommandGenerator.sendReq( - self, + self.commandGenerator.sendVarBinds( snmpEngine, - addrName, - varBinds, - _cbFunWithDeferred, - { 'df': df }, # anonymous dictionary used for cbCtx + targetName, contextEngineId, - contextName - ) + contextName, + varBinds, + _cbFun, + { 'df': df } # anonymous dictionary used for cbCtx + ) return df + +class GetCommandGenerator(AbstractCommandGenerator): + commandGenerator = cmdgen.GetCommandGenerator() + +class SetCommandGenerator(AbstractCommandGenerator): + commandGenerator = cmdgen.SetCommandGenerator() + +class NextCommandGeneratorSingleRun(AbstractCommandGenerator): + commandGenerator = cmdgen.NextCommandGeneratorSingleRun() -class BulkCommandGenerator(cmdgen.BulkCommandGenerator): - def sendReq( +class NextCommandGenerator(AbstractCommandGenerator): + commandGenerator = cmdgen.NextCommandGenerator() + +class AbstractBulkCommandGenerator: + commandGenerator = None + + def sendVarBinds( self, snmpEngine, - addrName, + targetName, nonRepeaters, maxRepetitions, - varBinds, - contextEngineId=None, - contextName=null + contextEngineId, + contextName, + varBinds ): df = defer.Deferred() - cmdgen.BulkCommandGenerator.sendReq( - self, + self.commandGenerator.sendVarBinds( snmpEngine, - addrName, + targetName, nonRepeaters, maxRepetitions, + contextEngineId, + contextName, varBinds, - _cbFunWithDeferred, - { 'df': df }, # anonymous dictionary used for cbCtx - contextEngineId=None, - contextName=null + _cbFun, + { 'df': df } # anonymous dictionary used for cbCtx ) return df +class BulkCommandGeneratorSingleRun(AbstractBulkCommandGenerator): + commandGenerator = cmdgen.BulkCommandGeneratorSingleRun() + +class BulkCommandGenerator(AbstractBulkCommandGenerator): + commandGenerator = cmdgen.BulkCommandGenerator() + +# +# Obsolete, compatibility interfaces. +# + +def __sendReqCbFun(response, outerDf): + ( snmpEngine, + errorIndication, + errorStatus, + errorIndex, + varBinds) = response + outerDf.callback((errorIndication, errorStatus, errorIndex, varBinds)) + # Callback function may return another deferred to indicate + # it wishes to continue MIB walk. + if isinstance(outerDf.result, defer.Deferred): + innerDf = defer.Deferred() + innerDf.addCallback(__sendReqCbFun, outerDf.result) + return innerDf + +def _sendReq(self, + snmpEngine, + targetName, + varBinds, + contextEngineId=None, + contextName=''): + innerDf = self.sendVarBinds(snmpEngine, + targetName, + contextEngineId, + contextName, + varBinds) + outerDf = defer.Deferred() + innerDf.addCallback(__sendReqCbFun, outerDf) + return outerDf + +def _sendBulkReq(self, + snmpEngine, + targetName, + nonRepeaters, + maxRepetitions, + varBinds, + contextEngineId=None, + contextName=''): + innerDf = self.sendVarBinds(snmpEngine, + targetName, + nonRepeaters, + maxRepetitions, + contextEngineId, + contextName, + varBinds) + outerDf = defer.Deferred() + innerDf.addCallback(__sendReqCbFun, outerDf) + return outerDf + +# install compatibility wrappers +GetCommandGenerator.sendReq = _sendReq +SetCommandGenerator.sendReq = _sendReq +NextCommandGenerator.sendReq = _sendReq +NextCommandGeneratorSingleRun.sendReq = _sendReq +BulkCommandGenerator.sendReq = _sendBulkReq +BulkCommandGeneratorSingleRun.sendReq = _sendBulkReq diff --git a/pysnmp/entity/rfc3413/twisted/ntforg.py b/pysnmp/entity/rfc3413/twisted/ntforg.py index 1f39c27..d527663 100644 --- a/pysnmp/entity/rfc3413/twisted/ntforg.py +++ b/pysnmp/entity/rfc3413/twisted/ntforg.py @@ -2,28 +2,74 @@ from twisted.internet import defer from pysnmp.entity.rfc3413 import ntforg from pyasn1.compat.octets import null -def _cbFun(sendRequestHandle, errorIndication, +def _cbFun(snmpEngine, metaSendPduHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx): - cbCtx.callback((errorIndication, errorStatus, errorIndex, varBinds)) - -class NotificationOriginator(ntforg.NotificationOriginator): - def sendNotification( - self, - snmpEngine, - notificationTarget, - notificationName, - additionalVarBinds=None, - contextName=null - ): + cbCtx.callback( + (snmpEngine, errorIndication, errorStatus, errorIndex, varBinds) + ) + +class NotificationOriginator: + def __init__(self, snmpContext=None): + self.snmpContext = snmpContext # this is deprecated + self.notificationOriginator = ntforg.NotificationOriginator() + + def sendVarBinds(self, + snmpEngine, + notificationTarget, + snmpContext, + contextName, + notificationName, + instanceIndex, + additionalVarBinds=()): df = defer.Deferred() - ntforg.NotificationOriginator.sendNotification( - self, + self.notificationOriginator.sendVarBinds( snmpEngine, notificationTarget, + snmpContext, + contextName, notificationName, + instanceIndex, additionalVarBinds, _cbFun, - df, - contextName=null - ) + df + ) return df + +# +# Obsolete, compatibility interfaces. +# + +def __sendReqCbFun(response, outerDf): + ( snmpEngine, + errorIndication, + errorStatus, + errorIndex, + varBinds) = response + outerDf.callback((errorIndication, errorStatus, errorIndex, varBinds)) + # Callback function may return another deferred to indicate + # it wishes to continue MIB walk. + if isinstance(outerDf.result, defer.Deferred): + innerDf = defer.Deferred() + innerDf.addCallback(__sendReqCbFun, outerDf.result) + return innerDf + +def _sendNotification(self, + snmpEngine, + notificationTarget, + notificationName, + additionalVarBinds=None, + contextName=null): + + innerDf = self.sendVarBinds(snmpEngine, + notificationTarget, + self.snmpContext, + contextName, + notificationName, + None, + additionalVarBinds) + outerDf = defer.Deferred() + innerDf.addCallback(__sendReqCbFun, outerDf) + return outerDf + +# install compatibility wrappers +NotificationOriginator.sendNotification = _sendNotification |