fix(station): Panel ermittelt die Adresse per Netlink und nennt das Geraet

Am echten Pi stand im Aus-Zustand "LAN: not connected", obwohl er unter
192.168.2.96 erreichbar war - derselbe build_state()-Aufruf von Hand lieferte die
Adresse dagegen richtig. Ursache ist die Absicherung des Anzeigedienstes:
ninlight-display.service setzt RestrictAddressFamilies=AF_UNIX AF_NETLINK, der
UDP-Kniff in local_ip() legt aber ein AF_INET-Socket an. Das scheitert dort mit
EAFNOSUPPORT, und die Zeile fiel auf "not connected" zurueck. Kein Test hat das
gefunden, weil alle ohne diese Beschraenkung liefen.

Statt die Absicherung zu lockern ermittelt local_address() die Adresse jetzt mit
"ip -4 route get" - das spricht Netlink und bleibt damit innerhalb der Erlaubnis.
Der Unterprozess faellt nur im Aus-Zustand an, dem einzigen Statusbild mit dieser
Zeile.

Dazu die Beschriftung: "LAN" war eine Falschauskunft, dieser Pi haengt per WLAN
im Netz und hat gar kein Kabel. Der Kernel nennt in derselben Auskunft beides,
also steht dort jetzt "wlan0: 192.168.2.96" (bzw. "eth0: ..." am Kabel) und ohne
Netz "no home network" statt eines nackten "no network", das schon einmal auf den
Rettungs-Zugangspunkt bezogen wurde.

Der neue Test sperrt AF_INET wie die Unit und verlangt die Adresse trotzdem -
genau die Luecke, die den Befund ueberhaupt durchgelassen hat.
This commit is contained in:
Michael Sauer
2026-09-23 22:35:50 +02:00
parent f31ef879ee
commit bd467b5e52
3 changed files with 136 additions and 55 deletions
+15 -8
View File
@@ -317,16 +317,23 @@ def blocks(state: dict) -> list[tuple[str, str]]:
# die Zeile ausdruecklich, dass kein Netz da ist: "keine Zeile" und "kein Netz"
# sind zwei verschiedene Auskuenfte, und die zweite erklaert, warum SSH scheitert.
#
# Beschriftung "LAN" statt eines nackten "IP"/"no network": Rueckmeldung eines
# Bedieners (2026-09-23) las "no network" so, als sei damit der Migrations-/
# Rettungs-Zugangspunkt gemeint (der ja tatsaechlich aus ist, die Station ist
# ausgeschaltet). Gemeint ist hier aber das GEGENTEIL - das gewoehnliche Heimnetz,
# in dem der Pi als normaler Rechner haengt, sobald die Station aus ist (siehe
# Kommentar oben). "LAN" grenzt das eindeutig vom Zugangspunkt-Netz ab, das auf
# jedem ANDEREN Statusbild als SSID steht.
# Beschriftet mit dem GERAET ("wlan0: 192.168.2.96"), nicht mit "LAN": derselbe
# Bediener las "LAN" als Falschauskunft, weil dieser Pi per WLAN im Netz haengt
# und gar kein Kabel hat (Rueckmeldung 2026-09-23). Der Geraetename grenzt
# ausserdem genauso eindeutig vom Zugangspunkt-Netz ab, das auf jedem ANDEREN
# Statusbild als SSID steht - und er sagt zusaetzlich, WORUEBER der Pi haengt.
# Ohne Netz "no home network" statt eines nackten "no network": letzteres wurde
# auf den Migrations-/Rettungs-Zugangspunkt bezogen (der im Aus-Zustand ja
# tatsaechlich aus ist). Gemeint ist das GEGENTEIL - das gewoehnliche Heimnetz.
ip = state.get("ip")
if isinstance(ip, str):
out.append((f"LAN: {ip}" if ip else "LAN: not connected", ROLE_DETAIL))
geraet = state.get("iface")
if not ip:
out.append(("no home network", ROLE_DETAIL))
elif isinstance(geraet, str) and geraet:
out.append((f"{geraet}: {ip}", ROLE_DETAIL))
else:
out.append((f"IP: {ip}", ROLE_DETAIL))
return out + footer
if mode not in ("recovery", "migration"):