lists.checkmk.com
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
List overview
Download
Checkmk git commits
May 2018
----- 2024 -----
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
checkmk-commits@lists.checkmk.com
10 participants
375 discussions
Start a n
N
ew thread
Various simplification/cleanups in SNMPTrapTranslator.
by Sven Panne
Module: check_mk Branch: master Commit: eb736e13fa5a7d070697713775e2f705faacba17 URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=eb736e13fa5a7d…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 14:42:34 2018 +0200 Various simplification/cleanups in SNMPTrapTranslator. Change-Id: Ief3bf64661208e0b7558150eea71c67bcb466d3a --- cmk/ec/main.py | 77 +++++++++++++++++++++++----------------------------------- 1 file changed, 31 insertions(+), 46 deletions(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index fa59317..68dacf5 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -552,61 +552,48 @@ class SNMPTrapEngine(object): class SNMPTrapTranslator(object): def __init__(self, settings, config, logger): super(SNMPTrapTranslator, self).__init__() - self._settings = settings - self._translation_mode = self._to_translation_mode(config["translate_snmptraps"]) self._logger = logger - self._mib_resolver = None - self._load_mibs() - - - # TODO: This should be in the valuespec, the current set of values is horrible. - @staticmethod - def _to_translation_mode(translation_config): + translation_config = config["translate_snmptraps"] if translation_config == False: - return "no_translation" - if translation_config == (True, {}): - return "translate" - if translation_config == (True, {'add_description': True}): - return "translate_with_description" - raise Exception("invalid SNMP trap translation") + self.translate = self._translate_simple + elif translation_config == (True, {}): + self._mib_resolver = self._construct_resolver(logger, settings.paths.compiled_mibs_dir.value, False) + self.translate = self._translate_via_mibs + elif translation_config == (True, {'add_description': True}): + self._mib_resolver = self._construct_resolver(logger, settings.paths.compiled_mibs_dir.value, True) + self.translate = self._translate_via_mibs + else: + raise Exception("invalid SNMP trap translation") - def _load_mibs(self): - if self._settings.options.snmptrap_udp is None or self._translation_mode == "no_translation": - return + @staticmethod + def _construct_resolver(logger, mibs_dir, load_texts): try: builder = pysnmp.smi.builder.MibBuilder() # manages python MIB modules # load MIBs from our compiled MIB and default MIB paths - builder.setMibSources(*[pysnmp.smi.builder.DirMibSource(str(self._settings.paths.compiled_mibs_dir.value))] + list(builder.getMibSources())) + builder.setMibSources(*[pysnmp.smi.builder.DirMibSource(str(mibs_dir))] + list(builder.getMibSources())) - # Indicate we wish to load DESCRIPTION and other texts from MIBs - builder.loadTexts = True + # Indicate if we wish to load DESCRIPTION and other texts from MIBs + builder.loadTexts = load_texts # This loads all or specified pysnmp MIBs into memory builder.loadModules() loaded_mib_module_names = builder.mibSymbols.keys() - self._logger.info('Loaded %d SNMP MIB modules' % len(loaded_mib_module_names)) - self._logger.verbose('Found modules: %s' % (', '.join(loaded_mib_module_names))) + logger.info('Loaded %d SNMP MIB modules' % len(loaded_mib_module_names)) + logger.verbose('Found modules: %s' % (', '.join(loaded_mib_module_names))) # This object maintains various indices built from MIBs data - self._mib_resolver = pysnmp.smi.view.MibViewController(builder) + return pysnmp.smi.view.MibViewController(builder) except pysnmp.smi.error.SmiError as e: - if self._settings.options.debug: - raise - self._logger.info("Exception while loading MIB modules. Proceeding without modules!") - self._logger.exception("Exception: %s" % e) - - - def translate(self, ipaddress, var_binds): - if self._translation_mode == "no_translation": - return self._translate_simple(var_binds) - return self._translate_via_mibs(ipaddress, var_binds) + logger.info("Exception while loading MIB modules. Proceeding without modules!") + logger.exception("Exception: %s" % e) + return None # Convert pysnmp datatypes to simply handable ones - def _translate_simple(self, var_bind_list): + def _translate_simple(self, ipaddress, var_bind_list): var_binds = [] for oid, value in var_bind_list: key = str(oid) @@ -667,23 +654,21 @@ class SNMPTrapTranslator(object): for oid, value in var_bind_list: try: node, translated_oid, translated_value = do_translate(oid, value) - - if hasattr(node, "getUnits"): - translated_value += ' ' + node.getUnits() - - if hasattr(node, "getDescription") and self._translation_mode == "translate_with_description": - translated_value += "(%s)" % node.getDescription() - - var_binds.append((translated_oid, translated_value)) - + units = node.getUnits() if hasattr(node, "getUnits") else "" + if units: + translated_value += ' %s' % units + description = node.getDescription() if hasattr(node, "getDescription") else "" + if description: + translated_value += "(%s)" % description except (pysnmp.smi.error.SmiError, pyasn1.error.ValueConstraintError) as e: self._logger.warning('Failed to translate OID %s (in trap from %s): %s ' '(enable debug logging for details)' % (oid.prettyPrint(), ipaddress, e)) self._logger.debug('Failed trap var binds:\n%s' % "\n".join(["%s: %r" % i for i in var_bind_list])) self._logger.debug(traceback.format_exc()) - - var_binds.append((str(oid), str(value))) # add untranslated + translated_oid = str(oid) + translated_value = str(value) + var_binds.append((translated_oid, translated_value)) return var_binds
6 years, 4 months
1
0
0
0
Bumped python version integration test
by Lars Michelsen
Module: check_mk Branch: master Commit: 8eb4a7266a94a2b915999f880284ad04f3b09dbf URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=8eb4a7266a94a2…
Author: Lars Michelsen <lm(a)mathias-kettner.de> Date: Wed May 2 14:47:02 2018 +0200 Bumped python version integration test Change-Id: Ia77e6ee917bd3607c1e2fefe9065f49a34eb4140 --- tests/integration/omd/test_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/omd/test_python.py b/tests/integration/omd/test_python.py index 50688de..17f05ac 100644 --- a/tests/integration/omd/test_python.py +++ b/tests/integration/omd/test_python.py @@ -20,7 +20,7 @@ def test_03_python_interpreter_version(site): p = site.execute(["python", "-V"], stderr=subprocess.PIPE) version = p.stderr.read() - assert version.startswith("Python 2.7.14") + assert version.startswith("Python 2.7.15") def test_03_python_path(site):
6 years, 4 months
1
0
0
0
Move even more stuff into SNMPTrapTranslator.
by Sven Panne
Module: check_mk Branch: master Commit: b9ac1ef17ddf188bbf0ef132c21d11c5e179c53c URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b9ac1ef17ddf18…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 13:39:01 2018 +0200 Move even more stuff into SNMPTrapTranslator. Change-Id: I70d226b597f73174183397ffc7fc62979bceb405 --- cmk/ec/main.py | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index a25bb79..fa59317 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -553,14 +553,26 @@ class SNMPTrapTranslator(object): def __init__(self, settings, config, logger): super(SNMPTrapTranslator, self).__init__() self._settings = settings - self._config = config + self._translation_mode = self._to_translation_mode(config["translate_snmptraps"]) self._logger = logger self._mib_resolver = None self._load_mibs() + # TODO: This should be in the valuespec, the current set of values is horrible. + @staticmethod + def _to_translation_mode(translation_config): + if translation_config == False: + return "no_translation" + if translation_config == (True, {}): + return "translate" + if translation_config == (True, {'add_description': True}): + return "translate_with_description" + raise Exception("invalid SNMP trap translation") + + def _load_mibs(self): - if self._settings.options.snmptrap_udp is None or not snmptrap_translation_enabled(self._config): + if self._settings.options.snmptrap_udp is None or self._translation_mode == "no_translation": return try: builder = pysnmp.smi.builder.MibBuilder() # manages python MIB modules @@ -587,8 +599,14 @@ class SNMPTrapTranslator(object): self._logger.exception("Exception: %s" % e) + def translate(self, ipaddress, var_binds): + if self._translation_mode == "no_translation": + return self._translate_simple(var_binds) + return self._translate_via_mibs(ipaddress, var_binds) + + # Convert pysnmp datatypes to simply handable ones - def convert_var_binds(self, var_bind_list): + def _translate_simple(self, var_bind_list): var_binds = [] for oid, value in var_bind_list: key = str(oid) @@ -628,10 +646,11 @@ class SNMPTrapTranslator(object): # Convert pysnmp datatypes to simply handable ones - def translate(self, ipaddress, var_bind_list): + def _translate_via_mibs(self, ipaddress, var_bind_list): var_binds = [] if self._mib_resolver is None: self._logger.warning('Failed to translate OIDs, no modules loaded (see above)') + # TODO: Fall back to _translate_simple? return [(str(oid), str(value)) for oid, value in var_bind_list] def do_translate(oid, value): @@ -652,9 +671,7 @@ class SNMPTrapTranslator(object): if hasattr(node, "getUnits"): translated_value += ' ' + node.getUnits() - if hasattr(node, "getDescription") \ - and type(self._config["translate_snmptraps"]) == tuple \ - and "add_description" in self._config["translate_snmptraps"][1]: + if hasattr(node, "getDescription") and self._translation_mode == "translate_with_description": translated_value += "(%s)" % node.getDescription() var_binds.append((translated_oid, translated_value)) @@ -1581,14 +1598,8 @@ class EventServer(ECServerThread): def handle_snmptrap(self, snmp_engine, state_reference, context_engine_id, context_name, var_binds, cb_ctx): ipaddress = snmp_engine.getUserContext("sender_address")[0] - self.log_snmptrap_details(context_engine_id, context_name, var_binds, ipaddress) - - if snmptrap_translation_enabled(self._config): - trap = self._snmp_trap_translator.translate(ipaddress, var_binds) - else: - trap = self._snmp_trap_translator.convert_var_binds(var_binds) - + trap = self._snmp_trap_translator.translate(ipaddress, var_binds) event = self.create_event_from_trap(trap, ipaddress) self.process_event(event) @@ -5041,10 +5052,6 @@ def reload_configuration(settings, event_status, event_server, status_server, sl logger.info("Reloaded configuration.") -def snmptrap_translation_enabled(config): - return config["translate_snmptraps"] is not False - - #. # .--Main----------------------------------------------------------------. # | __ __ _ |
6 years, 4 months
1
0
0
0
Moved more methods to SNMPTrapTranslator.
by Sven Panne
Module: check_mk Branch: master Commit: 39d8e642b1f53a31ec9184e1a812a43ad507849d URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=39d8e642b1f53a…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 12:41:39 2018 +0200 Moved more methods to SNMPTrapTranslator. Change-Id: If1b2e6640867b22e1ffc5afef6300b91f06f68aa --- cmk/ec/main.py | 80 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index 65cba59..f5be9f5 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -588,6 +588,46 @@ class SNMPTrapTranslator(object): # Convert pysnmp datatypes to simply handable ones + def convert_var_binds(self, var_bind_list): + var_binds = [] + for oid, value in var_bind_list: + key = str(oid) + + if value.__class__.__name__ in ['ObjectIdentifier', 'IpAddress']: + val = value.prettyPrint() + elif value.__class__.__name__ == 'TimeTicks': + val = self._fmt_timeticks(value._value) + else: + val = value._value + + # Translate some standard SNMPv2 oids + if key == '1.3.6.1.2.1.1.3.0': + key = 'Uptime' + + var_binds.append((key, val)) + return var_binds + + + # Format time difference seconds into approximated human readable value + @staticmethod + def _fmt_timeticks(ticks): + secs = float(ticks) / 100 + if secs < 240: + return "%d sec" % secs + mins = secs / 60 + + if mins < 120: + return "%d min" % mins + + hours, mins = divmod(mins, 60) + if hours < 48: + return "%d hours, %d min" % (hours, mins) + + days, hours = divmod(hours, 24) + return "%d days, %d hours, %d min" % (days, hours, mins) + + + # Convert pysnmp datatypes to simply handable ones def translate(self, ipaddress, var_bind_list): var_binds = [] if self._mib_resolver is None: @@ -1530,44 +1570,6 @@ class EventServer(ECServerThread): #
http://www.outflux.net/blog/archives/2008/03/09/using-select-on-a-fifo/
return os.open(str(self.settings.paths.event_pipe.value), os.O_RDWR | os.O_NONBLOCK) - # Format time difference seconds into approximated - # human readable value - def fmt_timeticks(self, ticks): - secs = float(ticks) / 100 - if secs < 240: - return "%d sec" % secs - mins = secs / 60 - - if mins < 120: - return "%d min" % mins - - hours, mins = divmod(mins, 60) - if hours < 48: - return "%d hours, %d min" % (hours, mins) - - days, hours = divmod(hours, 24) - return "%d days, %d hours, %d min" % (days, hours, mins) - - # Convert pysnmp datatypes to simply handable ones - def snmptrap_convert_var_binds(self, var_bind_list): - var_binds = [] - for oid, value in var_bind_list: - key = str(oid) - - if value.__class__.__name__ in ['ObjectIdentifier', 'IpAddress']: - val = value.prettyPrint() - elif value.__class__.__name__ == 'TimeTicks': - val = self.fmt_timeticks(value._value) - else: - val = value._value - - # Translate some standard SNMPv2 oids - if key == '1.3.6.1.2.1.1.3.0': - key = 'Uptime' - - var_binds.append((key, val)) - return var_binds - # Receives an incoming SNMP trap from the socket and hands it over to PySNMP for parsing # and processing. PySNMP is calling self.handle_snmptrap back. def process_snmptrap(self, message, sender_address): @@ -1585,7 +1587,7 @@ class EventServer(ECServerThread): if snmptrap_translation_enabled(self._config): trap = self._snmp_trap_translator.translate(ipaddress, var_binds) else: - trap = self.snmptrap_convert_var_binds(var_binds) + trap = self._snmp_trap_translator.convert_var_binds(var_binds) event = self.create_event_from_trap(trap, ipaddress) self.process_event(event)
6 years, 4 months
1
0
0
0
Show initial tree in inventory history
by Simon Betz
Module: check_mk Branch: master Commit: f50e118dcef44aa5f23d71d7770c3345a2ec9c58 URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=f50e118dcef44a…
Author: Simon Betz <si(a)mathias-kettner.de> Date: Tue May 1 11:05:31 2018 +0200 Show initial tree in inventory history Change-Id: I6dc374afd2c91eb5c5ee8c3ab993edb6fb69c3f1 --- web/htdocs/inventory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/htdocs/inventory.py b/web/htdocs/inventory.py index 5fe8547..ccc0a95 100644 --- a/web/htdocs/inventory.py +++ b/web/htdocs/inventory.py @@ -160,7 +160,7 @@ def get_history(hostname): except: return [] # No inventory for this host else: - history = [(timestamp, inventory_tree)] + history = [(0, StructuredDataTree()), (timestamp, inventory_tree)] inventory_archive_dir = "%s/inventory_archive/%s" % (cmk.paths.var_dir, hostname) if os.path.exists(inventory_archive_dir):
6 years, 4 months
1
0
0
0
De-obfuscate naming.
by Sven Panne
Module: check_mk Branch: master Commit: d5701e6c468e2ec34a5ecf5b482a4b0aa44f241e URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=d5701e6c468e2e…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 12:38:57 2018 +0200 De-obfuscate naming. Change-Id: I854515407c1bdc947d4bb299f7d543ed40800db8 --- cmk/ec/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index 428d030..65cba59 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -594,7 +594,7 @@ class SNMPTrapTranslator(object): self._logger.warning('Failed to translate OIDs, no modules loaded (see above)') return [(str(oid), str(value)) for oid, value in var_bind_list] - def translate(oid, value): + def do_translate(oid, value): # Disable mib_var[0] type detection # pylint: disable=no-member mib_var = pysnmp.smi.rfc1902.ObjectType(pysnmp.smi.rfc1902.ObjectIdentity(oid), value).resolveWithMib(self._mib_resolver) @@ -607,7 +607,7 @@ class SNMPTrapTranslator(object): for oid, value in var_bind_list: try: - node, translated_oid, translated_value = translate(oid, value) + node, translated_oid, translated_value = do_translate(oid, value) if hasattr(node, "getUnits"): translated_value += ' ' + node.getUnits()
6 years, 4 months
1
0
0
0
Fixed logging message.
by Sven Panne
Module: check_mk Branch: master Commit: 3bdc3d2de1ef3630403dbee101b5e18277c2142a URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=3bdc3d2de1ef36…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 12:46:47 2018 +0200 Fixed logging message. Change-Id: I21a0cde159cf806616c5a0a5db86000db5f4a30f --- cmk/ec/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index f5be9f5..a25bb79 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -1750,7 +1750,7 @@ class EventServer(ECServerThread): self.process_raw_data(lambda: self.process_snmptrap(message, sender_address)) except Exception: self.logger.exception('Exception handling a SNMP trap from "%s". Skipping this one' % - (data[1][0])) + sender_address[0]) try: # process the first spool file we get
6 years, 4 months
1
0
0
0
Moved snmptrap_translate_varbinds from EventServer to SNMPTrapTranslator.
by Sven Panne
Module: check_mk Branch: master Commit: 02cd9791cac0ee7c7b7f248bd89bb4f0c017bb6e URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=02cd9791cac0ee…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 12:31:28 2018 +0200 Moved snmptrap_translate_varbinds from EventServer to SNMPTrapTranslator. Change-Id: If2cbeded345f11c3ab13d0935f35e483fe6c2e86 --- cmk/ec/main.py | 96 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index 5057b88..428d030 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -555,10 +555,11 @@ class SNMPTrapTranslator(object): self._settings = settings self._config = config self._logger = logger - self.mib_resolver = None + self._mib_resolver = None + self._load_mibs() - def load_mibs(self): + def _load_mibs(self): if self._settings.options.snmptrap_udp is None or not snmptrap_translation_enabled(self._config): return try: @@ -578,7 +579,7 @@ class SNMPTrapTranslator(object): self._logger.verbose('Found modules: %s' % (', '.join(loaded_mib_module_names))) # This object maintains various indices built from MIBs data - self.mib_resolver = pysnmp.smi.view.MibViewController(builder) + self._mib_resolver = pysnmp.smi.view.MibViewController(builder) except pysnmp.smi.error.SmiError as e: if self._settings.options.debug: raise @@ -586,6 +587,50 @@ class SNMPTrapTranslator(object): self._logger.exception("Exception: %s" % e) + # Convert pysnmp datatypes to simply handable ones + def translate(self, ipaddress, var_bind_list): + var_binds = [] + if self._mib_resolver is None: + self._logger.warning('Failed to translate OIDs, no modules loaded (see above)') + return [(str(oid), str(value)) for oid, value in var_bind_list] + + def translate(oid, value): + # Disable mib_var[0] type detection + # pylint: disable=no-member + mib_var = pysnmp.smi.rfc1902.ObjectType(pysnmp.smi.rfc1902.ObjectIdentity(oid), value).resolveWithMib(self._mib_resolver) + + node = mib_var[0].getMibNode() + translated_oid = mib_var[0].prettyPrint().replace("\"", "") + translated_value = mib_var[1].prettyPrint() + + return node, translated_oid, translated_value + + for oid, value in var_bind_list: + try: + node, translated_oid, translated_value = translate(oid, value) + + if hasattr(node, "getUnits"): + translated_value += ' ' + node.getUnits() + + if hasattr(node, "getDescription") \ + and type(self._config["translate_snmptraps"]) == tuple \ + and "add_description" in self._config["translate_snmptraps"][1]: + translated_value += "(%s)" % node.getDescription() + + var_binds.append((translated_oid, translated_value)) + + except (pysnmp.smi.error.SmiError, pyasn1.error.ValueConstraintError) as e: + self._logger.warning('Failed to translate OID %s (in trap from %s): %s ' + '(enable debug logging for details)' % + (oid.prettyPrint(), ipaddress, e)) + self._logger.debug('Failed trap var binds:\n%s' % "\n".join(["%s: %r" % i for i in var_bind_list])) + self._logger.debug(traceback.format_exc()) + + var_binds.append((str(oid), str(value))) # add untranslated + + return var_binds + + #. # .--Timeperiods---------------------------------------------------------. # | _____ _ _ _ | @@ -1523,49 +1568,6 @@ class EventServer(ECServerThread): var_binds.append((key, val)) return var_binds - # Convert pysnmp datatypes to simply handable ones - def snmptrap_translate_varbinds(self, ipaddress, var_bind_list): - var_binds = [] - if self._snmp_trap_translator.mib_resolver is None: - self.logger.warning('Failed to translate OIDs, no modules loaded (see above)') - return [(str(oid), str(value)) for oid, value in var_bind_list] - - def translate(oid, value): - # Disable mib_var[0] type detection - # pylint: disable=no-member - mib_var = pysnmp.smi.rfc1902.ObjectType(pysnmp.smi.rfc1902.ObjectIdentity(oid), value).resolveWithMib(self._snmp_trap_translator.mib_resolver) - - node = mib_var[0].getMibNode() - translated_oid = mib_var[0].prettyPrint().replace("\"", "") - translated_value = mib_var[1].prettyPrint() - - return node, translated_oid, translated_value - - for oid, value in var_bind_list: - try: - node, translated_oid, translated_value = translate(oid, value) - - if hasattr(node, "getUnits"): - translated_value += ' ' + node.getUnits() - - if hasattr(node, "getDescription") \ - and type(self._config["translate_snmptraps"]) == tuple \ - and "add_description" in self._config["translate_snmptraps"][1]: - translated_value += "(%s)" % node.getDescription() - - var_binds.append((translated_oid, translated_value)) - - except (pysnmp.smi.error.SmiError, pyasn1.error.ValueConstraintError) as e: - self.logger.warning('Failed to translate OID %s (in trap from %s): %s ' - '(enable debug logging for details)' % - (oid.prettyPrint(), ipaddress, e)) - self.logger.debug('Failed trap var binds:\n%s' % "\n".join(["%s: %r" % i for i in var_bind_list])) - self.logger.debug(traceback.format_exc()) - - var_binds.append((str(oid), str(value))) # add untranslated - - return var_binds - # Receives an incoming SNMP trap from the socket and hands it over to PySNMP for parsing # and processing. PySNMP is calling self.handle_snmptrap back. def process_snmptrap(self, message, sender_address): @@ -1581,7 +1583,7 @@ class EventServer(ECServerThread): self.log_snmptrap_details(context_engine_id, context_name, var_binds, ipaddress) if snmptrap_translation_enabled(self._config): - trap = self.snmptrap_translate_varbinds(ipaddress, var_binds) + trap = self._snmp_trap_translator.translate(ipaddress, var_binds) else: trap = self.snmptrap_convert_var_binds(var_binds)
6 years, 4 months
1
0
0
0
Moved load_mibs into a new class.
by Sven Panne
Module: check_mk Branch: master Commit: 2f99e27b991eb725613674c2b24548d13f92af39 URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2f99e27b991eb7…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 11:59:15 2018 +0200 Moved load_mibs into a new class. Change-Id: Iedee6c71b2b8ddbac387a3fe8b601616860e2031 --- cmk/ec/main.py | 74 +++++++++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index 3d58fa6..5057b88 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -548,6 +548,44 @@ class SNMPTrapEngine(object): priv_proto, priv_key, securityEngineId=pysnmp.proto.api.v2c.OctetString(hexValue=engine_id)) + +class SNMPTrapTranslator(object): + def __init__(self, settings, config, logger): + super(SNMPTrapTranslator, self).__init__() + self._settings = settings + self._config = config + self._logger = logger + self.mib_resolver = None + + + def load_mibs(self): + if self._settings.options.snmptrap_udp is None or not snmptrap_translation_enabled(self._config): + return + try: + builder = pysnmp.smi.builder.MibBuilder() # manages python MIB modules + + # load MIBs from our compiled MIB and default MIB paths + builder.setMibSources(*[pysnmp.smi.builder.DirMibSource(str(self._settings.paths.compiled_mibs_dir.value))] + list(builder.getMibSources())) + + # Indicate we wish to load DESCRIPTION and other texts from MIBs + builder.loadTexts = True + + # This loads all or specified pysnmp MIBs into memory + builder.loadModules() + + loaded_mib_module_names = builder.mibSymbols.keys() + self._logger.info('Loaded %d SNMP MIB modules' % len(loaded_mib_module_names)) + self._logger.verbose('Found modules: %s' % (', '.join(loaded_mib_module_names))) + + # This object maintains various indices built from MIBs data + self.mib_resolver = pysnmp.smi.view.MibViewController(builder) + except pysnmp.smi.error.SmiError as e: + if self._settings.options.debug: + raise + self._logger.info("Exception while loading MIB modules. Proceeding without modules!") + self._logger.exception("Exception: %s" % e) + + #. # .--Timeperiods---------------------------------------------------------. # | _____ _ _ _ | @@ -1270,7 +1308,6 @@ class EventServer(ECServerThread): self._syslog = None self._syslog_tcp = None self._snmptrap = None - self._mib_resolver = None self._rules = [] self._hash_stats = [] @@ -1288,7 +1325,7 @@ class EventServer(ECServerThread): self.open_syslog_tcp() self.open_snmptrap() self._snmp_trap_engine = SNMPTrapEngine(self.settings, self._config, self.handle_snmptrap) - self._load_mibs() + self._snmp_trap_translator = SNMPTrapTranslator(self.settings, self._config, self.logger) @classmethod def status_columns(cls): @@ -1448,33 +1485,6 @@ class EventServer(ECServerThread): #
http://www.outflux.net/blog/archives/2008/03/09/using-select-on-a-fifo/
return os.open(str(self.settings.paths.event_pipe.value), os.O_RDWR | os.O_NONBLOCK) - def _load_mibs(self): - if self.settings.options.snmptrap_udp is None or not snmptrap_translation_enabled(self._config): - return - try: - builder = pysnmp.smi.builder.MibBuilder() # manages python MIB modules - - # load MIBs from our compiled MIB and default MIB paths - builder.setMibSources(*[pysnmp.smi.builder.DirMibSource(str(self.settings.paths.compiled_mibs_dir.value))] + list(builder.getMibSources())) - - # Indicate we wish to load DESCRIPTION and other texts from MIBs - builder.loadTexts = True - - # This loads all or specified pysnmp MIBs into memory - builder.loadModules() - - loaded_mib_module_names = builder.mibSymbols.keys() - self.logger.info('Loaded %d SNMP MIB modules' % len(loaded_mib_module_names)) - self.logger.verbose('Found modules: %s' % (', '.join(loaded_mib_module_names))) - - # This object maintains various indices built from MIBs data - self._mib_resolver = pysnmp.smi.view.MibViewController(builder) - except pysnmp.smi.error.SmiError as e: - if self.settings.options.debug: - raise - self.logger.info("Exception while loading MIB modules. Proceeding without modules!") - self.logger.exception("Exception: %s" % e) - # Format time difference seconds into approximated # human readable value def fmt_timeticks(self, ticks): @@ -1516,14 +1526,14 @@ class EventServer(ECServerThread): # Convert pysnmp datatypes to simply handable ones def snmptrap_translate_varbinds(self, ipaddress, var_bind_list): var_binds = [] - if self._mib_resolver is None: + if self._snmp_trap_translator.mib_resolver is None: self.logger.warning('Failed to translate OIDs, no modules loaded (see above)') return [(str(oid), str(value)) for oid, value in var_bind_list] def translate(oid, value): # Disable mib_var[0] type detection # pylint: disable=no-member - mib_var = pysnmp.smi.rfc1902.ObjectType(pysnmp.smi.rfc1902.ObjectIdentity(oid), value).resolveWithMib(self._mib_resolver) + mib_var = pysnmp.smi.rfc1902.ObjectType(pysnmp.smi.rfc1902.ObjectIdentity(oid), value).resolveWithMib(self._snmp_trap_translator.mib_resolver) node = mib_var[0].getMibNode() translated_oid = mib_var[0].prettyPrint().replace("\"", "") @@ -2025,7 +2035,7 @@ class EventServer(ECServerThread): def reload_configuration(self, config): self._config = config self._snmp_trap_engine = SNMPTrapEngine(self.settings, self._config, self.handle_snmptrap) - self._load_mibs() + self._snmp_trap_translator = SNMPTrapTranslator(self.settings, self._config, self.logger) self.compile_rules(self._config["rules"], self._config["rule_packs"]) self.host_config.initialize()
6 years, 4 months
1
0
0
0
Moved a few global function into SNMPTrapEngine class.
by Sven Panne
Module: check_mk Branch: master Commit: b835b27b1449881971cb7ef47684a903a5fb5a51 URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=b835b27b144988…
Author: Sven Panne <sp(a)mathias-kettner.de> Date: Wed May 2 11:39:06 2018 +0200 Moved a few global function into SNMPTrapEngine class. Change-Id: I1ce3a326567b152e65b40a95c2d0267f96722b0a --- cmk/ec/main.py | 134 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/cmk/ec/main.py b/cmk/ec/main.py index 02992a6..3d58fa6 100644 --- a/cmk/ec/main.py +++ b/cmk/ec/main.py @@ -478,73 +478,75 @@ class SNMPTrapEngine(object): if settings.options.snmptrap_udp is None: return self.snmp_engine = pysnmp.entity.engine.SnmpEngine() - initialize_snmp_credentials(config, self.snmp_engine) - self.snmp_receiver = SNMPTrapEngine.ECNotificationReceiver(self.snmp_engine, callback) - - -def auth_proto_for(proto_name): - if proto_name == "md5": - return pysnmp.entity.config.usmHMACMD5AuthProtocol - if proto_name == "sha": - return pysnmp.entity.config.usmHMACSHAAuthProtocol - raise Exception("Invalid SNMP auth protocol: %s" % proto_name) - - -def priv_proto_for(proto_name): - if proto_name == "DES": - return pysnmp.entity.config.usmDESPrivProtocol - if proto_name == "AES": - return pysnmp.entity.config.usmAesCfb128Protocol - raise Exception("Invalid SNMP priv protocol: %s" % proto_name) - - -def initialize_snmp_credentials(config, snmp_engine): - user_num = 0 - for spec in config["snmp_credentials"]: - credentials = spec["credentials"] - user_num += 1 - - # SNMPv1/v2 - if type(credentials) != tuple: - community_index = 'snmpv2-%d' % user_num - logger.info("adding SNMPv1 system: communityIndex=%s" % community_index) - pysnmp.entity.config.addV1System(snmp_engine, community_index, credentials) - continue + self._initialize_snmp_credentials(config) + self._snmp_receiver = SNMPTrapEngine.ECNotificationReceiver(self.snmp_engine, callback) + + + @staticmethod + def _auth_proto_for(proto_name): + if proto_name == "md5": + return pysnmp.entity.config.usmHMACMD5AuthProtocol + if proto_name == "sha": + return pysnmp.entity.config.usmHMACSHAAuthProtocol + raise Exception("Invalid SNMP auth protocol: %s" % proto_name) + + + @staticmethod + def _priv_proto_for(proto_name): + if proto_name == "DES": + return pysnmp.entity.config.usmDESPrivProtocol + if proto_name == "AES": + return pysnmp.entity.config.usmAesCfb128Protocol + raise Exception("Invalid SNMP priv protocol: %s" % proto_name) + + + def _initialize_snmp_credentials(self, config): + user_num = 0 + for spec in config["snmp_credentials"]: + credentials = spec["credentials"] + user_num += 1 + + # SNMPv1/v2 + if type(credentials) != tuple: + community_index = 'snmpv2-%d' % user_num + logger.info("adding SNMPv1 system: communityIndex=%s" % community_index) + pysnmp.entity.config.addV1System(self.snmp_engine, community_index, credentials) + continue - # SNMPv3 - securityLevel = credentials[0] - if securityLevel == "noAuthNoPriv": - user_id = credentials[1] - auth_proto = pysnmp.entity.config.usmNoAuthProtocol - auth_key = None - priv_proto = pysnmp.entity.config.usmNoPrivProtocol - priv_key = None - elif securityLevel == "authNoPriv": - user_id = credentials[2] - auth_proto = auth_proto_for(credentials[1]) - auth_key = credentials[3] - priv_proto = pysnmp.entity.config.usmNoPrivProtocol - priv_key = None - elif securityLevel == "authPriv": - user_id = credentials[2] - auth_proto = auth_proto_for(credentials[1]) - auth_key = credentials[3] - priv_proto = priv_proto_for(credentials[4]) - priv_key = credentials[5] - else: - raise Exception("Invalid SNMP security level: %s" % securityLevel) - - for engine_id in spec.get("engine_ids", []): - logger.info("adding SNMPv3 user: userName=%s, authProtocol=%s, privProtocol=%s, securityEngineId=%s" % - (user_id, - ".".join(str(i) for i in auth_proto), - ".".join(str(i) for i in priv_proto), - engine_id)) - pysnmp.entity.config.addV3User( - snmp_engine, user_id, - auth_proto, auth_key, - priv_proto, priv_key, - securityEngineId=pysnmp.proto.api.v2c.OctetString(hexValue=engine_id)) + # SNMPv3 + securityLevel = credentials[0] + if securityLevel == "noAuthNoPriv": + user_id = credentials[1] + auth_proto = pysnmp.entity.config.usmNoAuthProtocol + auth_key = None + priv_proto = pysnmp.entity.config.usmNoPrivProtocol + priv_key = None + elif securityLevel == "authNoPriv": + user_id = credentials[2] + auth_proto = self._auth_proto_for(credentials[1]) + auth_key = credentials[3] + priv_proto = pysnmp.entity.config.usmNoPrivProtocol + priv_key = None + elif securityLevel == "authPriv": + user_id = credentials[2] + auth_proto = self._auth_proto_for(credentials[1]) + auth_key = credentials[3] + priv_proto = self._priv_proto_for(credentials[4]) + priv_key = credentials[5] + else: + raise Exception("Invalid SNMP security level: %s" % securityLevel) + + for engine_id in spec.get("engine_ids", []): + logger.info("adding SNMPv3 user: userName=%s, authProtocol=%s, privProtocol=%s, securityEngineId=%s" % + (user_id, + ".".join(str(i) for i in auth_proto), + ".".join(str(i) for i in priv_proto), + engine_id)) + pysnmp.entity.config.addV3User( + self.snmp_engine, user_id, + auth_proto, auth_key, + priv_proto, priv_key, + securityEngineId=pysnmp.proto.api.v2c.OctetString(hexValue=engine_id)) #. # .--Timeperiods---------------------------------------------------------.
6 years, 4 months
1
0
0
0
← Newer
1
...
34
35
36
37
38
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Results per page:
10
25
50
100
200