"""Das Protokoll eines Containers für Lucy (seit 25.09.2026, Ausbauplan Welle 3, Punkt 14: „Lucy liest Logs und Messwerte, erklärt den Befund“). Über den Ausführer (Aktion journal, nur lesend): Warnungen und Fehler der letzten 24 Stunden aus dem Journal, ohne systemd (Alpine) die letzten Zeilen von /var/log/messages. Nur für freigegebene Container — in eine VM kommt der Ausführer nicht hinein. Lucys Werkzeug geraet_logs() liest es über GET /api/homelab/ziele/{id}/journal. """ from services.homelab import inventar, kanal ZEITLIMIT_S = 90 def lesen(ziel_id: str, zeilen: int = 80) -> dict: gast = inventar.gast(ziel_id) if not gast: return {"ok": False, "detail": "Dieses Gerät steht nicht im Bericht des Ausführers."} if gast.get("art") != "lxc": return {"ok": False, "detail": "Protokolle gibt es nur von Containern; in eine VM kommt der Ausführer nicht."} if not gast.get("erlaubt"): return {"ok": False, "detail": "Dieses Gerät ist nicht freigegeben (Etikett watcher fehlt)."} auftrag = kanal.anlegen("journal", {"vmid": gast["vmid"], "zeilen": max(20, min(int(zeilen), 300))}) ergebnis = kanal.warten(auftrag, ZEITLIMIT_S) if not ergebnis: return {"ok": False, "detail": "Der Ausführer hat nicht rechtzeitig geantwortet."} if ergebnis.get("status") != "fertig": return {"ok": False, "detail": str(ergebnis.get("text") or "Das Protokoll ließ sich nicht lesen.")[:500]} return {"ok": True, "text": str(ergebnis.get("text") or "").strip() or "(keine Warnungen oder Fehler)"}