Neues Modul services/platform_info.py prüft systemd-detect-virt einmalig
beim Start (statt pro Request). SMART-Abfragen werden in Containern
übersprungen, da /dev/sdX dort meist nicht verfügbar ist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
auth_service-Referenzen entfernt, Cookie-basierte Auth dokumentiert,
Endpunkt-Tabellen für alle Router ergänzt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
__pycache__, .env.local, Screenshots/, .claude/, memory/, resume
waren versehentlich committed worden.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shares- und Identities-Seite nutzen jetzt ?tab= Query-Parameter statt
clientseitigem JS. Der Server steuert aktiven Tab via Jinja2, kein
<script>-Block mehr nötig.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Kein Node.js, kein npm, kein Build-Schritt mehr
- HTMX 2.0.4 + PicoCSS 2 vendored in backend/static/
- Jinja2 Templates für alle 9 Seiten (Dashboard, ZFS, Snapshots,
Shares, Identities, Logs, Services, Navigator, Login)
- HTMX Fragments für Live-Updates (30s Polling Dashboard)
- JWT als httpOnly Cookie statt localStorage
- Disk Usage zeigt TB/PB korrekt (Jinja2 serverseitig formatiert)
- Update-safe: nur Python-Deps, keine npm-Abhängigkeiten
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
net conf setparm kann Keys nicht entfernen. Beim Deaktivieren blieben
fruit:* Keys in der Registry erhalten. Jetzt werden Keys die im neuen
Dict fehlen via net conf delparm gelöscht.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Route /samba/{name} was matching before /samba/config, causing 422 on
PUT /samba/config. Moved static routes before parameterized routes.
Values starting with '-' (shadow: format = -%Y-%m-%d-%H%M) were parsed
as CLI flags by net conf setparm. Added '--' separator to escape them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_is_container() prüft via systemd-detect-virt ob der Prozess in einem
Container läuft. Im LXC gibt get_disk_io() leere Liste zurück, da
/proc/diskstats die Host-Geräte zeigt und nicht dem Container gehören.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- get_disk_usage() in system_info.py via /usr/bin/df -P
- GET /api/system/disk-usage Endpoint
- getDiskUsage() im API-Client
- Dashboard zeigt Disk Usage Karten mit Balken + Total/Used/Free
(sichtbar auf LXC wo /proc/diskstats keine Blockgeräte liefert)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
shutil.which() reicht nicht: auf privilegierten LXC-Containern ist
zpool installiert, aber /dev/zfs fehlt → Befehl schlägt fehl.
_probe_zfs() führt zpool list einmal aus und wertet den Exit-Code aus.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ZFS_AVAILABLE Flag beim Import gesetzt (shutil.which)
- FileNotFoundError in run_command: ERROR → DEBUG
- list_pools/get_pool_status/list_datasets/list_snapshots: frühzeitiger
Return wenn kein zpool vorhanden → keine nutzlosen Subprocess-Aufrufe
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Backend: neue Endpoints POST /api/pools/{name}/clear und /resilver
- Frontend: Pool ⋮-Menü mit Scrub, Resilver, Clear Errors
- Product-Spalte im Status-Tab bricht jetzt korrekt um statt abgeschnitten zu werden
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
samba.parameters?.map() statt .map() direkt — API kann parameters
weglassen ohne einen Fehler zu werfen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Size/Allocated/Free/Fragmentation kommen jetzt direkt aus den Pool-Daten
(zpool list) statt aus aufsummierten Dataset-Werten, die zu Doppelzählung
führten. Pools werden parallel zu Datasets geladen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-d 1 begrenzte auf direkte Snapshots des Datasets, tank/share wurde
nicht eingeschlossen. -r (recursive) liefert alle Sub-Datasets.
Cache-Key jetzt dataset-spezifisch um Kollisionen zu vermeiden.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
root war auf backend/static statt frontend/ - alle Seiten außer /
wurden nach Hard Reload nicht gefunden. try_files ergänzt um $uri.html
damit /datasets → datasets.html korrekt aufgelöst wird.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sub-Datasets (tank/share) waren initial eingeklappt, dadurch waren
alle Zeilen unsichtbar. Beim Laden werden jetzt alle Top-Level-Datasets
automatisch expandiert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend liefert das Snapshot-Erstellungsdatum als 'created' (Unix-Timestamp),
das Frontend-Interface/Rendering erwartete aber 'creation'. Feld angeglichen
und creation_datetime im Interface ergänzt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CAP und FRAG wurden um eine Spalte verschoben gelesen (DEDUP statt CAP,
CAP statt FRAG). Korrekt: FRAG=parts[6], CAP=parts[7]. Prozentzeichen
ergänzt, da -p die Werte ohne % liefert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- main.py: CORS-Origins aus ZMB_CORS_ORIGINS (kommagetrennt), Default "*"
- allow_credentials automatisch aktiv bei konkreten Origins, aus bei "*"
- Root-Endpoint liefert Frontend-URL dynamisch via request.base_url
- keine hartkodierten IPs mehr im Anwendungscode
- Doku in CLAUDE.md und systemd-Unit ergaenzt
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- output: export für statischen HTML Export in Next.js 14
- Images optimiert für Export
- ESLint Warnings während Build ignorieren
Ermöglicht npm run build → out/ für nginx Deployment
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- add_user_to_group: Exception werfen mit stderr Nachricht
- remove_user_from_group: Exception werfen mit stderr Nachricht
- text=True für subprocess für besseres Error Handling
- Router aktualisiert um Fehlermeldungen an Frontend weiterzugeben
- Benutzer sehen jetzt detaillierte Fehlermeldungen beim Gruppe-Entfernen
Behebt: 'Failed to remove user from group' verschluckt die echte Fehlermeldung
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>