From 96dab95a85d9a94c09d1176333bace05bf53b7de Mon Sep 17 00:00:00 2001
From: "Th.L" <thl-cmk@outlook.com>
Date: Wed, 14 Jul 2021 18:52:27 +0200
Subject: [PATCH] update project

---
 agent_based/inv_cisco_wlc_aps_lwap.py       | 379 ++++++++++----------
 inv_cisco_wlc_aps_lwap.mkp                  | Bin 6395 -> 6307 bytes
 web/plugins/views/inv_cisco_wlc_aps_lwap.py |   4 +-
 web/plugins/wato/inv_cisco_wlc_aps_lwap.py  |   4 +-
 4 files changed, 187 insertions(+), 200 deletions(-)

diff --git a/agent_based/inv_cisco_wlc_aps_lwap.py b/agent_based/inv_cisco_wlc_aps_lwap.py
index 97253c4..79642b9 100644
--- a/agent_based/inv_cisco_wlc_aps_lwap.py
+++ b/agent_based/inv_cisco_wlc_aps_lwap.py
@@ -14,15 +14,6 @@
 # 2018-09-04 : changes for CMK 1.5.x (inv_tree --> inv_tree_list)
 # 2021-07-11 : rewritten for CMK 2.0
 
-import re
-import time
-import binascii
-from typing import List, NamedTuple
-
-from cmk.base.plugins.agent_based.agent_based_api.v1 import (
-    OIDEnd,
-    OIDBytes,
-)
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     SNMPTree,
@@ -35,187 +26,187 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
 )
 
 _last_reboot_reason = {
-    0: 'none',
-    1: 'dot11gModeChange',
-    2: 'ipAddressSet',
-    3: 'ipAddressReset',
-    4: 'rebootFromController',
-    5: 'dhcpFallbackFail',
-    6: 'discoveryFail',
-    7: 'noJoinResponse',
-    8: 'denyJoin',
-    9: 'noConfigResponse',
-    10: 'configController',
-    11: 'imageUpgradeSuccess',
-    12: 'imageOpcodeInvalid',
-    13: 'imageCheckSumInvalid',
-    14: 'imageDataTimeout',
-    15: 'configFileInvalid',
-    16: 'imageDownloadError',
-    17: 'rebootFromConsole',
-    18: 'rapOverAir',
-    19: 'powerLow',
-    20: 'crash',
-    21: 'powerHigh',
-    22: 'powerLoss',
-    23: 'powerChange',
-    24: 'componentFailure',
-    25: 'watchdog',
+    '0': 'none',
+    '1': 'dot11gModeChange',
+    '2': 'ipAddressSet',
+    '3': 'ipAddressReset',
+    '4': 'rebootFromController',
+    '5': 'dhcpFallbackFail',
+    '6': 'discoveryFail',
+    '7': 'noJoinResponse',
+    '8': 'denyJoin',
+    '9': 'noConfigResponse',
+    '10': 'configController',
+    '11': 'imageUpgradeSuccess',
+    '12': 'imageOpcodeInvalid',
+    '13': 'imageCheckSumInvalid',
+    '14': 'imageDataTimeout',
+    '15': 'configFileInvalid',
+    '16': 'imageDownloadError',
+    '17': 'rebootFromConsole',
+    '18': 'rapOverAir',
+    '19': 'powerLow',
+    '20': 'crash',
+    '21': 'powerHigh',
+    '22': 'powerLoss',
+    '23': 'powerChange',
+    '24': 'componentFailure',
+    '25': 'watchdog',
 }
 
 _enable_disable = {
-    0: 'N/A',
-    1: 'enabled',
-    2: 'disabled',
+    '0': 'N/A',
+    '1': 'enabled',
+    '2': 'disabled',
 }
 
 _failover_pirority = {
-    0: 'N/A',
-    1: 'low',
-    2: 'medium',
-    3: 'high',
-    4: 'critical',
+    '0': 'N/A',
+    '1': 'low',
+    '2': 'medium',
+    '3': 'high',
+    '4': 'critical',
 }
 
 _power_status = {
-    0: 'N/A',
-    1: 'low',
-    2: '15.4W',
-    3: '16.8W',
-    4: 'full',
-    5: 'external',
-    6: 'mixedmode',
+    '0': 'N/A',
+    '1': 'low',
+    '2': '15.4W',
+    '3': '16.8W',
+    '4': 'full',
+    '5': 'external',
+    '6': 'mixedmode',
 }
 
 _pwr_injector_selection = {
-    0: 'N/A',
-    1: 'unknown',
-    2: 'installed',
-    3: 'override',
+    '0': 'N/A',
+    '1': 'unknown',
+    '2': 'installed',
+    '3': 'override',
 }
 
 _monitor_mode_optimization = {
-    0: 'N/A',
-    1: 'all',
-    2: 'tracking',
-    3: 'wips',
-    4: 'none',
+    '0': 'N/A',
+    '1': 'all',
+    '2': 'tracking',
+    '3': 'wips',
+    '4': 'none',
 }
 
 _encryption_supported = {
-    0: 'N/A',
-    1: 'yes',
-    2: 'no',
+    '0': 'N/A',
+    '1': 'yes',
+    '2': 'no',
 }
 
 _inet_address_type = {
-    0: 'N/A',
-    1: 'ipv4',
-    2: 'ipv6',
-    3: 'ipv4z',
-    4: 'ipv6z',
-    16: 'dns',
+    '0': 'N/A',
+    '1': 'ipv4',
+    '2': 'ipv6',
+    '3': 'ipv4z',
+    '4': 'ipv6z',
+    '16': 'dns',
 }
 
 _antenna_band_mode = {
-    0: 'N/A',
-    1: 'not applicable',
-    2: 'single',
-    3: 'dual',
+    '0': 'N/A',
+    '1': 'not applicable',
+    '2': 'single',
+    '3': 'dual',
 }
 
 _venueconfigvenuegroup = {
-    0: 'N/A',
-    1: 'unspecified',
-    2: 'assembly',
-    3: 'business',
-    4: 'educational',
-    5: 'factory and industrial',
-    6: 'institutional',
-    7: 'mercantile',
-    8: 'residential',
-    9: 'storage',
-    10: 'utility and misc',
-    11: 'vehicular',
-    12: 'outdoor',
+    '0': 'N/A',
+    '1': 'unspecified',
+    '2': 'assembly',
+    '3': 'business',
+    '4': 'educational',
+    '5': 'factory and industrial',
+    '6': 'institutional',
+    '7': 'mercantile',
+    '8': 'residential',
+    '9': 'storage',
+    '10': 'utility and misc',
+    '11': 'vehicular',
+    '12': 'outdoor',
 }
 
 _venueconfigvenuetype = {
-    0: 'N/A',
-    1: 'unspecified',
-    2: 'unspecified assembly',
-    3: 'arena',
-    4: 'stadium',
-    5: 'passenger terminal',
-    6: 'amphitheater',
-    7: 'amusement park',
-    8: 'place of worship',
-    9: 'convention center',
-    10: 'library',
-    11: 'museum',
-    12: 'restaurant',
-    13: 'theater',
-    14: 'bar',
-    15: 'coffee shop',
-    16: 'zoo or aquarium',
-    17: 'emergency coordination center',
-    18: 'unspecified business',
-    19: 'doctor or dentist office',
-    20: 'bank',
-    21: 'firestation',
-    22: 'policestation',
-    23: 'postoffice',
-    24: 'professional office',
-    25: 'research and development facility',
-    26: 'attorney office',
-    27: 'unspecified educational',
-    28: 'school primary',
-    29: 'school secondary',
-    30: 'university or college',
-    31: 'unspecified factory and industrial',
-    32: 'factory',
-    33: 'unspecified institutional',
-    34: 'hospital',
-    35: 'longterm carefacility',
-    36: 'alcohol and drug rehabilitation center',
-    37: 'group home',
-    38: 'prison or jail',
-    39: 'unspecified mercantile',
-    40: 'retail store',
-    41: 'grocery market',
-    42: 'auomotive service station',
-    43: 'shoppin gmall',
-    44: 'gas station',
-    45: 'unspecified residential',
-    46: 'privat eresidence',
-    47: 'hotel or motel',
-    48: 'dormitory',
-    49: 'boarding house',
-    50: 'unspecified storage',
-    51: 'unspecified utility',
-    52: 'unspecified vehicular',
-    53: 'automobile or truck',
-    54: 'airplane',
-    55: 'bus',
-    56: 'ferry',
-    57: 'ship or boat',
-    58: 'train',
-    59: 'motorbike',
-    60: 'unspecified outdoor',
-    61: 'muni mesh network',
-    62: 'citypark',
-    63: 'restarea',
-    64: 'traffic control',
-    65: 'busstop',
-    66: 'kiosk',
+    '0': 'N/A',
+    '1': 'unspecified',
+    '2': 'unspecified assembly',
+    '3': 'arena',
+    '4': 'stadium',
+    '5': 'passenger terminal',
+    '6': 'amphitheater',
+    '7': 'amusement park',
+    '8': 'place of worship',
+    '9': 'convention center',
+    '10': 'library',
+    '11': 'museum',
+    '12': 'restaurant',
+    '13': 'theater',
+    '14': 'bar',
+    '15': 'coffee shop',
+    '16': 'zoo or aquarium',
+    '17': 'emergency coordination center',
+    '18': 'unspecified business',
+    '19': 'doctor or dentist office',
+    '20': 'bank',
+    '21': 'firestation',
+    '22': 'policestation',
+    '23': 'postoffice',
+    '24': 'professional office',
+    '25': 'research and development facility',
+    '26': 'attorney office',
+    '27': 'unspecified educational',
+    '28': 'school primary',
+    '29': 'school secondary',
+    '30': 'university or college',
+    '31': 'unspecified factory and industrial',
+    '32': 'factory',
+    '33': 'unspecified institutional',
+    '34': 'hospital',
+    '35': 'longterm carefacility',
+    '36': 'alcohol and drug rehabilitation center',
+    '37': 'group home',
+    '38': 'prison or jail',
+    '39': 'unspecified mercantile',
+    '40': 'retail store',
+    '41': 'grocery market',
+    '42': 'auomotive service station',
+    '43': 'shoppin gmall',
+    '44': 'gas station',
+    '45': 'unspecified residential',
+    '46': 'privat eresidence',
+    '47': 'hotel or motel',
+    '48': 'dormitory',
+    '49': 'boarding house',
+    '50': 'unspecified storage',
+    '51': 'unspecified utility',
+    '52': 'unspecified vehicular',
+    '53': 'automobile or truck',
+    '54': 'airplane',
+    '55': 'bus',
+    '56': 'ferry',
+    '57': 'ship or boat',
+    '58': 'train',
+    '59': 'motorbike',
+    '60': 'unspecified outdoor',
+    '61': 'muni mesh network',
+    '62': 'citypark',
+    '63': 'restarea',
+    '64': 'traffic control',
+    '65': 'busstop',
+    '66': 'kiosk',
 }
 
 _apsubmode = {
-    0: 'N/A',
-    1: 'none',
-    2: 'wips',
-    3: 'pppoe',
-    4: 'pppoewips',
+    '0': 'N/A',
+    '1': 'none',
+    '2': 'wips',
+    '3': 'pppoe',
+    '4': 'pppoewips',
 }
 
 
@@ -248,12 +239,12 @@ def parse_inv_cisco_wlc_aps_lwap(string_table: StringTable):
             'max_#_of_dot11_slots': ap[1],
             'name': ap[2],
             'max_#_of_ethernet_slots': ap[3],
-            'encryption_supported': _encryption_supported.get(int(ap[23])),
+            'encryption_supported': _encryption_supported.get(ap[23]),
             'tcp_mss': ap[25],
-            'data_encryption': _enable_disable.get(int(ap[26])),
+            'data_encryption': _enable_disable.get(ap[26]),
             'port_number': ap[28],
-            'venue_config_venue_group': _venueconfigvenuegroup.get(int(ap[29])),
-            'venue_config_venue_type': _venueconfigvenuetype.get(int(ap[30])),
+            'venue_config_venue_group': _venueconfigvenuegroup.get(ap[29]),
+            'venue_config_venue_type': _venueconfigvenuetype.get(ap[30]),
             'venue_config_venue_name': ap[31],
             'venue_config_language': ap[32],
             'trunk_vlan': ap[34],
@@ -261,49 +252,49 @@ def parse_inv_cisco_wlc_aps_lwap(string_table: StringTable):
             'floor_label': ap[45],
             'module_inserted': ap[49],
             'status_columns': {
-                'antenna_band_mode': _antenna_band_mode.get(int(ap[48])),
-                'encryption': _enable_disable.get(int(ap[11])),
-                'failover_priority': _failover_pirority.get(int(ap[12])),
-                'power_status': _power_status.get(int(ap[13])),
-                'telnet': _enable_disable.get(int(ap[14])),
-                'ssh': _enable_disable.get(int(ap[15])),
-                'pwr_pre_std_state': _enable_disable.get(int(ap[16])),
-                'pwr_injector_state': _enable_disable.get(int(ap[17])),
-                'pwr_injector_selection': _pwr_injector_selection.get(int(ap[18])),
+                'antenna_band_mode': _antenna_band_mode.get(ap[48]),
+                'encryption': _enable_disable.get(ap[11]),
+                'failover_priority': _failover_pirority.get(ap[12]),
+                'power_status': _power_status.get(ap[13]),
+                'telnet': _enable_disable.get(ap[14]),
+                'ssh': _enable_disable.get(ap[15]),
+                'pwr_pre_std_state': _enable_disable.get(ap[16]),
+                'pwr_injector_state': _enable_disable.get(ap[17]),
+                'pwr_injector_selection': _pwr_injector_selection.get(ap[18]),
                 'pwr_injector_sw_mac_addr': _render_mac_address(ap[19]),
-                'wips': _enable_disable.get(int(ap[20])),
-                'monitor_mode_optimization': _monitor_mode_optimization.get(int(ap[18])),
-                'amsdu': _enable_disable.get(int(ap[22])),
-                'admin': _enable_disable.get(int(ap[27])),
-                'rogue_detection': _enable_disable.get(int(ap[24])),
-                'led_state': _enable_disable.get(int(ap[33])),
-                'trunk_vlan_status': _enable_disable.get(int(ap[35])),
-                'submode': _apsubmode.get(int(ap[37])),
-                'real_time_stats_mode_enabled': _enable_disable.get(int(ap[38])),
+                'wips': _enable_disable.get(ap[20]),
+                'monitor_mode_optimization': _monitor_mode_optimization.get(ap[18]),
+                'amsdu': _enable_disable.get(ap[22]),
+                'admin': _enable_disable.get(ap[27]),
+                'rogue_detection': _enable_disable.get(ap[24]),
+                'led_state': _enable_disable.get(ap[33]),
+                'trunk_vlan_status': _enable_disable.get(ap[35]),
+                'submode': _apsubmode.get(ap[37]),
+                'real_time_stats_mode_enabled': _enable_disable.get(ap[38]),
                 'upgrade_from_version': ap[39],
                 'upgrade_to_version': ap[40],
                 'upgrade_failure_cause': ap[41],
                 'adj_channel_rogue_enabled': ap[46],
                 'sys_net_id': ap[47],
-                'enable_module': _enable_disable.get(int(ap[50])),
-                'is_universal': _enable_disable.get(int(ap[51])),
+                'enable_module': _enable_disable.get(ap[50]),
+                'is_universal': _enable_disable.get(ap[51]),
                 'universal_prime_status': ap[52],
-                'is_master': _enable_disable.get(int(ap[53])),
-                'ble_fw_download_status': _enable_disable.get(int(ap[54])),
+                'is_master': _enable_disable.get(ap[53]),
+                'ble_fw_download_status': _enable_disable.get(ap[54]),
                 'max_client_limit_number_trap': ap[42],
                 'max_client_limit_cause': ap[43],
-                'max_client_limit_set': _enable_disable.get(int(ap[44])),
+                'max_client_limit_set': _enable_disable.get(ap[44]),
                 'wlc_primary_address': wlcprimaryaddress,
                 'wlc_secondary_address': wlcsecondaryaddress,
                 'wlc_tertiary_address': wlctertiaryaddress,
-                'last_reboot_reason': _last_reboot_reason.get(int(ap[10])),
+                'last_reboot_reason': _last_reboot_reason.get(ap[10]),
             }
         })
 
     return aps
 
 
-def inventory_wlc_aps_lwap(params, section) -> InventoryResult:
+def inventory_cisco_wlc_aps_lwap(params, section) -> InventoryResult:
     removecolumns = []
 
     if params:
@@ -317,24 +308,22 @@ def inventory_wlc_aps_lwap(params, section) -> InventoryResult:
         for key in key_columns.keys():
             ap.pop(key)
 
+        status_columns = ap['status_columns']
+
+        ap.pop('status_columns')
+
         for entry in removecolumns:
             try:
                 ap.pop(entry)
             except KeyError:
                 pass
 
-        status_columns = ap.get('status_columns', None)
         for entry in removecolumns:
             try:
                 status_columns.pop(entry)
             except KeyError:
                 pass
 
-        try:
-            ap.pop('status_columns')
-        except KeyError:
-            pass
-
         yield TableRow(
             path=path,
             key_columns=key_columns,
@@ -342,6 +331,7 @@ def inventory_wlc_aps_lwap(params, section) -> InventoryResult:
             status_columns=status_columns,
         )
 
+
 register.snmp_section(
     name='inv_cisco_wlc_aps_lwap',
     parse_function=parse_inv_cisco_wlc_aps_lwap,
@@ -412,8 +402,7 @@ register.snmp_section(
 
 register.inventory_plugin(
     name='inv_cisco_wlc_aps_lwap',
-    inventory_function=inventory_wlc_aps_lwap,
+    inventory_function=inventory_cisco_wlc_aps_lwap,
     inventory_default_parameters={},
-    inventory_ruleset_name='inv_cisco_wlc_ap_cdp_cache',
+    inventory_ruleset_name='inv_cisco_wlc_aps_lwap',
 )
-
diff --git a/inv_cisco_wlc_aps_lwap.mkp b/inv_cisco_wlc_aps_lwap.mkp
index 60fe55d3ee0184f91851bac43d5010ea6ef68849..432139322c4d4e9ffa33e77abbd9a51d8620cdf6 100644
GIT binary patch
literal 6307
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

literal 6395
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
W{ofz^KUU${bi?Sw8NwI>!v6#8$(We{

diff --git a/web/plugins/views/inv_cisco_wlc_aps_lwap.py b/web/plugins/views/inv_cisco_wlc_aps_lwap.py
index 0317984..67974dd 100644
--- a/web/plugins/views/inv_cisco_wlc_aps_lwap.py
+++ b/web/plugins/views/inv_cisco_wlc_aps_lwap.py
@@ -1,10 +1,10 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
-import cmk.gui.utils
 from cmk.gui.plugins.views import (
     inventory_displayhints,)
 from cmk.gui.i18n import _
+from cmk.gui.plugins.views.inventory import declare_invtable_view
 
 
 inventory_displayhints.update({
@@ -67,6 +67,4 @@ inventory_displayhints.update({
     '.networking.wlan.controller.accesspoints_lwap:*.ble_fw_download_status'       : {'title': _('Ble FW downaload status')},
 })
 
-from cmk.gui.plugins.views.inventory import declare_invtable_view
-
 declare_invtable_view('invwlcapslwap', '.networking.wlan.controller.accesspoints_lwap:', _('Cisco WLC APs LWAP info'), _('Cisco WLC APs LWAP info)'))
diff --git a/web/plugins/wato/inv_cisco_wlc_aps_lwap.py b/web/plugins/wato/inv_cisco_wlc_aps_lwap.py
index e2bb151..4d6be49 100644
--- a/web/plugins/wato/inv_cisco_wlc_aps_lwap.py
+++ b/web/plugins/wato/inv_cisco_wlc_aps_lwap.py
@@ -16,7 +16,7 @@ from cmk.gui.plugins.wato.inventory import (
     RulespecGroupInventory,
 )
 
-removecolumns = [
+_removecolumns = [
     ('adj_channel_rogue_enabled', 'Adj. channel rogue'),
     ('admin', 'Admin state'),
     ('amsdu', 'Aggregate MAC Service Data Unit'),
@@ -78,7 +78,7 @@ def _valuespec_inv_cisco_wlc_aps_lwap():
              ListChoice(
                  title=_('list of columns to remove'),
                  help=_('information to remove from inventory'),
-                 choices=removecolumns,
+                 choices=_removecolumns,
                  default_value=[
                      'adj_channel_rogue_enabled', 'amsdu', 'is_master', 'is_universal', 'submode',
                      'universal_prime_status', 'max_client_limit_cause', 'ble_fw_download_status', 'antenna_band_mode',
-- 
GitLab