fix(station): stat-Reihenfolge, Phase nur im Migrationsmodus, eingerueckte Konfig-Werte, kein /tmp-Zugriff im Test
Fixrunde 2 zu Task 4:
- N1 (wichtig): file_mode() in test_cli.sh/test_setup_pi.sh probierte
"stat -f '%Lp'" vor "stat -c '%a'" - auf GNU-coreutils (dem Pi) deutet
"-f" dort "Dateisystemstatus" und liefert Muell statt der Rechte-Zahl,
faellt aber trotzdem in den "||"-Zweig durch, der zusaetzlich "644"
anhaengt. Reihenfolge umgedreht und mit einem per gstat erzwungenen
GNU-Testlauf zusaetzlich abgesichert.
- N2 (wichtig): status zeigte nach einem Wechsel zurueck in den
Rettungsmodus weiterhin die letzte Migrationsphase aus einer liegen
gebliebenen control.json (moeglich seit RuntimeDirectoryPreserve=
restart aus Fixrunde 1). Phase wird jetzt nur noch angezeigt, wenn
Modus tatsaechlich "migration" ist.
- N3 (klein): die Schluesselerkennung in setup_pi.sh war rein
zeilenverankert ("^KEY=") und haette einen eingerueckten Bestandswert
als fehlend gewertet - beim naechsten Sourcen der Konfiguration haette
die zusaetzlich angehaengte Vorlagenzeile das eigene Passwort
ueberschrieben. Muster auf fuehrenden Leerraum/export gehaertet.
- N4 (klein): test_setup_pi.sh liess setup_pi.sh ueber den scp-Stub echte
Dateien im /tmp des Entwicklungsrechners anlegen und wieder loeschen.
Neue Variable NINLIGHT_STAGE_DIR biegt das auf eine Sandbox um.
Alle vier Punkte mit Regressionstests, N2 und N3 zusaetzlich per
Mutationsprobe (Fix zurueckgenommen, Test wird rot) verifiziert.
This commit is contained in:
@@ -13,6 +13,13 @@ HERE=$(cd "$(dirname "$0")" && pwd)
|
||||
# Stubs statt einen echten Pi laufen kann.
|
||||
SSH_BIN=${NINLIGHT_SSH_BIN:-/usr/bin/ssh}
|
||||
SCP_BIN=${NINLIGHT_SCP_BIN:-/usr/bin/scp}
|
||||
# Wo die per scp uebertragenen Dateien auf dem Zielsystem zwischenlanden, bevor
|
||||
# sie an ihren endgueltigen Platz installiert werden. Ueberschreibbar wie die
|
||||
# anderen NINLIGHT_*-Pfade: auf dem Pi bleibt es bei /tmp, ein Test kann hier in
|
||||
# eine Sandbox statt in das echte /tmp des Entwicklungsrechners umleiten
|
||||
# (Fixrunde 2, N4) - sowohl fuer die lokale scp-Zielangabe unten als auch fuer
|
||||
# die REMOTE-Bloecke, die dieselbe Variable (mit demselben Default) referenzieren.
|
||||
STAGE_DIR=${NINLIGHT_STAGE_DIR:-/tmp}
|
||||
|
||||
echo "== Voraussetzungen auf $HOST pruefen =="
|
||||
"$SSH_BIN" "$HOST" bash -s <<'REMOTE'
|
||||
@@ -24,14 +31,14 @@ echo " ok"
|
||||
REMOTE
|
||||
|
||||
echo "== Konfiguration =="
|
||||
"$SCP_BIN" -q "$HERE/station.conf.example" "$HOST:/tmp/ninlight-station.conf.example"
|
||||
"$SCP_BIN" -q "$HERE/station.conf.example" "$HOST:$STAGE_DIR/ninlight-station.conf.example"
|
||||
# CONF ueberschreibbar wie ROOT_DIR/BIN_PATH/UNIT_PATH unten: auf dem Pi bleibt es
|
||||
# beim Default, ein Test kann hier gegen eine Sandbox-Datei statt gegen echte
|
||||
# Systempfade laufen.
|
||||
"$SSH_BIN" "$HOST" bash -s <<'REMOTE'
|
||||
set -e
|
||||
CONF=${NINLIGHT_STATION_CONF:-/etc/ninlight-station.conf}
|
||||
TEMPLATE=/tmp/ninlight-station.conf.example
|
||||
TEMPLATE=${NINLIGHT_STAGE_DIR:-/tmp}/ninlight-station.conf.example
|
||||
if [ -f "$CONF" ]; then
|
||||
# Eine bestehende Konfiguration bleibt bei ihren Werten - nur Schluessel, die
|
||||
# eine neuere Version des CLI zusaetzlich verlangt (z.B. die Migrations- und
|
||||
@@ -43,7 +50,14 @@ if [ -f "$CONF" ]; then
|
||||
ADDED=""
|
||||
for KEY in SSID PSK IMAGE_DIR HOME_CONNECTION AP_CONNECTION \
|
||||
MIGRATE_AP_CONNECTION MIGRATE_SSID MIGRATE_PSK EPD_REVISION; do
|
||||
if ! sudo grep -Eq "^${KEY}=" "$CONF"; then
|
||||
# Nicht nur "^KEY=": eine vorhandene Zuweisung mit fuehrendem Leerraum oder
|
||||
# einem "export" davor (beides gueltiges ". datei"-Shell) wuerde sonst als
|
||||
# fehlend gelten, die Vorlagenzeile wird angehaengt, und da das CLI die
|
||||
# Datei per ". $CONF" sourct, gewinnt die LETZTE Zuweisung - ein eigenes
|
||||
# Passwort wuerde so still durch den oeffentlichen Vorlagenwert ersetzt
|
||||
# (Fixrunde 2, N3: genau das "vorhandene Werte nicht ueberschreiben" aus I4,
|
||||
# nur eine Formatierungsvariante weiter).
|
||||
if ! sudo grep -Eq "^[[:space:]]*(export[[:space:]]+)?${KEY}=" "$CONF"; then
|
||||
LINE=$(grep -E "^${KEY}=" "$TEMPLATE" || true)
|
||||
if [ -n "$LINE" ]; then
|
||||
printf '%s\n' "$LINE" | sudo tee -a "$CONF" >/dev/null
|
||||
@@ -64,21 +78,22 @@ rm -f "$TEMPLATE"
|
||||
REMOTE
|
||||
|
||||
echo "== Server, CLI und Unit installieren =="
|
||||
"$SCP_BIN" -q "$HERE/server.py" "$HERE/products.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/"
|
||||
"$SCP_BIN" -q "$HERE/server.py" "$HERE/products.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:$STAGE_DIR/"
|
||||
# Pfade als Variablen mit Default (wie in deploy.sh): so kann ein Test die
|
||||
# Installation gegen ein Sandbox-Verzeichnis statt gegen echte Systempfade laufen
|
||||
# lassen.
|
||||
"$SSH_BIN" "$HOST" bash -s <<'REMOTE'
|
||||
set -e
|
||||
STAGE_DIR=${NINLIGHT_STAGE_DIR:-/tmp}
|
||||
ROOT_DIR=${NINLIGHT_STATION_ROOT:-/opt/ninlight-station}
|
||||
BIN_PATH=${NINLIGHT_STATION_BIN:-/usr/local/bin/ninlight-station}
|
||||
UNIT_PATH=${NINLIGHT_STATION_UNIT:-/etc/systemd/system/ninlight-station.service}
|
||||
sudo install -d -m 0755 "$ROOT_DIR" "$ROOT_DIR/images"
|
||||
sudo install -m 0755 /tmp/server.py "$ROOT_DIR/server.py"
|
||||
sudo install -m 0644 /tmp/products.py "$ROOT_DIR/products.py"
|
||||
sudo install -m 0755 /tmp/ninlight-station "$BIN_PATH"
|
||||
sudo install -m 0644 /tmp/ninlight-station.service "$UNIT_PATH"
|
||||
rm -f /tmp/server.py /tmp/products.py /tmp/ninlight-station /tmp/ninlight-station.service
|
||||
sudo install -m 0755 "$STAGE_DIR/server.py" "$ROOT_DIR/server.py"
|
||||
sudo install -m 0644 "$STAGE_DIR/products.py" "$ROOT_DIR/products.py"
|
||||
sudo install -m 0755 "$STAGE_DIR/ninlight-station" "$BIN_PATH"
|
||||
sudo install -m 0644 "$STAGE_DIR/ninlight-station.service" "$UNIT_PATH"
|
||||
rm -f "$STAGE_DIR/server.py" "$STAGE_DIR/products.py" "$STAGE_DIR/ninlight-station" "$STAGE_DIR/ninlight-station.service"
|
||||
sudo systemctl daemon-reload
|
||||
echo " installiert"
|
||||
REMOTE
|
||||
|
||||
Reference in New Issue
Block a user