Vollständiges Audit aller Routen gegen das Rechtesystem durchgeführt. Die
Nav-Sichtbarkeit stufte "Live" (Live-Log) bereits korrekt als admin-only ein
(_nav_key_visible: logs_live -> user.is_admin), die zugehörigen Routen
/logs und /get_log prüften das aber nie tatsächlich — nur @login_required.
Jeder eingeloggte Benutzer, unabhängig von seinen Gruppen-Rechten, konnte
das Live-Log damit direkt per URL aufrufen, obwohl die Sidebar es korrekt
ausblendete.
- /logs: fehlende is_admin-Prüfung ergänzt (Flash + Redirect, konsistent zu
activity_log()/users()/groups()/settings()).
- /get_log: fehlende is_admin-Prüfung ergänzt (403, da per AJAX abgerufen).
Alle anderen neu hinzugekommenen Seiten (Benutzer, Gruppen, Systemein-
stellungen, Im-/Export, Änderungslog, Jetzt-prüfen-Trigger) waren bereits
korrekt und bewusst exklusiv auf is_admin geprüft — dort gibt es keine
sinnvolle granularere Rechte-Stufe unterhalb von Admin (Gruppenverwaltung
steuert das Rechtesystem selbst, Systemeinstellungen/Import-Export/manuelle
Prüfung wirken global). Zugangsdaten bleiben bewusst an switches.*-Rechte
gekoppelt (bestehende, dokumentierte Design-Entscheidung). README um eine
Übersicht ergänzt, welche Bereiche bewusst ohne granulare Rechte auskommen
und warum.
Mit Testbenutzer ohne jede Gruppenzugehörigkeit verifiziert: /logs liefert
jetzt 302 (Redirect), /get_log liefert 403 statt beide zuvor 200.
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>
- Datei hatte CRLF-Zeilenenden (vermutlich aus einer Windows-Bearbeitung),
wodurch das Skript unter Linux/WSL mit "command not found: $'\r'" und
Syntaxfehlern abbrach. Auf LF normalisiert.
- Die Haupt-Check-Schleife las per `read` nur 7 Felder aus
generate_ips.py, das aber inzwischen 8 Felder liefert (MAC am Ende
angehängt) — dadurch landete die MAC-Adresse an $switch_pass
angehängt. `mac` als zusätzliche (ungenutzte) read-Variable ergänzt.
- PoE-Neustart wurde bei nicht erreichbaren Geräten ausgelöst, sobald ein
`port`-Wert gesetzt war — unabhängig davon, ob dem Gerät überhaupt ein
Switch zugeordnet ist. Das führte zu sinnlosen SSH-Versuchen mit leeren
Zugangsdaten (ssh @) und irreführenden "PoE deaktiviert/aktiviert"
Log-Einträgen für Geräte ohne Switch. Prüft jetzt zusätzlich, dass
switch_ip nicht leer ist, bevor ein Neustart versucht wird (gilt für
den regulären Check-Loop und den manuellen Neustart).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Live-Log-Bug behoben: _latest_log_file() sortierte nach Datei-ctime statt
nach Dateiname — auf manchen Dateisystemen (u.a. unter WSL2 auf einem
gemounteten Windows-Laufwerk) unzuverlässig und lieferte nicht immer das
tatsächlich neueste Logfile. Sortiert jetzt wie der Rest des Codes über
den chronologisch sortierbaren Dateinamen (rpi-YYYYMMDDHHMMSS.log).
- Navbar umstrukturiert in aufklappbare Gruppen mit Unterpunkten:
- "Geräte": Clients (bisherige Devices-Seite), Switche, Zugangsdaten
- "Einstellungen": Benutzer, Gruppen, Systemeinstellungen (Prüfintervall),
Im-/Export
- "Logs": Live, Änderungen (vormals Live-Log/Änderungslog)
Sichtbarkeit gilt jetzt auch pro Unterpunkt: eine Gruppe erscheint nur,
wenn mindestens ein Unterpunkt für den Benutzer sichtbar ist, und zeigt
dann auch nur die sichtbaren Unterpunkte.
- Im-/Export als eigene Unterseite mit Export/Import nebeneinander
(.settings-grid).
- Neue Seite "Mein Konto" (/account, erreichbar über ein Zahnrad-Symbol
neben dem eigenen Namen in der Sidebar) ersetzt das bisherige Profil-Modal:
Profil/Passwort/Profilbild als volle Seite, dazu für Admins die
Navbar-Reihenfolge (aus den Systemeinstellungen hierher verschoben).
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>
- Dashboard zeigt jetzt in beiden Zustaenden (mit/ohne Login) Kacheln statt
Tabelle; ohne Login nur aktive Geraete + Online/Offline/Gesamt, eingeloggt
alle Geraete + zusaetzliche Deaktiviert-Kachel
- Sortierung ueberall: erst alle Nicht-Online-Geraete, dann Online, jeweils
alphabetisch
- Neue Rechte devices.view / switches.view; Standardgruppe 'Benutzer' wird
automatisch angelegt (alle Ansichtsrechte) und jedem neuen Benutzer
zugeordnet; bestehende Benutzer ohne Gruppe werden migriert
- Gruppen-Seite zeigt zusaetzlich virtuelle 'Admin'-Karte (informativ) und
markiert die Standardgruppe (nicht loeschbar)
- 'Naechste Pruefung'-Countdown wird serverseitig aus dem tatsaechlichen
letzten Log-Eintrag geseedet statt bei jedem Reload neu zu starten
- Deployment-Doku korrigiert: Checkout getrennt von /srv/poe_manager, damit
kein verschachteltes srv/poe_manager/srv/poe_manager entsteht
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>