- kern/platten.py: SMART aus pvesh, smartctl und SNMP in einer Form; rot bei SMART FAILED, kritischer Warnung, aufgebrauchter Reserve, ≥ 90 % verbraucht; gelb bei ≥ 80 %, Hitze, gewachsenen Fehlerzählern (Ausgangslage je Platte, „Zur Kenntnis genommen“ setzt sie neu) - Ausführer: stündlich disks/list + disks/smart im Bericht (nur lesend) - services/homelab/nas_snmp.py: kleiner SNMPv2c-GetBulk-Leser ohne neue Abhängigkeit, QNAP hdTable/diskTable, Zugang 0600, Einstellungen „Verbindung testen und speichern“ - services/platten.py: NVMe der KI-Box über sudo smartctl (smartmontools am 26.09. nachinstalliert) - Wächter beider Rollen, Plattenfeld in beiden Cockpits, Doku Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
"""Plattengesundheit im Homelab (Ausbauplan „Später“, Punkt 18, seit 26.09.2026): die Platten des Proxmox-Hosts
|
|
(Ausführer, stündlich im Bericht) und die des NAS (SNMP, services/homelab/nas_snmp.py), bewertet mit kern/platten.py.
|
|
Der Wächter meldet nur, was schlecht ist oder schlechter wird; „Zur Kenntnis genommen“ macht die heutigen
|
|
Fehlerzähler zur neuen Ausgangslage.
|
|
"""
|
|
|
|
from kern import platten as kern_platten
|
|
|
|
from services.homelab import kanal, nas_snmp
|
|
|
|
|
|
def host_platten() -> list[dict]:
|
|
host = ((kanal.bericht() or {}).get("bericht") or {}).get("host") or {}
|
|
return [kern_platten.aus_proxmox(e.get("disk") or {}, e.get("smart")) for e in host.get("platten") or []
|
|
if isinstance(e, dict) and isinstance(e.get("disk"), dict)]
|
|
|
|
|
|
def lage() -> dict:
|
|
"""Für GET /api/homelab/platten."""
|
|
nas = nas_snmp.stand()
|
|
platten = kern_platten.bewertet(host_platten() + list(nas.get("platten") or []))
|
|
return {"platten": platten, "nas": {"eingerichtet": nas["eingerichtet"], "ok": nas.get("ok", False),
|
|
"detail": nas.get("detail"), "system": nas.get("system")}}
|
|
|
|
|
|
def hinnehmen(pid: str) -> dict:
|
|
return kern_platten.hinnehmen(pid, host_platten() + list(nas_snmp.stand().get("platten") or []))
|
|
|
|
|
|
def pruefe_platten_gesundheit() -> list:
|
|
"""Für den Wächter (Rolle homelab)."""
|
|
from services.waechter import Befund, _aktion
|
|
|
|
befunde = []
|
|
for p in lage()["platten"]:
|
|
if p["stufe"] == "ok":
|
|
continue
|
|
fehler = any("→" in s for s in p["saetze"])
|
|
befunde.append(Befund(
|
|
id=f"platte:{p['id']}", stufe=p["stufe"], titel=kern_platten.befund_titel(p),
|
|
text="; ".join(p["saetze"]) + ". Die Daten darauf sichern und die Platte bald ersetzen, wenn es weiter "
|
|
"schlechter wird.",
|
|
quelle=p["id"].split(":")[0] if p["id"].startswith("nas:") else "pve",
|
|
aktionen=[_aktion("hinnehmen", "Zur Kenntnis genommen", platte=p["id"])] if fehler else [],
|
|
sofort=True))
|
|
return befunde
|