From d3b5593f73139421974ab8506163fdd1f6f77ed6 Mon Sep 17 00:00:00 2001
From: David Schmitz <schmitz@lrz.de>
Date: Mon, 12 Feb 2024 10:19:44 +0000
Subject: [PATCH] fix/snmp_error_verbose: SNMP communication errors in log are
 now containing details of ip address and last received snmp var during the
 current poll

---
 flowspec/snmpstats.py | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/flowspec/snmpstats.py b/flowspec/snmpstats.py
index 81ee5ae9..c649375f 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,
-- 
GitLab