From 25dff4ff6b1cd1c7b950f391aba67b32f43be204 Mon Sep 17 00:00:00 2001 From: OMD site cmk16x <thl-cmk@outlook.com> Date: Fri, 3 Apr 2020 15:48:05 +0200 Subject: [PATCH] update project --- checks/iferrordetails | 251 ++++++++++++++++++++++++++ iferrordetails.mkp | Bin 0 -> 3436 bytes packages/iferrordetails | 11 ++ web/plugins/metrics/iferrordetails.py | 145 +++++++++++++++ 4 files changed, 407 insertions(+) create mode 100644 checks/iferrordetails create mode 100644 iferrordetails.mkp create mode 100644 packages/iferrordetails create mode 100644 web/plugins/metrics/iferrordetails.py diff --git a/checks/iferrordetails b/checks/iferrordetails new file mode 100644 index 0000000..832242d --- /dev/null +++ b/checks/iferrordetails @@ -0,0 +1,251 @@ +#!/usr/bin/python +# -*- encoding: utf-8; py-indent-offset: 4 -*- +# +# Interface error details +# +# Author: Th.L. +# Date : 2020-04-03 +# +# Monitor error details of ethernet like interfaces +# Please use only for troubleshooting purposes +# +# +# snmpwalk sample +# +# OMD[mysite]:~$ snmpwalk -v2c -c public isr-1100 -ObentU 1.3.6.1.2.1.10.7.10.1 +# +# +# OMD[mysite]:~$ snmpwalk -v2c -c public isr-1100 -m EtherLike-MIB 1.3.6.1.2.1.10.7.10.1 +# +# +# sample info +# + + + +factory_settings['iferrordetails_defaults'] = { + 'notFound': 3, +} + + +########################################################################### +# +# DATA Parser function +# +########################################################################### + + +def parse_iferrordetails(info): + def get_dot3StatsDuplexStatus(st): + name = { + 1: 'unknown', + 2: 'half duplex', + 3: 'full duplex', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + def get_dot3StatsRateControlAbility(st): + name = { + 1: 'capable', + 2: 'non capable', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + def get_dot3StatsRateControlStatus(st): + name = { + 1: 'off', + 2: 'on', + 3: 'unkown', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + def get_ifOperStatus(st): + name = { + 1: 'up', + 2: 'down', + 3: 'testing', + 4: 'unknown', + 5: 'dormant', + 6: 'notPresent', + 7: 'lowerLayerDown', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + + def get_short_if_name(st): + names = {'ethernet': 'Eth', + 'fastethernet': 'Fa', + 'gigabitethernet': 'Gi', + 'tengigabitethernet': 'Te', + 'fortygigabitethernet': 'Fo', + 'hundredgigabitethernet': 'Hu', + 'port-channel': 'Po', + 'tunnel': 'Tu', + 'loopback': 'Lo', + 'wlan-gigabitethernet': 'Wlan-Gi', + } + for item in names.keys(): + if st.lower().startswith(item): + st = st.lower().replace(item, names.get(item)) + return st + + errorDetailsList, interfaces = info + + parsed = {} + + for entry in errorDetailsList: + ifIndex, dot3StatsAlignmentErrors, dot3StatsFCSErrors, dot3StatsSingleCollisionFrames, \ + dot3StatsMultipleCollisionFrames, dot3StatsSQETestErrors, dot3StatsDeferredTransmissions, \ + dot3StatsLateCollisions, dot3StatsExcessiveCollisions, dot3StatsInternalMacTransmitErr, \ + dot3StatsCarrierSenseErrors, dot3StatsFrameTooLongs, dot3StatsInternalMacReceiveErrors, \ + dot3StatsSymbolErrors, dot3StatsDuplexStatus, dot3StatsRateControlAbility, \ + dot3StatsRateControlStatus = entry + + for interface in interfaces: + if ifIndex == interface[0]: + ifIndex, ifName, ifOperStatus = interface + + if int(ifOperStatus) != 1: + dot3StatsDuplexStatus ='interface not up' + else: + dot3StatsDuplexStatus = get_dot3StatsDuplexStatus(dot3StatsDuplexStatus) + + + + errorsDetails = { + 'dot3StatsAlignmentErrors': int(dot3StatsAlignmentErrors), + 'dot3StatsFCSErrors': int(dot3StatsFCSErrors), + 'dot3StatsSingleCollisionFrames': int(dot3StatsSingleCollisionFrames), + 'dot3StatsMultipleCollisionFrames': int(dot3StatsMultipleCollisionFrames), + 'dot3StatsSQETestErrors': int(dot3StatsSQETestErrors), + 'dot3StatsDeferredTransmissions': int(dot3StatsDeferredTransmissions), + 'dot3StatsLateCollisions': int(dot3StatsLateCollisions), + 'dot3StatsExcessiveCollisions': int(dot3StatsExcessiveCollisions), + 'dot3StatsInternalMacTransmitErr': int(dot3StatsInternalMacTransmitErr), + 'dot3StatsCarrierSenseErrors': int(dot3StatsCarrierSenseErrors), + 'dot3StatsFrameTooLongs': int(dot3StatsFrameTooLongs), + 'dot3StatsInternalMacReceiveErrors': int(dot3StatsInternalMacReceiveErrors), + 'dot3StatsSymbolErrors': int(dot3StatsSymbolErrors), + 'dot3StatsDuplexStatus': dot3StatsDuplexStatus, + 'dot3StatsRateControlAbility': get_dot3StatsRateControlAbility(dot3StatsRateControlAbility), + 'dot3StatsRateControlStatus': get_dot3StatsRateControlStatus(dot3StatsRateControlStatus), + 'ifOperStatus': get_ifOperStatus(ifOperStatus), + } + + parsed.update({'{}'.format(get_short_if_name(ifName)): errorsDetails}) + + return parsed + + +########################################################################### +# +# INVENTORY function +# +########################################################################### + + +def inventory_iferrordetails(parsed): + for entry in parsed.keys(): + yield entry, {} + + +########################################################################### +# +# CHECK function +# +########################################################################### + + +def check_iferrordetails(item, params, parsed): + + if item in parsed.keys(): + + errorDetails = parsed[item] + longoutput = '' + infotext = '' + perfdata = [] + state = 0 + + infotext += 'Interface state: {}'.format(errorDetails['ifOperStatus']) + if errorDetails['ifOperStatus'].lower() == 'up': + infotext += ', duplex state: {}'.format(errorDetails['dot3StatsDuplexStatus']) + + longoutput += '\nRate control: {}'.format( errorDetails['dot3StatsRateControlAbility']) + longoutput += '\nRate control state: {}'.format(errorDetails['dot3StatsRateControlStatus']) + + perfdata = [ + ('dot3statsalignmenterrors', errorDetails['dot3StatsAlignmentErrors']), + ('dot3statsfcserrors', errorDetails['dot3StatsFCSErrors']), + ('dot3statssinglecollisionframes', errorDetails['dot3StatsSingleCollisionFrames']), + ('dot3statsmultiplecollisionframes', errorDetails['dot3StatsMultipleCollisionFrames']), + ('dot3statssqetesterrors', errorDetails['dot3StatsSQETestErrors']), + ('dot3statsdeferredtransmissions', errorDetails['dot3StatsDeferredTransmissions']), + ('dot3statslatecollisions', errorDetails['dot3StatsLateCollisions']), + ('dot3statsexcessivecollisions', errorDetails['dot3StatsExcessiveCollisions']), + ('dot3statsinternalmactransmiterr', errorDetails['dot3StatsInternalMacTransmitErr']), + ('dot3statscarriersenseerrors', errorDetails['dot3StatsCarrierSenseErrors']), + ('dot3statsframetoolongs', errorDetails['dot3StatsFrameTooLongs']), + ('dot3statsinternalmacreceiveerrors', errorDetails['dot3StatsInternalMacReceiveErrors']), + ('dot3statssymbolerrors', errorDetails['dot3StatsSymbolErrors']), + ] + + yield state, infotext + longoutput, perfdata + + else: + yield params['notFound'], 'item missing' + + +########################################################################### +# +# CHECK info +# +########################################################################### + + +check_info['iferrordetails'] = { + 'check_function': check_iferrordetails, + 'inventory_function': inventory_iferrordetails, + 'service_description': 'Error details %s', + 'has_perfdata': True, + 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.10.7.10.1.1') != '', # EtherLike-MIB::dot3PauseAdminMode + 'group': 'iferrordetails', + 'default_levels_variable': 'iferrordetails_defaults', + 'parse_function': parse_iferrordetails, + 'snmp_info': [('.1.3.6.1.2.1.10.7.2.1', [ # EtherLike-MIB::dot3StatsEntry + OID_END, # ifIndex + '2', # dot3StatsAlignmentErrors(2) + '3', # dot3StatsFCSErrors(3) + '4', # dot3StatsSingleCollisionFrames(4) + '5', # dot3StatsMultipleCollisionFrames(5) + '6', # dot3StatsSQETestErrors(6) + '7', # dot3StatsDeferredTransmissions(7) + '8', # dot3StatsLateCollisions(8) + '9', # dot3StatsExcessiveCollisions(9) + '10', # dot3StatsInternalMacTransmitErrors(10) + '11', # dot3StatsCarrierSenseErrors(11) + '13', # dot3StatsFrameTooLongs(13) + '16', # dot3StatsInternalMacReceiveErrors(16) + '18', # dot3StatsSymbolErrors(18) + '19', # dot3StatsDuplexStatus(19) + '20', # dot3StatsRateControlAbility(20) + '21', # dot3StatsRateControlStatus(21) + ]), + ('.1.3.6.1.2.1.2.2.1', ['1', # ifIndex + '2', # ifDescr + '8', # ifOperStatus + ]), + ] +} + diff --git a/iferrordetails.mkp b/iferrordetails.mkp new file mode 100644 index 0000000000000000000000000000000000000000..b218b10a4d2172fb0658777290403f111446efaa GIT binary patch literal 3436 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 literal 0 HcmV?d00001 diff --git a/packages/iferrordetails b/packages/iferrordetails new file mode 100644 index 0000000..b6373da --- /dev/null +++ b/packages/iferrordetails @@ -0,0 +1,11 @@ +{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)', + 'description': u'Monitors interfaces error details\nPlease use only for troubleshooting purposes', + 'download_url': 'https://thl-cmk.hopto.org', + 'files': {'checks': ['iferrordetails'], + 'web': ['plugins/metrics/iferrordetails.py']}, + 'name': 'iferrordetails', + 'num_files': 2, + 'title': u'CInterface error details', + 'version': '20200403.v0.0.1', + 'version.min_required': '1.2.8b8', + 'version.packaged': '1.6.0p8'} \ No newline at end of file diff --git a/web/plugins/metrics/iferrordetails.py b/web/plugins/metrics/iferrordetails.py new file mode 100644 index 0000000..80fb0dd --- /dev/null +++ b/web/plugins/metrics/iferrordetails.py @@ -0,0 +1,145 @@ +#!/usr/bin/python +# -*- encoding: utf-8; py-indent-offset: 4 -*- +# +# Interface error details metrics plugin +# +# Author: Th.L. +# Date : 2020-04-03 +# + +##################################################################################################################### +# +# define units +# +##################################################################################################################### + + +###################################################################################################################### +# +# map perfdata to metric, not really necessary but makes sure to use the right metrics +# +###################################################################################################################### + + +check_metrics['check_mk-iferrordetails'] = { + 'dot3statsalignmenterrors': {'name': 'iferrordetails_dot3statsalignmenterrors',}, + 'dot3statsfcserrors': {'name': 'iferrordetails_dot3statsfcserrors',}, + 'dot3statssinglecollisionframes': {'name': 'iferrordetails_dot3statssinglecollisionframes',}, + 'dot3statsmultiplecollisionframes': {'name': 'iferrordetails_dot3statsmultiplecollisionframes',}, + 'dot3statssqetesterrors': {'name': 'iferrordetails_dot3statssqetesterrors',}, + 'dot3statsdeferredtransmissions': {'name': 'iferrordetails_dot3statsdeferredtransmissions',}, + 'dot3statslatecollisions': {'name': 'iferrordetails_dot3statslatecollisions',}, + 'dot3statsexcessivecollisions': {'name': 'iferrordetails_dot3statsexcessivecollisions',}, + 'dot3statsinternalmactransmiterr': {'name': 'iferrordetails_dot3statsinternalmactransmiterr',}, + 'dot3statscarriersenseerrors': {'name': 'iferrordetails_dot3statscarriersenseerrors',}, + 'dot3statsframetoolongs': {'name': 'iferrordetails_dot3statsframetoolongs',}, + 'dot3statsinternalmacreceiveerrors': {'name': 'iferrordetails_dot3statsinternalmacreceiveerrors',}, + 'dot3statssymbolerrors': {'name': 'iferrordetails_dot3statssymbolerrors',}, +} + +##################################################################################################################### +# +# define metrics for perfdata +# +##################################################################################################################### + + +metric_info['iferrordetails_dot3statsalignmenterrors'] = { + 'title' : _('Alignment errors'), + 'unit' : 'count', + 'color' : '11/a', +} +metric_info['iferrordetails_dot3statsfcserrors'] = { + 'title' : _('FCS errors'), + 'unit' : 'count', + 'color' : '12/a', +} +metric_info['iferrordetails_dot3statssinglecollisionframes'] = { + 'title' : _('Single collision frames'), + 'unit' : 'count', + 'color' : '13/a', +} +metric_info['iferrordetails_dot3statsmultiplecollisionframes'] = { + 'title' : _('Multiple collision frames'), + 'unit' : 'count', + 'color' : '14/a', +} +metric_info['iferrordetails_dot3statssqetesterrors'] = { + 'title' : _('sqe test errors'), + 'unit' : 'count', + 'color' : '15/a', +} +metric_info['iferrordetails_dot3statsdeferredtransmissions'] = { + 'title' : _('Deferred transmissions'), + 'unit' : 'count', + 'color' : '16/a', +} +metric_info['iferrordetails_dot3statslatecollisions'] = { + 'title' : _('Late collisions'), + 'unit' : 'count', + 'color' : '21/a', +} +metric_info['iferrordetails_dot3statsexcessivecollisions'] = { + 'title' : _('Excessive collisions'), + 'unit' : 'count', + 'color' : '22/a', +} +metric_info['iferrordetails_dot3statsinternalmactransmiterr'] = { + 'title' : _('internal MAC transmit errors'), + 'unit' : 'count', + 'color' : '23/a', +} +metric_info['iferrordetails_dot3statscarriersenseerrors'] = { + 'title' : _('Sarrier sense errors'), + 'unit' : 'count', + 'color' : '24/a', +} +metric_info['iferrordetails_dot3statsframetoolongs'] = { + 'title' : _('Frame too long'), + 'unit' : 'count', + 'color' : '25/a', +} +metric_info['iferrordetails_dot3statsinternalmacreceiveerrors'] = { + 'title' : _('Internal MAC receive errors'), + 'unit' : 'count', + 'color' : '26/a', +} +metric_info['iferrordetails_dot3statssymbolerrors'] = { + 'title' : _('Symbol errors'), + 'unit' : 'count', + 'color' : '31/a', +} + + +###################################################################################################################### +# +# how to graph perdata +# +###################################################################################################################### + +graph_info.append({ + 'title': _('Interface error details'), + 'metrics': [ + ('iferrordetails_dot3statsalignmenterrors', 'line'), + ('iferrordetails_dot3statsfcserrors', 'line'), + ('iferrordetails_dot3statssinglecollisionframes', 'line'), + ('iferrordetails_dot3statsmultiplecollisionframes', 'line'), + ('iferrordetails_dot3statssqetesterrors', 'line'), + ('iferrordetails_dot3statsdeferredtransmissions', 'line'), + ('iferrordetails_dot3statslatecollisions', 'line'), + ('iferrordetails_dot3statsexcessivecollisions', 'line'), + ('iferrordetails_dot3statsinternalmactransmiterr', 'line'), + ('iferrordetails_dot3statscarriersenseerrors', 'line'), + ('iferrordetails_dot3statsframetoolongs', 'line'), + ('iferrordetails_dot3statsinternalmacreceiveerrors', 'line'), + ('iferrordetails_dot3statssymbolerrors', 'line'), + ], +}) + + +###################################################################################################################### +# +# define perf-o-meter +# +###################################################################################################################### + -- GitLab