From 3e49d45bcc2a3fac4324544ddc522d338477e565 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Fri, 8 Mar 2024 16:40:47 +0100 Subject: [PATCH] update project --- README.md | 1 + ..._cisco_wlc_ap_cdp_cache-0.4.1-20240308.mkp | Bin 0 -> 3526 bytes .../agent_based/inv_cisco_wlc_ap_cdp_cache.py | 185 ++++++++++++++++++ .../inv_cisco_wlc_ap_cdp_cache.py | 76 +++++++ source/packages/inv_cisco_wlc_ap_cdp_cache | 21 ++ .../views/inv_cisco_wlc_ap_cdp_cache.py | 34 ++++ 6 files changed, 317 insertions(+) create mode 100644 mkp/inv_cisco_wlc_ap_cdp_cache-0.4.1-20240308.mkp create mode 100644 source/agent_based/inv_cisco_wlc_ap_cdp_cache.py create mode 100644 source/gui/wato/check_parameters/inv_cisco_wlc_ap_cdp_cache.py create mode 100644 source/packages/inv_cisco_wlc_ap_cdp_cache create mode 100644 source/web/plugins/views/inv_cisco_wlc_ap_cdp_cache.py diff --git a/README.md b/README.md index 31a7384..2a289b7 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 GIT binary patch literal 3526 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 U{eLLo_EMq*dJ;(Tg@ojP0Cn;Ey#N3J literal 0 HcmV?d00001 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 0000000..b983c81 --- /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 0000000..d24febe --- /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 0000000..ad53498 --- /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 0000000..93d1b3a --- /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'), }, +}) -- GitLab