diff --git a/flowspec/snmpstats.py b/flowspec/snmpstats.py index 81ee5ae99b3af6753a5035de5bdeda4493a76c81..c649375fbdf5370ce05937e8d12dd84f90f9f8c0 100644 --- a/flowspec/snmpstats.py +++ b/flowspec/snmpstats.py @@ -33,6 +33,10 @@ logger = flowspec.logging_utils.logger_init_default(__name__, "celery_snmpstats. identoffset = len(settings.SNMP_CNTPACKETS) + 1 +# + +last_snmp_var_got__from__transportTarget__hash = {} + # Wait for responses or errors, submit GETNEXT requests for further OIDs # noinspection PyUnusedLocal,PyUnusedLocal def snmpCallback(snmpEngine, sendRequestHandle, errorIndication, @@ -44,12 +48,17 @@ def snmpCallback(snmpEngine, sendRequestHandle, errorIndication, # debug - which router replies: #print('%s via %s' % (authData, transportTarget)) + try: + last_snmp_var_got__from__transportTarget = last_snmp_var_got__from__transportTarget[str(transportTarget)] + except: + last_snmp_var_got__from__transportTarget = "null" + # CNTPACKETS and CNTBYTES are of the same length if errorIndication: - logger.error('snmpCallback(): Bad errorIndication.') + logger.error('snmpCallback(): Bad errorIndication: transportTarget={} last_snmp_var_got__from__transportTarget={}'.format(transportTarget, last_snmp_var_got__from__transportTarget)) return 0 elif errorStatus: - logger.error('snmpCallback(): Bad errorStatus.') + logger.error('snmpCallback(): Bad errorStatus: transportTarget={} last_snmp_var_got__from__transportTarget={}'.format(transportTarget, last_snmp_var_got__from__transportTarget)) return 0 for varBindRow in varBindTable: for name, val in varBindRow: @@ -62,6 +71,8 @@ def snmpCallback(snmpEngine, sendRequestHandle, errorIndication, logger.debug('snmpCallback(): Finished {}.'.format(transportTarget)) return 0 + last_snmp_var_got__from__transportTarget__hash[tabstoptr(transportTarget)]=name + ident = name[identoffset:] ordvals = [int(i) for i in ident.split(".")] # the first byte is length of table name string @@ -154,6 +165,8 @@ def get_snmp_stats(): except Exception as e: snmp_bulk_get__max_repetitions = 10 + last_snmp_var_got__from__transportTarget__hash = {} # reset history of snmp vars seen from a router + # Submit initial GETNEXT requests and wait for responses for authData, transportTarget, varBinds in targets: bulkCmd(snmpEngine, authData, transportTarget, ContextData(), snmp_bulk_get__non_repeaters, snmp_bulk_get__max_repetitions,