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)