From d78d21c3125c88066d47bfa4299717d1d4ea4a5e Mon Sep 17 00:00:00 2001 From: Alex Tau Date: Sat, 16 Aug 2025 12:11:42 +0300 Subject: [PATCH 1/3] bump ver to v1.1.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5317964..6f55eba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lego-monitoring" -version = "1.0.0" +version = "1.1.0" description = "Monitoring software for the lego server" readme = "README.md" requires-python = ">=3.12" From c355583f59e78696df5ace4b0717f3fc4a247826 Mon Sep 17 00:00:00 2001 From: Alex Tau Date: Sat, 16 Aug 2025 13:24:47 +0300 Subject: [PATCH 2/3] meaningful exception handling for vulnix --- src/lego_monitoring/checks/vulnix/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/lego_monitoring/checks/vulnix/__init__.py b/src/lego_monitoring/checks/vulnix/__init__.py index 2e866e6..c25bfd6 100644 --- a/src/lego_monitoring/checks/vulnix/__init__.py +++ b/src/lego_monitoring/checks/vulnix/__init__.py @@ -2,7 +2,6 @@ from socket import gethostname from lego_monitoring.alerting.alert import Alert from lego_monitoring.alerting.enum import AlertType, Severity -from lego_monitoring.alerting.sender import send_alert from ..utils import format_for_healthchecks_slug from .vulnix import get_vulnix_output @@ -16,15 +15,14 @@ async def vulnix_check() -> list[Alert]: try: vulnix_output = get_vulnix_output(IS_TESTING) except Exception as e: - await send_alert( + return [ Alert( - alert_type=AlertType.ERROR, + AlertType.VULN, message=f"Exception {type(e).__name__} while calling vulnix: {e}", severity=Severity.CRITICAL, healthchecks_slug=slug, ) - ) - return [] + ] for finding in vulnix_output: if not IS_TESTING: non_whitelisted_cves = [k for k in finding.description if k not in finding.whitelisted] From 9b884788a6f7cb99aecb14971ef20c9e15f8a142 Mon Sep 17 00:00:00 2001 From: Alex Tau Date: Sat, 16 Aug 2025 13:35:15 +0300 Subject: [PATCH 3/3] ignore first cpu check to prevent guaranteed alert on machine startup --- src/lego_monitoring/__init__.py | 6 +++++- src/lego_monitoring/core/checkers.py | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lego_monitoring/__init__.py b/src/lego_monitoring/__init__.py index 16bde25..75e1312 100644 --- a/src/lego_monitoring/__init__.py +++ b/src/lego_monitoring/__init__.py @@ -56,7 +56,11 @@ async def async_main(): sender.send_alert(checks.generate_start_alert()), IntervalChecker(checks.self_check, interval=datetime.timedelta(minutes=5), persistent=False), ], - check_sets.CPU: [IntervalChecker(checks.cpu_check, interval=datetime.timedelta(minutes=3), persistent=True)], + check_sets.CPU: [ + IntervalChecker( + checks.cpu_check, interval=datetime.timedelta(minutes=3), persistent=True, ignore_first_run=True + ) + ], check_sets.RAM: [IntervalChecker(checks.ram_check, interval=datetime.timedelta(minutes=1), persistent=True)], check_sets.TEMP: [IntervalChecker(checks.temp_check, interval=datetime.timedelta(minutes=5), persistent=True)], check_sets.VULNIX: [ diff --git a/src/lego_monitoring/core/checkers.py b/src/lego_monitoring/core/checkers.py index 78168bf..d3e4a0f 100644 --- a/src/lego_monitoring/core/checkers.py +++ b/src/lego_monitoring/core/checkers.py @@ -87,14 +87,19 @@ class BaseChecker: class IntervalChecker(BaseChecker): _: KW_ONLY interval: datetime.timedelta + ignore_first_run: bool = False async def run_checker(self) -> None: interval_secs = self.interval.total_seconds() + ignore_first_run = self.ignore_first_run while True: logging.info(f"Calling {self.check.__name__}") result = await self._call_check() logging.info(f"Got {len(result)} alerts") - await self._handle_alerts(result) + if ignore_first_run: + ignore_first_run = False + else: + await self._handle_alerts(result) await asyncio.sleep(interval_secs)