summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2014-08-18 07:21:15 +0000
committerelie <elie>2014-08-18 07:21:15 +0000
commit5215d0d2b72743407eb748efad61c985e3ec3bea (patch)
tree21484f9104abc221a1c5f7758a4f4b2c0b79a192
parent3e848c2f1d170b3f12fe122432417002e045d3b5 (diff)
downloadpysnmp-5215d0d2b72743407eb748efad61c985e3ec3bea.tar.gz
CommandGenerator.getNext() & .getBulk() methods now support the
maxCalls kwarg to limit the maximum number of request-response iterations to perform
-rw-r--r--CHANGES2
-rw-r--r--examples/v3arch/oneliner/manager/cmdgen/getbulk-v3-with-custom-mib-path-and-options.py5
-rw-r--r--pysnmp/entity/rfc3413/oneliner/cmdgen.py75
3 files changed, 53 insertions, 29 deletions
diff --git a/CHANGES b/CHANGES
index f55229d..bb09e2c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -152,6 +152,8 @@ Revision 4.2.5
to facilitate authentication data management in user applications.
- Oneliner transport target classes now support the getTransportInfo()
method that returns network addresses used on protocol level.
+- Oneliner CommandGenerator.getNext() & .getBulk() methods now support the
+ maxCalls kwarg to limit the maximum number of iterations to perform.
- The config.addSocketTransport() helper renamed into config.addTransport()
and improved by automatically instantiating compatible TransportDispatcher
making it dispatcher-agnostic. As an additional bonus, application may not
diff --git a/examples/v3arch/oneliner/manager/cmdgen/getbulk-v3-with-custom-mib-path-and-options.py b/examples/v3arch/oneliner/manager/cmdgen/getbulk-v3-with-custom-mib-path-and-options.py
index f85cf6b..a0f0f29 100644
--- a/examples/v3arch/oneliner/manager/cmdgen/getbulk-v3-with-custom-mib-path-and-options.py
+++ b/examples/v3arch/oneliner/manager/cmdgen/getbulk-v3-with-custom-mib-path-and-options.py
@@ -8,7 +8,8 @@
# * to an Agent at demo.snmplabs.com:161
# * for all OIDs past TCP-MIB::tcpConnTable
# * TCP-MIB will be searched by a user-specified path
-# * run till end-of-mib condition is reported by Agent OR maxRows == 20
+# * run till end-of-mib condition is reported by Agent OR maxRows == 100 OR
+# maxCalls == 10 request-response interactions occur
# * ignoring non-increasing OIDs whenever reported by Agent
#
# make sure IF-MIB.py is search path
@@ -22,7 +23,7 @@ errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.bulkCmd(
cmdgen.UdpTransportTarget(('demo.snmplabs.com', 161)),
0, 50,
cmdgen.MibVariable('TCP-MIB', 'tcpConnTable').addMibSource('/tmp/mymibs'),
- lexicographicMode=True, maxRows=100, ignoreNonIncreasingOid=True
+ lexicographicMode=True, maxRows=100, maxCalls=10,ignoreNonIncreasingOid=True
)
if errorIndication:
diff --git a/pysnmp/entity/rfc3413/oneliner/cmdgen.py b/pysnmp/entity/rfc3413/oneliner/cmdgen.py
index 65bc2c7..1e91042 100644
--- a/pysnmp/entity/rfc3413/oneliner/cmdgen.py
+++ b/pysnmp/entity/rfc3413/oneliner/cmdgen.py
@@ -626,18 +626,6 @@ class CommandGenerator:
appReturn['varBindTable'] = varBindTotalTable
return
else:
- if maxRows and len(varBindTotalTable) >= maxRows or \
- hasattr(self, 'maxRows') and self.maxRows and \
- len(varBindTotalTable) >= self.maxRows:
- appReturn['errorIndication'] = errorIndication
- appReturn['errorStatus'] = errorStatus
- appReturn['errorIndex'] = errorIndex
- if hasattr(self, 'maxRows'):
- appReturn['varBindTable'] = varBindTotalTable[:self.maxRows]
- else:
- appReturn['varBindTable'] = varBindTotalTable[:maxRows]
- return
-
varBindTableRow = varBindTable and varBindTable[-1] or varBindTable
for idx in range(len(varBindTableRow)):
name, val = varBindTableRow[idx]
@@ -660,6 +648,27 @@ class CommandGenerator:
varBindTotalTable.extend(varBindTable)
+ if maxRows and len(varBindTotalTable) >= maxRows or \
+ hasattr(self, 'maxRows') and self.maxRows and \
+ len(varBindTotalTable) >= self.maxRows:
+ appReturn['errorIndication'] = errorIndication
+ appReturn['errorStatus'] = errorStatus
+ appReturn['errorIndex'] = errorIndex
+ if hasattr(self, 'maxRows'):
+ appReturn['varBindTable'] = varBindTotalTable[:self.maxRows]
+ else:
+ appReturn['varBindTable'] = varBindTotalTable[:maxRows]
+ return
+
+ if maxCalls[0] > 0:
+ maxCalls[0] -= 1
+ if maxCalls[0] == 0:
+ appReturn['errorIndication'] = errorIndication
+ appReturn['errorStatus'] = errorStatus
+ appReturn['errorIndex'] = errorIndex
+ appReturn['varBindTable'] = varBindTotalTable
+ return
+
return 1 # continue table retrieval
lookupNames = kwargs.get('lookupNames', False)
@@ -668,6 +677,7 @@ class CommandGenerator:
contextName = kwargs.get('contextName', null)
lexicographicMode = kwargs.get('lexicographicMode', False)
maxRows = kwargs.get('maxRows', 0)
+ maxCalls = [ kwargs.get('maxCalls', 0) ]
ignoreNonIncreasingOid = kwargs.get('ignoreNonIncreasingOid', False)
varBindHead = [ univ.ObjectIdentifier(x[0]) for x in self.__asynCmdGen.makeReadVarBinds(varNames) ]
@@ -714,22 +724,8 @@ class CommandGenerator:
else:
break
- varBindTotalTable.extend(varBindTable) # XXX out of table
- # rows possible
-
- if maxRows and len(varBindTotalTable) >= maxRows or \
- hasattr(self, 'maxRows') and self.maxRows and \
- len(varBindTotalTable) >= self.maxRows: # obsolete
- appReturn['errorIndication'] = errorIndication
- appReturn['errorStatus'] = errorStatus
- appReturn['errorIndex'] = errorIndex
- if hasattr(self, 'maxRows'):
- appReturn['varBindTable'] = varBindTotalTable[:self.maxRows]
- else:
- appReturn['varBindTable'] = varBindTotalTable[:maxRows]
- return
-
varBindTableRow = varBindTable and varBindTable[-1] or varBindTable
+
for idx in range(len(varBindTableRow)):
name, val = varBindTableRow[idx]
if not isinstance(val, univ.Null):
@@ -748,6 +744,30 @@ class CommandGenerator:
appReturn['varBindTable'] = varBindTotalTable
return
+ varBindTotalTable.extend(varBindTable) # XXX out of table
+ # rows possible
+
+ if maxCalls[0] > 0:
+ maxCalls[0] -= 1
+ if maxCalls[0] == 0:
+ appReturn['errorIndication'] = errorIndication
+ appReturn['errorStatus'] = errorStatus
+ appReturn['errorIndex'] = errorIndex
+ appReturn['varBindTable'] = varBindTotalTable
+ return
+
+ if maxRows and len(varBindTotalTable) >= maxRows or \
+ hasattr(self, 'maxRows') and self.maxRows and \
+ len(varBindTotalTable) >= self.maxRows: # obsolete
+ appReturn['errorIndication'] = errorIndication
+ appReturn['errorStatus'] = errorStatus
+ appReturn['errorIndex'] = errorIndex
+ if hasattr(self, 'maxRows'):
+ appReturn['varBindTable'] = varBindTotalTable[:self.maxRows]
+ else:
+ appReturn['varBindTable'] = varBindTotalTable[:maxRows]
+ return
+
return 1 # continue table retrieval
lookupNames = kwargs.get('lookupNames', False)
@@ -756,6 +776,7 @@ class CommandGenerator:
contextName = kwargs.get('contextName', null)
lexicographicMode = kwargs.get('lexicographicMode', False)
maxRows = kwargs.get('maxRows', 0)
+ maxCalls = [ kwargs.get('maxCalls', 0) ]
ignoreNonIncreasingOid = kwargs.get('ignoreNonIncreasingOid', False)
varBindHead = [ univ.ObjectIdentifier(x[0]) for x in self.__asynCmdGen.makeReadVarBinds(varNames) ]