feat: test-alert subcommand + enable email for bredelar.info

- Add `test-alert [--level yellow|red]` to verify SMTP without a real scan
- Enable email alerting in bredelar.info/config.yaml (uses DEFAULT_CONFIG
  for host/user/from/to, only smtp_password_env kept explicit)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-12 19:50:24 +02:00
commit aa2b1ebf5c
2 changed files with 49 additions and 8 deletions

View file

@ -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: ""

View file

@ -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: