diff --git a/splunk_connect_for_snmp_mib_server/translator.py b/splunk_connect_for_snmp_mib_server/translator.py index 21e7656e..ee3c81fd 100644 --- a/splunk_connect_for_snmp_mib_server/translator.py +++ b/splunk_connect_for_snmp_mib_server/translator.py @@ -212,15 +212,41 @@ def mib_translator(self, var_bind): logger.debug( f"* Re-Translated PDU: {translated_var_bind.prettyPrint()}" ) - return translated_var_bind.prettyPrint().replace(" = ", "=") except Exception as e: logger.debug(f"Error happened during translation checking: {e}") - return None + return None, None else: - return None + return None, None + + index_result = self.parse_index(translated_var_bind) + return translated_var_bind.prettyPrint().replace(" = ", "="), index_result + + def parse_index(self, translated_var_bind): + object_identity, object_value = translated_var_bind + index_tuple = object_identity.getMibSymbol()[2] + family = object_identity.getMibSymbol()[0] + label_index = -1 + label = object_identity.getLabel()[label_index] + index_row = self._mib_view_controller.mibBuilder.mibSymbols[family].get(label) + index_result = dict() + + while ( + abs(label_index) < len(object_identity.getLabel()) + and type(index_row).__name__ == "MibTableColumn" + ): + label_index = label_index - 1 + label = object_identity.getLabel()[label_index] + index_row = self._mib_view_controller.mibBuilder.mibSymbols[family].get( + label + ) + + if index_row and type(index_row).__name__ == "MibTableRow": + index_tuple = [v.prettyPrint() for v in index_tuple] + index_names = [v[2] for v in index_row.getIndexNames()] + index_result = dict(zip(index_names, index_tuple)) - return translated_var_bind.prettyPrint().replace(" = ", "=") + return index_result # Translate SNMP PDU varBinds into MIB objects using custom translation table def custom_translator(self, oid): @@ -270,7 +296,7 @@ def format_text_event(self, var_binds: list): oid_type_string = 'oid-type{offset}="{oid_type}"'.format( offset=offset, oid_type=name_type ) - translated_mib_string = self.mib_translator(var_bind) + translated_mib_string, parsed_index = self.mib_translator(var_bind) if translated_mib_string: translated_mib_string = '{translated_oid}="{translated_value}"'.format( translated_oid=translated_mib_string.split("=")[0], @@ -329,7 +355,7 @@ def format_metric_data(self, var_bind, index=0): val_type = var_bind["val_type"] # mib translation for oid (val keep same for original, mib translation, custom translation) - translated_mib_string = self.mib_translator(var_bind) + translated_mib_string, parsed_index = self.mib_translator(var_bind) if translated_mib_string: translated_oid = translated_mib_string.split("=")[0] translated_val = translated_mib_string.split("=")[1] @@ -351,6 +377,8 @@ def format_metric_data(self, var_bind, index=0): metric_data["metric_type"] = val_type if custom_translated_oid: metric_data["custom_metric_name"] = custom_translated_oid + if parsed_index: + metric_data["parsed_index"] = parsed_index logger.debug(f"metric_data: {json.dumps(metric_data)}") return metric_data diff --git a/tests/local-config.yaml b/tests/local-config.yaml index 07a73768..aa2d3c4d 100644 --- a/tests/local-config.yaml +++ b/tests/local-config.yaml @@ -25,7 +25,4 @@ mongo: collection: "oids" mib: database: "files" - collection: "mib_files" - profile: - database: "profiles" - collection: "profiles" \ No newline at end of file + collection: "mib_files" \ No newline at end of file