Betriebs-Luecken: Restore-Probe, Venv-Audit, Disk-Waechter, PC-Watch
Scope-Entscheid 17.07.: MC2 bleibt Box-Zentrale (KEINE Homelab-Zentrale) - Infra-Radar (Proxmox/PBS/QNAP/Gitea) geht als eigenes Projekt an Lucys Queue. - restore-probe.sh (Cron 1. d. M. 06:40, no-agent): stellt WIRKLICH wieder her - PBS-Canary aus hermes.pxar (selektiv via --pattern, sudo-frei ueber die User-Unit-Zugaenge) + Tarball-Probe + Frische-Check <36h; Erstlauf-Fallbacks (llamaswap.pxar / Kern-Datei) bis der Canary in den Sicherungen ankommt. - venv-audit.sh (Cron 2. d. M. 06:40, no-agent): pip outdated + pip-audit-CVEs fuer mem0-/voice-venv ueber eigenes Audit-venv; Funde -> Kanban-Karte je Monat, Update bleibt Commander-Entscheid. - self-smoke: Disk-Waechter (Check 7, Schwelle 85%, nennt die groessten Brocken). - Trend-Radar-Watchlist: neue Typen github_release_major + pypi; Eintraege electron-major (PC-Shell auf 33!) und pocket-tts (PyPI-Versionswatch). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env bash
|
||||
# Venv-Audit (monatlich, 17.07.2026): die Python-Nebendienste (Mem0, Voice) altern
|
||||
# eingefroren — kein Auto-Update-Kanal deckt sie ab. Dieser Audit MELDET nur
|
||||
# (bewusst kein Auto-Update: Python-Deps brechen gern):
|
||||
# je venv: veraltete Pakete zählen (pip list --outdated) + bekannte
|
||||
# Sicherheitslücken prüfen (pip-audit gegen den eingefrorenen Stand).
|
||||
# Werkzeug: eigenes Audit-venv (~/.venv-audit, wird beim Erstlauf angelegt) — die
|
||||
# Dienst-venvs selbst werden NICHT angefasst. CVE-Funde → Kanban-Karte (triage,
|
||||
# idempotent je Monat). Läuft als Hermes-Cron --no-agent (stdout = Telegram).
|
||||
set -uo pipefail
|
||||
|
||||
VENVS=("$HOME/.mem0/venv:mem0" "$HOME/.voice/venv:voice")
|
||||
AUDIT_VENV="$HOME/.venv-audit"
|
||||
HERMES="$HOME/.local/bin/hermes"
|
||||
MONAT="$(date '+%Y-%m')"
|
||||
TMP="$(mktemp -d /tmp/venv-audit.XXXXXX)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
briefkasten() {
|
||||
curl -sf -m 5 -X POST "${MC_ANNOUNCE_URL:-http://127.0.0.1:9001/api/voice/announce}" \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data "$(python3 - "$1" <<'PY'
|
||||
import json, sys
|
||||
print(json.dumps({"text": sys.argv[1], "subject": "Venv-Audit",
|
||||
"source": "venv-audit", "priority": "silent"}))
|
||||
PY
|
||||
)" >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
# ---------- Werkzeug-venv sicherstellen (einmalig) ----------
|
||||
if [ ! -x "$AUDIT_VENV/bin/pip-audit" ]; then
|
||||
python3 -m venv "$AUDIT_VENV" >/dev/null 2>&1 || true
|
||||
"$AUDIT_VENV/bin/pip" install -q --upgrade pip pip-audit >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
ZEILEN=()
|
||||
CVE_DETAILS=""
|
||||
CVES_GESAMT=0
|
||||
|
||||
for EINTRAG in "${VENVS[@]}"; do
|
||||
VENV="${EINTRAG%%:*}"; NAME="${EINTRAG##*:}"
|
||||
if [ ! -x "$VENV/bin/pip" ]; then
|
||||
ZEILEN+=("$NAME: venv fehlt unter $VENV — bitte prüfen")
|
||||
continue
|
||||
fi
|
||||
# Veraltete Pakete (Anzahl reicht fürs Lagebild)
|
||||
ALT_N="$("$VENV/bin/pip" list --outdated 2>/dev/null | tail -n +3 | grep -c '' || echo 0)"
|
||||
# CVE-Prüfung gegen den eingefrorenen Stand (lokale Pfade/Editables ausfiltern)
|
||||
"$VENV/bin/pip" freeze 2>/dev/null | grep -vE ' @ |^-e |^#' > "$TMP/$NAME.txt" || true
|
||||
CVE_N=0
|
||||
if [ -x "$AUDIT_VENV/bin/pip-audit" ] && [ -s "$TMP/$NAME.txt" ]; then
|
||||
AUDIT_OUT="$("$AUDIT_VENV/bin/pip-audit" -r "$TMP/$NAME.txt" --progress-spinner off 2>&1 || true)"
|
||||
if printf '%s' "$AUDIT_OUT" | grep -qi 'No known vulnerabilities'; then
|
||||
CVE_N=0
|
||||
else
|
||||
CVE_N="$(printf '%s\n' "$AUDIT_OUT" | grep -cE '^[a-zA-Z0-9_.-]+ +[0-9][^ ]* +(GHSA|PYSEC|CVE)' || echo 0)"
|
||||
if [ "${CVE_N:-0}" -gt 0 ]; then
|
||||
CVE_DETAILS="${CVE_DETAILS}
|
||||
== ${NAME} ==
|
||||
$(printf '%s\n' "$AUDIT_OUT" | grep -E '^[a-zA-Z0-9_.-]+ +[0-9][^ ]* +(GHSA|PYSEC|CVE)' | head -10)"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
ZEILEN+=("$NAME: pip-audit nicht verfügbar (Audit-venv kaputt oder offline?) — nur Outdated-Zählung")
|
||||
fi
|
||||
CVES_GESAMT=$(( CVES_GESAMT + ${CVE_N:-0} ))
|
||||
ZEILEN+=("$NAME: ${ALT_N} Pakete veraltet · ${CVE_N:-0} bekannte Sicherheitslücken")
|
||||
done
|
||||
|
||||
# ---------- Bericht ----------
|
||||
if [ "$CVES_GESAMT" -eq 0 ]; then
|
||||
echo "Commander, monatlicher Venv-Audit der Python-Nebendienste — keine bekannten Sicherheitslücken:"
|
||||
printf '• %s\n' "${ZEILEN[@]}"
|
||||
echo "(Veraltete Pakete sind nur ein Lagebild; aktualisiert wird bewusst nur mit Anlass.)"
|
||||
briefkasten "Venv-Audit grün: $(printf '%s · ' "${ZEILEN[@]}")"
|
||||
else
|
||||
echo "⚠️ Commander, der monatliche Venv-Audit hat ${CVES_GESAMT} bekannte Sicherheitslücken gefunden:"
|
||||
printf '• %s\n' "${ZEILEN[@]}"
|
||||
echo "Details liegen als Karte in der Ideen-Queue — Update bleibt dein Entscheid."
|
||||
if [ -x "$HERMES" ]; then
|
||||
"$HERMES" kanban create "Venv-Audit ${MONAT}: ${CVES_GESAMT} Sicherheitslücken in Python-Diensten" \
|
||||
--body "Automatischer monatlicher Audit (restore-/venv-Kreislauf 17.07.). Funde (pip-audit):
|
||||
${CVE_DETAILS}
|
||||
|
||||
Empfehlung: betroffene Pakete gezielt aktualisieren (venv-weise, mit Dienst-Restart + Postcheck) — KEIN pauschales Upgrade." \
|
||||
--triage --created-by venv-audit --idempotency-key "venv-audit-${MONAT}" >/dev/null 2>&1 || true
|
||||
fi
|
||||
briefkasten "⚠️ Venv-Audit: ${CVES_GESAMT} Sicherheitslücken — Karte liegt in der Queue."
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user