Hostname (Systemeinstellungen, neben Pruefintervall):
- hostnamectl set-hostname ueber die App, Validierung (RFC-1123-artiges
Label), kein Revert-Timer noetig (kappt die Erreichbarkeit nicht wie
eine IP-Aenderung). Live getestet inkl. Validierung und Revert.
DHCP: Range ist jetzt Pflicht, kein geratener Default mehr:
- dhcp_range_start/end/dns starten leer (Platzhaltertext statt fake-
echt aussehendem Default) - ein Zufalls-Range haette den Dienst sonst
unbemerkt mit einer zum echten Netz nicht passenden Konfiguration
starten lassen koennen.
- write_dhcp_file und dhcp_service_action=enable_restart verweigern sich
ohne eingetragene Range; _render_kea_config laesst "pools" ohne Range
komplett weg statt einen kaputten Pool-String zu erzeugen.
- Neues, separates dhcp_gateway-Feld (optional) fuer einen vom
automatisch erkannten Gateway abweichenden Router fuer die Clients.
Topbar-Ampel fuer den Kea-Dienst:
- Gruener/roter Punkt neben dem Pruefintervall-Timer, nur sichtbar mit
settings_dhcp.view (ein einzelner, kurzer systemctl-Aufruf pro Request,
nicht die volle Status-Erkennung). Live verifiziert (rot wenn gestoppt,
gruen wenn gestartet).
Reservierungstabelle zeigt jetzt pro Client, welche eigene DHCP-Option
greift (global oder Client-Override, mit Wert im Tooltip).
Text-Straffung: die laengsten Hint-Texte und Code-Kommentare in
Templates/app.py gekuerzt (u.a. groups.html, settings_dhcp.html,
account.html, devices/switches/users/credentials.html, zwei grosse
Migrations-/DHCP-Kommentarbloecke in app.py) - Kernaussagen erhalten,
Redundanz entfernt.
Quelltext-Huerde (KEINE echte Sicherheit, nur Abschreckung): Rechtsklick
und DevTools-/Quelltext-Shortcuts per JS blockiert. Klar dokumentiert
in Kommentar + README, dass der Browser HTML/CSS/JS immer vollstaendig
ausliefert und das in Sekunden umgehbar ist - echte Absicherung bleiben
ausschliesslich die serverseitigen Rechteprüfungen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bugfix (von dir gemeldet, live auf Port 5000 gefunden):
- initConfirmables() in app.js rief beim bestätigten Absenden
form.requestSubmit() OHNE den ursprünglichen Submitter auf. Laut Spec
wird dann KEIN Submit-Button-Name/Value mitgeschickt. users.html trug
die Benutzer-ID als name/value des Löschen-Buttons selbst (statt eines
verstecken Inputs wie überall sonst) — dadurch kam "delete_user" nie
im Request an, der Klick tat scheinbar nichts. Fix: e.submitter beim
ersten Klick merken und an requestSubmit(submitter) weiterreichen
(behebt es grundsätzlich für alle Formulare dieser Art); zusätzlich
users.html auf das robustere hidden-input-Muster umgestellt wie
credentials/devices/groups. Mit echtem Playwright-Browserklick
(nicht nur curl) verifiziert.
Gruppen-Rechtetabelle, mehrere Korrekturrunden nach deinem Mockup:
- Bereichsname + Kill-Switch-Kästchen jetzt eng nebeneinander in der
Tabellen-Kopfzeile (nicht mehr an den Rand gestellt), R/W/E/D-Spalten
in derselben Zeile statt einer zweiten.
- Nur die von einem Bereich tatsächlich genutzten Spalten werden gezeigt
(GROUP_ROW_TYPES) — Logs zeigt nur R, Einstellungen nur R/W/E, nur
Geräte zeigt zusätzlich D.
- Bugfix: D-Spalte bei Geräte verschwand durch zu schmale Flex-Breite der
Spalte im Overflow, obwohl serverseitig korrekt gerendert — behoben
durch flex:0 0 auto statt fester Breite.
- Checkbox-Zentrierung robust per display:block+margin:auto statt sich
auf native Checkbox-Ränder zu verlassen (waren leicht asymmetrisch).
- Unterpunkte deutlich weiter eingerückt (34px) für klare Hierarchie.
- Sichtbares Ausgrauen (nicht nur natives disabled) der Unterpunkte,
solange der Bereich-Kill-Switch aus ist (JS setzt .permission-locked).
- Legende jetzt UNTER der Rechtetabelle statt darüber.
- Rechte lassen sich jetzt direkt beim Anlegen einer neuen Gruppe setzen
(Modal zeigt dieselbe Rechtetabelle, add_group-Route verarbeitet
mitgesendete permissions[] im selben Request) statt sie erst danach
über die Gruppentabelle nachzupflegen.
Alles inkl. Erstellen-mit-Rechten und Bearbeiten-Regression live per
Playwright verifiziert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- section-head: Button ("+ Neue Zugangsdaten" etc.) rutscht bei langer
Beschreibung nicht mehr in die nächste Zeile — bleibt immer rechts oben,
der Beschreibungstext wickelt stattdessen innerhalb seiner eigenen Spalte.
- Suchfeld-Icon überlappte den Platzhaltertext: eine spätere, generische
Input-Regel mit gleicher Spezifität hat die padding-left-Regel des
Lupe-Icons überschrieben (reine Reihenfolge-im-Stylesheet-Sache) — Selektor
spezifischer gemacht.
- Live-Log: Neustart-bezogene Zeilen (manueller Neustart, automatischer
PoE-Restart bei Ausfall) werden jetzt orange markiert statt farblos.
- Aufgeklappte Nav-Gruppen bleiben über Seitenwechsel hinweg erhalten
(localStorage), zusätzlich zur automatischen Aufklappung der Gruppe der
aktuell aktiven Seite.
- Datei-Auswahl (Import) im Dark Mode gestylt (Text + Button), inkl.
color-scheme-bewusster Browser-Widgets.
- Manueller "Jetzt prüfen"-Trigger (Icon neben dem globalen Timer, nur
Admins): startet rpi-check.service neu -> frisches Logfile + sofortiger
Durchlauf, Countdown synchronisiert sich auf den manuellen Zeitpunkt.
- Dashboard und Live-Log aktualisieren sich jetzt per AJAX im Hintergrund
(kein voller Seiten-Reload mehr): neue Route /dashboard/tiles liefert das
Kachel-Fragment (_dashboard_tiles.html, von index.html eingebunden und vom
Live-Update nachgeladen), get_log() liefert den aktuellen Dateinamen als
Header mit, damit die Anzeige nach einem Service-Neustart aktuell bleibt.
- Root-Cause für "Intervall bleibt immer bei 300s": in der WSL-Testumgebung
lief poe_wrapper.py nur als manuell gestarteter Hintergrundprozess statt
als echter rpi-check.service — "systemctl restart" lief dadurch ins Leere.
Echten systemd-Service in WSL eingerichtet und Intervalländerung end-to-end
verifiziert (Log-Zeilenabstand folgt jetzt dem neu gesetzten Intervall).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Topbar zeigt rechts jetzt ausschließlich den "Nächste Prüfung"-Countdown,
konsistent auf jeder Seite (auch anonymes Dashboard) statt nur auf dem
Dashboard. Neuer Context-Processor inject_check_timer()/get_last_run_at()
liefert last_run/interval global, ohne dass jede Route das selbst
berechnen muss.
- "+ Neu ..."-Buttons (Devices, Switches, Zugangsdaten, Benutzer, Gruppen)
aus der Topbar entfernt und stattdessen in einen .section-head direkt
über der jeweiligen Tabelle verschoben, zusammen mit einer kurzen
Beschreibung der Seite (bisher nur bei Zugangsdaten/Gruppen vorhanden,
jetzt auch bei Geräte/Switche/Benutzer).
- Live-Log: eigene lokale Timer-Pill entfernt (redundant zum globalen
Timer), "Aktualisieren"-Button in denselben section-head verschoben.
Dashboard: Suchfeld aus der Topbar in den Seiteninhalt verschoben, lokale
Timer-Anzeige entfernt (übernimmt die globale Topbar-Pill), Reload-bei-
Intervallende-Logik bleibt als separater, unsichtbarer Scheduler erhalten.
- Neue generische Tabellen-Sortierung (app.js: initSortableTables): Klick
auf eine Spaltenüberschrift mit data-sort-key sortiert die Zeilen anhand
von data-sort-<key>-Attributen. Unterstützt auch Akkordeon-Tabellen mit
mehreren <tbody> (Gruppen: Haupt- + Detail-Zeile bleiben als Einheit
zusammen, die virtuelle "Admin"-Zeile bleibt über data-sort-pinned immer
oben). Angewendet auf Geräte, Switche, Zugangsdaten, Benutzer, Gruppen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Änderungslog: audit_log-Tabelle + last_modified_by/at an Devices und
Switches; log_action()/touch_record() in allen Verwaltungsrouten
(Devices, Switches, Zugangsdaten, Benutzer, Gruppen, Settings) verdrahtet.
Neue Admin-Seite "Änderungslog" unter /logs/aenderungen. PoE-Neustarts
werden bewusst nicht geloggt.
- Verschlüsseltes Import/Export für Devices/Switches/Zugangsdaten unter
Settings, passphrasenbasiert (PBKDF2 + Fernet), für Umzug auf neue
Umgebungen. Referenziert Zugangsdaten/Switche über Name/Hostname statt
interner ID für stabilen Re-Import.
- Eigenes Profil: Klick auf den Namen in der Sidebar öffnet ein Modal zum
Ändern von Vor-/Nachname, eigenem Passwort (mit Prüfung des aktuellen
Passworts) und Profilbild-Upload (Anzeige in Sidebar + Änderungslog).
- Anpassbare Navigation: Reihenfolge der Sidebar-Punkte ist unter Settings
per Auf-/Ab-Buttons konfigurierbar (settings.nav_order); "Devices"/
"Users"/"Settings" umbenannt zu "Geräte"/"Benutzer"/"Einstellungen";
"Live-Log" und "Änderungslog" zu aufklappbarer "Logs"-Gruppe
zusammengefasst. Jeder Benutzer sieht weiterhin nur, wofür er berechtigt
ist.
- create_db.py mit allen Schema-Erweiterungen synchronisiert (audit_log,
last_modified_by/at, avatar_filename) für Frischinstallationen.
- venv-Umgebung im WSL neu aufgesetzt (war fälschlich unter dem
Erstellungspfad venv-linux verankert und daher nicht aktivierbar).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 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>