From f35ffa9121ba427468cdeb75b4bc6e021487a9e4 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Sun, 17 Nov 2024 17:08:09 +0100 Subject: [PATCH] update project --- README.md | 2 +- mkp/nvdct-0.9.2-20241116.mkp | Bin 0 -> 40580 bytes source/bin/nvdct/conf/nvdct.toml | 71 ++++++++++---------- source/bin/nvdct/lib/args.py | 24 +++---- source/bin/nvdct/lib/settings.py | 109 +++++++++++++++---------------- source/bin/nvdct/lib/utils.py | 2 +- source/bin/nvdct/nvdct.py | 83 +++++++++++++---------- source/packages/nvdct | 2 +- 8 files changed, 155 insertions(+), 138 deletions(-) create mode 100644 mkp/nvdct-0.9.2-20241116.mkp diff --git a/README.md b/README.md index 0e0a0cd..567c5c3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[PACKAGE]: ../../raw/master/mkp/nvdct-0.9.1-20241110.mkp "nvdct-0.9.1-20241110.mkp" +[PACKAGE]: ../../raw/master/mkp/nvdct-0.9.2-20241116.mkp "nvdct-0.9.2-20241116.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.\ diff --git a/mkp/nvdct-0.9.2-20241116.mkp b/mkp/nvdct-0.9.2-20241116.mkp new file mode 100644 index 0000000000000000000000000000000000000000..ba44fa941c1816075850cd9cd46d7d144127ccf4 GIT binary patch literal 40580 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 literal 0 HcmV?d00001 diff --git a/source/bin/nvdct/conf/nvdct.toml b/source/bin/nvdct/conf/nvdct.toml index 48d787b..b5632b5 100755 --- a/source/bin/nvdct/conf/nvdct.toml +++ b/source/bin/nvdct/conf/nvdct.toml @@ -13,23 +13,18 @@ # # list of (additional to -s/--seed-devices) seed devices -SEED_DEVICES = [ +L2_SEED_DEVICES = [ # "CORE01", # "LOCATION01", # "LOCATION02", ] # drop neighbours with invalid names (only L2 Topologies (i.e. CDP, LLDP, CUSTOM) -DROP_HOSTS = [ +L2_DROP_HOSTS = [ # "not advertised", # "a nother invalid name", ] -# drop neighbours with invalid names by regex (only L2 Topologies (i.e. CDP, LLDP, CUSTOM) -DROP_HOSTS_REGEX = [ - # "^(([0-9a-fA-F]){2}[:.-]?){5}([0-9a-fA-F]){2}$", -] - # hosts will be ignored in L3v4 topology L3V4_IGNORE_HOSTS = [ # "host1", @@ -69,7 +64,7 @@ PROTECTED_TOPOLOGIES = [ ] # user defined static connections -# connections will be added from host to neighbour and in reverese +# these connections will be added from host to neighbour and in reverese # hosts/neighbours in this section will be added to SEED_DEVICES STATIC_CONNECTIONS = [ # ["cmk_host1", "local-port1", "neighbour-port1", "neighbour1", "label"], @@ -84,38 +79,39 @@ CUSTOM_LAYERS = [ # { path = "networking,cdp_cache,neighbours", columns = "neighbour_name,local_port,neighbour_port", label = "custom_CDP", host_label = "nvdct/has_cdp_neighbours" }, ] -# list site so include/excluse, use option --filter-sites INCLUDE/EXCLUDE -SITES = [ - # "site1", - # "site2", - # "site3", -] - -# list customers so include/excluse, use option --filter-costumers INCLUDE/EXCLUDE +# list customers so include/excluse, use option --filter-costumers INCLUDE/EXCLUDE CUSTOMERS = [ # "customer1", # "customer2", # "customer3", ] -[MAP_SPEED_TO_THICKNESS] -# must be sorted from slower to faster speed -# use only one entry to have all conections with the same thickness -# bits per second = thickness -# 2000000 = 1 # 2 mbit -# 5000000 = 2 # 5 mbit -# 1e7 = 3 # 10 mbit -# 51e7 = 4 # 51 mbit -1e8 = 1 # 100 mbit -1e9 = 3 # 1 gbit -1e10 = 5 # 10 gbit +# list site so include/excluse, use option --filter-sites INCLUDE/EXCLUDE +SITES = [ + # "site1", + # "site2", + # "site3", +] # map inventory neighbour name to Checkmk host name -[HOST_MAP] +[L2_HOST_MAP] # inventory_neighbour1 = "cmk_host1" # inventory_neighbour2 = "cmk_host2" # inventory_neighbour3 = "cmk_host3" +[L2_NEIGHBOUR_REPLACE_REGEX] +# "regex string to replace" = "string to replace with" +# "^(([0-9a-fA-F]){2}[:.-]?){5}([0-9a-fA-F]){2}$" = "" +# "\\([0-9a-zA-Z]+\\)$" = "" +# "^Meraki.*\\s-\\s" = "" + +# replace network objects (takes place after summarize) +[L3V4_REPLACE] +# "10.193.172.0/24" = "MPLS" +# "10.194.8.0/23" = "MPLS" +# "10.194.12.0/24" = "MPLS" +# "10.194.115.0/24" = "MPLS" + [EMBLEMS] # can use misc icons from CMK or upload your own in the misc category # for built-in icons use "icon_" as prefix to the name from CMK @@ -127,12 +123,17 @@ CUSTOMERS = [ # "l3v4_summarize" = "icon_aggr" # "service_node" = "icon_missing" -# replace network objects (takes place after summarize) -[L3V4_REPLACE] -# "10.193.172.0/24" = "MPLS" -# "10.194.8.0/23" = "MPLS" -# "10.194.12.0/24" = "MPLS" -# "10.194.115.0/24" = "MPLS" +[MAP_SPEED_TO_THICKNESS] +# must be sorted from slower to faster speed +# use only one entry to have all conections with the same thickness +# bits per second = thickness +# 2000000 = 1 # 2 mbit +# 5000000 = 2 # 5 mbit +# 1e7 = 3 # 10 mbit +# 51e7 = 4 # 51 mbit +1e8 = 1 # 100 mbit +1e9 = 3 # 1 gbit +1e10 = 5 # 10 gbit [SETTINGS] # api_port = 80 @@ -143,7 +144,6 @@ CUSTOMERS = [ # filter_customers = "INCLUDE" |"EXCLUDE" # filter_sites = "INCLUDE" | "EXCLUDE" # keep = 0 -# keep_domain = false # layers = ["LLDP", "CDP", "STATIC", "CUSTOM", "L3v4"] # log_file = "~/var/log/nvdct.log" # log_level = "WARNING" @@ -153,6 +153,7 @@ CUSTOMERS = [ # pre_fetch = false # prefix = "" # quiet = true +# remove_domain = false # skip_l3_if = false # skip_l3_ip = false # time_format = "%Y-%m-%dT%H:%M:%S.%m" diff --git a/source/bin/nvdct/lib/args.py b/source/bin/nvdct/lib/args.py index 080a075..abd5472 100755 --- a/source/bin/nvdct/lib/args.py +++ b/source/bin/nvdct/lib/args.py @@ -14,7 +14,7 @@ # -l --layer # -o --output-directory # -p --prefix -# -s --seed-devices +# # -s --seed-devices # -u --user-data-file # -v --version # --api-port (deprecated ?) @@ -24,13 +24,13 @@ # --filter-customers # --filter-sites # --keep -# --keep-domain # --log-file # --log-level # --log-to-stdout # --min-age # --pre-fetch # --quiet +# --remove-domain # --skip-l3-if # --skip-l3-ip # --time-format @@ -50,7 +50,7 @@ from lib.utils import ( MIN_LLDP_VERSION, MIN_IPV4_ADDRESSES, NVDCT_VERSION, - SAMPLE_SEEDS, + # SAMPLE_SEEDS, SCRIPT, TIME_FORMAT_ARGPARSER, USER_DATA_FILE, @@ -83,7 +83,7 @@ def parse_arguments() -> arg_Namespace: f' {ExitCodes.BACKEND_NOT_IMPLEMENTED.value} - Backend not implemented\n' f' {ExitCodes.AUTOMATION_SECRET_NOT_FOUND.value} - Automation secret not found\n' '\nUsage:\n' - f'{SCRIPT} -s {SAMPLE_SEEDS} -d\n\n' + f'{SCRIPT} -u ~/local/bin/nvdct/conf/{USER_DATA_FILE} \n\n' ) parser.add_argument( @@ -107,11 +107,11 @@ def parse_arguments() -> arg_Namespace: 'in "--time-format" format.\n' 'NOTE: the directory is a sub directory under "~/var/check_mk/topology/data/"\n', ) - parser.add_argument( - '-s', '--seed-devices', type=str, nargs='+', - help=f'List of devices to start the topology discovery from.\n' - f'I.e. {SAMPLE_SEEDS}', - ) + # parser.add_argument( + # '-s', '--seed-devices', type=str, nargs='+', + # help=f'List of devices to start the topology discovery from.\n' + # f'I.e. {SAMPLE_SEEDS}', + # ) parser.add_argument( '-p', '--prefix', type=str, help='Prepends each host with the prefix. (Needs testing)\n' @@ -131,7 +131,7 @@ def parse_arguments() -> arg_Namespace: parser.add_argument( '-u', '--user-data-file', type=str, help='Set the name uf the user provided data file\n' - f'Default is ~/local/bin/nvdct/conf/conf/{USER_DATA_FILE}\n', + f'Default is ~/local/bin/nvdct/conf/{USER_DATA_FILE}\n', ) parser.add_argument( '-v', '--version', action='version', @@ -191,8 +191,8 @@ def parse_arguments() -> arg_Namespace: 'Note: MULTISITE backend only.', ) parser.add_argument( - '--keep-domain', action='store_const', const=True, # default=False, - help='Do not remove the domain name from the neighbor name', + '--remove-domain', action='store_const', const=True, # default=False, + help='Remove the domain name from the neighbor name', ) parser.add_argument( '--keep', type=int, diff --git a/source/bin/nvdct/lib/settings.py b/source/bin/nvdct/lib/settings.py index 8a55f55..f8f4bc8 100755 --- a/source/bin/nvdct/lib/settings.py +++ b/source/bin/nvdct/lib/settings.py @@ -16,7 +16,7 @@ from logging import CRITICAL, FATAL, ERROR, WARNING, INFO, DEBUG from os import environ from sys import exit as sys_exit from time import strftime -from typing import Dict, List, NamedTuple +from typing import Dict, List, NamedTuple, Tuple from lib.utils import ( ExitCodes, @@ -81,7 +81,7 @@ class Settings: 'filter_customers': None, 'filter_sites': None, 'keep': False, - 'keep_domain': False, + 'remove_domain': False, 'layers': ['CDP'], 'log_file': f'{self.omd_root}/var/log/nvdct.log', 'log_level': 'WARNING', @@ -91,12 +91,11 @@ class Settings: 'prefix': None, 'quiet': False, 'pre_fetch': False, - 'seed_devices': [], + # 'seed_devices': [], 'skip_l3_if': False, 'skip_l3_ip': False, 'time_format': TIME_FORMAT, 'user_data_file': f'{self.omd_root}/local/bin/nvdct/conf/{USER_DATA_FILE}', - # 'version': False, } # args in the form {'s, __seed_devices': 'CORE01', 'p, __path_in_inventory': None, ... }} # we will remove 's, __' @@ -129,10 +128,14 @@ class Settings: self.__api_port: int | None = None # init user data with defaults + # self.__drop_host_regex: List[str] | None = None self.__custom_layers: List[StaticConnection] | None = None - self.__drop_host: List[str] | None = None - self.__drop_host_regex: List[str] | None = None - self.__host_map: Dict[str, str] | None = None + self.__customers: List[str] | None = None + self.__emblems: Emblems | None = None + self.__l2_drop_host: List[str] | None = None + self.__l2_host_map: Dict[str, str] | None = None + self.__l2_neighbour_replace_regex: List[Tuple[str, str]] | None = None + self.__l2_seed_devices: List[str] | None = None self.__l3v4_ignore_hosts: List[str] | None = None self.__l3v4_ignore_ip: List[IPv4Network] | None = None self.__l3v4_ignore_wildcard: List[Wildcard] | None = None @@ -140,11 +143,8 @@ class Settings: self.__l3v4_summarize: List[IPv4Network] | None = None self.__map_speed_to_thickness: List[Thickness] | None = None self.__protected_topologies: List[str] | None = None - self.__seed_devices: List[str] | None = None - self.__static_connections: List[StaticConnection] | None = None - self.__emblems: Emblems | None = None self.__sites: List[str] | None = None - self.__customers: List[str] | None = None + self.__static_connections: List[StaticConnection] | None = None # # CLI settings @@ -167,13 +167,13 @@ class Settings: return str(self.__settings['backend']) else: # fallback to defaukt -> exit ?? LOGGER.warning( - f'Unknown backend: {self.__settings['backend']}. Accepted backends are: ' + f'Unknown backend: {self.__settings["backend"]}. Accepted backends are: ' 'LIVESTATUS, MULTISITE, RESTAPI. Fall back zo MULTISITE.' ) return 'MULTISITE' @property # --case - def case(self) -> str| None: + def case(self) -> str | None: if self.__settings['case'] in ['LOWER', 'UPPER']: return self.__settings['case'] elif self.__settings['case'] is not None: @@ -224,8 +224,8 @@ class Settings: return None @property # --keep-domain - def keep_domain(self) -> bool: - return bool(self.__settings['keep_domain']) + def remove_domain(self) -> bool: + return bool(self.__settings['remove_domain']) @property # --layers def layers(self) -> List[str]: @@ -287,14 +287,6 @@ class Settings: def quiet(self) -> bool: return bool(self.__settings['quiet']) - @property # --seed-devices - def seed_devices(self) -> List[str]: - if self.__seed_devices is None: - self.__seed_devices = list(set(str(host) for host in ( - self.__user_data.get('SEED_DEVICES', []) + self.__settings.get('seed_devices', []) - ))) - return self.__seed_devices - @property # --skip-l3-if def skip_l3_if(self) -> bool: return bool(self.__settings['skip_l3_if']) @@ -311,13 +303,18 @@ class Settings: def user_data_file(self) -> str: return str(self.__settings['user_data_file']) - # @property # --version - # def version(self) -> bool: - # return bool(self.__settings['version']) - # # user data setting # + @property + def customers(self) -> List[str]: + if self.__customers is None: + self.__customers = [ + str(customer) for customer in set(self.__user_data.get('CUSTOMERS', [])) + ] + LOGGER.info(f'Found {len(self.__customers)} to filter on') + return self.__customers + @property def custom_layers(self) -> List[Layer]: if self.__custom_layers is None: @@ -341,20 +338,6 @@ class Settings: ) return self.__custom_layers - @property - def drop_hosts(self) -> List[str]: - if self.__drop_host is None: - self.__drop_host = [str(host) for host in set(self.__user_data.get('DROP_HOSTS', []))] - return self.__drop_host - - @property - def drop_hosts_regex(self) -> List[str]: - if self.__drop_host_regex is None: - self.__drop_host_regex = [str(host) for host in self.__user_data.get( - 'DROP_HOSTS_REGEX', [] - )] - return self.__drop_host_regex - @property def emblems(self) -> Emblems: if self.__emblems is None: @@ -370,14 +353,39 @@ class Settings: return self.__emblems @property - def host_map(self) -> Dict[str, str]: - if self.__host_map is None: - self.__host_map = { + def l2_drop_hosts(self) -> List[str]: + if self.__l2_drop_host is None: + self.__l2_drop_host = [str(host) for host in set(self.__user_data.get('L2_DROP_HOSTS', []))] + return self.__l2_drop_host + + @property + def l2_seed_devices(self) -> List[str]: + if self.__l2_seed_devices is None: + self.__l2_seed_devices = list(set(str(host) for host in ( + # self.__user_data.get('L2_SEED_DEVICES', []) + self.__settings.get('seed_devices', []) + self.__user_data.get('L2_SEED_DEVICES', []) + ))) + return self.__l2_seed_devices + + @property + def l2_host_map(self) -> Dict[str, str]: + if self.__l2_host_map is None: + self.__l2_host_map = { str(host): str(replace_host) for host, replace_host in self.__user_data.get( - 'HOST_MAP', {} + 'L2_HOST_MAP', {} ).items() } - return self.__host_map + return self.__l2_host_map + + @property + def l2_neighbour_replace_regex(self) -> List[Tuple[str, str]] | None: + if self.__l2_neighbour_replace_regex is None: + self.__l2_neighbour_replace_regex = [ + ( + str(regex), str(replace) + ) for regex, replace in self.__user_data.get('L2_NEIGHBOUR_REPLACE_REGEX', {}).items() + ] + return self.__l2_neighbour_replace_regex @property def l3v4_ignore_hosts(self) -> List[str]: @@ -544,15 +552,6 @@ class Settings: LOGGER.info(f'fFound {len(self.__sites)} to filter on') return self.__sites - @property - def customers(self) -> List[str]: - if self.__customers is None: - self.__customers = [ - str(customer) for customer in set(self.__user_data.get('CUSTOMERS', [])) - ] - LOGGER.info(f'fFound {len(self.__customers)} to filter on') - return self.__customers - # # all other settings # diff --git a/source/bin/nvdct/lib/utils.py b/source/bin/nvdct/lib/utils.py index 5b74464..27af6e0 100755 --- a/source/bin/nvdct/lib/utils.py +++ b/source/bin/nvdct/lib/utils.py @@ -23,7 +23,7 @@ from time import time as now_time from tomllib import loads as toml_loads, TOMLDecodeError from typing import List, Dict, TextIO -NVDCT_VERSION = '0.9.1-20241110' +NVDCT_VERSION = '0.9.2-20241117' @unique diff --git a/source/bin/nvdct/nvdct.py b/source/bin/nvdct/nvdct.py index 12eda3b..81ae957 100755 --- a/source/bin/nvdct/nvdct.py +++ b/source/bin/nvdct/nvdct.py @@ -113,12 +113,24 @@ # moved (default) config file(s) to ./conf/ # 2024-06-14: added debug code for bad IPv4 address data # 2024-06-17: fixed bad IPv4 address data (just drop it) -# 2024-09-23: replaced options --lowercase/--uppercase with --case LOWER|UPPER +# 2024-09-23: incompatible replaced options --lowercase/--uppercase with --case LOWER|UPPER # changed version output from settings to argparse action -# removed backend FILESYSTEM -> will fallback to MULTISITE +# incompatible removed backend FILESYSTEM -> will fallback to MULTISITE +# incompatible # removed support for CMK2.2.x file format (removed option --new-format) -# 2024-09-24: added site filter for multisite deployments (MULTISITE only), option --filter-sites and SITES section in toml file -# added customer filter for MSP deployments (MULTISITE only), option --filter-customers and section CUSTOMERS in toml file +# 2024-09-24: added site filter for multisite deployments (MULTISITE only), option --filter-sites +# and SITES section in toml file +# added customer filter for MSP deployments (MULTISITE only), option --filter-customers +# and section CUSTOMERS in toml file +# 2024-11-16: added better logging for missing L2 data +# 2024-11-17: added L2_NEIGHBOUR_REPLACE_REGEX (ThX to Frankb@checkmk forum for the base idea) +# incompatible removed DROP_HOST_REGEX -> use L2_NEIGHBOUR_REPLACE_REGEX instead +# incompatible changed section names in TOML file to better distinguish between L2 and L3v4 +# HOST_MAP -> L2_HOST_MAP +# DROP_HOSTS -> L2_DROP_HOSTS +# SEED_DEVICES -> L2_SEED_DEVICES +# incompatible removed option -s, --seed-devices from CLI -> use TOML section L2_SEED_DEVICES instead +# incompatible changed the option keep-domain to remove-domain -> don't mess with neighbor names by default # creating topology data json from inventory data # @@ -217,9 +229,9 @@ import sys from collections.abc import Mapping, Sequence from ipaddress import IPv4Network from logging import DEBUG -from re import compile as re_compile +from re import sub as re_sub from time import strftime, time_ns -from typing import Dict, List +from typing import Dict, List, Tuple from lib.args import parse_arguments from lib.backends import ( @@ -265,11 +277,11 @@ from lib.settings import ( ) -DROP_HOSTS_REGEX: List[str] = [] -DROP_HOSTS: List[str] = [] EMBLEMS: Emblems HOST_CACHE: HostCache -HOST_MAP: Dict[str, str] = {} +L2_DROP_HOSTS: List[str] = [] +L2_HOST_MAP: Dict[str, str] = {} +L2_NEIGHBOUR_REPLACE_REGEX: List[Tuple[str, str]] | None = None MAP_SPEED_TO_THICKNESS: List[Thickness] = [] NV_CONNECTIONS = NvConnections() NV_OBJECTS = NvObjects() @@ -280,37 +292,42 @@ def create_l2_device_from_inv( host: str, inv_data: Sequence[Mapping[str, str]], inv_columns: InventoryColumns, - label: str, + # label: str, ) -> None: for topo_neighbour in inv_data: # check if required data are not empty if not (neighbour := topo_neighbour.get(inv_columns.neighbour)): + LOGGER.warning(f'incomplete data, neighbour missing {topo_neighbour}') continue if not (raw_local_port := topo_neighbour.get(inv_columns.local_port)): + LOGGER.warning(f'incomplete data, local port missing {topo_neighbour}') continue if not (raw_neighbour_port := topo_neighbour.get(inv_columns.neighbour_port)): + LOGGER.warning(f'incomplete data, neighbour port missing {topo_neighbour}') continue # drop neighbour before domain split - if neighbour in DROP_HOSTS: + if neighbour in L2_DROP_HOSTS: LOGGER.info(msg=f'drop neighbour: {neighbour}') continue - drop_regex = False - for re_str in DROP_HOSTS_REGEX: - re_host = re_compile(re_str) - if re_host.match(neighbour): - LOGGER.info(msg=f'regex drop neighbour: {neighbour}, regex str: {re_str}') - drop_regex = True - break - if drop_regex: - continue + if L2_NEIGHBOUR_REPLACE_REGEX: + for re_str, replace_str in L2_NEIGHBOUR_REPLACE_REGEX: + re_neighbour = re_sub(re_str, replace_str, neighbour) + if re_neighbour != neighbour: + LOGGER.info(f'regex changed Neighbor |{neighbour}| to |{re_neighbour}|') + neighbour = re_neighbour + if not neighbour: + LOGGER.info(f'Neighbour removed by regex (|{neighbour}|, |{re_str}|, |{replace_str}|)') + break + if not neighbour: + continue - if not SETTINGS.keep_domain: + if SETTINGS.remove_domain: neighbour = neighbour.split('.')[0] # drop neighbour after domain split - if neighbour in DROP_HOSTS: + if neighbour in L2_DROP_HOSTS: LOGGER.info(msg=f'drop neighbour: {neighbour}') continue @@ -324,8 +341,8 @@ def create_l2_device_from_inv( if SETTINGS.prefix: neighbour = f'{SETTINGS.prefix}{neighbour}' # rewrite neighbour if inventory neighbour and checkmk host don't match - if neighbour in HOST_MAP.keys(): - neighbour = HOST_MAP[neighbour] + if neighbour in L2_HOST_MAP.keys(): + neighbour = L2_HOST_MAP[neighbour] # getting/checking interfaces local_port = get_service_by_interface(host, raw_local_port, HOST_CACHE) @@ -439,12 +456,12 @@ def create_l2_topology( while devices_to_go: device = devices_to_go[0] - if device in HOST_MAP.keys(): + if device in L2_HOST_MAP.keys(): try: devices_to_go.remove(device) except ValueError: pass - device = HOST_MAP[device] + device = L2_HOST_MAP[device] if device in devices_done: continue @@ -456,7 +473,7 @@ def create_l2_topology( host=device, inv_data=topo_data, inv_columns=inv_columns, - label=label, + # label=label, ) for _entry in NV_OBJECTS.host_list: @@ -627,7 +644,7 @@ if __name__ == '__main__': HOST_CACHE = HostCacheMultiSite( pre_fetch=SETTINGS.pre_fetch, filter_sites=SETTINGS.filter_sites, - sites = SETTINGS.sites, + sites=SETTINGS.sites, ) case 'LIVESTATUS': HOST_CACHE = HostCacheLiveStatus( @@ -637,11 +654,11 @@ if __name__ == '__main__': LOGGER.error(msg=f'Backend {SETTINGS.backend} not (yet) implemented') sys.exit(ExitCodes.BACKEND_NOT_IMPLEMENTED.value) - HOST_MAP = SETTINGS.host_map - DROP_HOSTS = SETTINGS.drop_hosts - DROP_HOSTS_REGEX = SETTINGS.drop_hosts_regex - MAP_SPEED_TO_THICKNESS = SETTINGS.map_speed_to_thickness EMBLEMS = SETTINGS.emblems + L2_DROP_HOSTS = SETTINGS.l2_drop_hosts + L2_HOST_MAP = SETTINGS.l2_host_map + L2_NEIGHBOUR_REPLACE_REGEX = SETTINGS.l2_neighbour_replace_regex + MAP_SPEED_TO_THICKNESS = SETTINGS.map_speed_to_thickness jobs: List[Layer] = [] final_topology: Dict = {} @@ -701,7 +718,7 @@ if __name__ == '__main__': label = job.label.lower() columns = job.columns.split(',') create_l2_topology( - seed_devices=SETTINGS.seed_devices, + seed_devices=SETTINGS.l2_seed_devices, path_in_inventory=job.path, inv_columns=InventoryColumns( neighbour=columns[0], diff --git a/source/packages/nvdct b/source/packages/nvdct index 0302612..0b021af 100644 --- a/source/packages/nvdct +++ b/source/packages/nvdct @@ -54,7 +54,7 @@ 'htdocs/images/icons/location_80.png']}, 'name': 'nvdct', 'title': 'Network Visualization Data Creation Tool (NVDCT)', - 'version': '0.9.1-20241110', + 'version': '0.9.2-20241116', 'version.min_required': '2.3.0b1', 'version.packaged': 'cmk-mkp-tool 0.2.0', 'version.usable_until': '2.4.0p1'} -- GitLab