diff --git a/README.md b/README.md index 31a7384bae31c439ede6780c5815942bc84a813a..2a289b7d92895e43bb32bfb676ff2516d902416b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[PACKAGE]: ../../raw/master/mkp/inv_cisco_wlc_ap_cdp_cache-0.4.1-20240308.mkp "inv_cisco_wlc_ap_cdp_cache-0.4.1-20240308.mkp" # Cisco WLC AP CDP cache inventory plugin Adds APs CDP information to the inventory diff --git a/mkp/inv_cisco_wlc_ap_cdp_cache-0.4.1-20240308.mkp b/mkp/inv_cisco_wlc_ap_cdp_cache-0.4.1-20240308.mkp new file mode 100644 index 0000000000000000000000000000000000000000..f1ee1d7d9944f04d602f8ed2914c9608b3ba91c8 Binary files /dev/null and b/mkp/inv_cisco_wlc_ap_cdp_cache-0.4.1-20240308.mkp differ diff --git a/source/agent_based/inv_cisco_wlc_ap_cdp_cache.py b/source/agent_based/inv_cisco_wlc_ap_cdp_cache.py new file mode 100644 index 0000000000000000000000000000000000000000..b983c818a08f366a1380b48b51a36edd7aff4c53 --- /dev/null +++ b/source/agent_based/inv_cisco_wlc_ap_cdp_cache.py @@ -0,0 +1,185 @@ +#!/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 : 2016-04-08 +# +# inventory of cisco wlc ap cdp cache +# +# 2016-08-22: removed index column +# 2018-08-03: code cleanup +# 2018-09-04: changes for CMK 1.5.x (inv_tree --> inv_tree_list) +# 2020-03-15: added support for CMK1.6x +# 2021-07-10: rewritten vor CMK 2.0 +# 2021-07-15 : added support for Catalyst 9800 Controllers +# 2023-06-07: moved gui files to ~/local/lib/chek_mk/gui/plugins/... +# + +from cmk.base.plugins.agent_based.agent_based_api.v1 import ( + register, + SNMPTree, + TableRow, + contains, + any_of, +) +from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( + StringTable, + InventoryResult, +) + + +def _render_ip_address(bytestring): + if len(bytestring) == 4: + return '.'.join(['%s' % ord(m) for m in bytestring]) + else: + bytestring_clean = bytestring.replace('"', '').replace('|4|', '').replace('.', ' ').strip().split(' ') + try: + return '.'.join(['%s' % int(m, 16) for m in bytestring_clean]) + except ValueError: + return bytestring + + +_cdp_duplex = { + '0': 'N/A', + '1': 'unknown', + '2': 'full duplex', + '3': 'half duplex', +} + +_cdp_speed = { + '0': 'N/A', + '1': 'none', + '2': '10Mbps', + '3': '100Mbps', + '4': '1000Mbps', + '5': 'auto', +} + +_interface_displayhints = { + 'ethernet': 'eth', + 'fastethernet': 'Fa', + 'gigabitethernet': 'Gi', + 'tengigabitethernet': 'Te', + 'fortygigabitethernet': 'Fo', + 'hundredgigabitethernet': 'Hu', + 'port-channel': 'Po', + 'tunnel': 'Tu', + 'loopback': 'Lo', + 'cellular': 'Cel', + 'vlan': 'Vlan', + 'management': 'Ma', +} + + +def _get_short_if_name(ifname: str) -> str: + """ + returns 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] + return ifname.lower().replace(ifname_prefix.lower(), ifname_short, 1) + return ifname + + +def parse_cisco_wlc_ap_cdp_cache(string_table: StringTable): + neighbours = [] + for deviceindex, apname, apaddresstype, apaddress, neighname, neighaddresstype, neighaddress, neighinterface, \ + platform, duplex, speed in string_table: + + if int(apaddresstype) == 1: + apaddress = _render_ip_address(apaddress) + + if int(neighaddresstype) == 1: + neighaddress = _render_ip_address(neighaddress) + + neighbours.append({ + 'ap_name': apname, + 'ap_address': apaddress, + 'neighbour_name': neighname, + 'neighbour_address': neighaddress, + 'neighbour_interface': neighinterface, + 'neighbour_platform': platform, + 'duplex': _cdp_duplex.get(duplex), + 'speed': _cdp_speed.get(speed), + }) + + return neighbours + + +def inventory_cisco_wlc_ap_cdp_cache(params, section) -> InventoryResult: + removecolumns = [] + remove_domain = False + domain_name = '' + use_short_if_name = False + + if params: + removecolumns = params.get('removecolumns', removecolumns) + remove_domain = params.get('remove_domain', remove_domain) + domain_name = params.get('domain_name', domain_name) + use_short_if_name = params.get('use_short_if_name', use_short_if_name) + + path = ['networking', 'wlan', 'controller', 'ap_cdp_cache'] + + for neighbour in section: + if remove_domain: + if not domain_name == '': + neighbour['neighbour_name'] = neighbour['neighbour_name'].replace(domain_name, '') + else: + neighbour['neighbour_name'] = neighbour['neighbour_name'].split('.')[0] + + if use_short_if_name: + neighbour['neighbour_interface'] = _get_short_if_name(neighbour['neighbour_interface']) + + key_columns = {'ap_name': neighbour['ap_name']} + + for key in key_columns.keys(): + neighbour.pop(key) + + for entry in removecolumns: + neighbour.pop(entry) + + yield TableRow( + path=path, + key_columns=key_columns, + inventory_columns=neighbour + ) + + +register.snmp_section( + name='inv_cisco_wlc_ap_cdp_cache', + parse_function=parse_cisco_wlc_ap_cdp_cache, + fetch=SNMPTree( + base='.1.3.6.1.4.1.9.9.623.1.3.1.1', # CISCO-LWAPP-CDP-MIB::clcCdpApCacheEntry + oids=[ + '1', # clcCdpApCacheDeviceIndex + '2', # clcCdpApCacheApName + '3', # clcCdpApCacheApAddressType + '4', # clcCdpApCacheApAddress + '6', # clcCdpApCacheNeighName + '7', # clcCdpApCacheNeighAddressType + '8', # clcCdpApCacheNeighAddress + '9', # clcCdpApCacheNeighInterface + '12', # clcCdpApCachePlatform + '15', # clcCdpApCacheDuplex + '16', # clcCdpApCacheInterfaceSpeed + ] + ), + detect=any_of( + contains('.1.3.6.1.2.1.1.1.0', 'Cisco Controller'), # sysDescr + contains('.1.3.6.1.2.1.1.1.0', 'C9800 Software'), # sysDescr + ) +) + +register.inventory_plugin( + name='inv_cisco_wlc_ap_cdp_cache', + inventory_function=inventory_cisco_wlc_ap_cdp_cache, + inventory_default_parameters={}, + inventory_ruleset_name='inv_cisco_wlc_ap_cdp_cache', +) diff --git a/source/gui/wato/check_parameters/inv_cisco_wlc_ap_cdp_cache.py b/source/gui/wato/check_parameters/inv_cisco_wlc_ap_cdp_cache.py new file mode 100644 index 0000000000000000000000000000000000000000..d24febe6fe6a8a3518589439eeb41a9b48736f93 --- /dev/null +++ b/source/gui/wato/check_parameters/inv_cisco_wlc_ap_cdp_cache.py @@ -0,0 +1,76 @@ +#!/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 : 2016-04-08 +# +# +# 2023-06-14: moved wato file to check_parameters sub directory + +from cmk.gui.i18n import _ +from cmk.gui.plugins.wato.utils import ( + HostRulespec, + rulespec_registry, +) +from cmk.gui.valuespec import ( + Dictionary, + FixedValue, + TextAscii, + ListChoice, +) + +from cmk.gui.plugins.wato.inventory import ( + RulespecGroupInventory, +) + +_removecolumns_cisco_wlc_ap_cdp_cache = [ + ('duplex', 'Duplex'), + ('speed', 'Speed'), +] + + +def _valuespec_inv_cisco_wlc_ap_cdp_cache(): + return Dictionary( + title=_('Cisco WLC AP CDP cache'), + elements=[ + ('remove_domain', + FixedValue( + True, + title=_('Remove domain name from neighbour device name'), + totext=_('Remove the domain name enabled'), + default_value=False, + )), + ('domain_name', + TextAscii( + title=_('Specific domain name to remove from neighbour device name'), + allow_empty=False, + default_value='', + )), + ('removecolumns', + ListChoice( + title=_('List of columns to remove'), + help=_('information to remove from inventory'), + choices=_removecolumns_cisco_wlc_ap_cdp_cache, + default_value=[], + )), + ('use_short_if_name', + FixedValue( + True, + title=_('use short interface names (i.e. Gi0/0 for GigabitEthernet0/0)'), + totext=_('use short interface names enabled'), + default_value=False, + )), + ], + ) + + +rulespec_registry.register( + HostRulespec( + group=RulespecGroupInventory, + match_type='dict', + name='inv_parameters:inv_cisco_wlc_ap_cdp_cache', + valuespec=_valuespec_inv_cisco_wlc_ap_cdp_cache, + )) diff --git a/source/packages/inv_cisco_wlc_ap_cdp_cache b/source/packages/inv_cisco_wlc_ap_cdp_cache new file mode 100644 index 0000000000000000000000000000000000000000..ad53498c2c41f2c3b32d6602bf04e789b6c382f3 --- /dev/null +++ b/source/packages/inv_cisco_wlc_ap_cdp_cache @@ -0,0 +1,21 @@ +{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)', + 'description': 'SNMP inventory for Cisco WLC AP CDP cache ' + '(CISCO-LWAPP-CDP-MIB).\n' + '\n' + 'via WATO you can:\n' + ' - you can add/remove some fields\n' + ' - remove domain from neighbor name\n' + ' - use short interface names\n' + '\n' + '2020-03.15: added support for CMK1.6x\n' + '2021-07-10: rewritten for CMK 2.0\n', + 'download_url': 'https://thl-cmk.hopto.org', + 'files': {'agent_based': ['inv_cisco_wlc_ap_cdp_cache.py'], + 'gui': ['wato/check_parameters/inv_cisco_wlc_ap_cdp_cache.py'], + 'web': ['plugins/views/inv_cisco_wlc_ap_cdp_cache.py']}, + 'name': 'inv_cisco_wlc_ap_cdp_cache', + 'title': 'inventory for Cisco WLC AP CDP cache (CISCO-LWAPP-CDP-MIB)', + 'version': '0.4.1-20240308', + 'version.min_required': '2.2.0b1', + 'version.packaged': '2.2.0p17', + 'version.usable_until': None} diff --git a/source/web/plugins/views/inv_cisco_wlc_ap_cdp_cache.py b/source/web/plugins/views/inv_cisco_wlc_ap_cdp_cache.py new file mode 100644 index 0000000000000000000000000000000000000000..93d1b3a684311a12d0665b586fc7f9f45512c0b0 --- /dev/null +++ b/source/web/plugins/views/inv_cisco_wlc_ap_cdp_cache.py @@ -0,0 +1,34 @@ +#!/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 : 2016-04-08 +# +# +# 2023-06-14: removed declare_invtable_view from view definition on cmk 2.2 (see werk 15493) +# changed inventory_displayhints import (see werk 15493) +# 2024-03-08: moved view back to ~/local/share/check_mk/web/plugins/views + + +from cmk.gui.i18n import _ +from cmk.gui.views.inventory.registry import inventory_displayhints + +inventory_displayhints.update({ + '.networking.wlan.controller.ap_cdp_cache:': {'title': _('Access Points CDP Cache'), + 'keyorder': ['ap_name', 'ap_address', 'neighbour_name', + 'neighbour_address', 'neighbour_interface', + 'neighbour_platform', ], + 'view': 'invwlcapcdpcache_of_host', + }, + '.networking.wlan.controller.ap_cdp_cache:*.ap_name': {'title': _('AP name'), }, + '.networking.wlan.controller.ap_cdp_cache:*.ap_address': {'title': _('AP address'), }, + '.networking.wlan.controller.ap_cdp_cache:*.neighbour_name': {'title': _('Neighbour name'), }, + '.networking.wlan.controller.ap_cdp_cache:*.neighbour_address': {'title': _('Neighbour address'), }, + '.networking.wlan.controller.ap_cdp_cache:*.neighbour_interface': {'title': _('Neighbour interface'), }, + '.networking.wlan.controller.ap_cdp_cache:*.neighbour_platform': {'title': _('Neighbour platform'), }, + '.networking.wlan.controller.ap_cdp_cache:*.duplex': {'title': _('Duplex'), }, + '.networking.wlan.controller.ap_cdp_cache:*.speed': {'title': _('Speed'), }, +})