diff --git a/tangostationcontrol/tangostationcontrol/clients/snmp_client.py b/tangostationcontrol/tangostationcontrol/clients/snmp_client.py index aac0e603fe9320ecb3afcd561dbb443e5b913f1c..5878ffa55c42e19880d39dc84e549cc8beb840f5 100644 --- a/tangostationcontrol/tangostationcontrol/clients/snmp_client.py +++ b/tangostationcontrol/tangostationcontrol/clients/snmp_client.py @@ -111,7 +111,7 @@ class SNMP_client(CommClient): def load_mib(mib_name): mibBuilder = builder.MibBuilder() mibBuilder.loadModule(mib_name) - + class snmp_attribute: @@ -200,19 +200,39 @@ class snmp_attribute: varBinds = varBinds[0] for varBind in varBinds: - # class 'DisplayString' doesnt want to play along for whatever reason - if "DisplayString" in str(type(varBind[1])): - vals.append(varBind[1].prettyPrint()) - elif type(varBind[1]) == hlapi.IpAddress: + + # Get all the types. Custom and base. Custom types are merely wrapped base types. + varbind_types = varBind[1].__class__.__bases__ + (type(varBind[1]),) + + snmp_type = None + + for i in varbind_types: + if i in snmp_to_numpy_dict.keys(): + snmp_type = i + + if snmp_type is None: + TypeError(f"Error: did not find a valid snmp type. Got: {varbind_types}, expected one of: {snmp_to_numpy_dict.keys()}") + + if snmp_type == hlapi.IpAddress: # IpAddress values get printed as their raw value but in hex (7F 20 20 01 for 127.0.0.1 for example) vals.append(varBind[1].prettyPrint()) + + elif snmp_type == hlapi.Integer32 and self.dtype == str: + # Integers can have 'named values', Where a value can be translated to a specific name. A dict basically + # Example: {1: "other", 2: "invalid", 3: "dynamic", 4: "static",} + + if varBind[1].namedValues == {}: + # An empty dict {} means no namedValue's are present. + vals.append(snmp_to_numpy_dict[snmp_type](varBind[1])) + + else: + # append the named values string instead of the raw number. + vals.append(varBind[1].prettyPrint()) else: # convert from the funky pysnmp types to numpy types and then append - vals.append(snmp_to_numpy_dict[type(varBind[1])](varBind[1])) + vals.append(snmp_to_numpy_dict[snmp_type](varBind[1])) if self.is_scalar: vals = vals[0] return vals - -