From 52b0c6b5090ffac1e93c3c4f68aa1504036e1a54 Mon Sep 17 00:00:00 2001 From: Johannes Findeisen Date: Mon, 21 Aug 2023 15:05:42 +0200 Subject: [PATCH] Moved databases from tasks to own concept because they need persistent connections. Tasks do now allow this. (0.24.0) --- bin/linspector | 29 +++++++++++++++++++++++------ etc/linspector.conf | 4 +++- linspector/database.py | 13 +++++++++++++ linspector/databases/__init__.py | 0 linspector/databases/mariadb.py | 16 ++++++++++++++++ linspector/monitor.py | 5 +++-- linspector/monitors.py | 4 +++- linspector/tasks/mariadb.py | 17 ----------------- requirements.txt | 2 +- 9 files changed, 62 insertions(+), 28 deletions(-) create mode 100644 linspector/database.py create mode 100644 linspector/databases/__init__.py create mode 100644 linspector/databases/mariadb.py delete mode 100644 linspector/tasks/mariadb.py diff --git a/bin/linspector b/bin/linspector index 8ead2cb..4923c68 100755 --- a/bin/linspector +++ b/bin/linspector @@ -19,7 +19,7 @@ from linspector.environment import Environment from linspector.linspector import Linspector from linspector.monitors import Monitors -__version__ = '0.23.2' +__version__ = '0.24.0' __author__ = 'Johannes Findeisen ' @@ -48,6 +48,7 @@ def parse_args(): def linspector(): args = parse_args() + databases = {} monitors = {} notifications = {} plugins = {} @@ -103,24 +104,40 @@ def linspector(): environment = Environment(log) try: - if configuration.get_option('linspector', 'tasks'): - log.info(configuration.get_option('linspector', 'tasks')) + if configuration.get_option('linspector', 'databases'): + log.info('Loading databases: ' + configuration.get_option('linspector', 'databases')) + database_list = configuration.get_option('linspector', 'databases') + database_list = database_list.split(',') + for database_name in database_list: + database_package = 'linspector.databases.' + database_name + if importlib.util.find_spec(database_package) is not None: + database_module = importlib.import_module(database_package) + database_object = database_module.create(configuration, environment, log) + databases[database_name] = database_object + else: + log.warning('initialization of database: {0} failed! seems it does not exist.'. + format(database_name)) + except Exception as err: + log.warning('database initialization error: {0}'.format(err)) + try: + if configuration.get_option('linspector', 'tasks'): + log.info('Loading tasks: ' + configuration.get_option('linspector', 'tasks')) task_list = configuration.get_option('linspector', 'tasks') task_list = task_list.split(',') for task_name in task_list: task_package = 'linspector.tasks.' + task_name if importlib.util.find_spec(task_package) is not None: task_module = importlib.import_module(task_package) - task = task_module.create(configuration, environment, log) - tasks[task_name] = task + task_object = task_module.create(configuration, environment, log) + tasks[task_name] = task_object else: log.warning('initialization of task: {0} failed! seems it does not exist.'.format(task_name)) except Exception as err: log.warning('task initialization error: {0}'.format(err)) try: - monitors = Monitors(configuration, environment, log, notifications, services, tasks) + monitors = Monitors(configuration, databases, environment, log, notifications, services, tasks) except Exception as err: log.warning('monitor initialization error: {0}'.format(err)) diff --git a/etc/linspector.conf b/etc/linspector.conf index 5f3a13e..3bb3835 100644 --- a/etc/linspector.conf +++ b/etc/linspector.conf @@ -24,11 +24,13 @@ logfile_level = DEBUG ; size of logfiles (default: 1MB) logfile_size = 10MB +databases = mariadb + notifications = plugins = -tasks = mariadb +tasks = ; timezone can be set to a remote timezone to make monitors run at the remote time. this can be overridden in each ; monitor configuration. diff --git a/linspector/database.py b/linspector/database.py new file mode 100644 index 0000000..2dc8e4e --- /dev/null +++ b/linspector/database.py @@ -0,0 +1,13 @@ +""" +This file is part of Linspector (https://linspector.org/) +Copyright (c) 2022-2023 Johannes Findeisen . All Rights Reserved. +See LICENSE (MIT license). +""" + + +class Database: + def __init__(self, configuration, environment, log, **kwargs): + self._args = {} + self._configuration = configuration + self._environment = environment + self._log = log diff --git a/linspector/databases/__init__.py b/linspector/databases/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/linspector/databases/mariadb.py b/linspector/databases/mariadb.py new file mode 100644 index 0000000..51d0a33 --- /dev/null +++ b/linspector/databases/mariadb.py @@ -0,0 +1,16 @@ +""" +This file is part of Linspector (https://linspector.org/) +Copyright (c) 2022-2023 Johannes Findeisen . All Rights Reserved. +See LICENSE (MIT license). +""" +from linspector.database import Database + + +def create(configuration, environment, log): + return MariaDBDatabase(configuration, environment, log) + + +class MariaDBDatabase(Database): + + def execute(self): + self._log.debug("Hello from MariaDB Database...") diff --git a/linspector/monitor.py b/linspector/monitor.py index a5d2b9a..2e87d39 100644 --- a/linspector/monitor.py +++ b/linspector/monitor.py @@ -8,10 +8,11 @@ import importlib class Monitor: - def __init__(self, configuration, environment, identifier, log, monitor_configuration, - notifications, services, tasks, kwargs): + def __init__(self, configuration, databases, environment, identifier, log, + monitor_configuration, notifications, services, tasks, kwargs): self._args = kwargs self._configuration = configuration + self._databases = databases self._enabled = True self._environment = environment self._host = monitor_configuration.get('monitor', 'host') diff --git a/linspector/monitors.py b/linspector/monitors.py index f06f5e8..63cdf8d 100644 --- a/linspector/monitors.py +++ b/linspector/monitors.py @@ -17,8 +17,9 @@ from linspector.monitor import Monitor # if a new monitor is added at runtime it needs to be checked manually by running a "reload" command # to lish which walks thrue all scheduled jobs and when an unknown monitor is found, schedule it. class Monitors: - def __init__(self, configuration, environment, log, notifications, services, tasks): + def __init__(self, configuration, databases, environment, log, notifications, services, tasks): self._configuration = configuration + self._databases = databases self._environment = environment self._log = log self._notifications = notifications @@ -57,6 +58,7 @@ class Monitors: # create Monitor() object and copy monitor_configuration for each instance because # they else refer to the same object? copy.deepcopy(monitor_configuration)??? self._monitors[identifier] = Monitor(self._configuration, + self._databases, self._environment, identifier, self._log, diff --git a/linspector/tasks/mariadb.py b/linspector/tasks/mariadb.py deleted file mode 100644 index 9ba811f..0000000 --- a/linspector/tasks/mariadb.py +++ /dev/null @@ -1,17 +0,0 @@ -""" -This file is part of Linspector (https://linspector.org/) -Copyright (c) 2022-2023 Johannes Findeisen . All Rights Reserved. -See LICENSE (MIT license). -""" -from linspector.task import Task - - -def create(configuration, environment, log): - return MariaDBTask(configuration, environment, log) - - -# TODO: check for all required configuration options and set defaults if needed. -class MariaDBTask(Task): - - def execute(self): - self._log.debug("Hello from MariaDB Task...") diff --git a/requirements.txt b/requirements.txt index 5cdd152..91fe720 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ APScheduler==3.10.4 CherryPy==18.8.0 asyncssh==2.13.2 fastapi==0.101.1 -fritzconnection==1.13.0 +fritzconnection==1.13.1 loguru==0.7.0 paramiko==3.3.1 pydantic==2.2.1