mirror of
https://forgejo.altau.su/lego/lego-monitoring.git
synced 2026-03-10 04:41:10 +00:00
81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
import argparse
|
|
import asyncio
|
|
import datetime
|
|
import logging
|
|
import signal
|
|
|
|
from . import checks
|
|
from .alerting import alerts
|
|
from .checks.temp.sensors import print_readings
|
|
from .config import load_config
|
|
from .core import cvars
|
|
from .core.checkers import interval_checker
|
|
|
|
stopping = False
|
|
|
|
|
|
def stop_gracefully(signum, frame):
|
|
global stopping
|
|
stopping = True
|
|
|
|
|
|
def main() -> None:
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
asyncio.run(async_main())
|
|
|
|
|
|
async def async_main():
|
|
parser = argparse.ArgumentParser(
|
|
prog="lego-monitoring",
|
|
description="Lego-monitoring service",
|
|
)
|
|
parser.add_argument("-c", "--config", help="config file")
|
|
parser.add_argument("--print-temp", help="print temp sensor readings and exit", action="store_true")
|
|
args = parser.parse_args()
|
|
|
|
if args.config:
|
|
config_path = parser.parse_args().config
|
|
config = load_config(config_path)
|
|
cvars.config.set(config)
|
|
|
|
if args.print_temp:
|
|
print_readings()
|
|
raise SystemExit
|
|
|
|
if not args.config:
|
|
raise RuntimeError("--config must be specified in standard operating mode")
|
|
|
|
tg_client = await alerts.get_client()
|
|
cvars.tg_client.set(tg_client)
|
|
|
|
checker_sets = {
|
|
"start": [
|
|
alerts.send_start_alert(),
|
|
],
|
|
"stop": [], # this is checked later
|
|
"temp": [interval_checker(checks.temp_check, datetime.timedelta(minutes=5))],
|
|
"vulnix": [interval_checker(checks.vulnix_check, datetime.timedelta(days=3))],
|
|
"cpu": [interval_checker(checks.cpu_check, datetime.timedelta(minutes=5))],
|
|
}
|
|
|
|
checkers = []
|
|
for enabled_set in config.enabled_check_sets:
|
|
for checker in checker_sets[enabled_set]:
|
|
checkers.append(checker)
|
|
|
|
signal.signal(signal.SIGTERM, stop_gracefully)
|
|
|
|
async with asyncio.TaskGroup() as tg:
|
|
checker_tasks: set[asyncio.Task] = set()
|
|
for c in checkers:
|
|
task = tg.create_task(c)
|
|
checker_tasks.add(task)
|
|
while True:
|
|
if stopping:
|
|
if "stop" in config.enabled_check_sets:
|
|
await alerts.send_stop_alert()
|
|
await tg_client.disconnect()
|
|
raise SystemExit
|
|
else:
|
|
await asyncio.sleep(3)
|