First commit with working service execution and a defined log output (0.20).
This commit is contained in:
parent
be78e5e031
commit
c8fa991478
14 changed files with 63 additions and 177 deletions
|
|
@ -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 <you@hanez.org>'
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
[hostgroups]
|
||||
testgroup1 = host1,host2,host3,192.168.2.1>192.168.2.127
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
interval = 5
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[api]
|
||||
host = 127.0.0.1
|
||||
port = 4242
|
||||
type = thread
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[httpserver]
|
||||
host = 127.0.0.1
|
||||
port = 8080
|
||||
type = thread
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[lish]
|
||||
type = none
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
[splunk]
|
||||
host = splunk.example.org
|
||||
port = 3333
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
[syslog]
|
||||
host = log.example.org
|
||||
port = 514
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ This file is part of Linspector (https://linspector.org/)
|
|||
Copyright (c) 2022 Johannes Findeisen <you@hanez.org>. 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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue