From b14e2e2399868df4a5ea26f34181671fde744f93 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Tue, 21 Feb 2023 20:30:24 +0100 Subject: [PATCH] update project --- agent_based/cisco_wlc.py | 2 +- cisco_wlc.mkp | Bin 9197 -> 9271 bytes gui/metrics/cisco_wlc.py | 176 +++++++++++++++++++++++++++++++++++++++ gui/wato/cisco_wlc.py | 157 ++++++++++++++++++++++++++++++++++ packages/cisco_wlc | 7 +- 5 files changed, 337 insertions(+), 5 deletions(-) create mode 100644 gui/metrics/cisco_wlc.py create mode 100644 gui/wato/cisco_wlc.py diff --git a/agent_based/cisco_wlc.py b/agent_based/cisco_wlc.py index 1f6e443..8c87417 100644 --- a/agent_based/cisco_wlc.py +++ b/agent_based/cisco_wlc.py @@ -27,7 +27,7 @@ # 2022-05-31: removed "Software" from snmp detect function # 2022-10-23: fixed warning on upgrade "non-empty params vanished" for inv_ap_info # 2023-02-21: added cluster function (backport from check_mk) THX to roger[dot]ellenberger[at]wagner[dot]ch -# +# 2023-02-21: moved gui files from ~/local/share/check_mk/... to ~/local/lib/check_mk... from time import time from dataclasses import dataclass diff --git a/cisco_wlc.mkp b/cisco_wlc.mkp index c3e156e67d1e4b104ea4bcbca7ca977d9d4dd273..acb7a83641d485927e4ee10d4c8307aa70b920ad 100644 GIT binary patch literal 9271 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 DVUZ5U literal 9197 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 diff --git a/gui/metrics/cisco_wlc.py b/gui/metrics/cisco_wlc.py new file mode 100644 index 0000000..98bc0ca --- /dev/null +++ b/gui/metrics/cisco_wlc.py @@ -0,0 +1,176 @@ +#!/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 : 2018-01-06 +# +# +# missing a way to include hostname and service description +# +# 2023-02-21: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk... +# + + +from cmk.gui.i18n import _ + +from cmk.gui.plugins.metrics.utils import ( + metric_info, + graph_info, + perfometer_info + +) + +##################################################################################################################### +# +# define metrics for perfdata +# +##################################################################################################################### + +metric_info['cisco_wlc_uptime_seconds'] = { + 'title': _('AP uptime'), + 'help': _(''), + 'unit': 's', + 'color': '26/a', +} + +metric_info['cisco_wlc_lwap_uptime_seconds'] = { + 'title': _('LWAP uptime'), + 'help': _(''), + 'unit': 's', + 'color': '41/a', +} + +metric_info['cisco_wlc_active_client_count'] = { + 'title': _('Active clients'), + 'help': _(''), + 'unit': 'count', + 'color': '11/a', +} + +metric_info['cisco_wlc_associated_clients'] = { + 'title': _('Associated clients'), + 'help': _(''), + 'unit': 'count', + 'color': '23/a', +} + +metric_info['cisco_wlc_reassoiation_success_count'] = { + 'title': _('Reassoiation success'), + 'help': _(''), + 'unit': '1/s', + 'color': '21/a', +} + +metric_info['cisco_wlc_reassoiation_failure_count'] = { + 'title': _('Reassoiation failure'), + 'help': _(''), + 'unit': '1/s', + 'color': '31/a', +} + +metric_info['cisco_wlc_reassoiation_failure_count_by_rate'] = { + 'title': _('Reassoiation failure rate'), + 'help': _(''), + 'unit': '1/s', + 'color': '41/a', +} + +metric_info['cisco_wlc_echo_request_count'] = { + 'title': _('Echo request'), + 'help': _(''), + 'unit': '1/s', + 'color': '12/a', +} + +metric_info['cisco_wlc_echo_response_loss_count'] = { + 'title': _('Echo response loss'), + 'help': _(''), + 'unit': '1/s', + 'color': '22/a', +} + +metric_info['cisco_wlc_association_fail_count_for_rssi_low'] = { + 'title': _('Association fail rssi low'), + 'help': _(''), + 'unit': '1/s', + 'color': '32/a', +} + +metric_info['cisco_wlc_association_fail_times'] = { + 'title': _('Association fail times'), + 'help': _(''), + 'unit': '1/s', + 'color': '42/a', +} + +metric_info['cisco_wlc_association_count'] = { + 'title': _('Associations'), + 'help': _(''), + 'unit': '1/s', + 'color': '13/a', +} + +###################################################################################################################### +# +# how to graph perdata +# +###################################################################################################################### + +graph_info['cisco_wlc.ap_uptime'] = { + 'title': _('AP/LWAP Uptime'), + 'metrics': [ + ('cisco_wlc_lwap_uptime_seconds', '-area'), + ('cisco_wlc_uptime_seconds', 'area'), + ], + 'optional_metrics': ['cisco_wlc_lwap_uptime_seconds'], +} + +graph_info['cisco_wlc.active_client'] = { + 'title': _('Active clients'), + 'metrics': [ + ('cisco_wlc_active_client_count', 'area'), + ('cisco_wlc_associated_clients', 'line'), + ], +} + +graph_info['cisco_wlc.counters'] = { + 'title': _('Counters'), + 'metrics': [ + ('cisco_wlc_reassoiation_success_count', 'line'), + ('cisco_wlc_reassoiation_failure_count', 'line'), + ('cisco_wlc_association_fail_times', 'line'), + ('cisco_wlc_association_fail_count_for_rssi_low', 'line'), + ('cisco_wlc_association_count', 'line'), + ], +} + +graph_info['cisco_elc_echo'] = { + 'title': _('Echos'), + 'metrics': [ + ('cisco_wlc_echo_request_count', 'area'), + ('cisco_wlc_echo_response_loss_count', '-area'), + ], +} + +###################################################################################################################### +# +# define perf-o-meter +# +###################################################################################################################### + +perfometer_info.append(('stacked', [ + { + 'type': 'logarithmic', + 'metric': 'cisco_wlc_uptime_seconds', + 'half_value': 2592000.0, + 'exponent': 2, + }, + { + 'type': 'linear', + 'segments': ['cisco_wlc_active_client_count'], + 'total': 200, + } +])) diff --git a/gui/wato/cisco_wlc.py b/gui/wato/cisco_wlc.py new file mode 100644 index 0000000..d97168f --- /dev/null +++ b/gui/wato/cisco_wlc.py @@ -0,0 +1,157 @@ +#!/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 : +# +# 2023-02-21: moved from ~/local/share/check_mk/... to ~/local/lib/check_mk... +# + +from cmk.gui.i18n import _ +from cmk.gui.valuespec import ( + Dictionary, + Tuple, + TextAscii, + ListOf, + MonitoringState, + TextUnicode, +) + +from cmk.gui.plugins.wato.utils import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersNetworking, +) + + +def _parameter_valuespec_cisco_wlc(): + return Dictionary( + elements=[ + ('state_ap_missing', + MonitoringState( + title=_('State if AP is missing'), + help=_('Set the monitoring state if the access point is not in the SNMP data. Default is WARN.'), + default_value=1, + )), + ('state_ap_adminstatus', + MonitoringState( + title=_('State if AP is not admin enabled'), + help=_('Set the monitoring state if the access point is not in "admin enable". Default is WARN.'), + default_value=1, + )), + ('state_ap_operationstatus', + MonitoringState( + title=_('State if AP is not operational'), + help=_('Set the monitoring state if the access point is not in "operational" state. Default is WARN.'), + default_value=1, + )), + ('state_ap_telnetenable', + MonitoringState( + title=_('State if Telnet is enabled'), + help=_('Set the monitoring state if the access point has telnet access enabled. Default is CRIT.'), + default_value=2, + )), + ('state_ap_sshenable', + MonitoringState( + title=_('State if SSH is enabled'), + help=_('Set the monitoring state if the access point has SSH access enabled. Default is WARN.'), + default_value=1, + )), + ('stateap_encryptionenable', + MonitoringState( + title=_('State if encryption is not enabled'), + help=_('Set the monitoring state if the LEAP/CAPWAP tunnel encryption nor enabled. Default is WARN.'), + default_value=1, + )), + ('state_ap_dataencryptionstatus', + MonitoringState( + title=_('State if encryption is not active'), + help=_('Set the monitoring state if the LWAP/CAPWAP tunnel encryption enabled but not active. ' + 'Default is WARN.'), + default_value=1, + )), + ('state_ap_powerstatus', + MonitoringState( + title=_('State if AP is not on full power'), + help=_('Set the monitoring state if the access point not on full power. Default is CRIT.'), + default_value=2, + )), + ('state_cdp_duplex', + MonitoringState( + title=_('State if CDP "half duplex"'), + help=_('Set the monitoring state if the the CDP neighbour info for "duplex" is "half duplex". ' + 'Default is WARN.'), + default_value=1, + )), + ('state_cdp_change', + MonitoringState( + title=_('State if CDP info is changed/missing'), + help=_('Set the monitoring state if the CDP info from the access point has changed or is missing. ' + 'This happens if the AP was moved to a different switch/interface. The CDP info will be used ' + 'to help locating a missing access point. ' + 'Default is WARN.'), + default_value=1, + )), + ('state_ap_change', + MonitoringState( + title=_('State if H/W has changed'), + help=_('Set the monitoring state if the hard ware of the access point has changed. This information ' + 'will be used to help locate a missing access point ' + 'Default is WARN.'), + default_value=1, + )), + ('ap_list', + ListOf( + Tuple( + elements=[ + TextUnicode( + title=_('AP name'), + help=_('The configured value must match a AP item as reported by the monitored ' + 'device. For example: "AP1.4"'), + allow_empty=False, + size=40, + ), + TextUnicode( + title=_('AP Alias'), + help=_('You can configure an individual alias here for the access point matching ' + 'the text configured in the "AP item name" field. The alias will ' + 'be shown in the check info'), + allow_empty=False, + size=40, + ), + ], + orientation='horizontal', + ), + title=_('AP alias'), + add_label=_('Add name'))), + ('inv_ap_info', # added by plugin discovery function + Dictionary( + elements=[ + ('ap_location', TextUnicode()), + ('ap_model', TextUnicode()), + ('ap_serialnumber', TextUnicode()), + ('ap_ipaddress', TextUnicode()), + ('ap_ethernetmacaddress', TextUnicode()), + ('cdp_neigh_name', TextUnicode()), + ('cdp_neigh_address', TextUnicode()), + ('cdp_neigh_interface', TextUnicode()), + ('cdp_neigh_platform', TextUnicode()), + ], + )), + ], + hidden_keys=['inv_ap_info'], + ) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name='cisco_wlc', + group=RulespecGroupCheckParametersNetworking, + match_type='dict', + parameter_valuespec=_parameter_valuespec_cisco_wlc, + title=lambda: _('Cisco WLC APs'), + item_spec=lambda: TextAscii(title=_('Cisco WLC AP name'), ), + )) diff --git a/packages/cisco_wlc b/packages/cisco_wlc index e2cb239..3f9f3e6 100644 --- a/packages/cisco_wlc +++ b/packages/cisco_wlc @@ -9,11 +9,10 @@ 'Perfdata: Clientcount, clientfail, uptime, ...\n', 'download_url': 'http://thl-cmk.hopto.org', 'files': {'agent_based': ['cisco_wlc.py'], - 'web': ['plugins/wato/cisco_wlc.py', - 'plugins/metrics/cisco_wlc.py']}, + 'gui': ['metrics/cisco_wlc.py', 'wato/cisco_wlc.py']}, 'name': 'cisco_wlc', 'title': 'monitor Cisco WLC APs', - 'version': '20230221.v0.7', - 'version.min_required': '2.0.0', + 'version': '20230221.v0.8', + 'version.min_required': '2.1.0', 'version.packaged': '2.1.0p21', 'version.usable_until': None} \ No newline at end of file -- GitLab