Nach einem echten Import (46 Geräte, 8 Switche aus dem Altsystem)
zeigten sich zwei Probleme in der Hintergrund-Prüfschleife:
- Geräte wurden strikt sequentiell geprüft (eine einzige "while read"-
Schleife) -- ein einzelnes ausgefallenes Gerät mit ebenfalls nicht
erreichbarem Switch (bis zu 5s expect-Timeout je Verbindungsschritt)
verzögerte die Prüfung aller nachfolgenden Geräte. Jede Geräte-Prüfung
läuft jetzt als eigener Hintergrund-Job (& + wait), über Process
Substitution statt einer Pipe, damit wait die Jobs auch tatsächlich
erfasst (bei "cmd | while ...; done" liefe die Schleife sonst in
einer eigenen Subshell).
- disable_poe()/enable_poe() haben unabhängig vom tatsächlichen Ergebnis
der SSH/expect-Sitzung immer wie ein Erfolg gewirkt -- lief die
Verbindung in einen Timeout (Switch nicht erreichbar, falsche
Zugangsdaten, falscher Port), endete das expect-Skript trotzdem mit
Exit-Code 0, poe.sh loggte fälschlich "PoE deaktiviert"/"PoE
aktiviert", obwohl am Switch nichts passiert war. Jeder kritische
expect-Schritt hat jetzt einen eigenen timeout-Zweig mit explizitem
"exit 1"; poe.sh wertet den Rückgabewert aus und loggt bei einem
nicht erreichbaren/ablehnenden Switch stattdessen klar, dass die
PoE-Aktion fehlgeschlagen ist. Gilt für die Prüfschleife, den
manuellen Neustart (poe.sh restart <mac>) und damit auch den
Dashboard-Neustart-Button.
Live verifiziert: alle 46 Geräte innerhalb von ~2s geprüft (statt
sequentiell), alle 43 offline erkannten Geräte mit Switch-Zuordnung
zeigten korrekt die neue Fehlermeldung, da die realen Switch-IPs vom
Test-Host aus nicht erreichbar sind -- vorher hätte das fälschlich als
43x "PoE deaktiviert/aktiviert" geloggt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Neue Spalte switches.ssh_port (nullable INTEGER), Migration für
bestehende DBs in _ensure_schema(), Feld in create_db.py ergänzt.
- Formular (Anlegen/Bearbeiten): optionales SSH-Port-Feld, Validierung
1-65535, leer -> NULL (= Standard 22 überall, SWITCH_DEFAULT_SSH_PORT).
Switch-Liste zeigt den effektiven Port inkl. "(Standard)"-Hinweis.
- generate_ips.py liefert den effektiven Port (Fallback 22) als eigenes
Pipe-Feld an poe.sh; poe.sh übernimmt es in disable_poe/enable_poe und
reicht es als "ssh -p <port>" an die expect-Skripte durch (Default
weiterhin 22 falls Parameter fehlt).
- Web-Terminal (Verbindungstest) sendet den im Formular eingetragenen
Port statt hartkodiert 22.
- Live getestet: gültiger/leerer/ungültiger Port beim Anlegen, korrekte
Weitergabe durch generate_ips.py inkl. Feldreihenfolge, die poe.sh
'read' erwartet.
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>
- 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>