fix(display-service): HOME/WorkingDirectory fuer lgpio unter systemd setzen

Am Pi diagnostiziert: unter systemd ist HOME leer und cwd "/", lgpio legt seine
Benachrichtigungs-Pipe aber unter "$HOME/.lgd-nfy0" an - das wird "//.lgd-nfy0"
und scheitert an ProtectSystem=strict. gpiozero faellt bis zur experimentellen
NativeFactory durch, die dann mit EINVAL abbricht; display.py faengt das als
DisplayUnavailable ab und beendet sich mit 0, sodass der Ausfall wie ein
fehlendes Panel aussieht statt wie die eigentliche Sandbox-Ursache.

RuntimeDirectory=ninlight-display, WorkingDirectory= und Environment=HOME=
zeigen jetzt auf ein eigenes, beschreibbares /run/ninlight-display - bewusst
getrennt vom RuntimeDirectory der Hauptunit, da dieser Dienst dort nur liest.

Szenario 19 in test_setup_pi.sh prueft die drei Zeilen in der ausgelieferten
Unit; per Mutationsprobe bestaetigt, dass das Entfernen jeder einzelnen davon
den Test rot werden laesst.
This commit is contained in:
Michael Sauer
2026-09-14 01:32:53 +02:00
parent 47532a6820
commit 46b0a198d9
2 changed files with 59 additions and 0 deletions
+36
View File
@@ -683,6 +683,42 @@ echo "$PROBE_OUT" | grep -q WEITERGELAUFEN && fail "nach dem Strg-C lief das Skr
[ "$PROBE_RC" -eq 130 ] && pass "Exit-Code 130 (128+SIGINT), nicht 0" || fail "Exit-Code $PROBE_RC statt 130"
[ -n "$PROBE_DIR" ] && [ ! -d "$PROBE_DIR" ] && pass "das Temp-Verzeichnis mit dem Passwort wurde dabei aufgeraeumt" || fail "Temp-Verzeichnis blieb liegen: $PROBE_DIR"
echo
echo "=== Szenario 19 (Hardware-Abnahme): der Anzeigedienst bekommt ein beschreibbares Arbeitsverzeichnis und ein gesetztes HOME ==="
# Befund vom echten Pi: unter systemd ist HOME leer und das Arbeitsverzeichnis "/" -
# lgpio legt seine Benachrichtigungs-Pipe unter "$HOME/.lgd-nfy0" an, das wird
# "//.lgd-nfy0", und ProtectSystem=strict (s.u.) macht "/" schreibgeschuetzt. lgpio
# scheitert, gpiozero faellt bis zur experimentellen NativeFactory durch, und die
# scheitert ihrerseits - das Panel bleibt schwarz, obwohl die Hardware in Ordnung ist.
# Kein systemd auf diesem (macOS-)Testrechner, also keine echte Namensraum-Pruefung -
# aber die Unit ist eine Textdatei, und "RuntimeDirectory=/WorkingDirectory=/
# Environment=HOME= sind gesetzt" laesst sich daran pruefen, ob nun im Repo direkt
# oder (hier) in der von setup_pi.sh ausgelieferten Kopie - Szenario 12 bewacht
# schon, dass beide je identisch sind.
STATE="$TMPROOT/s19-state"; STUBBIN="$TMPROOT/bin19"; LOG="$TMPROOT/s19.log"
setup_state "$STATE"
setup_stubbin "$STUBBIN" "$LOG"
: >"$LOG"
set +e
OUT=$(run_setup "$STATE" "$STUBBIN" 2>&1)
RC=$?
set -e
[ "$RC" -eq 0 ] && pass "Exit-Code 0" || fail "Exit-Code $RC, Ausgabe: $OUT"
INSTALLED_DISPLAY_UNIT="$STATE/etc/systemd/system/ninlight-display.service"
if [ -f "$INSTALLED_DISPLAY_UNIT" ]; then
grep -Eq '^RuntimeDirectory=ninlight-display$' "$INSTALLED_DISPLAY_UNIT" \
&& pass "RuntimeDirectory=ninlight-display gesetzt (eigenes Verzeichnis, nicht das der Hauptunit)" \
|| fail "RuntimeDirectory=ninlight-display fehlt - lgpio findet kein beschreibbares HOME unter systemd"
grep -Eq '^WorkingDirectory=/run/ninlight-display$' "$INSTALLED_DISPLAY_UNIT" \
&& pass "WorkingDirectory=/run/ninlight-display gesetzt" \
|| fail "WorkingDirectory=/run/ninlight-display fehlt"
grep -Eq '^Environment=HOME=/run/ninlight-display$' "$INSTALLED_DISPLAY_UNIT" \
&& pass "Environment=HOME=/run/ninlight-display gesetzt" \
|| fail "Environment=HOME=/run/ninlight-display fehlt - lgpio legt seine Pipe sonst unter //.lgd-nfy0 an (schreibgeschuetzt durch ProtectSystem=strict)"
else
fail "ninlight-display.service wurde nicht installiert - Szenario 19 kann nichts pruefen"
fi
echo
if [ "$FAILED" -eq 0 ]; then
echo "Alle Tests bestanden."