42 lines
1.6 KiB
Python
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
|