diff --git a/bin/linspector b/bin/linspector index 5283fec..f3c20d1 100755 --- a/bin/linspector +++ b/bin/linspector @@ -18,7 +18,7 @@ from linspector.core.monitors import Monitors # i currently only increase the 3rd number because the goal is that 0.19.* will become the first # stable version. -__version__ = '0.19.64.dev1' +__version__ = '0.20' __author__ = 'Johannes Findeisen ' diff --git a/etc/hostgroups/testgroup1.conf b/etc/hostgroups/testgroup1.conf deleted file mode 100644 index 226f3ef..0000000 --- a/etc/hostgroups/testgroup1.conf +++ /dev/null @@ -1,2 +0,0 @@ -[hostgroups] -testgroup1 = host1,host2,host3,192.168.2.1>192.168.2.127 \ No newline at end of file diff --git a/etc/linspector.conf b/etc/linspector.conf index 03849d6..a82fa1e 100644 --- a/etc/linspector.conf +++ b/etc/linspector.conf @@ -1,125 +1,35 @@ -; all you need to know: https://docs.python.org/3/library/configparser.html ... ;) [linspector] -; report core errors to the following users +default_interval = 300 +delta_range = 10 error_receivers = admin@example.com -; available log levels are: "critical", "error", "warning", "info" and "debug". if no log_level is set, it will be set -; to "critical". -log_level = debug -;log_file = ~/code/linspector/linspector/log/linspector.log -; number of log files to be kept. i recommend to use the lowest sensible value for keeping performance high. so set -; the size of the log file higher to increase the log history. log_file_count = 20 -; log file size in megabytes as int. the default is 10000000 bytes (10MiB) set in the code if not configured here. log_file_size = 1 -; log file size in bytes as int. you can set to bytes if you want to set a value lower then 1 megabyte. but it will -; only be used when log_file_size is not set. if this value is not set too the default in the code will be used. log_file_size_bytes = 100000 -pid_file = /var/run/user/1000/linspector.pid -; plugins separated by ','. no whitespaces allowed! not case sensitive. -plugins = api,httpd,lish -; globally configured tasks will always run on all monitors when no task is configured there. if tasks are configured in -; a monitor then maybe only run tasks from the dedicated monitor. maybe it is a good idea to run global tasks in every -; monitor and the monitor can add tasks to the global settings... need to think about it. -; tasks separated by ','. no whitespaces allowed! not case sensitive. -tasks = sqlite -notifications = sms -; maybe the run_mode is obsolete because this will be a daemon but maybe it is useful for one time execution? -; in uplink the available run_modes were cron, daemon and foreground -run_mode = cron -; members to send notifications to if something internally in Linspector went wrong. -members = superadmin@example.com,developers@example.com -; scheduler configuration -start_scheduler = true -; the mode the scheduler should run. options are, process or thread. default is the thread mode. process mode will run -; multiple processes, thread mode will run only one process with multiple threads. maybe this can be combined to run -; multiple processes with multiple threads... dont know this actually but reading the APScheduler documentation will -; explain this.... :) default is "thread" but Linspector will only run on one CPU core then. default threads are 1024 -; but this can be set much higher here. this should be minimal set to the number of monitors you are running. in process -; mode log rotating is not working as expected so i need to investigate some time to figure out what happens. -scheduler_mode = process -; the default job interval can be set here. in the code 300 seconds are set when this option does not exist here nor in -; the monitor configuration. -default_interval = 5 -; the minimum interval for monitors -minimum_interval = 1 +log_level = info +max_processes = 1 max_threads = 2048 -; i recommend to set this to your number of CPU cores available when running on a dedicated Linspector host. but if the -; system is running other services you should lower this value when you have too high CPU load. if you have enough -; resources this value really can be higher then your available CPU cores. -max_processes = 24 -; if timezone is not set, UTC is used by default. +minimum_interval = 10 +notifications = email +pid_file = /var/run/user/1000/linspector.pid +plugins = +run_mode = cron +scheduler_mode = thread +start_scheduler = true +tasks = mariadb timezone = CET -; this is for scheduling jobs to not run all at the same time. this should not be set lower then the lowest interval -; you use in monitors. it can be set to a lower value if you only have a small amount of services you are monitoring. -; i recommend the lowest interval you use in any monitor but higher values will reduce cpu load when using monitors -; with a higher value then the delta_range. it is always starting with 0. default is 60. the current setting is for -; development only. -delta_range = 60 -; hostgroup parents; if the hostgroup "group1" is down, don't alert for the hosts in group2. see TODO.txt for more -; information. [hostgroupparents] -; hostgroup group1 is parent of group2 -group1 = group2 -; a flexible way to define groups of hosts which can be used by monitors as target for monitoring for easily monitor -; groups without adding a monitor for each host. for some more information see the "hosts" section in gateway.conf. -; hostgroups can be defined in separate files in etc/hostgroups to be more flexible. [hostgroups] -; add single hosts -group1 = host1,host2,host3 -; add a range of ip addresses. -; for ip ranges see: https://stackoverflow.com/questions/19157307/generate-range-of-ips-in-python -group2 = 192.168.1.1/28 -; add a combination of hosts and ranges -group3 = host1,host2,host3,192.168.1.1/28 -; using groups inside groups. but need to take care about recursive dependencies. -group4 = host10,host11,host12,@group3 -; member groups to define recipients for notifications. see hostgroups for more details. [membergroups] -admins = admin1@example.com,admin2@example.com,admin3@example.com -developers = hanez@example.com -; just an idea taken from the old Linspector design. not tried but seems a good idea to add global options to monitor -; groups. no idea of an implementation yet. [monitorgroups] -; members of monitors to automatically send notifications to all without need to set them in each monitor. members can -; be added to monitors in the configuration of each monitor though. -network1_members = admin@example.com,@admins -; every notification can be configured in it's own configuration file in etc/notifications; there no notification -; name as prefix is needed. see email example. [notifications] -; values can be overridden in each defined monitor -sms_receivers = +number1,+number2 -sms_configuration_file = ~/linspector/etc/gammurc -; retry to send interval and number of retries if something failed -sms_resend = 10 -sms_resend_count = 5 -email_resend = 10 -; every plugin can be configured in it's own ini file in etc/plugins; there no plugin name as prefix is needed. see -; httpd example. [plugins] -api_host = 0.0.0.0 -httpd_host = 192.168.23.42 -httpd_port = 8089 -; if types can or must be configured before use; for now no use case seen. -; every type can be configured in it's own ini file in etc/types; there no type name as prefix is not needed. [services] -; run the speedtest not very often. it is not for alerting about problems bur maybe will be at some day. -speedtest_interval = 3600 -; the file to get for calculation of the downlink speed. microsoft has very fast servers so it will become a meaningful -; result. -speedtest_url = https://go.microsoft.com/fwlink/?Linkid=850641 -; tasks executed at the end of each monitor execution. this is for storing data for longtime analysis. not every task -; is storing results and this feature is fully optional. Linspector must run even without activated tasks! [tasks] -mariadb_database = linspector -mariadb_host = 10.0.0.254 -mariadb_password = PASSWORD -mariadb_port = 3306 -mariadb_user = USER \ No newline at end of file diff --git a/etc/monitors/network1/gateway.conf b/etc/monitors/network1/gateway.conf index 0199c5f..ab89407 100644 --- a/etc/monitors/network1/gateway.conf +++ b/etc/monitors/network1/gateway.conf @@ -1,37 +1,12 @@ -; required options: [monitor] -; Currently not used but should replace current usage of description. The description should be optional... -title = The Monitor Title -; The description must not but should be a unique description of the monitor for better identifying it in the datastore -; if a task is being used. +title = Uplink Status description = Cable Provider Uplink Status service = net.fritzboxuplink -hosts = 192.168.0.1,192.168.23.24,@group1,@testgroup1 +; this is obsolete because the host will become part of the args but removing it now will break the code. linspector +; should be for checking local or remote stuff so a host is optional. +hosts = 192.168.1.1 -; optional options when using notifications, plugins, services or tasks. btw. they still can be a required argument by -; a corresponding notification, plugin, service or task. they will need to check required args by themself and throw an -; exception if something fails. linspector never knows about required args: [args] -; this only depends on the SLA you made with the product owner. this option is optional. the default is 300 seconds. -interval = 60 -; notifications separated by ','. no whitespaces allowed. the case is not important. -notifications = sms,emaiL -; values from main configuration can be overridden for each defined monitor -; email_receivers separated by ','. no whitespaces allowed -email_receivers = admin@example.com,fallback@example.com -; sms_receivers separated by ','. no whitespaces allowed -sms_receivers = +number1,+number2 -; setting to None fails. just do not set this option. currently i get an error when tasks is not set here. need to be -; fixed. setting it like below works but is no good design for optional options. same for notifications. -tasks = redis -; maybe this should be some kind of range too, for example for the ping service like: 10.0.0.1>10.0.0.42 or more -; sophisticated kind of ranges... i will find a solution for that... like host groups in the old version of Linspector -; so we don't need to add a monitor for each host... but it would be a good idea to expose these to hostgroups -; 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 -; monitors can add their self into a hostgroup -hostgroups = group1 -user = USERNAME +host = 192.168.1.1 password = PASSWORD -; only alert when the error reaches the threshold -threshold = 3 +interval = 60 diff --git a/etc/monitors/network2/gateway.conf b/etc/monitors/network2/gateway.conf index 436b75c..e421bf7 100644 --- a/etc/monitors/network2/gateway.conf +++ b/etc/monitors/network2/gateway.conf @@ -1,14 +1,10 @@ [monitor] -description = Cable Provider -service = Net.FritzboxUplink -hosts = 192.168.1.1 +title = Uplink Status +description = DSL Provider Uplink Status +service = net.fritzboxuplink +hosts = 192.168.2.1 [args] -interval = 60 -notifications = email -email_receivers = admin@example.com,fallback@example.com -sms_receivers = +number1,+number2 -tasks = mariadb,file -user = USERNAME +host = 192.168.2.1 password = PASSWORD -hostgroups = group1 \ No newline at end of file +interval = 5 diff --git a/etc/notifications/email.conf b/etc/notifications/email.conf deleted file mode 100644 index 9d0bf9e..0000000 --- a/etc/notifications/email.conf +++ /dev/null @@ -1,7 +0,0 @@ -[email] -resend = 20 -smtp_host = mail.example.com -smtp_port = 25 -smtp_password = PASSWORD -smtp_user = alerts@example.com -receivers = admin@example.com \ No newline at end of file diff --git a/etc/plugins/api.conf b/etc/plugins/api.conf deleted file mode 100644 index 53a9488..0000000 --- a/etc/plugins/api.conf +++ /dev/null @@ -1,4 +0,0 @@ -[api] -host = 127.0.0.1 -port = 4242 -type = thread \ No newline at end of file diff --git a/etc/plugins/httpd.conf b/etc/plugins/httpd.conf deleted file mode 100644 index 4e92011..0000000 --- a/etc/plugins/httpd.conf +++ /dev/null @@ -1,4 +0,0 @@ -[httpserver] -host = 127.0.0.1 -port = 8080 -type = thread \ No newline at end of file diff --git a/etc/plugins/lish.conf b/etc/plugins/lish.conf deleted file mode 100644 index 4a8778c..0000000 --- a/etc/plugins/lish.conf +++ /dev/null @@ -1,2 +0,0 @@ -[lish] -type = none \ No newline at end of file diff --git a/etc/tasks/splunk.conf b/etc/tasks/splunk.conf deleted file mode 100644 index 80d2769..0000000 --- a/etc/tasks/splunk.conf +++ /dev/null @@ -1,3 +0,0 @@ -[splunk] -host = splunk.example.org -port = 3333 \ No newline at end of file diff --git a/etc/tasks/syslog.conf b/etc/tasks/syslog.conf deleted file mode 100644 index 343b479..0000000 --- a/etc/tasks/syslog.conf +++ /dev/null @@ -1,3 +0,0 @@ -[syslog] -host = log.example.org -port = 514 \ No newline at end of file diff --git a/linspector/core/linspector.py b/linspector/core/linspector.py index 1ad00f4..feb6b82 100644 --- a/linspector/core/linspector.py +++ b/linspector/core/linspector.py @@ -36,7 +36,7 @@ class Linspector: self.__scheduler = scheduler # load plugins - log.info('loading plugins...') + log.info('message=loading plugins') if configuration.get_option('linspector', 'plugins'): plugin_list = configuration.get_option('linspector', 'plugins') self.__plugin_list = plugin_list.split(',') @@ -114,8 +114,12 @@ class Linspector: monitor_job.set_job(scheduler_job) self.__jobs.append(monitor_job) - log.info('scheduling job ' + monitor + ' with delta ' + str(time_delta) + - ' @' + str(new_start_date) + ' running service ' + monitor_job.get_service()) + log.info('identifier=' + monitor + + ' host=' + "NOT IMPLEMENTED" + + ' service=' + monitor_job.get_service() + + ' delta=' + str(time_delta) + + ' next=' + str(new_start_date) + + ' message=scheduling job') if configuration.get_option('linspector', 'start_scheduler') == 'true': self.__scheduler['linspector'].start() diff --git a/linspector/core/monitor.py b/linspector/core/monitor.py index e38c15f..190a15c 100644 --- a/linspector/core/monitor.py +++ b/linspector/core/monitor.py @@ -219,13 +219,16 @@ class Monitor: def handle_tasks(self, monitor_information): for task in self.__tasks: if self.status.lower() in task.get_task_type().lower(): - self.__log.debug('executing task of type: ' + self.status) + self.__log.debug('message=executing task type=' + self.status) # tasks can but should not be executed here. putting them in a queue is the better # solution to execute them in a serial process. # TaskExecutor.instance().schedule_task(monitor_information, task) def handle_call(self): - self.__log.info('handle call to monitor with identifier: ' + self.__identifier) + self.__log.debug('identifier=' + self.__identifier + + ' object=' + str(self)) + self.__log.debug('identifier=' + self.__identifier + + ' message=handle call to service') # logger.debug("handle call") # logger.debug(self.service) if self.enabled: @@ -233,7 +236,7 @@ class Monitor: try: self.last_execution = MonitorExecution(self.get_host()) # self.__services[self.__service].execute(self.last_execution) - self.__services[self.__service].execute(**self.__args) + self.__services[self.__service].execute(self.__identifier, self.__service, **self.__args) except Exception as err: self.__log.error(err) diff --git a/linspector/services/net/fritzboxuplink.py b/linspector/services/net/fritzboxuplink.py index 97fd707..41b7cab 100644 --- a/linspector/services/net/fritzboxuplink.py +++ b/linspector/services/net/fritzboxuplink.py @@ -3,6 +3,7 @@ This file is part of Linspector (https://linspector.org/) Copyright (c) 2022 Johannes Findeisen . All Rights Reserved. See LICENSE.txt (MIT license). """ +from fritzconnection.lib.fritzstatus import FritzStatus from linspector.core.service import Service @@ -18,7 +19,29 @@ class FritzboxUplinkService(Service): self.__environment = environment self.__log = log - def execute(self, **kwargs): - self.__log.debug('FritzboxUplinkService object ' + str(self) + ' using kwargs: ' + - str(kwargs)) - return + def execute(self, identifier, service, **kwargs): + status = "NONE" + self.__log.debug('identifier=' + identifier + + 'service=' + service + + ' object=' + str(self) + + ' kwargs=' + str(kwargs)) + try: + fc = FritzStatus(address=kwargs['host'], + password=kwargs['password']) + + if fc.is_connected: + status = "OK" + else: + status = "ERROR" + except Exception: + self.__log.error('identifier=' + identifier + + ' host=' + str(kwargs['host']) + + ' service=' + service + + ' failed ') + return False + + self.__log.info('identifier=' + identifier + + ' host=' + str(kwargs['host']) + + ' service=' + service + + ' status=' + status) + return True