Commit Graph

60 Commits

Author SHA1 Message Date
patrick 12248afa3a Refactor: Container-Erkennung zentralisiert, SMART-Check auf LXC überspringen
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>
2026-06-15 20:37:14 +02:00
patrick b941c5db51 Refactor: Deploy-Skripte bereinigt (Next.js/deploy/-Referenzen entfernt)
4 veraltete Skripte durch 2 einfache ersetzt: deploy-test.sh + deploy-pi.sh

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:43:00 +02:00
patrick 8dc4e8d698 Docs: backend/README.md neu geschrieben (PAM-Auth, aktuelle Endpunkte)
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>
2026-06-05 19:40:15 +02:00
patrick 744aacaa86 Docs: README komplett neu geschrieben (aktueller Stack: HTMX+Jinja2)
Next.js, Node.js, deploy/-Ordner-Referenzen entfernt. Spiegelt
den echten Stand wider: FastAPI + HTMX, PAM-Auth, Samba Registry.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:38:03 +02:00
patrick 52fc888309 Remove: .gitignore aus Tracking entfernt (bleibt lokal)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:30:22 +02:00
patrick e57e252afe Fix: .gitignore hinzugefügt, ungewollte Dateien aus Tracking entfernt
__pycache__, .env.local, Screenshots/, .claude/, memory/, resume
waren versehentlich committed worden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:27:00 +02:00
patrick 50ac6b1a61 Remove: altes Next.js-Frontend gelöscht (durch HTMX+Jinja2 ersetzt)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:21:29 +02:00
patrick 56b1ab9970 Refactor: Tab-Switching von JavaScript auf HTMX + Jinja2 umgestellt
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>
2026-06-05 19:21:29 +02:00
patrick 909c32f087 .gitignore gelöscht 2026-06-05 19:20:58 +02:00
patrick 673c7d2f96 Refactor: Java-Klassen aus Services entfernt + .gitignore aus Repo
shares.py, zfs_runner.py: SharesManager/ZFSRunner → Modul-Funktionen
Backward-compat Shims erhalten (zfs_runner/share_manager bleiben nutzbar)
system_users.py, auth.py.bak: ungenutzte Dateien gelöscht
.gitignore: aus Repo entfernt (enthält interne Pfade/Infos)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:10:06 +02:00
patrick 10306cbd5b Remove: CLAUDE.md aus Repo (enthält interne IPs/Pfade) 2026-06-05 19:00:30 +02:00
patrick 5ecd143535 Feature: HTMX + Jinja2 Frontend ersetzt Next.js komplett
- 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>
2026-06-05 18:45:46 +02:00
patrick 654df5b98f Fix: Disk Usage zeigt undefined für TB/PB Werte
Lokale formatBytes Funktion hatte sizes Array nur bis GB.
TB und PB ergänzt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 18:22:24 +02:00
patrick fd40c2e899 Fix: Samba MacOS toggle deaktivieren löscht fruit: Keys via delparm
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>
2026-06-05 16:06:46 +02:00
patrick 3632991043 Fix: Samba config PUT 422 + shadow:format setparm dash escaping
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>
2026-06-05 16:04:06 +02:00
patrick eef4ab09a7 Fix: Disk I/O im LXC-Container ausgeblendet
_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>
2026-06-05 15:48:19 +02:00
patrick c4454a675a Feature: Disk Usage via df im Dashboard (LXC-kompatibel)
- 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>
2026-06-05 15:34:18 +02:00
patrick 3bc57ef36b Fix: ZFS-Erkennung via tatsächlichem zpool-Test statt which()
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>
2026-06-05 15:15:55 +02:00
patrick 2b6d508ca4 Fix: ZFS-Fehlerlogs auf LXC/non-ZFS-Systemen unterdrückt
- 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>
2026-06-05 15:08:23 +02:00
patrick f49793e6f2 Refactor: Java-Klassen aus Services entfernt + kritische Bugs gefixt
- AuthService, SystemInfo, IdentitiesManager Klassen → Modul-Funktionen
- grp.getall() → grp.getgrall() (Bug: Methode existierte nie)
- open('/proc/loadavg') ohne context manager gefixt (File-Handle-Leak)
- rx_packets/tx_packets null-check im Frontend (toLocaleString auf undefined)
- PoolCard onClick: /pools/{name} → /zfs (Route existierte nicht, löste Seitenreload aus)
- Alle Router-Imports auf Modul-Aliase umgestellt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 14:11:32 +02:00
patrick ce78f0ae95 Feature: Disk-ID Namen + SMART-Daten on demand im VdevTree
- Backend: get_disk_id_map() liest /dev/disk/by-id/ dynamisch aus (ata/nvme/scsi/wwn)
- Backend: _annotate_disk_ids() hängt disk_id an Leaf-Vdevs in get_pool_status()
- Backend: get_smart_info() liest smartctl --json (Modell, Temp, Health, Stunden, Sektoren)
- Backend: GET /api/pools/disks/{disk}/smart Endpoint
- Frontend: DiskRow zeigt Modellname neben sda/sdb, aufklappbar für SMART-Details
- Frontend: Temp-Spalte farbcodiert (grün/gelb/rot), SMART-Spalte zeigt PASSED/FAILED

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 09:36:36 +02:00
patrick 202fdfaaeb Feature: VdevTree rekursiv + Disk-Aktionen (Offline/Online/Detach/Clear)
- VdevTree rendert jetzt alle Ebenen (pool → mirror → sda/sdb)
- Disk-⋮-Menü: Clear Disk Errors, Offline, Online, Detach
- Backend: neue Endpoints /disk/offline, /disk/online, /disk/detach

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 00:51:34 +02:00
patrick 6f6e8555af Feature: ZFS Pool-Aktionen (Scrub, Resilver, Clear Errors) + Product-Spalte fix
- 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>
2026-06-05 00:45:35 +02:00
patrick 1dc55b189b Fix: /zfs Seitenbreite auf max-w-7xl angepasst wie andere Seiten
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 00:41:03 +02:00
patrick 2c477cd5c9 Fix: file-sharing Seite crasht wenn parameters undefined
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>
2026-06-05 00:39:43 +02:00
patrick 8c12e1c73d Refactor: /datasets und /snapshots entfernt, neue /zfs-Seite nach Cockpit-Vorbild
- Neue Seite /zfs: Pools-Tabelle mit aufklappbaren Zeilen, Tabs File Systems / Snapshots / Status, vdev-Baum im Status-Tab
- /datasets und /snapshots gelöscht (Funktionalität konsolidiert)
- Header bereinigt: ZFS-Link ersetzt Datasets/Snapshots, navLink-Hilfsfunktion reduziert Redundanz

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 00:33:23 +02:00
patrick feda8a9477 Revert "Refactor: Shares-Funktionen in Datasets-Seite zusammengeführt"
This reverts commit 55a6c38e02.
2026-06-04 23:31:32 +02:00
patrick d5b87028c5 Refactor: Shares-Funktionen in Datasets-Seite zusammengeführt
- datasets/page.tsx: neuer Tab 'Shares & Config' mit vollem Inhalt aus
  shares/page.tsx (Samba, NFS, Samba Config mit MacOS-Toggle + Raw-Editor)
- shares/page.tsx: redirect -> /datasets
- Header.tsx: 'Shares'-Link zeigt auf /datasets

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 23:28:21 +02:00
patrick 48dfd9e249 Cleanup: getPoolStats entfernt, nicht mehr verwendet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 23:16:29 +02:00
patrick d4a05aabb3 Fix: ungenutzte stats-Variable entfernt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 23:15:35 +02:00
patrick e9384289e0 Fix: Usage-Prozent aus Pool-Capacity statt Dataset-Summe
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 23:11:29 +02:00
patrick a3939666c4 Fix: getPools gibt Pool[] zurück, kein Wrapper-Objekt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 23:08:17 +02:00
patrick 986b78d15b Fix: Pool-Größe aus zpool list statt aus Dataset-Summen
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>
2026-06-04 23:05:31 +02:00
patrick e3b42caf01 Fix: list_snapshots mit -r statt -d1, Cache-Key pro Dataset
-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>
2026-06-04 22:59:40 +02:00
patrick 9cc9844f0b Feature: Snapshot-Tab gruppiert nach Dataset wie Cockpit-Plugin
Snapshots werden nach Dataset gruppiert angezeigt (tank: 94, tank/share: 94)
mit aufklappbaren Zeilen statt flacher Liste.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 22:56:37 +02:00
patrick d079d76151 Feature: Snapshot-Tab in Datasets mit Kontextmenü (Clone/Rename/Rollback/Destroy)
- Snapshots direkt im Datasets-Tab ladbar (lazy, per Pool)
- Tabelle: Name, Created, Used, Referenced, Clones
- Kontextmenü (⋮) mit Clone, Rename, Roll Back, Destroy Snapshot
- Backend: /api/snapshots/clone + /api/snapshots/rename Endpoints

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 22:51:08 +02:00
patrick cf0626b293 Fix: nginx root auf frontend-Verzeichnis + try_files für Next.js Static Export
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>
2026-06-04 22:41:19 +02:00
patrick 09db060281 Feature: MacOS-Toggle + Raw-Editor im Samba Config-Tab
- Toggle 'Global MacOS Shares' setzt/entfernt fruit-Parameter automatisch
  (fruit:encoding=native, fruit:metadata=stream, fruit:zero_file_id=yes,
  fruit:nfs_aces=no) via net conf setparm
- Raw-Textarea zeigt alle globalen Parameter direkt editierbar (key = value)
- Tabellen-Ansicht durch Raw-Editor ersetzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 22:34:07 +02:00
patrick ab75f462cc Fix: Snapshots-Tabelle leer - Top-Level-Datasets initial expandiert
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>
2026-06-04 22:13:28 +02:00
patrick 5a71b559ca chore: Screenshots-Ordner aus Git-Tracking ausschließen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 21:58:04 +02:00
patrick bce8de36aa Fix: Snapshot-Datum 'Invalid Date' - Feld created statt creation
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>
2026-06-04 21:31:57 +02:00
patrick b85381759b Fix: zpool list Spalten-Indizes für Capacity/Fragmentation
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>
2026-06-04 17:04:36 +02:00
patrick f59da0acc0 Dokumentation: Session-Eintrag DEVLOG
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 14:59:08 +02:00
patrick 2fdff0407f Dokumentation: DEVLOG-Updates auf aktuellen Stand
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 14:58:50 +02:00
patrick d9c77e0b46 Konfigurierbares CORS per ZMB_CORS_ORIGINS + dynamische Frontend-URL
- 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>
2026-06-04 14:58:50 +02:00
patrick 5a26f3d300 Add: next.config.ts für Static Export
- 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>
2026-06-04 14:58:50 +02:00
patrick a187b625bc Fix: Identities Group Management - bessere Fehlermeldungen
- 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>
2026-06-04 14:58:50 +02:00
patrick 448026d91a Fix: Navigator Permissions - absolute Pfade für chmod/chown
- /bin/chmod statt chmod (line 435)
- /bin/chown statt chown (line 476)
- /bin/chmod -R statt chmod -R für recursive (line 514)

Behebt: 'Failed to save permissions' Fehler beim Ändern von Dateiberechtigungen

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-04 14:58:50 +02:00
patrick b69ae4051a README.md aktualisiert 2026-04-22 02:01:01 +02:00
patrick c561512460 Hinzufügen: INSTALLATION.md mit umfassender Installationsanleitung
- Systemanforderungen und Abhängigkeiten
- Schritt-für-Schritt Backend/Frontend Setup
- Systemd Service Konfiguration
- Nginx Reverse Proxy Setup mit SSL
- Samba Registry Konfiguration
- Troubleshooting und Performance-Tipps
- Sicherheitsrichtlinien

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 01:59:28 +02:00