poe.sh: parallele Geräte-Prüfung + echte PoE-Erfolgskontrolle

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>
This commit is contained in:
2026-08-12 11:59:52 +02:00
co-authored by Claude Sonnet 5
parent 3b2a5fc76c
commit d525ef2e0a
2 changed files with 155 additions and 29 deletions
+51 -3
View File
@@ -91,9 +91,12 @@ Die App ermöglicht:
(vom PoE-Server) aufgebaut, nie vom Browser/Client aus.
- **Granulares Rechtesystem mit Gruppen** (neu, siehe unten) statt der
ursprünglichen reinen Admin/User-Unterscheidung.
- **Gleiche Kernlogik**: Datenbankschema (erweitert um Gruppen/Rechte),
Login, PoE-Restart-Mechanismus (`poe.sh` per SSH/`expect` auf die
Aruba-Switche) sind ansonsten unverändert.
- **Gleiche Kernlogik**: Datenbankschema (erweitert um Gruppen/Rechte) und
Login sind ansonsten unverändert. Der PoE-Restart-Mechanismus selbst
(`poe.sh` per SSH/`expect` auf die Aruba-Switche) wurde dagegen
überarbeitet — parallele statt sequentielle Geräte-Prüfung und echte
Erfolgskontrolle statt blind angenommenem Erfolg, siehe
[Geräte-Prüfung](#geräte-prüfung-poesh).
- **Aufgeräumtes Backend**: konsistente, konfigurierbare Pfade (`POE_DB_PATH`,
`POE_SCRIPT`, `POE_LOG_GLOB`, …) statt hart codierter/inkonsistenter Pfade;
Secret-Key und Fernet-Key werden beim ersten Start automatisch generiert
@@ -476,6 +479,51 @@ Betrieb bestätigt: ein tatsächlicher, unreservierter Client im Testnetz
(„shellyhtg3-...“) hat sich selbstständig eine IP aus dem Pool geholt und
wurde korrekt mit der „Ohne Reservierung“-Markierung angezeigt.
## Geräte-Prüfung (`poe.sh`)
Der Hintergrund-Check-Dienst (`rpi-check.service`, ruft `poe.sh` ohne
Argument auf) prüft in einer Endlosschleife alle Geräte per Ping und
startet bei Ausfall automatisch den PoE-Port neu, über den ein Gerät am
zugeordneten Switch hängt (`expect`, siehe unten). Zwei Korrekturen nach
einem echten Import mit deutlich mehr Geräten (46 statt einer Handvoll
Testgeräte):
- **Parallele statt sequentielle Prüfung**: vorher wurde jedes Gerät strikt
nacheinander in einer einzigen Schleife geprüft — ein einzelnes bereits
ausgefallenes Gerät mit ebenfalls nicht erreichbarem Switch (jeder
`expect`-Verbindungsschritt bis zu 5s Timeout) hat dadurch die Prüfung
aller nachfolgenden Geräte in der Liste verzögert; bei vielen gleichzeitig
ausgefallenen Geräten konnte ein Prüfdurchlauf so erheblich länger dauern
als das eigentlich konfigurierte Intervall. Jetzt läuft jede
Geräte-Prüfung (Ping + ggf. PoE-Neustart) als eigener Hintergrund-Job
(`&` + `wait` am Ende des Durchlaufs, über Process Substitution statt
einer Pipe, damit `wait` die Jobs auch tatsächlich erfasst) — mehrere
Geräte, auch an unterschiedlichen Switchen, werden dadurch gleichzeitig
geprüft statt einzeln nacheinander.
- **Echte Erfolgskontrolle statt blind angenommenem Erfolg**: `disable_poe()`/
`enable_poe()` haben vorher unabhängig vom tatsächlichen Ergebnis der
SSH/`expect`-Sitzung immer wie ein Erfolg gewirkt — lief die Verbindung
zum Switch in einen Timeout (Switch nicht erreichbar, falsche
Zugangsdaten, falscher Port), endete das `expect`-Skript trotzdem mit
Exit-Code 0, und `poe.sh` loggte fälschlich „PoE deaktiviert“/„PoE
aktiviert", obwohl am Switch nichts passiert war. Jeder kritische
`expect`-Schritt (Verbindungsaufbau, `configure terminal`-Prompt,
Interface-Prompt, Bestätigung des `power-over-ethernet`-Kommandos) hat
jetzt einen eigenen `timeout`-Zweig mit explizitem `exit 1`; `poe.sh`
wertet diesen Rückgabewert aus und loggt bei einem nicht erreichbaren
oder ablehnenden Switch stattdessen klar „Switch ... nicht erreichbar
oder Kommando abgelehnt — PoE-Deaktivierung/-Reaktivierung
fehlgeschlagen“, ohne einen Neustart vorzugaukeln, der nie stattgefunden
hat. Gilt für die automatische Prüfschleife, den manuellen Neustart
(`poe.sh restart <mac>`) und damit auch für den Dashboard-Neustart-Button.
Live nach einem echten Import (46 Geräte, 8 Switche aus dem Altsystem)
verifiziert: alle 46 Geräte wurden innerhalb von ~2 Sekunden geprüft (statt
sequentiell), und alle 43 als offline erkannten Geräte mit Switch-Zuordnung
zeigten korrekt die neue Fehlermeldung, da die realen Switch-IPs
(192.168.200.x) vom Test-Host aus nicht erreichbar sind — vorher hätte das
fälschlich als 43× „PoE deaktiviert“/„PoE aktiviert“ geloggt.
## Netzwerkeinstellungen des Hosts (Systemeinstellungen)
Eigene, klar getrennte Funktion von obigem DHCP-*Server*: hier geht es um