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