From bef5cd37eb338ec9ea0101d4af9945a8c377e6b5 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Sat, 18 May 2024 19:01:15 +0200 Subject: [PATCH] update project --- README.md | 2 +- mkp/nvdct-0.8.9-20240518.mkp | Bin 0 -> 39407 bytes source/bin/nvdct/lib/utils.py | 2 +- source/bin/nvdct/nvdct.py | 85 +++++++++++++++++++++++++--------- source/packages/nvdct | 2 +- 5 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 mkp/nvdct-0.8.9-20240518.mkp diff --git a/README.md b/README.md index 604763c..9e10c1c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[PACKAGE]: ../../raw/master/mkp/nvdct-0.8.8-20240508.mkp "nvdct-0.8.8-20240508.mkp" +[PACKAGE]: ../../raw/master/mkp/nvdct-0.8.9-20240518.mkp "nvdct-0.8.9-20240518.mkp" Network Visualization Data Creation Tool (NVDCT) This script creates the topology data file needed for the [Checkmk Exchange Network visualization](https://exchange.checkmk.com/p/network-visualization) plugin by Andreas Boesl and [schnetz](https://exchange.checkmk.com/u/schnetz).\ diff --git a/mkp/nvdct-0.8.9-20240518.mkp b/mkp/nvdct-0.8.9-20240518.mkp new file mode 100644 index 0000000000000000000000000000000000000000..56d6a36ea2f20ee8588ad32227b3487e7599da62 GIT binary patch literal 39407 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⁢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 literal 0 HcmV?d00001 diff --git a/source/bin/nvdct/lib/utils.py b/source/bin/nvdct/lib/utils.py index 4ec0812..49f2986 100755 --- a/source/bin/nvdct/lib/utils.py +++ b/source/bin/nvdct/lib/utils.py @@ -22,7 +22,7 @@ from time import time as now_time from tomllib import loads as toml_loads, TOMLDecodeError from typing import List, Dict, Any, TextIO -NVDCT_VERSION = '0.8.8-20240507' +NVDCT_VERSION = '0.8.9-20240518' @unique diff --git a/source/bin/nvdct/nvdct.py b/source/bin/nvdct/nvdct.py index ffa5fb1..9b564ed 100755 --- a/source/bin/nvdct/nvdct.py +++ b/source/bin/nvdct/nvdct.py @@ -86,7 +86,7 @@ # min inv_lldp_cache version: 0.9.3-20240320 -> host label nvdct/has_lldp_neighbours # 2024-03-27: added option --api-port, defaults to 80 # 2024-03-28: changed restapi get_interface_data to use one call to fetch all data -# 2024-03-29: added L3V4_IGNORE_IP and L3V4_IRNORE_WILDCARD to toml file +# 2024-03-29: added L3V4_IGNORE_IP and L3V4_IGNORE_WILDCARD to toml file # 2024-03-31: fixed: L3V3_REPLACE -> L3V4_REPLACE # made input from toml more bullet proof # 2024-04-03: change HostCacheMultiSite to be child of HostCacheLiveStatus @@ -102,6 +102,10 @@ # added tooltip for --skip-l3-if and --skip-l3-ip # 2024-04-30: automatically create @default if it doesn't exist # 2024-05-07: fixed handling of ignore wildcard in L3v4 topology +# 2024-05-17: added support for Extreme interfaces in LLDP without stack id (1 -> 1:1) +# 2024-05-18: added support for NXOS interfaces in LLDP in short from (Eth1/1 -> Ethernet1/1) +# added IP-Address/IP-Network as quickinfo +# 2024-05-18: fixed crash non empty neighbour port (ThX to andreas doehler) # creating topology data json from inventory data # @@ -142,8 +146,8 @@ __objects = { # "link": {}, # object not in CMK core 'metadata': { 'images': { - 'icon': 'icon_warning', # additional immage shown at the node - 'emblem': 'ip-network_80', # image to show for a object + 'icon': 'icon_warning', # additional image shown at the node + 'emblem': 'ip-network_80', # image to show for an object }, 'tooltip': { 'html': "Test message<div style='color: blue'>Some color <b>test</b></div>", @@ -263,7 +267,8 @@ def add_host_object(host: str, emblem: bool = False) -> None: 'images': { 'emblem': EMBLEMS.host_node, # node image # 'icon': 'icon_tick', # status image, top left from emblem - } + }, + **({'tooltip': {'quickinfo': [{'name': 'Host node', 'value': host}]}} if not link else {}) } NV_OBJECTS[host] = { @@ -342,7 +347,8 @@ def add_service_object( 'images': { 'emblem': EMBLEMS.service_node, # node image # 'icon': 'icon_tick', # status image, top left from emblem - } + }, + **({'tooltip': {'quickinfo': [{'name': 'Service node', 'value': item}]}} if not link else {}) }) if isinstance(native_speed, int): metadata.update({'native_speed': native_speed}) @@ -368,6 +374,11 @@ def add_ipv4_network_object(network: str, emblem: str | None = None) -> None: 'images': { 'emblem': emblem, # node image # 'icon': 'icon_tick', # status image, top left from emblem + }, + 'tooltip': { + 'quickinfo': [ + {'name': 'IP-Network', 'value': network}, + ] } } } @@ -387,6 +398,11 @@ def add_ipv4_address_object(host: str, interface: str | None, ipv4_address: str) 'images': { 'emblem': EMBLEMS.ip_address, # 'icon': 'icon_tick', + }, + 'tooltip': { + 'quickinfo': [ + {'name': 'IP-Address', 'value': ipv4_address}, + ] } } } @@ -600,26 +616,51 @@ def get_service_by_interface(host: str, interface: str) -> Tuple[str | None, str Returns: Tuple of interface item, native interface speed in bits per second """ + + _alternate_if_name = { + 'ethernet': 'eth', + # 'fastethernet': 'Fa', + # 'gigabitethernet': 'Gi', + # 'tengigabitethernet': 'Te', + # 'fortygigabitethernet': 'Fo', + # 'hundredgigabitethernet': 'Hu', + # 'management': 'Ma', + } + + def _get_short_if_name(interface: str) -> str: + """ + returns short interface name from long interface name + interface: is the long interface name + :type interface: str + """ + if not interface: + return interface + for interface_prefix in _alternate_if_name.keys(): + if interface.lower().startswith(interface_prefix.lower()): + interface_short = _alternate_if_name[interface_prefix] + return interface.lower().replace(interface_prefix.lower(), interface_short, 1) + return interface + # try to find the item for an interface - def _match_entry_with_item(_entry: Dict[str, str], services: List[str]) -> str | None: + def _match_entry_with_item(_entry: Dict[str, str], services: List[str]) -> Tuple[str | None, str | None]: values = [_entry.get('name'), _entry.get('description'), _entry.get('alias')] for value in values: if value in services: - return value + return value, _entry.get('speed') index = str(_entry.get('index')) # for index try with padding for i in range(1, 6): index_padded = f'{index:0>{i}}' if index_padded in services: - return index_padded + return index_padded, _entry.get('speed') # still not found try values + index for value in values: if f'{value} {index_padded}' in services: - return f'{value} {index_padded}' + return f'{value} {index_padded}', _entry.get('speed') LOGGER.warning(f'no match found |{_entry}|{services}|') - return None + return None, None # empty host/neighbour should never happen here if not host: @@ -657,14 +698,12 @@ def get_service_by_interface(host: str, interface: str) -> Tuple[str | None, str str(_entry.get('index')), _entry.get('phys_address'), ]: - _interface = _match_entry_with_item(_entry, interface_items) - if _interface: - native_speed = _entry.get('speed') - LOGGER.debug( - msg=f'Device: {host}: speed for interface ' - f'{interface} is {native_speed}' - ) - return _interface, native_speed + return _match_entry_with_item(_entry, interface_items) + elif f'1:{interface}' == _entry.get('name'): # Extreme non stack: + return _match_entry_with_item(_entry, interface_items) + elif _entry.get('name') is not None and _get_short_if_name( + _entry.get('name')) == interface.lower(): # Cisco NXOS + return _match_entry_with_item(_entry, interface_items) LOGGER.warning(msg=f'Device: {host}: service for interface {interface} not found') return None, None @@ -679,8 +718,12 @@ def create_device_from_inv( data: Dict = {'connections': {}, "interfaces": []} for topo_neighbour in inv_data: - neighbour = topo_neighbour.get(inv_columns.neighbour) - if not neighbour: + # check if required data are not empty + if not (neighbour := topo_neighbour.get(inv_columns.neighbour)): + continue + if not (raw_local_port := topo_neighbour.get(inv_columns.local_port)): + continue + if not (raw_neighbour_port := topo_neighbour.get(inv_columns.neighbour_port)): continue # drop neighbour if inventory neighbour is invalid @@ -711,7 +754,6 @@ def create_device_from_inv( neighbour = HOST_MAP[neighbour] # getting/checking interfaces - raw_local_port = topo_neighbour.get(inv_columns.local_port, '') local_port, _local_speed = get_service_by_interface(host, raw_local_port) if not local_port: local_port = raw_local_port @@ -722,7 +764,6 @@ def create_device_from_inv( msg=f'host: {host}, raw_local_port: {raw_local_port} -> local_port: {local_port}' ) - raw_neighbour_port = topo_neighbour.get(inv_columns.neighbour_port, '') neighbour_port, _neighbour_speed = get_service_by_interface(neighbour, raw_neighbour_port) if not neighbour_port: neighbour_port = raw_neighbour_port diff --git a/source/packages/nvdct b/source/packages/nvdct index 36a3ef5..d046438 100644 --- a/source/packages/nvdct +++ b/source/packages/nvdct @@ -57,7 +57,7 @@ 'htdocs/images/icons/location_80.png']}, 'name': 'nvdct', 'title': 'Network Visualization Data Creation Tool (NVDCT)', - 'version': '0.8.8-20240508', + 'version': '0.8.9-20240518', 'version.min_required': '2.2.0b1', 'version.packaged': '2.2.0p24', 'version.usable_until': '2.4.0p1'} -- GitLab