Das Tastermenue bot bisher nur "Migration starten" an, fest verdrahtet
auf die Horchphase; den Automatikmodus gab es nur ueber die
Kommandozeile - also ausgerechnet dort nicht, wo man ihn braucht, denn
"on" macht wlan0 zum Zugangspunkt und reisst jede SSH-Sitzung ab.
Jetzt zwei getrennte, namentlich unterscheidbare Eintraege:
"Migration: horchen" (--listen) zuerst, danach "Migration: AUTOMATIK"
(ohne --listen). Der Automatikeintrag bekommt eine andere, deutlichere
Rueckfrage ("ACHTUNG" statt "RUECKFRAGE", plus zwei Warnzeilen), weil
der Migrations-Zugangspunkt ein oeffentlich bekanntes Passwort hat und
im Automatikmodus jede alte Klyqa-Lampe in Funkreichweite ungefragt
migriert wird, auch fremde. Die Bedienhinweise stehen weiterhin und
zuletzt.
88 lines
4.9 KiB
Markdown
88 lines
4.9 KiB
Markdown
# ninlight-Recovery-Station
|
|
|
|
Ein Raspberry Pi spannt den Zugangspunkt `ninlight-recovery` auf und liefert unter
|
|
`http://192.168.8.1/ninlight_<target>_ota.img` Firmware-Images aus.
|
|
|
|
Jede ninlight-Lampe sucht beim Booten bis zu drei Sekunden nach dieser Station. Findet sie
|
|
sie, lädt sie das Image für ihren Gerätetyp und flasht es — ohne dass die Lampe im WLAN
|
|
erreichbar sein muss. Das ist der Rettungsweg für Lampen, an die man sonst nur noch mit dem
|
|
Lötkolben käme.
|
|
|
|
Trägt das angebotene Image dieselbe Version, die bereits läuft, lehnt die Lampe es ab und
|
|
bootet normal weiter. Eine angelassene Station flasht also nicht in einer Endlosschleife.
|
|
|
|
## Voraussetzung
|
|
|
|
Der SSH-Benutzer auf dem Pi braucht passwortloses `sudo` — beide Skripte und die CLI
|
|
(`ninlight-station on|off|status`) rufen `sudo` nicht-interaktiv auf; ein Passwort-Prompt
|
|
würde dort nur mit einer Fehlermeldung enden.
|
|
|
|
## Bedienung
|
|
|
|
tools/station/setup_pi.sh <pi-host> einmalig einrichten
|
|
tools/station/deploy.sh <pi-host> [target] Images ausliefern
|
|
ssh <pi-host> ninlight-station on einschalten
|
|
ssh <pi-host> ninlight-station status Zustand und letzte Auslieferungen
|
|
ssh <pi-host> ninlight-station off ausschalten
|
|
|
|
## Taster am Gerät
|
|
|
|
Sobald die Station läuft, wird `wlan0` zum Zugangspunkt und **jede SSH-Sitzung reißt ab**.
|
|
Für genau diesen Zustand gibt es einen Taster auf **GPIO23**; die Rückmeldung kommt aufs
|
|
E-Paper. Ein Taster, zwei Zusammenhänge:
|
|
|
|
| | kurz (unter 1 s) | gehalten |
|
|
|----------------------|------------------|-------------------------------------------------------|
|
|
| Ruhe (Statusbild) | Menü öffnen | 3 s → Abbruch (Station aus), weiter 10 s → Herunterfahren |
|
|
| Menü offen | nächster Eintrag | 1,5 s → Eintrag auswählen |
|
|
| Rückfrage | abbrechen | 1,5 s → bestätigen |
|
|
|
|
Der Abbruch feuert **bei 3 s**, nicht erst beim Loslassen — danach läuft auf dem Panel ein
|
|
Countdown bis zum Herunterfahren, den Loslassen jederzeit abbricht. Das Menü schließt nach
|
|
20 s ohne Eingabe, eine Rückfrage verfällt nach 10 s als Abbruch. Die Einträge hängen vom
|
|
Zustand ab (Station aus / Rettung läuft / Migration läuft); jede verändernde Auswahl
|
|
bekommt eine Rückfrage.
|
|
|
|
**Die beiden Migrationsarten sind getrennte Einträge.** „Migration: horchen"
|
|
(`migrate on --listen`) steht zuerst und ist der naheliegende: der Zugangspunkt steht,
|
|
aber es geht nichts raus, bis du eine erkannte Lampe freigibst. „Migration: AUTOMATIK"
|
|
(`migrate on`) folgt danach und bekommt eine **andere, deutlichere Rückfrage** — der
|
|
Migrations-Zugangspunkt hat ein öffentlich bekanntes Passwort (es steht in der alten
|
|
Klyqa-Firmware), und im Automatikmodus wird jede alte Klyqa-Lampe in Funkreichweite
|
|
ungefragt migriert, auch fremde. Die Rückfrage benennt genau das, statt nur „Wirklich?"
|
|
zu fragen.
|
|
|
|
Der Taster ist nirgends Voraussetzung: fehlt `gpiozero` oder der Taster, protokolliert der
|
|
Dienst eine Zeile und beendet sich ohne Fehler. Er fasst den SPI-Bus **nicht** an (zwei
|
|
Prozesse auf denselben Leitungen ergeben `GPIO busy`), sondern schreibt seinen
|
|
Bedienzustand nach `/run/ninlight-button/ui.json`; der Anzeigedienst liest ihn und
|
|
zeichnet. Ausgeführt wird ausschließlich über das CLI.
|
|
|
|
Dienst und Unit liegen in `tools/station/button/` bzw.
|
|
`tools/station/ninlight-button.service`. `setup_pi.sh` installiert, aktiviert und startet
|
|
den Tasterdienst wie den Anzeigedienst; `deploy.sh` liefert `button/` bei jedem Deploy mit
|
|
aus. Ein fehlgeschlagenes Aktivieren/Starten ist dabei nur eine Warnung — eine Station
|
|
ohne Taster muss vollständig benutzbar bleiben.
|
|
|
|
SSID und Passwort stehen in `/etc/ninlight-station.conf` auf dem Pi und müssen zu den
|
|
Build-Parametern `NINLIGHT_RECOVERY_SSID` und `NINLIGHT_RECOVERY_PASSWORD` aus
|
|
`config.local.cmake` passen. Weicht eines ab, findet die Lampe die Station nicht.
|
|
|
|
## Vertrauensgrenze
|
|
|
|
Der Trailer eines Images prüft Gerätetyp und SHA256. Er ist **keine** kryptografische
|
|
Signatur, und der Download läuft über `http://` ohne TLS. Die Station schützt allein ein
|
|
WPA2-Passwort, dessen Default im Repo steht. Wer in Funkreichweite ist und es kennt, kann
|
|
jeder Lampe beim nächsten Boot beliebige Firmware unterschieben.
|
|
|
|
Das ist gewollt: Die Signaturprüfung der alten Firmware auszuhebeln ist der Zweck dieses
|
|
Projekts. Daraus folgen zwei Regeln.
|
|
|
|
**Setz ein eigenes Passwort.** In `config.local.cmake` und in
|
|
`/etc/ninlight-station.conf` — an beiden Stellen denselben Wert.
|
|
|
|
**Lass die Station nur an, solange du sie brauchst.** Nicht nur wegen des Fremdzugriffs:
|
|
Die Firmware löscht den Power-Cycle-Zähler, bevor sie einen Recovery-Versuch startet.
|
|
Solange eine Station in Reichweite ist, funktioniert der Werksreset per fünf Stromzyklen
|
|
bei **keiner** Lampe in Reichweite mehr.
|