diff --git a/bredelar.info/config.yaml b/bredelar.info/config.yaml index 1a22947..c40190f 100644 --- a/bredelar.info/config.yaml +++ b/bredelar.info/config.yaml @@ -75,15 +75,8 @@ periodic_checks: alerting: min_level: "yellow" email: - enabled: false - smtp_host: "localhost" - smtp_port: 587 - smtp_tls: true - smtp_user: "" + enabled: true smtp_password_env: "SCANNER_SMTP_PASSWORD" - from: "scanner@bredelar.info" - to: - - "admin@bredelar.info" webhook: enabled: false url: "" diff --git a/scanner/__main__.py b/scanner/__main__.py index 653995e..39c4277 100644 --- a/scanner/__main__.py +++ b/scanner/__main__.py @@ -1305,6 +1305,47 @@ def _print_summary(assessment: dict, diff: dict, f"Vollständiger Bericht: python -m scanner report") +def cmd_test_alert(args: argparse.Namespace, cfg: dict) -> int: + """Send a synthetic test alert to verify SMTP configuration.""" + import os + level = args.level + target = cfg.get("target", "?") + email_cfg = cfg.get("alerting", {}).get("email", {}) + + if not email_cfg.get("enabled"): + print("E-Mail-Alarm ist in der config.yaml nicht aktiviert (alerting.email.enabled: false).") + return 1 + + pw_env = email_cfg.get("smtp_password_env", "SCANNER_SMTP_PASSWORD") + if not os.environ.get(pw_env): + print(f"Umgebungsvariable {pw_env} ist nicht gesetzt.") + print(f"Bitte in ~/.bashrc eintragen: export {pw_env}=\"Passwort\"") + return 1 + + report = { + "target": target, + "assessment": { + "level": level, + "score": 42 if level == "yellow" else 120, + "reasons": ["[TEST] Dies ist eine Test-Benachrichtigung des integrity-scanner."], + "exit_code": 1 if level == "yellow" else 2, + }, + "diff": { + "new_external_domains": [], + "new_internal_urls": [], + "missing_internal_urls": [], + "page_diffs": [], + "new_broken_urls": [], + "known_broken_urls": [], + }, + } + + print(f"Sende Test-Alarm ({level}) an {email_cfg.get('to', [])} ...") + send_alert(report, cfg) + print("Fertig. Bitte E-Mail-Postfach prüfen.") + return 0 + + # --------------------------------------------------------------------------- # Argument parser # --------------------------------------------------------------------------- @@ -1350,6 +1391,12 @@ def _build_parser() -> argparse.ArgumentParser: aa = sub.add_parser("approve-assets", help="Aktuelle Asset-Hashes als neue Baseline setzen") aa.add_argument("--note", default="", help="Freitext-Notiz") + ta = sub.add_parser("test-alert", help="Test-E-Mail senden (prüft SMTP-Verbindung)") + ta.add_argument( + "--level", choices=["yellow", "red"], default="yellow", + help="Simulierter Alarm-Level (default: yellow)", + ) + return p @@ -1436,6 +1483,7 @@ def main() -> None: "check-ext-links": cmd_check_ext_links, "check-assets": cmd_check_assets, "approve-assets": cmd_approve_assets, + "test-alert": cmd_test_alert, } handler = commands.get(args.command) if not handler: