diff options
author | elie <elie> | 2014-08-18 07:21:15 +0000 |
---|---|---|
committer | elie <elie> | 2014-08-18 07:21:15 +0000 |
commit | 5215d0d2b72743407eb748efad61c985e3ec3bea (patch) | |
tree | 21484f9104abc221a1c5f7758a4f4b2c0b79a192 | |
parent | 3e848c2f1d170b3f12fe122432417002e045d3b5 (diff) | |
download | pysnmp-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-- | CHANGES | 2 | ||||
-rw-r--r-- | examples/v3arch/oneliner/manager/cmdgen/getbulk-v3-with-custom-mib-path-and-options.py | 5 | ||||
-rw-r--r-- | pysnmp/entity/rfc3413/oneliner/cmdgen.py | 75 |
3 files changed, 53 insertions, 29 deletions
@@ -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) ] |