From 4b57a1225791ffb2ae15645960064ba70c8b5b44 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 25 Sep 2026 15:55:04 +0200 Subject: [PATCH] =?UTF-8?q?homelab:=20Import=20in=20der=20Route=20?= =?UTF-8?q?=E2=80=9EAlle=20Update-R=C3=BCckwege=20l=C3=B6schen=E2=80=9C=20?= =?UTF-8?q?nachgetragen=20(ruff=20F821),=20Test=20ruft=20sie=20auf;=20Logo?= =?UTF-8?q?-Skript=20ruff-sauber?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- backend/routers/homelab.py | 2 ++ backend/tests/test_homelab_snapshots.py | 6 ++++++ frontend/scripts/logos_laden.py | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/routers/homelab.py b/backend/routers/homelab.py index 3e925fb..d6acf9f 100644 --- a/backend/routers/homelab.py +++ b/backend/routers/homelab.py @@ -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}/zuruecksetzen ebenso; danach Prüfung wie nach einem Update # 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. @router.get("/snapshots") @@ -173,6 +174,7 @@ def snapshots_liste() -> dict: def rueckwege_loeschen() -> dict: """Alle Rückwege von Updates löschen (Snapshots mit Herkunft „update“, Sicherungen des Orchestrators) — nur per Klick des Users, nacheinander, mit Meldung am Ende.""" + from services.homelab import snapshots return _antwort(snapshots.rueckwege_loeschen()) diff --git a/backend/tests/test_homelab_snapshots.py b/backend/tests/test_homelab_snapshots.py index 7a53b12..3e61ac5 100644 --- a/backend/tests/test_homelab_snapshots.py +++ b/backend/tests/test_homelab_snapshots.py @@ -455,6 +455,12 @@ def test_schnittstelle(host): antwort = c.post("/api/homelab/snapshots/ct-104/vor-dem-umbau/loeschen") 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 + # 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") assert antwort.status_code == 200 and antwort.json()["ok"] is True lauf = _auf_ende(antwort.json()) diff --git a/frontend/scripts/logos_laden.py b/frontend/scripts/logos_laden.py index efe7995..d427992 100644 --- a/frontend/scripts/logos_laden.py +++ b/frontend/scripts/logos_laden.py @@ -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 transmission ubuntu umami unraid uptime-kuma vaultwarden vikunja wallabag watchtower webmin wekan wiki-js wireguard 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. HELL = set(""" 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 -""".split()) +""".split()) # noqa: SIM905 def laden(ref: str) -> bytes: @@ -62,7 +62,7 @@ def main() -> int: LISTE.write_bytes(( "// Erzeugt von frontend/scripts/logos_laden.py: die Logos unter /logos/.svg (selfh.st/icons, CC BY 4.0).\n" "// Nicht von Hand pflegen — neue Logos mit demselben Skript holen.\n" - f"export const LOGOS: ReadonlySet = new Set([\n{zeilen}\n])\n").encode("utf-8")) + f"export const LOGOS: ReadonlySet = new Set([\n{zeilen}\n])\n").encode()) print(f"{len(vorhanden)} Logos in {ZIEL}") if fehlt: print("nicht geladen:", ", ".join(fehlt))