Newer
Older
#!/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,
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,
'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']
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
@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']:
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']