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:
Hitonabi
2026-07-17 16:50:48 +02:00
parent de21e1ac68
commit bc60c6fefc
8 changed files with 296 additions and 5 deletions
+17 -1
View File
@@ -239,7 +239,7 @@ echo
# =====================================================================
echo "### 3. WATCH-LISTE (mechanisch geprüft)"
python3 - "$WATCHLIST" "$STATE" "$TMPD/watch.txt" <<'PY'
import json, sys, urllib.request
import json, re, sys, urllib.request
def hole(url, timeout=30):
req = urllib.request.Request(url, headers={"User-Agent": "mc2-trend-radar"})
@@ -272,6 +272,22 @@ for e in eintraege:
neu = " ⚠️ NEU seit letzter Woche!" if tag != gesehen.get(key) else ""
zeilen.append(f"- {key}: neuester Release {tag}{neu} ({e['warum']})")
gesehen[key] = tag
elif typ == "github_release_major":
# PC-Watch (17.07.): nur MAJOR-Sprünge melden — Electron released wöchentlich,
# relevant ist der Chromium-Jahrgang, nicht jeder Patch.
d = json.loads(hole(f"https://api.github.com/repos/{e['repo']}/releases?per_page=1"))
tag = (d[0].get("tag_name") if isinstance(d, list) and d else "?") or "?"
m = re.search(r"(\d+)", tag)
major = m.group(1) if m else "?"
neu = " ⚠️ NEUE MAJOR-VERSION!" if major != gesehen.get(key, major) and major != "?" else ""
zeilen.append(f"- {key}: neuester Release {tag} (Major {major}){neu} ({e['warum']})")
gesehen[key] = major
elif typ == "pypi":
d = json.loads(hole(f"https://pypi.org/pypi/{e['paket']}/json"))
ver = ((d.get("info") or {}).get("version")) or "?"
neu = " ⚠️ NEU seit letzter Woche!" if ver != gesehen.get(key, ver) and ver != "?" else ""
zeilen.append(f"- {key}: PyPI-Version {ver}{neu} ({e['warum']})")
gesehen[key] = ver
elif typ == "url_zeilen":
text = hole(e["url"], timeout=45)
passend = [z.strip() for z in text.splitlines() if e.get("muster", "") in z]