Lot of bug fixing, optimizations and refactoring.

This commit is contained in:
Johannes Findeisen 2022-10-01 04:37:35 +02:00
commit 549510c3a4
19 changed files with 145 additions and 91 deletions

View file

@ -15,6 +15,7 @@ from linspector.core.helpers import log
def job_function(monitor):
log('debug', __name__, monitor)
monitor.handle_call()
@ -59,10 +60,15 @@ 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)
log('debug', __name__, monitor)
if configuration.get_option('linspector', 'delta_range'):
time_delta = round(random.uniform(0.00, float(configuration.get_option('linspector', 'delta_range'))), 2)
else:
time_delta = round(random.uniform(0.00, 60.00), 2)
new_start_date = start_date + datetime.timedelta(seconds=time_delta)
monitor_job = monitors.get(monitor)
interval = monitor_job.get_interval()
@ -74,7 +80,7 @@ class Linspector:
monitor_job.set_job(scheduler_job)
self.__jobs.append(monitor_job)
log('info', __name__, 'scheduling job ' + monitor + ' with delta ' + str(time_delta) +
' @' + str(new_start_date) + ' running service ')
' @' + str(new_start_date) + ' running service ' + monitor_job.get_service())
if configuration.get_option('linspector', 'start_scheduler') == 'true':
self.__scheduler['linspector'].start()

View file

@ -3,6 +3,8 @@ This file is part of Linspector (https://linspector.org/)
Copyright (c) 2022 Johannes Findeisen <you@hanez.org>. All Rights Reserved.
See LICENSE (MIT license)
"""
import configparser
import hashlib
import importlib
from datetime import datetime
@ -23,21 +25,25 @@ class Monitor:
self.__interval = int(monitor_configuration.get('monitor', 'interval'))
self.__monitor_configuration = monitor_configuration
self.__notification_list = []
self.__service = monitor_configuration.get('monitor', 'service')
self.__notifications = notifications
self.__service = monitor_configuration.get('monitor', 'service')
self.__services = services
self.__task_list = [] # put tasks for the dedicated job here.
self.__tasks = tasks
self.service = self.__service
#self.host = monitor_configuration.get('monitor', 'host')
#self.members = members
#self.core = core
self.hostgroup = monitor_configuration.get('monitor', 'hostgroup')
self.host = monitor_configuration.get('monitor', 'hosts')
try:
self.hostgroups = monitor_configuration.get('monitor', 'hostgroups')
except configparser.NoOptionError as err:
self.hostgroups = "None"
self.job_threshold = 0
self.enabled = True
self.scheduler_job = None
self.job_id = self.hex_string()
# the job_id is a sha256 string.
self.job_id = self.generate_job_id()
"""
NONE job was not executed
@ -53,23 +59,24 @@ class Monitor:
# self.service)
self.monitor_information = MonitorInformation(self.job_id, self.service)
if configuration.get_option('linspector', 'notifications') or \
monitor_configuration.get('monitor', 'notifications'):
if configuration.get_option('linspector', 'notifications') and \
try:
if configuration.get_option('linspector', 'notifications') or \
monitor_configuration.get('monitor', 'notifications'):
notification_list = \
configuration.get_option('linspector', 'notifications') + ',' + \
monitor_configuration.get('monitor', 'notifications')
elif configuration.get_option('linspector', 'notifications'):
notification_list = configuration.get_option('linspector', 'notifications')
elif monitor_configuration.get('monitor', 'notifications'):
notification_list = monitor_configuration.get('monitor', 'notifications')
else:
notification_list = None
if configuration.get_option('linspector', 'notifications') and \
monitor_configuration.get('monitor', 'notifications'):
self.__notification_list = notification_list.split(',')
notification_list = \
configuration.get_option('linspector', 'notifications') + ',' + \
monitor_configuration.get('monitor', 'notifications')
elif configuration.get_option('linspector', 'notifications'):
notification_list = configuration.get_option('linspector', 'notifications')
elif monitor_configuration.get('monitor', 'notifications'):
notification_list = monitor_configuration.get('monitor', 'notifications')
else:
notification_list = None
self.__notification_list = notification_list.split(',')
for notification_option in notification_list.split(','):
if notification_option not in notifications:
@ -77,6 +84,8 @@ class Monitor:
notification_module = importlib.import_module(notification_package)
notification = notification_module.create(configuration, environment)
notifications[notification_option.lower()] = notification
except configparser.NoOptionError as err:
self.__notifications = notifications
if self.__monitor_configuration.get('monitor', 'service'):
if monitor_configuration.get('monitor', 'service') not in services:
@ -87,30 +96,32 @@ class Monitor:
self.__service = monitor_configuration.get('monitor', 'service').lower()
service = service_module.create(configuration, environment, **self.__args)
self.__services[monitor_configuration.get('monitor', 'service').lower()] = service
try:
if configuration.get_option('linspector', 'tasks') or \
monitor_configuration.get('args', 'tasks'):
if configuration.get_option('linspector', 'tasks') or \
monitor_configuration.get('monitor', 'tasks'):
if configuration.get_option('linspector', 'tasks') and \
monitor_configuration.get('args', 'tasks'):
if configuration.get_option('linspector', 'tasks') and \
monitor_configuration.get('monitor', 'tasks'):
task_list = configuration.get_option('linspector', 'tasks') + ',' + \
monitor_configuration.get('args', 'tasks')
elif configuration.get_option('linspector', 'tasks'):
task_list = configuration.get_option('linspector', 'tasks')
elif monitor_configuration.get('args', 'tasks'):
task_list = monitor_configuration.get('args', 'tasks')
else:
task_list = None
task_list = configuration.get_option('linspector', 'tasks') + ',' + \
monitor_configuration.get('monitor', 'tasks')
elif configuration.get_option('linspector', 'tasks'):
task_list = configuration.get_option('linspector', 'tasks')
elif monitor_configuration.get('monitor', 'tasks'):
task_list = monitor_configuration.get('monitor', 'tasks')
else:
task_list = None
self.__task_list = task_list.split(',')
self.task_list = task_list.split(',')
for task_option in task_list.split(','):
if task_option not in tasks:
task_package = 'linspector.tasks.' + task_option.lower()
task_module = importlib.import_module(task_package)
task = task_module.create(configuration, environment)
tasks[task_option.lower()] = task
for task_option in task_list.split(','):
if task_option not in tasks:
task_package = 'linspector.tasks.' + task_option.lower()
task_module = importlib.import_module(task_package)
task = task_module.create(configuration, environment)
tasks[task_option.lower()] = task
except configparser.NoOptionError:
self.__tasks = tasks
def get_identifier(self):
return self.__identifier
@ -124,11 +135,9 @@ class Monitor:
def __str__(self):
return str(self.__dict__)
def __hex__(self):
return hex(crc32(bytes(self.hostgroup + self.service, 'utf-8')))
def hex_string(self):
ret = self.__hex__()
ret = hex(crc32(bytes(self.host + self.hostgroups + self.service, 'utf-8')))
#ret = self.__hex__()
if ret[0] == "-":
ret = ret[3:]
else:
@ -137,8 +146,9 @@ class Monitor:
ret = "0" + ret
return ret
def get_job_id(self):
return self.job_id
def generate_job_id(self):
return hashlib.sha256(bytes(self.__identifier + self.host + self.hostgroups + self.service,
'utf-8')).hexdigest()
def set_job(self, scheduler_job):
self.scheduler_job = scheduler_job
@ -179,7 +189,7 @@ class Monitor:
#TaskExecutor.instance().schedule_task(monitor_information, task)
def handle_call(self):
log('info', __name__, "handle call to identifier: " + self.__identifier)
#log('info', __name__, "handle call to identifier: " + self.__identifier)
self.__services[self.__service].execute()
#logger.debug("handle call")
#logger.debug(self.service)
@ -211,8 +221,8 @@ class Monitor:
#def get_host(self):
# return self.host
def get_hostgroup(self):
return self.hostgroup
def get_hostgroups(self):
return self.hostgroups
class MonitorExecution:

View file

@ -24,13 +24,16 @@ class Monitors:
monitor_groups = os.listdir(self.__configuration.get_configuration_path() + '/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:
identifier = monitor_group + '_' + os.path.splitext(os.path.basename(
monitor_file))[0]
monitor_configuration = configparser.ConfigParser()
monitor_configuration.read(monitor_file, 'utf-8')
kwargs = {}
@ -39,7 +42,8 @@ class Monitors:
value = monitor_configuration.get('args', option)
kwargs[option] = value
print(monitor_group + ' ' + str(kwargs))
if kwargs:
log('debug', __name__, identifier + ' args ' + str(kwargs))
identifier = monitor_group + '_' + os.path.splitext(os.path.basename(
monitor_file))[0]
@ -47,9 +51,8 @@ class Monitors:
# create Monitor() object and copy monitor_configuration for each instance because
# they else refer to the same object.
self.__monitors[identifier] = Monitor(configuration, environment, identifier,
copy.deepcopy(monitor_configuration),
notifications, services, tasks,
copy.deepcopy(kwargs))
monitor_configuration, notifications,
services, tasks, copy.deepcopy(kwargs))
del kwargs

View file

@ -22,5 +22,5 @@ class FritzboxUplinkService(Service):
self.__kwargs = kwargs
def execute(self):
log('debug', __name__, 'dummy object @' + str(self))
log('debug', __name__, 'fritzboxuplink object @' + str(self))
return