summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2014-06-16 16:41:05 +0000
committerelie <elie>2014-06-16 16:41:05 +0000
commitdb4648fcfaf69b309ae5869100c86421b7e068c2 (patch)
tree414de9e519263cc1807126155e4e8f2e6e18b169
parent95629ecefb5390431a05ff18f7091b99fe67b340 (diff)
downloadpysnmp-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.py187
-rw-r--r--pysnmp/entity/rfc3413/twisted/ntforg.py80
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