Collection of CheckMK checks (see https://checkmk.com/). All checks and plugins are provided as is. Absolutely no warranty. Send any comments to thl-cmk[at]outlook[dot]com

Skip to content
Snippets Groups Projects
create_topology_classes.py 3.64 KiB
Newer Older
thl-cmk's avatar
thl-cmk committed
#!/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,
            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',
            seed_devices: Optional[str] = '',
            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': 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,
        }
        # 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 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'].split(',')
        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']