From cc9f1d5574cc75fcd39c77b892a3f6d2f4160107 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Tue, 21 Feb 2023 20:01:38 +0100
Subject: [PATCH] update project

---
 CHANGELOG                     |   2 +
 agent_based/cisco_wlc.py      |  68 +++++++++++++++++++++++++++++++---
 cisco_wlc.mkp                 | Bin 8451 -> 9213 bytes
 packages/cisco_wlc            |   5 +--
 web/plugins/wato/cisco_wlc.py |   5 ++-
 5 files changed, 71 insertions(+), 9 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 7305a00..4599d9c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -17,3 +17,5 @@
 2022-04-01: added RADIO MAC address
 2022-05-31: removed "Software" from snmp detect function
 2022-10-23: fixed warning in upgrade "non-empty params vanished" for vpn_entry
+2023-02-21: added cluster function (backport from check_mk) THX to roger[dot]ellenberger[at]wagner[dot]ch
+
diff --git a/agent_based/cisco_wlc.py b/agent_based/cisco_wlc.py
index f36ff2f..87133bb 100644
--- a/agent_based/cisco_wlc.py
+++ b/agent_based/cisco_wlc.py
@@ -26,10 +26,12 @@
 # 2022-04-01: added RADIO MAC address
 # 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
+#
 
 from time import time
 from dataclasses import dataclass
-from typing import Optional, List, Dict
+from typing import Optional, List, Dict, Mapping, Any, Union
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
     CheckResult,
@@ -120,6 +122,8 @@ class InvApInfo:
     cdp_neigh_platform: Optional[str] = None
 
 
+Section = Dict[str, Ap]
+
 _operationasl_state = {
     1: 'associated',
     2: 'disassociating',
@@ -152,7 +156,6 @@ _cdp_speed = {
     '5': 'auto',
 }
 
-
 _interface_displayhints = {
     'ethernet': 'eth',
     'fastethernet': 'Fa',
@@ -168,6 +171,12 @@ _interface_displayhints = {
     'management': 'Ma',
 }
 
+_map_states = {
+    "1": (State.OK, "online"),
+    "2": (State.CRIT, "critical"),
+    "3": (State.WARN, "warning"),
+}
+
 
 def _get_short_if_name(ifname: str) -> str:
     """
@@ -293,7 +302,6 @@ def parse_cisco_wlc(string_table: List[StringTable]) -> Optional[Dict[str, Ap]]:
                 lwap_info=_get_lwapap_info(ap_oid_end, lwapap),
             )
         })
-
     return parsed
 
 
@@ -304,7 +312,7 @@ def parse_cisco_wlc(string_table: List[StringTable]) -> Optional[Dict[str, Ap]]:
 ###########################################################################
 
 
-def discovery_cisco_wlc(section: Dict[str, Ap]) -> DiscoveryResult:
+def discovery_cisco_wlc(section: Section) -> DiscoveryResult:
     for ap_name in section.keys():
         ap = section.get(ap_name)
 
@@ -334,7 +342,7 @@ def discovery_cisco_wlc(section: Dict[str, Ap]) -> DiscoveryResult:
 ###########################################################################
 
 
-def check_cisco_wlc(item, params, section: Dict[str, Ap]) -> CheckResult:
+def check_cisco_wlc(item, params, section: Section) -> CheckResult:
     ap_missing_state = params.get('state_ap_missing', 1)
     if params.get('inv_ap_info'):
         inv_ap_info = InvApInfo(
@@ -571,6 +579,48 @@ def check_cisco_wlc(item, params, section: Dict[str, Ap]) -> CheckResult:
     else:
         yield Result(state=State.WARN, summary='AP data from discovery missing.')
 
+###########################################################################
+#
+#  Cluster function
+#
+###########################################################################
+
+
+def _node_not_found(item: str, params: Mapping[str, Any]) -> Result:
+    infotext = "Accesspoint not found"
+    for ap_name, ap_state in params.get("ap_name", []):
+        if item.startswith(ap_name):
+            return Result(state=ap_state, summary=infotext)
+    return Result(state=State.CRIT, summary=infotext)
+
+
+def _ap_info(node: Optional[str], wlc_status: Union[str, Ap]) -> Result:
+    wlc_status = str(wlc_status.ap_info.ap_operationstatus) if isinstance(wlc_status, Ap) else wlc_status
+    status, state_readable = _map_states.get(wlc_status, (State.UNKNOWN, f"unknown[{wlc_status}]"))
+    return Result(state=status,
+                  summary="Accesspoint: %s%s" % (state_readable, (" (connected to %s)" % node) if node else ""),
+                  )
+
+
+def cluster_check_cisco_wlc(
+        item: str,
+        params: Mapping[str, Any],
+        section: Mapping[str, Optional[Section]],
+) -> CheckResult:
+
+    for node, node_section in section.items():
+        if node_section is not None and item in node_section:
+            yield _ap_info(node, node_section[item])
+            yield from check_cisco_wlc(item, params, node_section)
+            return
+    yield _node_not_found(item, params)
+
+###########################################################################
+#
+# Register SNMP section
+#
+###########################################################################
+
 
 register.snmp_section(
     name='cisco_wlc',
@@ -635,6 +685,13 @@ register.snmp_section(
         contains('.1.3.6.1.2.1.1.1.0', 'C9800'),  # sysDescr -> IOS-XE
     ))
 
+###########################################################################
+#
+# Register Check Plugin
+#
+###########################################################################
+
+
 register.check_plugin(
     name='cisco_wlc',
     service_name='AP %s',
@@ -656,4 +713,5 @@ register.check_plugin(
         # 'inv_ap_info': {},
     },
     check_ruleset_name='cisco_wlc',
+    cluster_check_function=cluster_check_cisco_wlc,
 )
diff --git a/cisco_wlc.mkp b/cisco_wlc.mkp
index c52c8c134ed37078a3f4ba5e450b8f1543d2009d..45dd8e4c2cf646e68e9b0486f7db3808d26c9a72 100644
GIT binary patch
literal 9213
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

literal 8451
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
Mb<z@{uA!j*2WudWegFUf

diff --git a/packages/cisco_wlc b/packages/cisco_wlc
index ca244c5..e2cb239 100644
--- a/packages/cisco_wlc
+++ b/packages/cisco_wlc
@@ -12,9 +12,8 @@
            'web': ['plugins/wato/cisco_wlc.py',
                    'plugins/metrics/cisco_wlc.py']},
  'name': 'cisco_wlc',
- 'num_files': 3,
  'title': 'monitor Cisco WLC APs',
- 'version': '20221023.v0.6b',
+ 'version': '20230221.v0.7',
  'version.min_required': '2.0.0',
- 'version.packaged': '2021.09.20',
+ 'version.packaged': '2.1.0p21',
  'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/wato/cisco_wlc.py b/web/plugins/wato/cisco_wlc.py
index 6a10e24..c0ed795 100644
--- a/web/plugins/wato/cisco_wlc.py
+++ b/web/plugins/wato/cisco_wlc.py
@@ -109,6 +109,7 @@ def _parameter_valuespec_cisco_wlc():
                              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'),
@@ -116,8 +117,10 @@ def _parameter_valuespec_cisco_wlc():
                                     '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'))),
-- 
GitLab