Files
patrickandClaude Sonnet 5.5 5278530467
test / pytest (3.11) (push) Canceled after 0s
test / pytest (3.13) (push) Canceled after 0s
feat: Phase 6b rules with delay, delta format, reminders, zpool default rule
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 02:38:10 +01:00

42 lines
1.6 KiB
Python

import logging
from .. import audit
from ..db import Database
from ..models import KIND_FLAPPING, KIND_PROBLEM, KIND_RECOVERY
from .repository import insert_statement
from .validation import RouteInput
log = logging.getLogger(__name__)
SEED_ACTOR = "system"
ZPOOL_MARKER = "seed.rule.zfs_zpool"
ZPOOL_REMINDER_HOURS = 4
ZPOOL_HINT = (
"ZFS-Pool-Alarm. Typische Prüfschritte: zpool status -v (betroffenes Gerät, Fehlerzähler "
"READ/WRITE/CKSUM), läuft ein Scrub oder Resilver, SMART-Werte der betroffenen Platte, "
"Kabel/Controller, ob 'zpool clear' genügt oder ein 'zpool replace' nötig ist. Der Meldungstext "
"enthält oft keine Geräte- oder Fehlerzahlen; weise darauf hin, dass sie nicht verifiziert sind."
)
def zpool_rule() -> RouteInput:
return RouteInput(
name="ZFS Zpool", match_host="*", match_service="*zpool*", min_state=1,
kinds=(KIND_PROBLEM, KIND_RECOVERY, KIND_FLAPPING), enabled=True, use_default_targets=True,
delay_minutes=0, ai_enabled=True, reminder_hours=ZPOOL_REMINDER_HOURS, loud=True,
ai_hint=ZPOOL_HINT,
)
def seed_default_rules(db: Database) -> bool:
try:
if db.query("SELECT 1 FROM app_state WHERE key=?", (ZPOOL_MARKER,)):
return False
sql, params = insert_statement(zpool_rule())
db.execute_many([(sql, params), ("INSERT INTO app_state(key, value) VALUES (?, '1')", (ZPOOL_MARKER,))])
audit.record(db, SEED_ACTOR, "route.seed", zpool_rule().name)
return True
except Exception:
log.exception("Standardregel konnte nicht angelegt werden")
return False