- Freigaben-Auswahl von einem Dropdown auf eine Baum-Navigation (links)
umgestellt: alle gemounteten Freigaben als Wurzelknoten, Ordner beliebig
aufklappbar. Der Pfad von der Wurzel bis zur aktuellen Position wird
serverseitig schon aufgeklappt gerendert (_fileshare_tree_ancestors),
alles andere laedt der Client per Klick lazy nach (neue Route
/fileshare/subfolders) -- kein Durchlaufen der kompletten Freigabe auf
einmal noetig. Dateien stehen bewusst nicht im Baum, nur in der
bestehenden Tabelle rechts.
- Inline-Vorschau fuer PDF (iframe), Bilder, TXT/CSV/LOG/MD/JSON (per Range-
Request in Haeppchen bis 512KB, mit Hinweis bei Abschneiden -- Erkennung
ueber den Content-Range-Header, nicht nur den 206-Status, der bei JEDEM
Range-Request auftritt) sowie Word/Excel rein clientseitig per mammoth.js
bzw. SheetJS (beide lokal vendored, kein Cloud-Viewer -- interne Dokumente
verlassen das Netz nicht). Excel-Zellen werden bewusst per textContent
statt ueber SheetJS' eigene HTML-Ausgabe gesetzt, um unabhaengig von
deren Escaping-Verhalten sicher zu sein. Neue Route /fileshare/view mit
fester Endungs-Positivliste, nosniff + restriktiver CSP.
- Uploads bis 15MB erlaubt (MAX_CONTENT_LENGTH in app.py) -- dafuer musste
auch nginx' client_max_body_size (Standard 1MB) auf 16MB angehoben werden,
sowohl im Vorlagen-Code (_NGINX_PROXY_LOCATIONS/_render_nginx_config,
fuer die naechste Anwendung ueber Einstellungen->NGINX) als auch in der
Fresh-Install-Vorlage. Neuer 413-Errorhandler zeigt eine Flash-Meldung
statt Werkzeugs nackter Fehlerseite.
- install.sh: known_hosts (liegt unter /srv/tesm) von rsync --delete
ausgenommen -- fehlte bisher in der Exclude-Liste (anders als sqlite.db/
fernet.key/secret.key) und waere bei jedem Update verlorengegangen.
Live auf POETEST getestet: Baum-Vorbefuellung, Lazy-Load von
Geschwisterordnern, alle 5 Vorschautypen (PDF-Route direkt verifiziert,
Bild/Text/Word/Excel zusaetzlich visuell), Abschneide-Erkennung sowohl bei
kleiner als auch bei >512KB-Datei.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Auf der frisch installierten Test-VM zeigten sich zwei weitere reale Probleme:
1. "Verbindung testen" im Switch-Modal blieb dauerhaft auf "Getrennt"
haengen, sobald ueber nginx (Port 80) statt direkt gegen Flask (Port
5000) zugegriffen wurde. Ursache: etc/nginx/sites-available/poe_manager
reichte den "Upgrade"/"Connection"-Header fuer /ws/ssh_terminal nicht
durch -- Flask/Werkzeug lehnte den WebSocket-Handshake dadurch mit
400 Bad Request ab, statt mit 101 Switching Protocols zu antworten.
Live reproduziert und verifiziert (curl-Handshake direkt vs. durch
nginx). Alle bisherigen Terminal-Tests dieser Session liefen ausschliesslich
direkt gegen Flask, nie durch nginx, daher bis jetzt unentdeckt.
Fix: eigener location /ws/ Block mit Upgrade-Map (Standard-nginx-Pattern)
und grosszuegigen Timeouts fuer die lang offene Terminal-Verbindung.
2. Der Kea-DHCP-Server lief nach einer Aenderung der Host-Netzwerkkonfiguration
unveraendert weiter, obwohl die konfigurierte Range nach einem
IP-/Subnetzwechsel nicht mehr zum neuen Netz passen muss. Neue Funktion
_stop_dhcp_service_if_active() stoppt Kea jetzt sowohl beim Anwenden
als auch beim Auto-Rollback einer Netzwerkaenderung -- bewusst nur
stoppen statt automatisch neu zu starten, die Range muss der Admin
aktiv auf der DHCP-Seite pruefen und den Dienst dort bewusst wieder
starten (gleiche Philosophie wie beim Rest der DHCP-Dienststeuerung).
Beide Fixes live auf der Test-VM verifiziert (WebSocket-Handshake per
curl, Netzwerk-Reapply ohne Fehler im journalctl-Log trotz nicht
installiertem Kea).
- Neues, eigenständiges Frontend (Sidebar, zentriertes Logo in der Topbar,
Dark/Light-Theme, Karten-Dashboard, Toasts/Modals statt Bootstrap)
- Oeffentliches Kurz-Dashboard ohne Login (Status-Uebersicht)
- Browser-SSH-Terminal (paramiko, plattformunabhaengig) zum Testen von
Switch-Zugangsdaten inkl. interaktiver Host-Key-Bestaetigung
- Granulares Rechtesystem mit Gruppen (Devices/Switches-Berechtigungen)
- Aufgeraeumtes Backend mit konfigurierbaren Pfaden, auto-generierten
Secrets statt hart codierter Werte im Original
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>