Die WLAN-Zugangsdaten stecken zur Bauzeit in der Firmware, es gibt also zwei Abzuege je Ziel. Die Station haelt jetzt beide vor - images/ migrate-nocreds (aus tools/build_nocreds.sh, Lampe startet im Onboarding-AP) und images/migrate-wlan (aus build/, Lampe haengt sofort im eigenen WLAN) - und der Bediener waehlt per Umschalter, welcher ausgeliefert wird: "ninlight-station bildsatz" oder der Menueeintrag am Taster. Der Zustand liegt in /var/lib/ninlight-station/imageset, ueberlebt Neustarts und steht dauerhaft in der Fusszeile des Panels - in jedem Modus, auch bei ausgeschalteter Station: man soll vor dem Einschalten sehen, was gilt. Vorgabe und Rueckfallwert in JEDEM Zweifelsfall ist "ohne-wlan". Im Automatikmodus wird jede Klyqa-Lampe in Reichweite migriert, auch fremde; ein Abzug ohne Zugangsdaten ist dann ein harmloser Fehlgriff, einer mit Zugangsdaten traegt das eigene WLAN-Passwort in ein fremdes Geraet. Fehlt der gewaehlte Satz (Verzeichnis weg oder leer), wird NICHTS ausgeliefert - kein stilles Ausweichen auf den anderen Satz. Der Server antwortet 404 mit Status "noimageset", CLI und Panel sagen "FEHLT". server.py und die Stations-Unit muessen mit: die Auswahl der ausgelieferten Datei ist genau die Aufgabe des Servers, und ein Symlink-Tausch haette "gewaehlt, aber nicht vorhanden" von "dieses Modell fehlt" nicht mehr unterscheidbar gemacht.
53 lines
2.6 KiB
Desktop File
53 lines
2.6 KiB
Desktop File
[Unit]
|
|
Description=ninlight recovery station (HTTP image server)
|
|
# Ohne den Zugangspunkt hat der Server beim Start keine Adresse zum Binden.
|
|
# Bewusst kein BindsTo=NetworkManager.service: ein dadurch ausgeloester Stop
|
|
# gilt fuer systemd als sauber und wuerde von KEINER Restart=-Politik erneut
|
|
# gestartet - ein NetworkManager-Neustart wuerde den Server dann still und
|
|
# dauerhaft mitreissen. Stattdessen nur Start-Reihenfolge vorgeben und den
|
|
# Prozess bei jedem Absturz (z.B. Bind-Fehler nach einem NM-Neustart) per
|
|
# Restart=always in kurzen Abstaenden neu versuchen lassen.
|
|
After=network.target NetworkManager.service
|
|
# Steht der Zugangspunkt nicht, kann server.py 192.168.8.1 nicht binden und
|
|
# stirbt sofort; Restart=always versucht es alle RestartSec=2 erneut. Damit
|
|
# das nicht endlos das Journal flutet, sondern nach kurzer Zeit ehrlich
|
|
# aufgibt (und ninlight-station dann mit einer klaren Fehlermeldung reagieren
|
|
# kann statt in einer stillen Neustartschleife zu haengen), hier explizit
|
|
# gedeckelt statt sich auf systemds Vorgabewerte zu verlassen.
|
|
StartLimitIntervalSec=30
|
|
StartLimitBurst=5
|
|
|
|
[Service]
|
|
Type=simple
|
|
EnvironmentFile=/etc/ninlight-station.conf
|
|
ExecStart=/usr/bin/python3 /opt/ninlight-station/server.py --image-dir ${IMAGE_DIR} --mode-file /run/ninlight-station/mode --imageset-file /var/lib/ninlight-station/imageset
|
|
Restart=always
|
|
RestartSec=2
|
|
|
|
# Laeuft als root: Port 80 und - fuer 4c - die DHCP-Leases in
|
|
# /var/lib/NetworkManager (Verzeichnis 0700 root:root) sind sonst nicht erreichbar.
|
|
# Gegengewicht:
|
|
NoNewPrivileges=yes
|
|
ProtectSystem=strict
|
|
ProtectHome=yes
|
|
PrivateTmp=yes
|
|
RuntimeDirectory=ninlight-station
|
|
# Ohne dies leert systemd /run/ninlight-station bei JEDEM Stop und Neustart, nicht
|
|
# nur beim allerersten Start - und ninlight-station (das CLI) schreibt mode/
|
|
# control.json immer VOR dem "systemctl restart", mit dem migrate/recovery on den
|
|
# Dienst (neu) starten. Ohne RuntimeDirectoryPreserve=restart wischt genau dieser
|
|
# Neustart die beiden gerade geschriebenen Dateien wieder weg, bevor der neue
|
|
# Serverprozess sie lesen kann - der Dienst faellt dann still auf den
|
|
# Recovery-Default zurueck (server.py resolve_mode()/read_control()), und ein
|
|
# ausdrueckliches "migrate on --listen" wird zu "Rettungsmodus" bzw. "auto"
|
|
# (Fixrunde 1, C1). "restart" (nicht "yes") reicht: das Verzeichnis muss nur einen
|
|
# Neustart ueberleben, nicht dauerhaft bestehen bleiben, wenn der Dienst regulaer
|
|
# gestoppt wird.
|
|
RuntimeDirectoryPreserve=restart
|
|
ReadWritePaths=/run/ninlight-station
|
|
RestrictAddressFamilies=AF_INET AF_UNIX
|
|
MemoryMax=128M
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|