From 9026d522a167a77feec1f20e015506f175474f77 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Thu, 29 Jul 2021 21:40:09 +0200
Subject: [PATCH] update project

---
 CHANGELOG                |   1 +
 agent_based/cisco_wlc.py |  62 +++++++++++++++++++++------------------
 cisco_wlc.mkp            | Bin 8069 -> 8126 bytes
 3 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index ae57d41..8c0802f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -12,3 +12,4 @@
 2021-07-17: added basic support for IOS-XE based WLAN controllers (C9800 family), without most of perfdata
             fixed _render_mac_address/_render_ip_address, code cleanup, removed WIPS check
             added lwap_uptime/time taken to join. changed perfdata to 1/s
+2021-07-29: fix missing data from discovery (inv_ap_info)
diff --git a/agent_based/cisco_wlc.py b/agent_based/cisco_wlc.py
index 7640fe6..b59170c 100644
--- a/agent_based/cisco_wlc.py
+++ b/agent_based/cisco_wlc.py
@@ -21,6 +21,7 @@
 # 2021-07-17: added basic support for IOS-XE based WLAN controllers (C9800 family), without most of perfdata
 #             fixed _render_mac_address/_render_ip_address, code cleanup, removed WIPS check
 #             added lwap_uptime/time taken to join. changed perfdata to 1/s
+# 2021-07-29: fix missing data from discovery (inv_ap_info)
 #
 from time import time
 from dataclasses import dataclass
@@ -165,11 +166,10 @@ _interface_displayhints = {
 
 def _get_short_if_name(ifname: str) -> str:
     """
-    returns short interface name from long interface name
+    Return short interface name from long interface name.
     ifname: is the long interface name
     :type ifname: str
     """
-
     for ifname_prefix in _interface_displayhints.keys():
         if ifname.lower().startswith(ifname_prefix.lower()):
             ifname_short = _interface_displayhints[ifname_prefix]
@@ -329,17 +329,20 @@ def discovery_cisco_wlc(section: Dict[str, Ap]) -> DiscoveryResult:
 
 def check_cisco_wlc(item, params, section: Dict[str, Ap]) -> CheckResult:
     ap_missing_state = params.get('state_ap_missing', 1)
-    inv_ap_info = InvApInfo(
-        ap_location=params.get('inv_ap_info').get('ap_location'),
-        ap_model=params.get('inv_ap_info').get('ap_model'),
-        ap_serialnumber=params.get('inv_ap_info').get('ap_serialnumber'),
-        ap_ipaddress=params.get('inv_ap_info').get('ap_ipaddress'),
-        ap_ethernetmacaddress=params.get('inv_ap_info').get('ap_ethernetmacaddress'),
-        cdp_neigh_name=params.get('inv_ap_info').get('cdp_neigh_name', None),
-        cdp_neigh_address=params.get('inv_ap_info').get('cdp_neigh_address', None),
-        cdp_neigh_interface=params.get('inv_ap_info').get('cdp_neigh_interface', None),
-        cdp_neigh_platform=params.get('inv_ap_info').get('cdp_neigh_platform', None),
-    )
+    if params.get('inv_ap_info'):
+        inv_ap_info = InvApInfo(
+            ap_location=params.get('inv_ap_info').get('ap_location'),
+            ap_model=params.get('inv_ap_info').get('ap_model'),
+            ap_serialnumber=params.get('inv_ap_info').get('ap_serialnumber'),
+            ap_ipaddress=params.get('inv_ap_info').get('ap_ipaddress'),
+            ap_ethernetmacaddress=params.get('inv_ap_info').get('ap_ethernetmacaddress'),
+            cdp_neigh_name=params.get('inv_ap_info').get('cdp_neigh_name', None),
+            cdp_neigh_address=params.get('inv_ap_info').get('cdp_neigh_address', None),
+            cdp_neigh_interface=params.get('inv_ap_info').get('cdp_neigh_interface', None),
+            cdp_neigh_platform=params.get('inv_ap_info').get('cdp_neigh_platform', None),
+        )
+    else:
+        inv_ap_info = None
 
     for ap_name, ap_alias in params.get('ap_list', []):
         if item == ap_name:
@@ -541,21 +544,24 @@ def check_cisco_wlc(item, params, section: Dict[str, Ap]) -> CheckResult:
         yield Result(state=State(params.get('state_cdp_change', 1)), notice=' - CDP info missing', )
 
     # ap has wrong serial number --> AP H/W changed.
-    if ap_info.ap_serialnumber != inv_ap_info.ap_serialnumber or \
-            ap_info.ap_model != inv_ap_info.ap_model or \
-            ap_info.ap_ethernetmacaddress != inv_ap_info.ap_ethernetmacaddress or \
-            ap_info.ap_ipaddress != inv_ap_info.ap_ipaddress or \
-            ap_info.ap_location != inv_ap_info.ap_location:
-        yield Result(
-            state=State(params.get('state_ap_change', 1)),
-            notice='Hardware changed',
-            details=f'\nAP hardware changed. Run inventory again. '
-                    f'\n - Serial number (found/expected): {ap_info.ap_serialnumber} / {inv_ap_info.ap_serialnumber} '
-                    f'\n - Model (found/expected): {ap_info.ap_model} / {inv_ap_info.ap_model} '
-                    f'\n - MAC address (found/expected): {ap_info.ap_ethernetmacaddress} / {inv_ap_info.ap_ethernetmacaddress} '
-                    f'\n - IP address (found/expected): {ap_info.ap_ipaddress} / {inv_ap_info.ap_ipaddress} '
-                    f'\n - Location (found/expected): {ap_info.ap_location} / {inv_ap_info.ap_location}',
-        )
+    if inv_ap_info:
+        if ap_info.ap_serialnumber != inv_ap_info.ap_serialnumber or \
+                ap_info.ap_model != inv_ap_info.ap_model or \
+                ap_info.ap_ethernetmacaddress != inv_ap_info.ap_ethernetmacaddress or \
+                ap_info.ap_ipaddress != inv_ap_info.ap_ipaddress or \
+                ap_info.ap_location != inv_ap_info.ap_location:
+            yield Result(
+                state=State(params.get('state_ap_change', 1)),
+                notice='Hardware changed',
+                details=f'\nAP hardware changed. Run inventory again. '
+                        f'\n - Serial number (found/expected): {ap_info.ap_serialnumber} / {inv_ap_info.ap_serialnumber} '
+                        f'\n - Model (found/expected): {ap_info.ap_model} / {inv_ap_info.ap_model} '
+                        f'\n - MAC address (found/expected): {ap_info.ap_ethernetmacaddress} / {inv_ap_info.ap_ethernetmacaddress} '
+                        f'\n - IP address (found/expected): {ap_info.ap_ipaddress} / {inv_ap_info.ap_ipaddress} '
+                        f'\n - Location (found/expected): {ap_info.ap_location} / {inv_ap_info.ap_location}',
+            )
+    else:
+        yield Result(state=State.WARN, summary='AP data from discovery missing.')
 
 
 register.snmp_section(
diff --git a/cisco_wlc.mkp b/cisco_wlc.mkp
index 28b28305d4210bd68bcd0b0c0a5b8399ffd1f500..0976ce4c1266461f7ab3771e6ba8c0b79f74b2e7 100644
GIT binary patch
delta 7678
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

delta 7553
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
XA2XAX9~}+!|2zF3V<6BJ0Pp|+<__@_

-- 
GitLab