homelab: Import in der Route „Alle Update-Rückwege löschen“ nachgetragen (ruff F821), Test ruft sie auf; Logo-Skript ruff-sauber

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-25 15:55:04 +02:00
co-authored by Claude Opus 5.5
parent 5c6e73c69c
commit 4b57a12257
3 changed files with 11 additions and 3 deletions
+2
View File
@@ -161,6 +161,7 @@ def speicher_lage() -> dict:
# POST /api/homelab/snapshots/{id}/{name}/loeschen nur Snapshots des Orchestrators (mc2-…) # POST /api/homelab/snapshots/{id}/{name}/loeschen nur Snapshots des Orchestrators (mc2-…)
# POST /api/homelab/snapshots/{id}/{name}/zuruecksetzen ebenso; danach Prüfung wie nach einem Update # POST /api/homelab/snapshots/{id}/{name}/zuruecksetzen ebenso; danach Prüfung wie nach einem Update
# POST /api/homelab/sicherungen/{id}/{datei}/loeschen nur Sicherungen des Orchestrators (Bericht) # POST /api/homelab/sicherungen/{id}/{datei}/loeschen nur Sicherungen des Orchestrators (Bericht)
# POST /api/homelab/snapshots/rueckwege-loeschen alle Rückwege von Updates, nacheinander (nur per Klick)
# Jede Aktion ist ein Lauf wie „Jetzt updaten“; was nicht geht, beantworten sie mit 409 wie die Update-Knöpfe. # Jede Aktion ist ein Lauf wie „Jetzt updaten“; was nicht geht, beantworten sie mit 409 wie die Update-Knöpfe.
@router.get("/snapshots") @router.get("/snapshots")
@@ -173,6 +174,7 @@ def snapshots_liste() -> dict:
def rueckwege_loeschen() -> dict: def rueckwege_loeschen() -> dict:
"""Alle Rückwege von Updates löschen (Snapshots mit Herkunft „update“, Sicherungen des Orchestrators) — nur per """Alle Rückwege von Updates löschen (Snapshots mit Herkunft „update“, Sicherungen des Orchestrators) — nur per
Klick des Users, nacheinander, mit Meldung am Ende.""" Klick des Users, nacheinander, mit Meldung am Ende."""
from services.homelab import snapshots
return _antwort(snapshots.rueckwege_loeschen()) return _antwort(snapshots.rueckwege_loeschen())
+6
View File
@@ -455,6 +455,12 @@ def test_schnittstelle(host):
antwort = c.post("/api/homelab/snapshots/ct-104/vor-dem-umbau/loeschen") antwort = c.post("/api/homelab/snapshots/ct-104/vor-dem-umbau/loeschen")
assert antwort.status_code == 409 and "Proxmox" in antwort.json()["detail"] assert antwort.status_code == 409 and "Proxmox" in antwort.json()["detail"]
assert c.post("/api/homelab/sicherungen/ct-105/fremd.tar.zst/loeschen").status_code == 409 assert c.post("/api/homelab/sicherungen/ct-105/fremd.tar.zst/loeschen").status_code == 409
# Aufräumen: ohne Rückwege 409 mit Grund, sonst startet es (hier gibt es zwei).
antwort = c.post("/api/homelab/snapshots/rueckwege-loeschen")
assert antwort.status_code == 200 and antwort.json() == {"ok": True, "anzahl": 2}
ende = time.time() + 20
while snapshots._AUFRAEUMEN.is_set() and time.time() < ende:
time.sleep(0.05)
antwort = c.post("/api/homelab/snapshots/ct-102/anlegen") antwort = c.post("/api/homelab/snapshots/ct-102/anlegen")
assert antwort.status_code == 200 and antwort.json()["ok"] is True assert antwort.status_code == 200 and antwort.json()["ok"] is True
lauf = _auf_ende(antwort.json()) lauf = _auf_ende(antwort.json())
+3 -3
View File
@@ -34,13 +34,13 @@ qbittorrent qnap rabbitmq radarr rancher rclone readarr redis rocket-chat rustde
searxng semaphore sonarr speedtest-tracker stirling-pdf syncthing synology tailscale tautulli telegram traefik searxng semaphore sonarr speedtest-tracker stirling-pdf syncthing synology tailscale tautulli telegram traefik
transmission ubuntu umami unraid uptime-kuma vaultwarden vikunja wallabag watchtower webmin wekan wiki-js wireguard transmission ubuntu umami unraid uptime-kuma vaultwarden vikunja wallabag watchtower webmin wekan wiki-js wireguard
woodpecker-ci wordpress zabbix zigbee2mqtt woodpecker-ci wordpress zabbix zigbee2mqtt
""".split() """.split() # noqa: SIM905 — die lange Namensliste liest sich als Text besser
# Auf dunklem Grund zu dunkel → helle Variante der Sammlung. # Auf dunklem Grund zu dunkel → helle Variante der Sammlung.
HELL = set(""" HELL = set("""
affine borgmatic cockpit crafty-controller debian docmost frigate github go2rtc healthchecks heimdall hermes-agent affine borgmatic cockpit crafty-controller debian docmost frigate github go2rtc healthchecks heimdall hermes-agent
homebridge influxdb logseq matrix mattermost miniflux minio node-red openai outline penpot pfsense portainer radarr scrutiny semaphore tailscale umami vaultwarden wallabag wireguard homebridge influxdb logseq matrix mattermost miniflux minio node-red openai outline penpot pfsense portainer radarr scrutiny semaphore tailscale umami vaultwarden wallabag wireguard
""".split()) """.split()) # noqa: SIM905
def laden(ref: str) -> bytes: def laden(ref: str) -> bytes:
@@ -62,7 +62,7 @@ def main() -> int:
LISTE.write_bytes(( LISTE.write_bytes((
"// Erzeugt von frontend/scripts/logos_laden.py: die Logos unter /logos/<name>.svg (selfh.st/icons, CC BY 4.0).\n" "// Erzeugt von frontend/scripts/logos_laden.py: die Logos unter /logos/<name>.svg (selfh.st/icons, CC BY 4.0).\n"
"// Nicht von Hand pflegen — neue Logos mit demselben Skript holen.\n" "// Nicht von Hand pflegen — neue Logos mit demselben Skript holen.\n"
f"export const LOGOS: ReadonlySet<string> = new Set([\n{zeilen}\n])\n").encode("utf-8")) f"export const LOGOS: ReadonlySet<string> = new Set([\n{zeilen}\n])\n").encode())
print(f"{len(vorhanden)} Logos in {ZIEL}") print(f"{len(vorhanden)} Logos in {ZIEL}")
if fehlt: if fehlt:
print("nicht geladen:", ", ".join(fehlt)) print("nicht geladen:", ", ".join(fehlt))