From 8fc642a22604679effe4c5cd4afec643fd7c9997 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Mon, 20 Feb 2023 20:02:20 +0100 Subject: [PATCH] update project --- CHANGELOG | 1 + agent_based/cisco_cellular_lte.py | 4 +- cisco_cellular_lte.mkp | Bin 12066 -> 12234 bytes gui/metrics/cisco_cellular_lte.py | 113 ++++++++++++++++++ gui/views/inv_cisco_cellular_lte.py | 51 ++++++++ gui/wato/cisco_cellular_lte.py | 173 ++++++++++++++++++++++++++++ packages/cisco_cellular_lte | 13 +-- 7 files changed, 347 insertions(+), 8 deletions(-) create mode 100644 gui/metrics/cisco_cellular_lte.py create mode 100644 gui/views/inv_cisco_cellular_lte.py create mode 100644 gui/wato/cisco_cellular_lte.py diff --git a/CHANGELOG b/CHANGELOG index 315d5dd..ca0721b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,3 +4,4 @@ METRICS: fixed range for RSRP and RSRQ, added range for RSSI, added scalars for all 2022-11-16: added band as metric on special request METRICS: added graph for current band +2023-02-20: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk... diff --git a/agent_based/cisco_cellular_lte.py b/agent_based/cisco_cellular_lte.py index 238688e..489989a 100644 --- a/agent_based/cisco_cellular_lte.py +++ b/agent_based/cisco_cellular_lte.py @@ -14,6 +14,7 @@ # 2022-09-20: added WATO options # 2022-11-10: added upper_levels to perfdata for scalars in metrics # 2022-11-16: added band as metric on special request +# 2023-02-20: moved gui files from ~/local/share/check_mk/... to ~/local/lib/check_mk... # # sample snmpwalk # @@ -37,7 +38,8 @@ # SNR -> Signal to Noise Ratio # # for Values https://usatcorp.com/faqs/understanding-lte-signal-strength-values/ -# +# overview of all the quality metrics +# https://help.venntelecom.com/support/solutions/articles/44001930601-how-to-interpret-ec-io-sinr-rssi-rscp-rsrp-rsrq-parameters-in-2g-3g-lte-routers import time from dataclasses import dataclass diff --git a/cisco_cellular_lte.mkp b/cisco_cellular_lte.mkp index 675e4ddf337ca8f78d2107bc55bf2a605177a619..63ce79a563dbe8c4d118c0ec9a9b4ea20d466688 100644 GIT binary patch literal 12234 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 literal 12066 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 LCU}PshlKba^ga9L diff --git a/gui/metrics/cisco_cellular_lte.py b/gui/metrics/cisco_cellular_lte.py new file mode 100644 index 0000000..d469b91 --- /dev/null +++ b/gui/metrics/cisco_cellular_lte.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# License: GNU General Public License v2 +# +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2022-09-26 +# File : metrics/cisco_cellular_lte.py +# +# Cisco Cellular LTE metrics plugin +# +# 2022-11-10: fixed range for RSRP and RSRQ +# added range for RSSI +# added scalars for all +# 2022-11-16: added graph for current band +# +from cmk.gui.i18n import _ + +from cmk.gui.plugins.metrics.utils import ( + metric_info, + graph_info, + perfometer_info, + check_metrics, +) +check_metrics['check_mk-cisco_cellular'] = { + 'cisco_cellular_rsrp': {'auto_graph': False}, + 'cisco_cellular_rsrq': {'auto_graph': False}, + 'cisco_cellular_rssi': {'auto_graph': False}, + 'cisco_cellular_band': {'auto_graph': False}, +} + +metric_info['cisco_cellular_rsrp'] = { + 'title': _('RSRP'), + 'unit': 'dbm', + 'color': '22/a', +} +metric_info['cisco_cellular_rsrq'] = { + 'title': _('RSRQ'), + 'unit': 'db', + 'color': '32/a', +} +metric_info['cisco_cellular_rssi'] = { + 'title': _('RSSI'), + 'unit': 'dbm', + # 'unit': 'count', + 'color': '42/a', +} + +metric_info['cisco_cellular_band'] = { + 'title': _('Band'), + 'unit': 'count', + 'color': '12/b', +} + +graph_info['cisco_cellular.rsrp'] = { + 'title': _('Reference Signal Received Power (only with LTE)'), + 'metrics': [ + ('cisco_cellular_rsrp', 'area'), + ], + 'scalars': [ + ('cisco_cellular_rsrp:crit,-1,*', 'Critical'), + ('cisco_cellular_rsrp:warn,-1,*', 'Warning'), + ], + 'range': ('cisco_cellular_rsrp:max,-', 1), +} + +graph_info['cisco_cellular.rsrq'] = { + 'title': _('Reference Signal Received Quality (only with LTE)'), + 'metrics': [ + ('cisco_cellular_rsrq', 'area'), + ], + 'scalars': [ + ('cisco_cellular_rsrq:crit,-1,*', 'Critical'), + ('cisco_cellular_rsrq:warn,-1,*', 'Critical'), + ], + 'range': ('cisco_cellular_rsrq:max,-', 1), +} + +graph_info['cisco_cellular.rssi'] = { + 'title': _('Received Signal Strength Indicator'), + 'metrics': [ + ('cisco_cellular_rssi', 'area'), + ], + 'scalars': [ + ('cisco_cellular_rssi:crit,-1,*', 'Critical'), + ('cisco_cellular_rsrq:warn,-1,*', 'Critical'), + ], + 'range': ('cisco_cellular_rssi:max,-', 1) +} + +graph_info['cisco_cellular.band'] = { + 'title': _('Band'), + 'metrics': [ + ('cisco_cellular_band', 'area'), + ], + 'scalars': [ + ('13#2196F3', 'LTE'), + ('12#558B2F', 'WCDMA-2100'), + ('11#689F38', 'WCDMA-1900'), + ('10#7CB342', 'WCDMA-850'), + ('9#8BC34A', 'WCDMA-800'), + ('8#2E7D32', 'GSM-1900'), + ('7#388E3C', 'GSM-1800'), + ('6#43A047', 'GSM-900'), + ('5#4CAF50', 'GSM-850'), + ('4#F9A825', 'none'), + ('3#FFA000', 'invalid'), + ('2#FFB300', 'unknown'), + ('1#00ACC1', 'UMTS'), + ], + 'range': (0, 15) +} diff --git a/gui/views/inv_cisco_cellular_lte.py b/gui/views/inv_cisco_cellular_lte.py new file mode 100644 index 0000000..5906358 --- /dev/null +++ b/gui/views/inv_cisco_cellular_lte.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# License: GNU General Public License v2 +# +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2022-09-26 +# File : view/inv_cisco_cellular_lte.py +# +# 2023-02-20: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk... +# + +from cmk.gui.i18n import _ +from cmk.gui.plugins.views.utils import ( + inventory_displayhints, +) +from cmk.gui.plugins.views.inventory import declare_invtable_view + +inventory_displayhints.update({ + '.networking.cellular:': { + 'title': _('Cellular (LTE)'), + 'keyorder': [ + 'imei', + 'iccid', + 'imsi', + 'fsn', + 'network', + 'country', + 'apn', + 'service_type' + ], + 'view': 'invcellularlte_of_host', + }, + '.networking.cellular:*.iccid': {'short': _('ICC ID'), 'title': _('Integrated Circuit Card ID (ICC ID)')}, + '.networking.cellular:*.imei': {'short': _('IMEI'), 'title': _('International Mobile Equipment Identifier (IMEI)')}, + '.networking.cellular:*.imsi': {'short': _('IMSI'), + 'title': _('International Mobile Subscriber Identifier (IMSI)')}, + '.networking.cellular:*.msisdn': { + 'short': _('MSISDN'), + 'title': _('Mobile Subscriber Integrated Services Digital Network Number (MSISDN') + }, + '.networking.cellular:*.fsn': {'short': _('FSN'), 'title': _('Factory serial Number (FSN)')}, + '.networking.cellular:*.country': {'title': _('Country'), }, + '.networking.cellular:*.network': {'title': _('Network'), }, + '.networking.cellular:*.current_band': {'title': _('Current band'), }, + '.networking.cellular:*.apn': {'short': _('APN'), 'title': _('Access Point Name (APN)')}, + '.networking.cellular:*.service_type': {'title': _('Service type'), }, +}) + +declare_invtable_view('invcellularlte', '.networking.cellular:', _('Cellular (LTE)'), _('Cellular (LTE)')) diff --git a/gui/wato/cisco_cellular_lte.py b/gui/wato/cisco_cellular_lte.py new file mode 100644 index 0000000..9f3c1b4 --- /dev/null +++ b/gui/wato/cisco_cellular_lte.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# License: GNU General Public License v2 +# +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2022-09-20 +# File : wato/cisco_cellular_lte.py +# +# 2023-02-20: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk... +# + +from cmk.gui.i18n import _ +from cmk.gui.valuespec import ( + Dictionary, + TextAscii, + MonitoringState, + FixedValue, + Integer, + Tuple, + DropdownChoice, +) + +from cmk.gui.plugins.wato.utils import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersNetworking, + RulespecGroupCheckParametersDiscovery, + HostRulespec, +) + + +def _parameter_valuespec_cisco_cellular_lte(): + return Dictionary( + elements=[ + ('rsrp_levels_lower', + Tuple( + title=_('Lower levels for RSRP'), + help=_('Lower levels for RSRP (Reference Signal Received Power) in dBm'), + elements=[ + Integer(title=_('Warning below'), default_value=-103, unit=_('dBm')), + Integer(title=_('Critical below'), default_value=-112, unit=_('dBm')), + ])), + ('rsrq_levels_lower', + Tuple( + title=_('Lower levels for RSRQ'), + help=_('Lower levels for RSRQ (Reference Signal Received Quality) in dB'), + elements=[ + Integer(title=_('Warning below'), default_value=-9, unit=_('dB')), + Integer(title=_('Critical below'), default_value=-13, unit=_('dB')), + ])), + ('rssi_levels_lower', + Tuple( + title=_('Lower levels for RSSI'), + help=_('Lower levels for RSSI (Received Signal Strength Indicator) in dBm'), + elements=[ + Integer(title=_('Warning below'), default_value=-75, unit=_('dBm')), + Integer(title=_('Critical below'), default_value=-85, unit=_('dBm')), + ])), + ('expected_band', + DropdownChoice( + title=_('Expected Band'), + help=_('The expected cellular band.'), + default_value='12', + choices=[ + ('12', 'LTE'), + ('0', 'UMTS'), + ('11', 'WCDMA-2100'), + ('10', 'WCDMA-1900'), + ('9', 'WCDMA-850'), + ('8', 'WCDMA-800'), + ('7', 'GSM-1900'), + ('6', 'GSM-1800'), + ('5', 'GSM-900'), + ('4', 'GSM-850'), + ('3', 'none'), + ('2', 'invalid'), + ('1', 'unknown'), + ] + )), + ('state_not_expected_band', + MonitoringState( + title=_('Monitoring state if current band is not expected band '), + help=_('Monitoring state if the current band is not the expected band. Default is WARN.'), + default_value=1, + )), + ('band_as_metric', + FixedValue( + True, + title=_('Show the current band as graph'), + help=_( + 'This will output the current band as performance data. Then you get a graph where you can ' + 'follow the band changes of the monitored device. Scalars are used to create a kind of ' + 'legend for this graph' + ), + totext=_('') + )), + ('roaming_state', + MonitoringState( + title=_('Monitoring state if the device is roaming'), + help=_('Monitoring state if the device is roaming. Default is WARN.'), + default_value=1, + )), + ('no_profile_state', + MonitoringState( + title=_('Monitoring state if no SIM card associated'), + help=_('Monitoring state if no SIM card associated with the interface. Default is WARN.'), + default_value=1, + )), + ('connection_state', + MonitoringState( + title=_('Monitoring state if the device is not connected'), + help=_('Monitoring state if the device is not connected. Default is CRIT.'), + default_value=1, + )), + ('modem_not_up_state', + MonitoringState( + title=_('Monitoring state if the modem is not up'), + help=_('Monitoring state if the the modem is not up. Default is CRIT.'), + default_value=1, + )), + ('modem_not_online_state', + MonitoringState( + title=_('Monitoring state if the modem is not online'), + help=_('Monitoring state if the the modem is not online. Default is CRIT.'), + default_value=1, + )), + ('CSCvt55347_fixed', + FixedValue( + True, + title=_('The device is not affected by Cisco Bug ID CSCvt55347.'), + help=_('In the Cisco OS is a Bug that gives the wrong value for RSRQ. Enable this option if ' + 'your device is not affected by this bug..'), + totext=_('') + )), + ], + ) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name='cisco_cellular_lte', + group=RulespecGroupCheckParametersNetworking, + match_type='dict', + parameter_valuespec=_parameter_valuespec_cisco_cellular_lte, + title=lambda: _('Cisco cellular LTE'), + item_spec=lambda: TextAscii(title=_('Interface name'), ), + )) + + +def _valuespec_discovery_cisco_cellular_lte(): + return Dictionary( + title=_('Cisco cellular LTE'), + elements=[ + ('only_configured', + FixedValue( + False, + title=_('Discover interfaces without associated SIM card'), + help=_('If enabled the plugin will discover cellular interfaces without a associated SIM card.'), + totext=_('') + )), + ], + ) + + +rulespec_registry.register( + HostRulespec( + group=RulespecGroupCheckParametersDiscovery, + match_type='dict', + name='discovery_cisco_cellular_lte', + valuespec=_valuespec_discovery_cisco_cellular_lte, + )) diff --git a/packages/cisco_cellular_lte b/packages/cisco_cellular_lte index 12aea5a..7c4dad6 100644 --- a/packages/cisco_cellular_lte +++ b/packages/cisco_cellular_lte @@ -5,13 +5,12 @@ 'files': {'agent_based': ['cisco_cellular_lte.py', 'inv_cisco_cellular_lte.py'], 'checkman': ['cisco_cellular_lte'], - 'web': ['plugins/wato/cisco_cellular_lte.py', - 'plugins/metrics/cisco_cellular_lte.py', - 'plugins/views/inv_cisco_cellular_lte.py']}, + 'gui': ['metrics/cisco_cellular_lte.py', + 'views/inv_cisco_cellular_lte.py', + 'wato/cisco_cellular_lte.py']}, 'name': 'cisco_cellular_lte', - 'num_files': 6, 'title': 'Cisco cellular LTE', - 'version': '20221116.v0.0.2', - 'version.min_required': '2.0.0', - 'version.packaged': '2021.09.20', + 'version': '20230220.v0.0.2a', + 'version.min_required': '2.1.0', + 'version.packaged': '2.1.0p21', 'version.usable_until': None} \ No newline at end of file -- GitLab