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

---
 agent_based/inv_cisco_wlc_clients.py       | 326 +++++++++++----------
 inv_cisco_wlc_clients.mkp                  | Bin 5449 -> 5650 bytes
 web/plugins/views/inv_cisco_wlc_clients.py | 112 +++----
 web/plugins/wato/inv_cisco_wlc_clients.py  |   5 +-
 4 files changed, 228 insertions(+), 215 deletions(-)

diff --git a/agent_based/inv_cisco_wlc_clients.py b/agent_based/inv_cisco_wlc_clients.py
index 11b58df..c208d2c 100644
--- a/agent_based/inv_cisco_wlc_clients.py
+++ b/agent_based/inv_cisco_wlc_clients.py
@@ -37,164 +37,171 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
 )
 
 _enable_disable = {
-    0: 'N/A',
-    1: 'enabled',
-    2: 'disabled',
+    '0': 'N/A',
+    '1': 'enabled',
+    '2': 'disabled',
 }
 
 _isaclapplied = {
-    0: 'n/a',
-    1: 'true',
-    2: 'false',
-    3: 'notavailable',
+    '0': 'n/a',
+    '1': 'true',
+    '2': 'false',
+    '3': 'notavailable',
 }
 
 _associationmode = {
-    0: 'n/a',
-    1: 'unknown',
-    2: 'wep',
-    3: 'wpa',
-    4: 'wpa2',
+    '0': 'n/a',
+    '1': 'unknown',
+    '2': 'wep',
+    '3': 'wpa',
+    '4': 'wpa2',
 }
 
 _authmode = {
-    0: 'none',
-    1: 'psk',
-    2: 'radius',
-    3: 'cckm',
-    4: 'wapipsk',
-    5: 'wapicert',
-    6: 'ftdot1x',
-    7: 'ftpsk',
-    8: 'pmfdot1x',
-    9: 'pmfpsk',
+    '0': 'none',
+    '1': 'psk',
+    '2': 'radius',
+    '3': 'cckm',
+    '4': 'wapipsk',
+    '5': 'wapicert',
+    '6': 'ftdot1x',
+    '7': 'ftpsk',
+    '8': 'pmfdot1x',
+    '9': 'pmfpsk',
 }
 
 _reasoncode = {
-    0: 'n/a',
-    1: 'unspecified',
-    2: 'previousauthnotvalid',
-    3: 'deauthenticationleaving',
-    4: 'disassociationduetoinactivity',
-    5: 'disassociationapbusy',
-    6: 'class2framefromnonauthstation',
-    7: 'class2framefromnonassstation',
-    8: 'disassociationstahasleft',
-    9: 'stareqassociationwithoutauth',
-    10: 'invalidinformationelement',
-    11: 'groupcipherinvalid',
-    12: 'unicastcipherinvalid',
-    13: 'akmpinvalid',
-    14: 'unsupportedrsnversion',
-    15: 'invalidrsniecapabilities',
-    16: 'ciphersuiterejected',
-    17: 'missingreasoncode',
-    18: 'maxassociatedclientsreached',
-    19: 'maxassociatedclientsreachedonradio',
-    20: 'maxassociatedclientsreachedonwlan',
-    21: 'unspecifiedqosfailure',
-    22: 'qospolicymismatch',
-    23: 'insufficientbandwidth',
-    24: 'invalidqosparams',
+    '0': 'n/a',
+    '1': 'unspecified',
+    '2': 'previousauthnotvalid',
+    '3': 'deauthenticationleaving',
+    '4': 'disassociationduetoinactivity',
+    '5': 'disassociationapbusy',
+    '6': 'class2framefromnonauthstation',
+    '7': 'class2framefromnonassstation',
+    '8': 'disassociationstahasleft',
+    '9': 'stareqassociationwithoutauth',
+    '10': 'invalidinformationelement',
+    '11': 'groupcipherinvalid',
+    '12': 'unicastcipherinvalid',
+    '13': 'akmpinvalid',
+    '14': 'unsupportedrsnversion',
+    '15': 'invalidrsniecapabilities',
+    '16': 'ciphersuiterejected',
+    '17': 'missingreasoncode',
+    '18': 'maxassociatedclientsreached',
+    '19': 'maxassociatedclientsreachedonradio',
+    '20': 'maxassociatedclientsreachedonwlan',
+    '21': 'unspecifiedqosfailure',
+    '22': 'qospolicymismatch',
+    '23': 'insufficientbandwidth',
+    '24': 'invalidqosparams',
 }
 
 _authentication = {
-    0: 'n/a',
-    1: 'unknown',
-    2: 'central',
-    3: 'local',
+    '0': 'n/a',
+    '1': 'unknown',
+    '2': 'central',
+    '3': 'local',
 }
 
 _dataswitching = {
-    0: 'n/a',
-    1: 'unknown',
-    2: 'central',
-    3: 'local',
+    '0': 'n/a',
+    '1': 'unknown',
+    '2': 'central',
+    '3': 'local',
 }
 
 _hreapapauth = {
-    0: 'n/a',
-    1: 'true',
-    2: 'false',
-    3: 'notapplicable',
+    '0': 'n/a',
+    '1': 'true',
+    '2': 'false',
+    '3': 'notapplicable',
 }
 
 _nacstate = {
-    0: 'n/a',
-    1: 'quarantine',
-    2: 'access',
+    '0': 'n/a',
+    '1': 'quarantine',
+    '2': 'access',
 }
 
 _protocol = {
-    0: 'n/a',
-    1: '802.11a',
-    2: '802.11b',
-    3: '802.11g',
-    4: 'unknown',
-    5: 'mobile',
-    6: '802.11n 2,4Ghz',
-    7: '802.11n 5GHz',
-    8: 'ethernet',
-    9: 'dot3',
-    10: '802.11ac 5GHz'
+    '0': 'n/a',
+    '1': '802.11a',
+    '2': '802.11b',
+    '3': '802.11g',
+    '4': 'unknown',
+    '5': 'mobile',
+    '6': '802.11n 2,4Ghz',
+    '7': '802.11n 5GHz',
+    '8': 'ethernet',
+    '9': 'dot3',
+    '10': '802.11ac 5GHz'
 }
 
 _userauthtype = {
-    0: 'n/a',
-    1: 'open',
-    2: 'wepPsk',
-    3: 'portal',
-    4: 'simPeap',
-    5: 'other',
+    '0': 'n/a',
+    '1': 'open',
+    '2': 'wepPsk',
+    '3': 'portal',
+    '4': 'simPeap',
+    '5': 'other',
 }
 
 _wgbstatus = {
-    0: 'n/a',
-    1: 'wireless client',
-    2: 'wireless client via WGB',
-    3: 'WGB itself',
+    '0': 'n/a',
+    '1': 'wireless client',
+    '2': 'wireless client via WGB',
+    '3': 'WGB itself',
 }
 
 _clientstatus = {
-    0: 'n/a',
-    1: 'idle',
-    2: 'aaa Pending',
-    3: 'authenticated',
-    4: 'associated',
-    5: 'powersave',
-    6: 'disassociated',
-    7: 'to be deleted',
-    8: 'probing',
-    9: 'excluded',
+    '0': 'n/a',
+    '1': 'idle',
+    '2': 'aaa Pending',
+    '3': 'authenticated',
+    '4': 'associated',
+    '5': 'powersave',
+    '6': 'disassociated',
+    '7': 'to be deleted',
+    '8': 'probing',
+    '9': 'excluded',
 }
 
 _interfacetype = {
-    0: 'n/a',
-    1: '802.11bg',
-    2: '802.11a',
-    3: 'Ultra wideband',
-    4: '802.11abgn',
-    5: '802.11ac',
-    6: '802.11b',
-    7: '802.11g',
-    8: '802.11n 2.4GHz',
-    9: '802.11n 5GHz',
-    10: 'unknown',
+    '0': 'n/a',
+    '1': '802.11bg',
+    '2': '802.11a',
+    '3': 'Ultra wideband',
+    '4': '802.11abgn',
+    '5': '802.11ac',
+    '6': '802.11b',
+    '7': '802.11g',
+    '8': '802.11n 2.4GHz',
+    '9': '802.11n 5GHz',
+    '10': 'unknown',
 }
 
 _powersavemode = {
-    0: 'n/a',
-    1: 'active',
-    2: 'powersave',
+    '0': 'n/a',
+    '1': 'active',
+    '2': 'powersave',
 }
 
 
 def _render_mac_address(bytestring):
-    return ':'.join(['%02s' % hex(ord(m))[2:] for m in bytestring]).replace(' ', '0').upper()
+    macaddress = bytestring
+    bytestring = bytestring.replace('|4|', ' ').replace('|4.', ' ').replace('"', '').strip(' ').strip('.').replace(' ', ':').replace('.', ':')
+
+    if len(bytestring) == 17:
+        return bytestring
+    else:
+        return ':'.join(['%02s' % hex(ord(m))[2:] for m in macaddress]).replace(' ', '0').upper()
 
 
 def parse_inv_cisco_wlc_clients(string_table: StringTable):
     clients = []
+    index = 0
 
     for client in string_table:
         macaddress, status, wlanprofilename, wgbstatus, wgbmacaddress, protocol, associationmode, \
@@ -205,56 +212,57 @@ def parse_inv_cisco_wlc_clients(string_table: StringTable):
         channel, authmode, reasoncode, sessionid, aproammacaddress, mdnsprofile, mdnsadvcount, \
         policyname, aaarole, devicetype, userauthtype = client
 
-        clients.append({
-            'macaddress': _render_mac_address(macaddress),
-            'username': username,
-            'status_columns': {
-                'status': _clientstatus.get(int(status)),
-                'wlanprofilename': wlanprofilename,
-                'wgbstatus': _wgbstatus.get(int(wgbstatus)),
-                'wgbmacaddress': wgbmacaddress,
-                'protocol': _protocol.get(int(protocol)),
-                'associationmode': _associationmode.get(int(associationmode)),
-                'apmacaddress': _render_mac_address(apmacaddress),
-                'iftype': _interfacetype.get(int(iftype)),
-                'ipaddress': ipaddress,
-                'nacstate': _nacstate.get(int(nacstate)),
-                'quarantinevlan': quarantinevlan,
-                'accessvlan': accessvlan,
-                'logintime': logintime,
-                'uptime': uptime,
-                'powersavemode': _powersavemode.get(int(powersavemode)),
-                'currenttxrateset': currenttxrateset,
-                'datarateset': datarateset,
-                'hreapapauth': _hreapapauth.get(int(hreapapauth)),
-                'ieee80211ucapable': _enable_disable.get(int(ieee80211ucapable)),
-                'posturestate': _enable_disable.get(int(posturestate)),
-                'aclname': aclname,
-                'aclapplied': _isaclapplied.get(int(aclapplied)),
-                'redirecturl': redirecturl,
-                'aaaoverrideaclname': aaaoverrideaclname,
-                'aaaoverrideaclapplied': _isaclapplied.get(int(aaaoverrideaclapplied)),
-                'ssid': ssid,
-                'securitytagid': securitytagid,
-                'typekts': _enable_disable.get(int(typekts)),
-                'ipv6aclname': ipv6aclname,
-                'ipv6aclapplied': _isaclapplied.get(int(ipv6aclapplied)),
-                'dataswitching': _dataswitching.get(int(dataswitching)),
-                'authentication': _authentication.get(int(authentication)),
-                'channel': channel,
-                'authmode': _authmode.get(int(authmode)),
-                'reasoncode': _reasoncode.get(int(reasoncode)),
-                'sessionid': sessionid,
-                'aproammacaddress': _render_mac_address(aproammacaddress),
-                'mdnsprofile': mdnsprofile,
-                'mdnsadvcount': mdnsadvcount,
-                'policyname': policyname,
-                'aaarole': aaarole,
-                'devicetype': devicetype,
-                'userauthtype': _userauthtype.get(int(userauthtype)),
-            },
-        })
-
+        index += 1
+        client = {}
+        client['status_columns'] = {}
+        client['index'] = index
+        client['status_columns']['username'] = username
+        client['status_columns']['wlanprofilename'] = wlanprofilename
+        client['status_columns']['ipaddress'] = ipaddress
+        client['status_columns']['quarantinevlan'] = quarantinevlan
+        client['status_columns']['accessvlan'] = accessvlan
+        client['status_columns']['logintime'] =logintime
+        client['status_columns']['uptime'] = uptime
+        client['status_columns']['currenttxrateset'] = currenttxrateset
+        client['status_columns']['datarateset'] = datarateset
+        client['status_columns']['aclname'] = aclname
+        client['status_columns']['redirecturl'] = redirecturl
+        client['status_columns']['aaaoverrideaclname'] = aaaoverrideaclname
+        client['status_columns']['ssid'] = ssid
+        client['status_columns']['securitytagid'] = securitytagid
+        client['status_columns']['ipv6aclname'] = ipv6aclname
+        client['status_columns']['channel'] = channel
+        client['status_columns']['sessionid'] = sessionid
+        client['status_columns']['mdnsprofile'] = mdnsprofile
+        client['status_columns']['mdnsadvcount'] = mdnsadvcount
+        client['status_columns']['policyname'] = policyname
+        client['status_columns']['aaarole'] = aaarole
+        client['status_columns']['devicetype'] = devicetype
+        client['status_columns']['macaddress'] = _render_mac_address(macaddress)
+        client['status_columns']['apmacaddress'] = _render_mac_address(apmacaddress)
+        client['status_columns']['aproammacaddress'] = _render_mac_address(aproammacaddress)
+        client['status_columns']['wgbmacaddress'] = _render_mac_address(wgbmacaddress)
+        client['status_columns']['ieee80211ucapable'] = _enable_disable.get(ieee80211ucapable)
+        client['status_columns']['posturestate'] = _enable_disable.get(posturestate)
+        client['status_columns']['typekts'] = _enable_disable.get(typekts)
+        client['status_columns']['aclapplied'] = _isaclapplied.get(aclapplied)
+        client['status_columns']['aaaoverrideaclapplied'] = _isaclapplied.get(aaaoverrideaclapplied)
+        client['status_columns']['ipv6aclapplied'] = _isaclapplied.get(ipv6aclapplied)
+        client['status_columns']['status'] = _clientstatus.get(status)
+        client['status_columns']['wgbstatus'] = _wgbstatus.get(wgbstatus)
+        client['status_columns']['protocol'] = _protocol.get(protocol)
+        client['status_columns']['associationmode'] = _associationmode.get(associationmode)
+        client['status_columns']['iftype'] = _interfacetype.get(iftype)
+        client['status_columns']['nacstate'] = _nacstate.get(nacstate)
+        client['status_columns']['powersavemode'] = _powersavemode.get(powersavemode)
+        client['status_columns']['hreapapauth'] = _hreapapauth.get(hreapapauth)
+        client['status_columns']['dataswitching'] = _dataswitching.get(dataswitching)
+        client['status_columns']['authentication'] = _authentication.get(authentication)
+        client['status_columns']['authmode'] = _authmode.get(authmode)
+        client['status_columns']['reasoncode'] = _reasoncode.get(reasoncode)
+        client['status_columns']['userauthtype'] = _userauthtype.get(userauthtype)
+
+        clients.append(client)
     return clients
 
 
@@ -267,7 +275,7 @@ def inventory_cisco_wlc_clients(params, section) -> InventoryResult:
     path = ['networking', 'wlan', 'controller', 'clients']
 
     for client in section:
-        key_columns = {'username': client['username']}  # 'macaddress': client['macaddress'],
+        key_columns = {'index': client['index']}
 
         for key in key_columns.keys():
             client.pop(key)
diff --git a/inv_cisco_wlc_clients.mkp b/inv_cisco_wlc_clients.mkp
index 680098daad11aad5babacc8b20b0cd130f018d27..037368977b5eca07bc1c0e53aba57326ac588090 100644
GIT binary patch
delta 5573
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
T6%P&iQ_%kb&g^Wb0LTCUd@&7A

delta 5362
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
Q(!ZSk54|(Iq5#MM0Kv|pBLDyZ

diff --git a/web/plugins/views/inv_cisco_wlc_clients.py b/web/plugins/views/inv_cisco_wlc_clients.py
index b8796ed..58ad25b 100644
--- a/web/plugins/views/inv_cisco_wlc_clients.py
+++ b/web/plugins/views/inv_cisco_wlc_clients.py
@@ -3,68 +3,70 @@
 
 import cmk.gui.utils
 from cmk.gui.plugins.views import (
-    inventory_displayhints,)
+    inventory_displayhints, )
 from cmk.gui.i18n import _
 
-
 inventory_displayhints.update({
-    '.networking.wlan.controller.clients:': {'title'   : _('WLC clients'),
-                                             'keyorder': ['username', 'uptime', 'ipaddress', 'apmacaddress', 'ssid',
-                                                          'channel', 'accessvlan', 'devicetype', 'protocol', 'status',
-                                                          ],
-                                             'view'    : 'invwlcclients_of_host'},
+    '.networking.wlan.controller.clients:': {'title': _('WLC clients'),
+                                             'keyorder': [
+                                                 'index', 'test', 'username', 'uptime', 'ipaddress', 'apmacaddress', 'ssid',
+                                                 'channel', 'accessvlan', 'devicetype', 'protocol', 'status',
+                                             ],
+                                             'view': 'invwlcclients_of_host'},
 
-    '.networking.wlan.controller.clients:*.macaddress'            : { 'title' : _('MAC Addresse'), },
-    '.networking.wlan.controller.clients:*.status'                : { 'title' : _('Status'), },
-    '.networking.wlan.controller.clients:*.wlanprofilename'       : { 'title' : _('WLAN profile name'), },
-    '.networking.wlan.controller.clients:*.wgbstatus'             : { 'title' : _('WGB status'), },
-    '.networking.wlan.controller.clients:*.wgbmacaddress'         : { 'title' : _('WGB MAC address'), },
-    '.networking.wlan.controller.clients:*.protocol'              : { 'title' : _('Protocol'), },
-    '.networking.wlan.controller.clients:*.associationmode'       : { 'title' : _('Association mode'), },
-    '.networking.wlan.controller.clients:*.apmacaddress'          : { 'title' : _('AP MAC address'), },
-    '.networking.wlan.controller.clients:*.iftype'                : { 'title' : _('Interface type'), },
-    '.networking.wlan.controller.clients:*.ipaddress'             : { 'title' : _('IP address'), },
-    '.networking.wlan.controller.clients:*.nacstate'              : { 'title' : _('NAC state'), },
-    '.networking.wlan.controller.clients:*.quarantinevlan'        : { 'title' : _('Quarantine VLAN'), },
-    '.networking.wlan.controller.clients:*.accessvlan'            : { 'title' : _('Access VLAN'), },
-    '.networking.wlan.controller.clients:*.logintime'             : { 'title' : _('Login time'), },
-    '.networking.wlan.controller.clients:*.uptime'                : { 'title' : _('Uptime'), },
-    '.networking.wlan.controller.clients:*.powersavemode'         : { 'title' : _('Power save mode'), },
-    '.networking.wlan.controller.clients:*.currenttxrateset'      : { 'title' : _('Current TX rate (MBit/s)'), },
-    '.networking.wlan.controller.clients:*.datarateset'           : { 'title' : _('Data rate set'), },
-    '.networking.wlan.controller.clients:*.hreapapauth'           : { 'title' : _('HREAP AP auth'), },
-    '.networking.wlan.controller.clients:*.ieee80211ucapable'     : { 'title' : _('802.11u capable'), },
-    '.networking.wlan.controller.clients:*.posturestate'          : { 'title' : _('Posture state'), },
-    '.networking.wlan.controller.clients:*.aclname'               : { 'title' : _('ACL name'), },
-    '.networking.wlan.controller.clients:*.aclapplied'            : { 'title' : _('ACL applied'), },
-    '.networking.wlan.controller.clients:*.redirecturl'           : { 'title' : _('Redirect URL'), },
-    '.networking.wlan.controller.clients:*.aaaoverrideaclname'    : { 'title' : _('AAA overide ACL name'), },
-    '.networking.wlan.controller.clients:*.aaaoverrideaclapplied' : { 'title' : _('AAA overide ACL applied'), },
-    '.networking.wlan.controller.clients:*.username'              : { 'title' : _('Username'), },
-    '.networking.wlan.controller.clients:*.ssid'                  : { 'title' : _('SSID'), },
-    '.networking.wlan.controller.clients:*.securitytagid'         : { 'title' : _('Security tag ID'), },
-    '.networking.wlan.controller.clients:*.typekts'               : { 'title' : _('NEC KTS SIP client'), },
-    '.networking.wlan.controller.clients:*.ipv6aclname'           : { 'title' : _('IPv6 ACL name'), },
-    '.networking.wlan.controller.clients:*.ipv6aclapplied'        : { 'title' : _('IPv6 ACL applied'), },
-    '.networking.wlan.controller.clients:*.dataswitching'         : { 'title' : _('Data switching'), },
-    '.networking.wlan.controller.clients:*.authentication'        : { 'title' : _('Authentication'), },
-    '.networking.wlan.controller.clients:*.channel'               : { 'title' : _('Channel'), },
-    '.networking.wlan.controller.clients:*.authmode'              : { 'title' : _('Auth mode'), },
-    '.networking.wlan.controller.clients:*.reasoncode'            : { 'title' : _('Reason code'), },
-    '.networking.wlan.controller.clients:*.sessionid'             : { 'title' : _('Session ID'), },
-    '.networking.wlan.controller.clients:*.aproammacaddress'      : { 'title' : _('AP roam MAC address'), },
-    '.networking.wlan.controller.clients:*.mdnsprofile'           : { 'title' : _('mDNS profile'), },
-    '.networking.wlan.controller.clients:*.mdnsadvcount'          : { 'title' : _('mDNS adv count'), },
-    '.networking.wlan.controller.clients:*.policyname'            : { 'title' : _('Policy name'), },
-    '.networking.wlan.controller.clients:*.aaarole'               : { 'title' : _('AAA role'), },
-    '.networking.wlan.controller.clients:*.devicetype'            : { 'title' : _('Device type'), },
-    '.networking.wlan.controller.clients:*.userauthtype'          : { 'title' : _('User auth type'), },
 
-#    '.networking.wlan.controller.clients:*.certificate_type'     : { 'title' : _('Certificate type'),    'short' : _('Cert type'), 'filter' : visuals.FilterInvtableWLCCertType, 'paint' : 'wlc_cert_type' },
+    '.networking.wlan.controller.clients:*.index': {'title': _('Index'), },
+    '.networking.wlan.controller.clients:*.test': {'title': _('Test'), },
+    '.networking.wlan.controller.clients:*.macaddress': {'title': _('MAC Addresse'), },
+    '.networking.wlan.controller.clients:*.status': {'title': _('Status'), },
+    '.networking.wlan.controller.clients:*.wlanprofilename': {'title': _('WLAN profile name'), },
+    '.networking.wlan.controller.clients:*.wgbstatus': {'title': _('WGB status'), },
+    '.networking.wlan.controller.clients:*.wgbmacaddress': {'title': _('WGB MAC address'), },
+    '.networking.wlan.controller.clients:*.protocol': {'title': _('Protocol'), },
+    '.networking.wlan.controller.clients:*.associationmode': {'title': _('Association mode'), },
+    '.networking.wlan.controller.clients:*.apmacaddress': {'title': _('AP MAC address'), },
+    '.networking.wlan.controller.clients:*.iftype': {'title': _('Interface type'), },
+    '.networking.wlan.controller.clients:*.ipaddress': {'title': _('IP address'), },
+    '.networking.wlan.controller.clients:*.nacstate': {'title': _('NAC state'), },
+    '.networking.wlan.controller.clients:*.quarantinevlan': {'title': _('Quarantine VLAN'), },
+    '.networking.wlan.controller.clients:*.accessvlan': {'title': _('Access VLAN'), },
+    '.networking.wlan.controller.clients:*.logintime': {'title': _('Login time'), },
+    '.networking.wlan.controller.clients:*.uptime': {'title': _('Uptime'), },
+    '.networking.wlan.controller.clients:*.powersavemode': {'title': _('Power save mode'), },
+    '.networking.wlan.controller.clients:*.currenttxrateset': {'title': _('Current TX rate (MBit/s)'), },
+    '.networking.wlan.controller.clients:*.datarateset': {'title': _('Data rate set'), },
+    '.networking.wlan.controller.clients:*.hreapapauth': {'title': _('HREAP AP auth'), },
+    '.networking.wlan.controller.clients:*.ieee80211ucapable': {'title': _('802.11u capable'), },
+    '.networking.wlan.controller.clients:*.posturestate': {'title': _('Posture state'), },
+    '.networking.wlan.controller.clients:*.aclname': {'title': _('ACL name'), },
+    '.networking.wlan.controller.clients:*.aclapplied': {'title': _('ACL applied'), },
+    '.networking.wlan.controller.clients:*.redirecturl': {'title': _('Redirect URL'), },
+    '.networking.wlan.controller.clients:*.aaaoverrideaclname': {'title': _('AAA overide ACL name'), },
+    '.networking.wlan.controller.clients:*.aaaoverrideaclapplied': {'title': _('AAA overide ACL applied'), },
+    '.networking.wlan.controller.clients:*.username': {'title': _('Username'), },
+    '.networking.wlan.controller.clients:*.ssid': {'title': _('SSID'), },
+    '.networking.wlan.controller.clients:*.securitytagid': {'title': _('Security tag ID'), },
+    '.networking.wlan.controller.clients:*.typekts': {'title': _('NEC KTS SIP client'), },
+    '.networking.wlan.controller.clients:*.ipv6aclname': {'title': _('IPv6 ACL name'), },
+    '.networking.wlan.controller.clients:*.ipv6aclapplied': {'title': _('IPv6 ACL applied'), },
+    '.networking.wlan.controller.clients:*.dataswitching': {'title': _('Data switching'), },
+    '.networking.wlan.controller.clients:*.authentication': {'title': _('Authentication'), },
+    '.networking.wlan.controller.clients:*.channel': {'title': _('Channel'), },
+    '.networking.wlan.controller.clients:*.authmode': {'title': _('Auth mode'), },
+    '.networking.wlan.controller.clients:*.reasoncode': {'title': _('Reason code'), },
+    '.networking.wlan.controller.clients:*.sessionid': {'title': _('Session ID'), },
+    '.networking.wlan.controller.clients:*.aproammacaddress': {'title': _('AP roam MAC address'), },
+    '.networking.wlan.controller.clients:*.mdnsprofile': {'title': _('mDNS profile'), },
+    '.networking.wlan.controller.clients:*.mdnsadvcount': {'title': _('mDNS adv count'), },
+    '.networking.wlan.controller.clients:*.policyname': {'title': _('Policy name'), },
+    '.networking.wlan.controller.clients:*.aaarole': {'title': _('AAA role'), },
+    '.networking.wlan.controller.clients:*.devicetype': {'title': _('Device type'), },
+    '.networking.wlan.controller.clients:*.userauthtype': {'title': _('User auth type'), },
 
-})
+    #    '.networking.wlan.controller.clients:*.certificate_type'     : { 'title' : _('Certificate type'),    'short' : _('Cert type'), 'filter' : visuals.FilterInvtableWLCCertType, 'paint' : 'wlc_cert_type' },
 
+})
 
 from cmk.gui.plugins.views.inventory import declare_invtable_view
 
-declare_invtable_view('invwlcclients',   '.networking.wlan.controller.clients:',  _('WLC clients'), _('WLC clients'))
+declare_invtable_view('invwlcclients', '.networking.wlan.controller.clients:', _('WLC clients'), _('WLC clients'))
diff --git a/web/plugins/wato/inv_cisco_wlc_clients.py b/web/plugins/wato/inv_cisco_wlc_clients.py
index f56883d..7da5516 100644
--- a/web/plugins/wato/inv_cisco_wlc_clients.py
+++ b/web/plugins/wato/inv_cisco_wlc_clients.py
@@ -67,7 +67,10 @@ removecolumns = [
 
 def _valuespec_inv_cisco_wlc_clients():
     return Dictionary(
-        title=_('Cisco WLC Client inventory'),
+        title=_('Cisco WLC Clients'),
+        help=_('This inventory plugin collects all the client information from a Cisco Wireless LAN Controller. '
+               'To use this plugin you must also enable "Status data inventory" in a "Do hardware/software inventory" '
+               'rule.'),
         elements=[
             ('removecolumns',
              ListChoice(
-- 
GitLab