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