#!/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 : 2023-10-12 # File : create_topology_classes.py from os import environ from time import strftime from typing import Dict, List, Optional, Any, NamedTuple class InventoryColumns(NamedTuple): neighbour: str local_port: str neighbour_port: str class Settings: def __init__( self, cli_args: Dict[str, Any], version: bool = False, make_default: bool = False, keep_domain: bool = False, uppercase: bool = False, lowercase: bool = False, seed_devices: Optional[List[str]] = [], time_format: Optional[str] = '%Y-%m-%dT%H:%M:%S.%m', path_in_inventory: Optional[str] = 'networking,cdp_cache', inventory_columns: Optional[str] = 'device_id,local_port,device_port', data_source: Optional[str] = 'inv_CDP', output_directory: Optional[str] = '', ): self.__settings = { 'version': version, 'time_format': time_format, 'path_in_inventory': path_in_inventory, 'inventory_columns': inventory_columns, 'seed_devices': list(set(seed_devices)), 'omd_root': environ.get('OMD_ROOT'), 'inventory_path': 'var/check_mk/inventory', 'autochecks_path': 'var/check_mk/autochecks', 'topology_save_path': 'var/topology_data', 'topology_file_name': 'network_data.json', 'data_source': data_source, 'output_directory': output_directory, 'make_default': make_default, 'keep_domain': keep_domain, 'lowercase': lowercase, 'uppercase': uppercase, } # args in the form {'s, __seed_devices': 'C9540-7-1', 'p, __path_in_inventory': None, ... }} # we will remove 's, __' self.__args = ({k.split(',')[-1].strip(' ').strip('_'): v for k, v in cli_args.items() if v}) self.__settings.update(self.__args) @property def version(self) -> bool: return self.__settings['version'] @property def make_default(self) -> bool: return self.__settings['make_default'] @property def keep_domain(self) -> bool: return self.__settings['keep_domain'] @property def uppercase(self) -> bool: return self.__settings['uppercase'] @property def lowercase(self) -> bool: return self.__settings['lowercase'] @property def time_format(self) -> str: return self.__settings['time_format'] @property def omd_root(self) -> str: return self.__settings['omd_root'] @property def inventory_path(self) -> str: return self.__settings['inventory_path'] @property def autochecks_path(self) -> str: return self.__settings['autochecks_path'] @property def topology_save_path(self) -> str: return self.__settings['topology_save_path'] @property def topology_file_name(self) -> str: return self.__settings['topology_file_name'] @property def path_in_inventory(self) -> List[str]: path = ('Nodes,' + ',Nodes,'.join(self.__settings['path_in_inventory'].split(',')) + ',Table,Rows').split(',') return path @property def inventory_columns(self) -> InventoryColumns: columns = self.__settings['inventory_columns'].split(',') return InventoryColumns( neighbour=columns[0], local_port=columns[1], neighbour_port=columns[2], ) @property def seed_devices(self) -> List[str]: if self.__settings['seed_devices']: return self.__settings['seed_devices'] else: return [] @property def data_source(self) -> str: return self.__settings['data_source'] @property def output_directory(self) -> str: if not self.__settings['output_directory']: return f'{strftime(self.__settings["time_format"])}' else: return self.__settings['output_directory']