#!/usr/bin/env python3 import asyncio import datetime import logging import os import shutil import signal from alerting import alerts, delayed from misc import checks, cvars from misc.checkers import interval_checker, scheduled_checker from misc.common import TMP_DIR from misc.config import get_config logging.basicConfig(level=logging.INFO) stopping = False def stop_gracefully(signum, frame): global stopping stopping = True def create_temp_dir() -> None: try: os.mkdir(str(TMP_DIR)) except FileExistsError: pass os.chmod(str(TMP_DIR), 0o770) try: shutil.chown(str(TMP_DIR), user="root", group="alerting") except LookupError: shutil.chown(str(TMP_DIR), user="root", group="root") with open(str(TMP_DIR / "pid"), "w") as pf: pf.write(str(os.getpid())) async def main(): create_temp_dir() signal.signal(signal.SIGTERM, stop_gracefully) loop = asyncio.get_event_loop() loop.add_signal_handler(signal.SIGUSR1, lambda: asyncio.create_task(delayed.handler())) config = get_config() cvars.config.set(config) client = await alerts.get_client() cvars.matrix_client.set(client) checker_sets = { "temp": [interval_checker(checks.temp_check, datetime.timedelta(minutes=5))], "cpu": [interval_checker(checks.cpu_check, datetime.timedelta(minutes=5))], "ups": [interval_checker(checks.ups_check, datetime.timedelta(minutes=5))], "ram": [interval_checker(checks.ram_check, datetime.timedelta(minutes=1))], "vuln": [interval_checker(checks.vuln_check, datetime.timedelta(days=1))], "raid": [interval_checker(checks.raid_check, datetime.timedelta(days=1))], "disk_wearout": [interval_checker(checks.disk_wearout_check, datetime.timedelta(days=1))], "docker_registry": [ scheduled_checker( checks.docker_registry_check, period=datetime.timedelta(days=1), when=datetime.time(hour=0, minute=0) ) ], } for disabled_key in config.disabled_checks: if disabled_key in checker_sets: del checker_sets[disabled_key] checkers = [] for _, s in checker_sets.items(): for checker in s: checkers.append(checker) 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: await client.close() shutil.rmtree(str(TMP_DIR)) raise SystemExit else: await asyncio.sleep(3) if __name__ == "__main__": asyncio.run(main())