From ee423c01bbe2fae77f1a0855d16202452dac8122 Mon Sep 17 00:00:00 2001 From: Johannes Findeisen Date: Fri, 30 Sep 2022 05:43:35 +0200 Subject: [PATCH] Backup commit. Many internally changes. Known issues still need to be fixed. --- TODO.txt | 1 + bin/linspector | 2 +- etc/linspector.conf | 2 +- etc/monitors/network1/gateway.conf | 10 +++++- etc/monitors/network2/gateway.conf | 6 +++- etc/monitors/test/test1.conf | 6 +++- linspector/core/linspector.py | 10 +++--- linspector/core/monitor.py | 38 ++++++++++------------- linspector/core/monitors.py | 18 +++++++++-- linspector/core/service.py | 4 +-- linspector/services/http/httpkeyword.py | 9 +++--- linspector/services/misc/dummy.py | 9 +++--- linspector/services/misc/random.py | 9 +++--- linspector/services/net/fritzboxuplink.py | 11 ++++--- linspector/services/net/ping.py | 9 +++--- linspector/services/net/port.py | 9 +++--- linspector/services/net/speedtest.py | 9 +++--- linspector/services/net/ssh.py | 9 +++--- linspector/services/net/tcpconnect.py | 9 +++--- linspector/services/snmp/get.py | 9 +++--- linspector/services/sys/shell.py | 9 +++--- linspector/services/sys/uptime.py | 9 +++--- 22 files changed, 122 insertions(+), 85 deletions(-) diff --git a/TODO.txt b/TODO.txt index 59b71aa..58676f4 100644 --- a/TODO.txt +++ b/TODO.txt @@ -11,3 +11,4 @@ Things to do in no particular order: - Add more tasks e.g. storage in mongodb or mariadb and some more notifications like XMPP and SMS - Check for all required configuration options and set defaults in services. - Write documentation and inline documentation. +- Add kwargs ro notifications, tasks and maybe plugins. diff --git a/bin/linspector b/bin/linspector index b38fa71..a405026 100755 --- a/bin/linspector +++ b/bin/linspector @@ -32,7 +32,7 @@ from linspector.core.environment import Environment from linspector.core.linspector import Linspector from linspector.core.monitors import Monitors -__version__ = '0.19.11.dev1' +__version__ = '0.19.12.dev1' __author__ = 'Johannes Findeisen ' logger = logging.getLogger('linspector') diff --git a/etc/linspector.conf b/etc/linspector.conf index f67176a..a8eeaad 100644 --- a/etc/linspector.conf +++ b/etc/linspector.conf @@ -24,7 +24,7 @@ members = superadmin@example.com,developers@example.com ; scheduler configuration start_scheduler = true max_threads = 3500 -max_processes = 10 +max_processes = 24 timezone = CET ; hostgroup parents; if the hostgroup "group1" is down, don't alert for the hosts in group2. see TODO.txt for more diff --git a/etc/monitors/network1/gateway.conf b/etc/monitors/network1/gateway.conf index 6a0ee82..8b4d2dc 100644 --- a/etc/monitors/network1/gateway.conf +++ b/etc/monitors/network1/gateway.conf @@ -19,9 +19,17 @@ tasks = redis ; internally to single hosts to become a monitor for each host internally. some more ideas are in ;) ; hosts with added hostgroup defined in main configuration file hosts = 192.168.0.1,192.168.23.24,@group1,@testgroup1 +; monitors can add their self into a hostgroup hostgroup = group1 user = USERNAME password = PASSWORD info = Cable Provider ; only alert when the error reaches the threshold -threshold = 3 \ No newline at end of file +threshold = 3 + +; need to think about it but since Linspector does not know variables defined by a service, notification or task they +; need to be handed over as **kwargs dict. so i think it would be a good idea to put them here and just give over all +; these vars as a dict. for now only interval and service are know and even required arguments to get a service running. +[args] +foo = bar +bar = foo \ No newline at end of file diff --git a/etc/monitors/network2/gateway.conf b/etc/monitors/network2/gateway.conf index ffd346b..940a3dc 100644 --- a/etc/monitors/network2/gateway.conf +++ b/etc/monitors/network2/gateway.conf @@ -9,4 +9,8 @@ tasks = MariaDB,FileLogger hosts = 192.168.1.1 user = USERNAME password = PASSWORD -info = Cable Provider \ No newline at end of file +info = Cable Provider + +[args] +foo = bary +bar = fooy \ No newline at end of file diff --git a/etc/monitors/test/test1.conf b/etc/monitors/test/test1.conf index 8a29e22..eadf86a 100644 --- a/etc/monitors/test/test1.conf +++ b/etc/monitors/test/test1.conf @@ -1,3 +1,7 @@ [monitor] service = misc.dummy -interval = 1 \ No newline at end of file +interval = 60 + +[args] +foo = barx +bar = foox \ No newline at end of file diff --git a/linspector/core/linspector.py b/linspector/core/linspector.py index 61ed984..97bab99 100644 --- a/linspector/core/linspector.py +++ b/linspector/core/linspector.py @@ -46,10 +46,10 @@ class Linspector: 'memory': MemoryJobStore() } executors = { - #'default': ThreadPoolExecutor(int(configuration.get_option('linspector', - # 'max_threads'))), - 'default': ProcessPoolExecutor(int(configuration.get_option('linspector', - 'max_processes'))) + 'default': ThreadPoolExecutor(int(configuration.get_option('linspector', + 'max_threads'))), + #'default': ProcessPoolExecutor(int(configuration.get_option('linspector', + # 'max_processes'))) } job_defaults = { 'max_instances': 10000 @@ -59,7 +59,7 @@ class Linspector: job_defaults=job_defaults) start_date = datetime.datetime.now() - log('debug', __name__, monitors.get_monitors()) + #log('debug', __name__, monitors.get_monitors()) monitors = self.__monitors.get_monitors() for monitor in monitors: time_delta = round(random.uniform(1.00, 10.00), 2) diff --git a/linspector/core/monitor.py b/linspector/core/monitor.py index d01937c..d7677b1 100644 --- a/linspector/core/monitor.py +++ b/linspector/core/monitor.py @@ -15,7 +15,8 @@ from linspector.core.task import Task, TaskExecutor class Monitor: def __init__(self, configuration, environment, identifier, monitor_configuration, notifications, - services, tasks): + services, tasks, kwargs): + self.__args = kwargs self.__configuration = configuration self.__environment = environment self.__identifier = identifier @@ -29,7 +30,7 @@ class Monitor: self.__tasks = tasks self.service = self.__service - self.host = monitor_configuration.get('monitor', 'host') + #self.host = monitor_configuration.get('monitor', 'host') #self.members = members #self.core = core self.hostgroup = monitor_configuration.get('monitor', 'hostgroup') @@ -48,8 +49,9 @@ class Monitor: """ self.status = "NONE" self.last_execution = None - self.monitor_information = MonitorInformation(self.job_id, self.hostgroup, self.host, - self.service) + #self.monitor_information = MonitorInformation(self.job_id, self.hostgroup, self.host, + # self.service) + self.monitor_information = MonitorInformation(self.job_id, self.service) if configuration.get_option('linspector', 'notifications') or \ monitor_configuration.get('monitor', 'notifications'): @@ -83,10 +85,8 @@ class Monitor: service_module = importlib.import_module(service_package) self.__service = monitor_configuration.get('monitor', 'service').lower() - service = service_module.create(configuration, environment) - services[monitor_configuration.get('monitor', 'service').lower()] = service - - #service.execute(self) + service = service_module.create(configuration, environment, **self.__args) + self.__services[monitor_configuration.get('monitor', 'service').lower()] = service if configuration.get_option('linspector', 'tasks') or \ monitor_configuration.get('monitor', 'tasks'): @@ -121,17 +121,11 @@ class Monitor: def get_service(self): return self.__service - # currently only used for testing but maybe i will add get functions for all known variables. - # but not all variables can be known because all monitors are different. only the service - # implementation can know all variables which are being used inside the service. - def get_service(self): - return self.__service - def __str__(self): return str(self.__dict__) def __hex__(self): - return hex(crc32(bytes(self.hostgroup + self.host + self.service, 'utf-8'))) + return hex(crc32(bytes(self.hostgroup + self.service, 'utf-8'))) def hex_string(self): ret = self.__hex__() @@ -186,6 +180,7 @@ class Monitor: def handle_call(self): log('info', __name__, "handle call to identifier: " + self.__identifier) + self.__services[self.__service].execute() #logger.debug("handle call") #logger.debug(self.service) if self.enabled: @@ -201,7 +196,8 @@ class Monitor: self.handle_threshold(self.service.get_threshold(), self.last_execution.was_successful()) - #logger.info("Job " + self.get_job_id() + + log('info', __name__, 'sadasd') + #log.info("Job " + self.get_job_id() + # ", Code: " + str(self.last_execution.get_error_code()) + # ", Message: " + str(self.last_execution.get_message())) @@ -212,8 +208,8 @@ class Monitor: else: log('info', __name__, "job " + self.get_job_id() + " disabled") - def get_host(self): - return self.host + #def get_host(self): + # return self.host def get_hostgroup(self): return self.hostgroup @@ -262,10 +258,10 @@ class MonitorExecution: class MonitorInformation: - def __init__(self, job_id, hostgroup, host, service): + def __init__(self, job_id, service): self.job_id = job_id - self.hostgroup = hostgroup - self.host = host + #self.hostgroup = hostgroup + #self.host = host self.service = service self.response_massage = None diff --git a/linspector/core/monitors.py b/linspector/core/monitors.py index 70324dc..9ee5263 100644 --- a/linspector/core/monitors.py +++ b/linspector/core/monitors.py @@ -26,20 +26,32 @@ class Monitors: log('debug', __name__, 'monitor groups: ' + str(monitor_groups)) monitor_configuration = configparser.ConfigParser() for monitor_group in monitor_groups: + monitors_file_list = glob.glob(self.__configuration.get_configuration_path() + '/monitors/' + monitor_group + '/*.conf') - log('debug', __name__, 'monitor files: ' + str(monitors_file_list)) + #log('debug', __name__, 'monitor files: ' + str(monitors_file_list)) for monitor_file in monitors_file_list: monitor_configuration.read(monitor_file, 'utf-8') + kwargs = {} + for option in monitor_configuration.options('args'): + #print(option) + value = monitor_configuration.get('args', option) + kwargs[option] = value + + print(monitor_group + ' ' + str(kwargs)) + identifier = monitor_group + '_' + os.path.splitext(os.path.basename( monitor_file))[0] # create Monitor() object and copy monitor_configuration for each instance because # they else refer to the same object. - self.__monitors[identifier] = copy.deepcopy(Monitor(configuration, environment, identifier, + self.__monitors[identifier] = Monitor(configuration, environment, identifier, copy.deepcopy(monitor_configuration), - notifications, services, tasks)) + notifications, services, tasks, + copy.deepcopy(kwargs)) + + del kwargs def get_monitors(self): return self.__monitors diff --git a/linspector/core/service.py b/linspector/core/service.py index 9061b57..3d9692a 100644 --- a/linspector/core/service.py +++ b/linspector/core/service.py @@ -8,7 +8,7 @@ from linspector.core.helpers import log class Service: - def __init__(self, configuration, environment): - super().__init__() + def __init__(self, configuration, environment, **kwargs): self.__configuration = configuration self._environment = environment + self.__kwargs = kwargs diff --git a/linspector/services/http/httpkeyword.py b/linspector/services/http/httpkeyword.py index e1506c2..fea5a6f 100644 --- a/linspector/services/http/httpkeyword.py +++ b/linspector/services/http/httpkeyword.py @@ -7,16 +7,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return HTTPKeywordService(configuration, environment) +def create(configuration, environment, **kwargs): + return HTTPKeywordService(configuration, environment, **kwargs) class HTTPKeywordService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): return diff --git a/linspector/services/misc/dummy.py b/linspector/services/misc/dummy.py index f82b679..d99f7ca 100644 --- a/linspector/services/misc/dummy.py +++ b/linspector/services/misc/dummy.py @@ -7,17 +7,18 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return DummyService(configuration, environment) +def create(configuration, environment, **kwargs): + return DummyService(configuration, environment, **kwargs) class DummyService(Service): - def __init__(self, configuration, environment): + def __init__(self, configuration, environment, **kwargs): super().__init__(configuration, environment) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): - log('debug', __name__, 'dummy object @' + str(self)) + log('debug', __name__, 'dummy object @' + str(self) + str(self.__kwargs['foo'])) return diff --git a/linspector/services/misc/random.py b/linspector/services/misc/random.py index 3812e30..76d5c0b 100644 --- a/linspector/services/misc/random.py +++ b/linspector/services/misc/random.py @@ -7,16 +7,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return RandomService(configuration, environment) +def create(configuration, environment, **kwargs): + return RandomService(configuration, environment, **kwargs) class RandomService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): return diff --git a/linspector/services/net/fritzboxuplink.py b/linspector/services/net/fritzboxuplink.py index 91cde0d..246052d 100644 --- a/linspector/services/net/fritzboxuplink.py +++ b/linspector/services/net/fritzboxuplink.py @@ -9,17 +9,18 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return FritzboxUplinkService(configuration, environment) +def create(configuration, environment, **kwargs): + return FritzboxUplinkService(configuration, environment, **kwargs) class FritzboxUplinkService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): - print('huhu') + log('debug', __name__, 'dummy object @' + str(self)) return diff --git a/linspector/services/net/ping.py b/linspector/services/net/ping.py index 803caa8..ec1c252 100644 --- a/linspector/services/net/ping.py +++ b/linspector/services/net/ping.py @@ -7,16 +7,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return PingService(configuration, environment) +def create(configuration, environment, **kwargs): + return PingService(configuration, environment, **kwargs) class PingService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): return diff --git a/linspector/services/net/port.py b/linspector/services/net/port.py index 68cf138..fe1c19d 100644 --- a/linspector/services/net/port.py +++ b/linspector/services/net/port.py @@ -9,16 +9,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return PortService(configuration, environment) +def create(configuration, environment, **kwargs): + return PortService(configuration, environment, **kwargs) class PortService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self, execution): diff --git a/linspector/services/net/speedtest.py b/linspector/services/net/speedtest.py index 28b0068..e6daa9c 100644 --- a/linspector/services/net/speedtest.py +++ b/linspector/services/net/speedtest.py @@ -11,16 +11,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return SpeedtestService(configuration, environment) +def create(configuration, environment, **kwargs): + return SpeedtestService(configuration, environment, **kwargs) class SpeedtestService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs self.__speedtest_maximum_speed = None self.__speedtest_average_speed = None diff --git a/linspector/services/net/ssh.py b/linspector/services/net/ssh.py index 546b37d..f3604d7 100644 --- a/linspector/services/net/ssh.py +++ b/linspector/services/net/ssh.py @@ -11,16 +11,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return SSHService(configuration, environment) +def create(configuration, environment, **kwargs): + return SSHService(configuration, environment, **kwargs) class SSHService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa') diff --git a/linspector/services/net/tcpconnect.py b/linspector/services/net/tcpconnect.py index e4519d4..d4f0271 100644 --- a/linspector/services/net/tcpconnect.py +++ b/linspector/services/net/tcpconnect.py @@ -7,17 +7,18 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return TCPConnectService(configuration, environment) +def create(configuration, environment, **kwargs): + return TCPConnectService(configuration, environment, **kwargs) # TODO: check for all required configuration options and set defaults if needed. class TCPConnectService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): return diff --git a/linspector/services/snmp/get.py b/linspector/services/snmp/get.py index 9f9ed26..b1a8d59 100644 --- a/linspector/services/snmp/get.py +++ b/linspector/services/snmp/get.py @@ -9,16 +9,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return GetService(configuration, environment) +def create(configuration, environment, **kwargs): + return GetService(configuration, environment, **kwargs) class GetService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): return diff --git a/linspector/services/sys/shell.py b/linspector/services/sys/shell.py index df1e212..08c3441 100644 --- a/linspector/services/sys/shell.py +++ b/linspector/services/sys/shell.py @@ -7,16 +7,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def create(configuration, environment): - return ShellService(configuration, environment) +def create(configuration, environment, **kwargs): + return ShellService(configuration, environment, **kwargs) class ShellService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): return diff --git a/linspector/services/sys/uptime.py b/linspector/services/sys/uptime.py index 314bec2..a6bb1ef 100644 --- a/linspector/services/sys/uptime.py +++ b/linspector/services/sys/uptime.py @@ -7,16 +7,17 @@ from linspector.core.helpers import log from linspector.core.service import Service -def get(configuration, environment): - return UptimeService(configuration, environment) +def get(configuration, environment, **kwargs): + return UptimeService(configuration, environment, **kwargs) class UptimeService(Service): - def __init__(self, configuration, environment): - super().__init__(configuration, environment) + def __init__(self, configuration, environment, **kwargs): + super().__init__(configuration, environment, **kwargs) self.__configuration = configuration self.__environment = environment + self.__kwargs = kwargs def execute(self): return