feat(station): Umschalter fuer Migrationsimages mit/ohne WLAN-Daten
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.
This commit is contained in:
@@ -504,8 +504,8 @@ RC=$?
|
||||
set -e
|
||||
if [ "$RC" -eq 0 ]; then pass "Exit-Code 0"; else fail "Exit-Code $RC, Ausgabe: $OUT"; fi
|
||||
GZ_SIZE=$(wc -c <"$SANDBOX/build/foo/ninlight_foo_gz.img" | tr -d ' ')
|
||||
PROD_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img"
|
||||
DEV_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img"
|
||||
PROD_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img"
|
||||
DEV_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img"
|
||||
if [ -f "$PROD_IMG" ] && [ -f "$DEV_IMG" ]; then
|
||||
pass "beide Migrationsimages (prod, dev) wurden angelegt"
|
||||
else
|
||||
@@ -535,7 +535,7 @@ set +e
|
||||
OUT=$(TEST_SIGN_DIR="$KEYDIR_FULL" run_deploy "$SANDBOX" pi-test foo 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
MANIFEST="$SANDBOX_STATE/opt/ninlight-station/images/migrate/manifest.json"
|
||||
MANIFEST="$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/manifest.json"
|
||||
if [ "$RC" -eq 0 ] && [ -f "$MANIFEST" ]; then
|
||||
pass "manifest.json wurde angelegt"
|
||||
else
|
||||
@@ -592,8 +592,8 @@ if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/ninlight_foo_ota.img" ]; the
|
||||
else
|
||||
fail "Rettungsimage fehlt: $OUT"
|
||||
fi
|
||||
if [ ! -d "$SANDBOX_STATE/opt/ninlight-station/images/migrate" ] \
|
||||
|| [ -z "$(ls -A "$SANDBOX_STATE/opt/ninlight-station/images/migrate" 2>/dev/null)" ]; then
|
||||
if [ ! -d "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan" ] \
|
||||
|| [ -z "$(ls -A "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan" 2>/dev/null)" ]; then
|
||||
pass "keine Migrationsimages entstanden"
|
||||
else
|
||||
fail "Migrationsimages entstanden, obwohl kein Schluesselverzeichnis vorhanden war"
|
||||
@@ -618,12 +618,12 @@ OUT=$(TEST_SIGN_DIR="$KEYDIR_DEV_ONLY" run_deploy "$SANDBOX" pi-test foo 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
if [ "$RC" -eq 0 ]; then pass "Exit-Code 0"; else fail "Exit-Code $RC, Ausgabe: $OUT"; fi
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img" ]; then
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img" ]; then
|
||||
pass "dev-Migrationsimage wurde angelegt"
|
||||
else
|
||||
fail "dev-Migrationsimage fehlt: $OUT"
|
||||
fi
|
||||
if [ ! -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img" ]; then
|
||||
if [ ! -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img" ]; then
|
||||
pass "prod-Migrationsimage entfiel wie erwartet"
|
||||
else
|
||||
fail "prod-Migrationsimage wurde trotz fehlendem Produktionsschluessel angelegt"
|
||||
@@ -644,15 +644,15 @@ make_gz_file "$SANDBOX/build/foo/ninlight_foo_gz.img" A
|
||||
make_gz_file "$SANDBOX/build/bar/ninlight_bar_gz.img" C
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
echo "bar-ota" >"$SANDBOX/build/bar/ninlight_bar_ota.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate"
|
||||
echo "vorhandenes-bar-prod" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/bar_prod.img"
|
||||
echo "vorhandenes-bar-dev" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/bar_dev.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan"
|
||||
echo "vorhandenes-bar-prod" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/bar_prod.img"
|
||||
echo "vorhandenes-bar-dev" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/bar_dev.img"
|
||||
# Manifest eines frueheren Deploys, das bar beschrieben hat - genau das darf ein
|
||||
# gezielter Deploy von foo nicht einfach wegschreiben (Fixrunde 1, I1). bar traegt
|
||||
# absichtlich eine ANDERE Firmware-Version als das, was dieser Lauf fuer foo signiert
|
||||
# (nl_mkimage-Stub liefert immer "1.0.0") - das Manifest nach dem Merge muss beide
|
||||
# Versionen unveraendert nebeneinander stehen lassen (Fixrunde 2, N2).
|
||||
cat >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/manifest.json" <<'JSON'
|
||||
cat >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/manifest.json" <<'JSON'
|
||||
{"built": "2026-01-01T00:00:00Z", "ninlight_version": "0.9.0",
|
||||
"images": [
|
||||
{"target": "bar", "variant": "prod", "file": "bar_prod.img", "bytes": 20, "sha256": "x",
|
||||
@@ -667,14 +667,14 @@ OUT=$(TEST_SIGN_DIR="$KEYDIR_FULL" run_deploy "$SANDBOX" pi-test foo 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
if [ "$RC" -eq 0 ]; then pass "Exit-Code 0"; else fail "Exit-Code $RC, Ausgabe: $OUT"; fi
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img" ] \
|
||||
&& [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img" ]; then
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img" ] \
|
||||
&& [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img" ]; then
|
||||
pass "Migrationsimages fuer das angegebene Ziel (foo) wurden angelegt"
|
||||
else
|
||||
fail "Migrationsimages fuer foo fehlen: $OUT"
|
||||
fi
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate/bar_prod.img" 2>/dev/null)" = "vorhandenes-bar-prod" ] \
|
||||
&& [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate/bar_dev.img" 2>/dev/null)" = "vorhandenes-bar-dev" ]; then
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/bar_prod.img" 2>/dev/null)" = "vorhandenes-bar-prod" ] \
|
||||
&& [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/bar_dev.img" 2>/dev/null)" = "vorhandenes-bar-dev" ]; then
|
||||
pass "Migrationsimages des NICHT ausgewaehlten Geraetetyps (bar) blieben unangetastet"
|
||||
else
|
||||
fail "Migrationsimages von bar wurden veraendert oder geloescht - 4a-Fehler fuer migrate/"
|
||||
@@ -682,7 +682,7 @@ fi
|
||||
set +e
|
||||
MANIFEST_CHECK=$(python3 -c "
|
||||
import json
|
||||
with open('$SANDBOX_STATE/opt/ninlight-station/images/migrate/manifest.json') as fh:
|
||||
with open('$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/manifest.json') as fh:
|
||||
data = json.load(fh)
|
||||
entries = data.get('images', [])
|
||||
keys = {(e.get('target'), e.get('variant')) for e in entries}
|
||||
@@ -768,7 +768,7 @@ OUT=$(TEST_SIGN_DIR="$KEYDIR_FULL" run_deploy "$SANDBOX" pi-test foo 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
if [ "$RC" -eq 0 ]; then pass "Exit-Code 0"; else fail "Exit-Code $RC, Ausgabe: $OUT"; fi
|
||||
DEV_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img"
|
||||
DEV_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img"
|
||||
if [ -f "$DEV_IMG" ]; then
|
||||
set +e
|
||||
python3 -c "
|
||||
@@ -797,22 +797,22 @@ setup_sandbox "$SANDBOX"
|
||||
setup_stubbin "$STUBBIN" "$LOG"
|
||||
mkdir -p "$SANDBOX/build/foo"
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate"
|
||||
echo "vorhandenes-foo-prod" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img"
|
||||
echo "vorhandenes-foo-dev" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan"
|
||||
echo "vorhandenes-foo-prod" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img"
|
||||
echo "vorhandenes-foo-dev" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img"
|
||||
: >"$LOG"
|
||||
set +e
|
||||
OUT=$(run_deploy "$SANDBOX" pi-test 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
if [ "$RC" -eq 0 ]; then pass "Exit-Code 0"; else fail "Exit-Code $RC, Ausgabe: $OUT"; fi
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img" 2>/dev/null)" = "vorhandenes-foo-prod" ] \
|
||||
&& [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img" 2>/dev/null)" = "vorhandenes-foo-dev" ]; then
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img" 2>/dev/null)" = "vorhandenes-foo-prod" ] \
|
||||
&& [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img" 2>/dev/null)" = "vorhandenes-foo-dev" ]; then
|
||||
pass "vorhandenes migrate/ blieb beim Voll-Deploy ohne Schluesselverzeichnis unangetastet"
|
||||
else
|
||||
fail "migrate/ wurde geleert, obwohl kein Schluesselverzeichnis vorhanden war - zerstoert die Bestueckung"
|
||||
fi
|
||||
if echo "$OUT" | grep -q "migrate/ auf dem Pi bleibt unangetastet"; then
|
||||
if echo "$OUT" | grep -q "migrate-wlan/ auf dem Pi bleibt unangetastet"; then
|
||||
pass "Ausgabe kuendigt an, dass migrate/ unangetastet bleibt"
|
||||
else
|
||||
fail "Ausgabe erwaehnt nicht, dass migrate/ unangetastet bleibt: $OUT"
|
||||
@@ -831,11 +831,11 @@ setup_sandbox "$SANDBOX"
|
||||
setup_stubbin "$STUBBIN" "$LOG"
|
||||
mkdir -p "$SANDBOX/build/foo"
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate"
|
||||
echo "vorhandenes-foo-prod" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img"
|
||||
echo "vorhandenes-foo-dev" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan"
|
||||
echo "vorhandenes-foo-prod" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img"
|
||||
echo "vorhandenes-foo-dev" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img"
|
||||
echo '{"built": "2026-01-01T00:00:00Z", "ninlight_version": "0.0.1", "images": []}' \
|
||||
>"$SANDBOX_STATE/opt/ninlight-station/images/migrate/manifest.json"
|
||||
>"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/manifest.json"
|
||||
: >"$LOG"
|
||||
set +e
|
||||
OUT=$(TEST_SIGN_DIR="$SIGN_EMPTY" run_deploy "$SANDBOX" pi-test 2>&1)
|
||||
@@ -847,9 +847,9 @@ if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/ninlight_foo_ota.img" ]; the
|
||||
else
|
||||
fail "Rettungsimage fehlt: $OUT"
|
||||
fi
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img" 2>/dev/null)" = "vorhandenes-foo-prod" ] \
|
||||
&& [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img" 2>/dev/null)" = "vorhandenes-foo-dev" ] \
|
||||
&& grep -q '"images": \[\]' "$SANDBOX_STATE/opt/ninlight-station/images/migrate/manifest.json"; then
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img" 2>/dev/null)" = "vorhandenes-foo-prod" ] \
|
||||
&& [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img" 2>/dev/null)" = "vorhandenes-foo-dev" ] \
|
||||
&& grep -q '"images": \[\]' "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/manifest.json"; then
|
||||
pass "vorhandenes migrate/ (Bilder UND manifest.json) blieb unangetastet - Verzeichnis war da, aber leer"
|
||||
else
|
||||
fail "migrate/ wurde trotz vorhandenem, aber leerem Schluesselverzeichnis veraendert/geleert - C2 nicht behoben"
|
||||
@@ -868,20 +868,20 @@ setup_stubbin "$STUBBIN" "$LOG"
|
||||
mkdir -p "$SANDBOX/build/foo"
|
||||
make_gz_file "$SANDBOX/build/foo/ninlight_foo_gz.img"
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate"
|
||||
echo "echtes-altes-prod-image" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan"
|
||||
echo "echtes-altes-prod-image" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img"
|
||||
: >"$LOG"
|
||||
set +e
|
||||
OUT=$(TEST_SIGN_DIR="$KEYDIR_DEV_ONLY" run_deploy "$SANDBOX" pi-test 2>&1) # Voll-Deploy, kein Ziel-Argument
|
||||
RC=$?
|
||||
set -e
|
||||
if [ "$RC" -eq 0 ]; then pass "Exit-Code 0"; else fail "Exit-Code $RC, Ausgabe: $OUT"; fi
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img" ]; then
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img" ]; then
|
||||
pass "neues dev-Migrationsimage wurde signiert und ausgeliefert"
|
||||
else
|
||||
fail "dev-Migrationsimage fehlt: $OUT"
|
||||
fi
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_prod.img" 2>/dev/null)" = "echtes-altes-prod-image" ]; then
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_prod.img" 2>/dev/null)" = "echtes-altes-prod-image" ]; then
|
||||
pass "das vorhandene _prod.img blieb unangetastet, obwohl dieser Voll-Deploy nur den dev-Schluessel hatte"
|
||||
else
|
||||
fail "das vorhandene _prod.img wurde beim Voll-Deploy mit nur dev-Schluessel entfernt - C2 (Teilfall) nicht behoben"
|
||||
@@ -907,12 +907,13 @@ set +e
|
||||
OUT=$(TEST_SIGN_DIR="$KEYDIR_FULL" run_deploy "$SANDBOX" pi-test foo 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
MANIFEST="$SANDBOX_STATE/opt/ninlight-station/images/migrate/manifest.json"
|
||||
MANIFEST="$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/manifest.json"
|
||||
if [ "$RC" -eq 0 ] && [ -f "$MANIFEST" ]; then
|
||||
pass "manifest.json wurde angelegt"
|
||||
else
|
||||
fail "manifest.json fehlt oder Exit-Code $RC: $OUT"
|
||||
fi
|
||||
printf 'mit-wlan\n' >"$TMPROOT/s20-imageset"
|
||||
set +e
|
||||
VERSION=$(python3 -c "
|
||||
import importlib.util
|
||||
@@ -929,6 +930,9 @@ st = module.Station(
|
||||
stall_after=None,
|
||||
mode='migration',
|
||||
control_path=Path('$TMPROOT/s20-control.json'),
|
||||
# Das Manifest dieses Szenarios gehoert zum Satz MIT WLAN-Zugangsdaten - der
|
||||
# Umschalter muss also darauf stehen, sonst liest der Server im anderen Satz nach.
|
||||
imageset_path=Path('$TMPROOT/s20-imageset'),
|
||||
)
|
||||
print(st.image_version('foo', 'dev'))
|
||||
" 2>&1)
|
||||
@@ -965,8 +969,8 @@ for label in truncated empty array null string null-entry; do
|
||||
mkdir -p "$SANDBOX/build/foo"
|
||||
make_gz_file "$SANDBOX/build/foo/ninlight_foo_gz.img"
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate"
|
||||
cp "$TMPROOT/bad-manifests/$label.json" "$SANDBOX_STATE/opt/ninlight-station/images/migrate/manifest.json"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan"
|
||||
cp "$TMPROOT/bad-manifests/$label.json" "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/manifest.json"
|
||||
: >"$LOG"
|
||||
set +e
|
||||
# Nur EIN Schluessel (dev) -> MIGRATE_COMPLETE=0 -> der Merge-Zweig laeuft, nicht der
|
||||
@@ -980,7 +984,7 @@ for label in truncated empty array null string null-entry; do
|
||||
fail "Bestandsmanifest '$label': Exit-Code $RC - Deploy abgebrochen. Ausgabe: $OUT"
|
||||
fi
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/server.py" ] \
|
||||
&& [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img" ]; then
|
||||
&& [ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img" ]; then
|
||||
pass "Bestandsmanifest '$label': Deploy lief vollstaendig durch (server.py installiert, foo_dev.img da)"
|
||||
else
|
||||
fail "Bestandsmanifest '$label': Deploy blieb auf halbem Weg stehen (server.py oder foo_dev.img fehlt)"
|
||||
@@ -1112,6 +1116,130 @@ ERR=$(cat "$TMPROOT/s27.err")
|
||||
echo "$ERR" | grep -q "Warnung" && pass "Warnung (keine Fehlermeldung) auf stderr" || fail "keine Warnung auf stderr: $ERR"
|
||||
[ -f "$SANDBOX_STATE/opt/ninlight-station/server.py" ] && pass "der Deploy selbst lief vollstaendig durch" || fail "server.py fehlt - der Deploy brach ab"
|
||||
|
||||
echo
|
||||
echo "=== Szenario 28: beide Bildsaetze werden ausgeliefert, und zwar aus verschiedenen Bauten ==="
|
||||
# Der Umschalter auf der Station ist nur so gut wie die Bestueckung: liegen beide Saetze
|
||||
# nicht getrennt auf dem Pi, kann er nichts umschalten. Geprueft wird am INHALT, nicht am
|
||||
# Verzeichnisnamen - die Fuellzeichen der beiden _gz.img sind verschieden, ein
|
||||
# vertauschter Quellbaum faellt also auf.
|
||||
SANDBOX="$TMPROOT/s28"; STUBBIN="$TMPROOT/bin28"; LOG="$TMPROOT/s28.log"; SANDBOX_STATE="$TMPROOT/s28-state"
|
||||
setup_sandbox "$SANDBOX"
|
||||
setup_stubbin "$STUBBIN" "$LOG"
|
||||
mkdir -p "$SANDBOX/build/foo" "$SANDBOX/build-nocreds/foo"
|
||||
make_gz_file "$SANDBOX/build/foo/ninlight_foo_gz.img" W
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
make_gz_file "$SANDBOX/build-nocreds/foo/ninlight_foo_gz.img" N
|
||||
: >"$LOG"
|
||||
set +e
|
||||
OUT=$(TEST_SIGN_DIR="$KEYDIR_FULL" run_deploy "$SANDBOX" pi-test foo 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
[ "$RC" -eq 0 ] && pass "Exit-Code 0" || fail "Exit-Code $RC, Ausgabe: $OUT"
|
||||
WLAN_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img"
|
||||
NOCR_IMG="$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds/foo_dev.img"
|
||||
if [ -f "$WLAN_IMG" ] && [ -f "$NOCR_IMG" ]; then
|
||||
pass "beide Bildsaetze liegen getrennt auf dem Pi"
|
||||
else
|
||||
fail "mindestens ein Bildsatz fehlt: $OUT"
|
||||
fi
|
||||
if [ -f "$WLAN_IMG" ] && [ -f "$NOCR_IMG" ]; then
|
||||
# Die ersten Bytes sind das Fuellzeichen des jeweiligen _gz.img.
|
||||
W_HEAD=$(head -c 8 "$WLAN_IMG")
|
||||
N_HEAD=$(head -c 8 "$NOCR_IMG")
|
||||
[ "$W_HEAD" = "WWWWWWWW" ] && pass "migrate-wlan/ kommt wirklich aus build/" || fail "migrate-wlan/ enthaelt '$W_HEAD' statt der build/-Bytes"
|
||||
[ "$N_HEAD" = "NNNNNNNN" ] && pass "migrate-nocreds/ kommt wirklich aus build-nocreds/" || fail "migrate-nocreds/ enthaelt '$N_HEAD' statt der build-nocreds/-Bytes"
|
||||
fi
|
||||
for m in migrate-wlan migrate-nocreds; do
|
||||
if [ -f "$SANDBOX_STATE/opt/ninlight-station/images/$m/manifest.json" ]; then
|
||||
pass "$m/manifest.json wurde angelegt"
|
||||
else
|
||||
fail "$m/manifest.json fehlt"
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
echo "=== Szenario 29: ohne build-nocreds/ bleibt der Satz 'ohne-wlan' auf dem Pi unangetastet ==="
|
||||
# tools/build_nocreds.sh ist ein eigener, optionaler Bau. Ein Deploy darf nicht daran
|
||||
# scheitern, dass er nicht gelaufen ist - und er darf die Bestueckung frueherer Deploys
|
||||
# nicht wegraeumen (derselbe Fehler wie frueher bei migrate/, siehe Szenario 17).
|
||||
SANDBOX="$TMPROOT/s29"; STUBBIN="$TMPROOT/bin29"; LOG="$TMPROOT/s29.log"; SANDBOX_STATE="$TMPROOT/s29-state"
|
||||
setup_sandbox "$SANDBOX"
|
||||
setup_stubbin "$STUBBIN" "$LOG"
|
||||
mkdir -p "$SANDBOX/build/foo"
|
||||
make_gz_file "$SANDBOX/build/foo/ninlight_foo_gz.img"
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds"
|
||||
echo "alter-nocreds-abzug" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds/foo_dev.img"
|
||||
: >"$LOG"
|
||||
set +e
|
||||
OUT=$(TEST_SIGN_DIR="$KEYDIR_FULL" run_deploy "$SANDBOX" pi-test 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
[ "$RC" -eq 0 ] && pass "Exit-Code 0 trotz fehlendem build-nocreds/" || fail "Exit-Code $RC: $OUT"
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds/foo_dev.img" 2>/dev/null)" = "alter-nocreds-abzug" ]; then
|
||||
pass "vorhandener Satz 'ohne-wlan' blieb unangetastet"
|
||||
else
|
||||
fail "der Satz 'ohne-wlan' wurde geleert oder ueberschrieben, obwohl build-nocreds/ fehlte"
|
||||
fi
|
||||
[ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-wlan/foo_dev.img" ] \
|
||||
&& pass "der Satz 'mit-wlan' wurde trotzdem ausgeliefert" \
|
||||
|| fail "der Satz 'mit-wlan' fehlt: $OUT"
|
||||
echo "$OUT" | grep -q "build_nocreds.sh" \
|
||||
&& pass "der Hinweis nennt, womit der fehlende Satz entsteht" \
|
||||
|| fail "kein Hinweis auf tools/build_nocreds.sh: $OUT"
|
||||
|
||||
echo
|
||||
echo "=== Szenario 30: ein unvollstaendiger Satz 'ohne-wlan' raeumt nicht mit --delete auf ==="
|
||||
# build-nocreds/ hat nur eines von zwei Zielen - dieser Lauf beschreibt den Sollzustand
|
||||
# also NICHT vollstaendig, und --delete wuerde das zweite Ziel des vorigen Deploys
|
||||
# wegraeumen.
|
||||
SANDBOX="$TMPROOT/s30"; STUBBIN="$TMPROOT/bin30"; LOG="$TMPROOT/s30.log"; SANDBOX_STATE="$TMPROOT/s30-state"
|
||||
setup_sandbox "$SANDBOX"
|
||||
setup_stubbin "$STUBBIN" "$LOG"
|
||||
mkdir -p "$SANDBOX/build/foo" "$SANDBOX/build/bar" "$SANDBOX/build-nocreds/foo"
|
||||
make_gz_file "$SANDBOX/build/foo/ninlight_foo_gz.img"
|
||||
make_gz_file "$SANDBOX/build/bar/ninlight_bar_gz.img"
|
||||
echo "foo-ota" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
echo "bar-ota" >"$SANDBOX/build/bar/ninlight_bar_ota.img"
|
||||
make_gz_file "$SANDBOX/build-nocreds/foo/ninlight_foo_gz.img" N
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds"
|
||||
echo "alter-bar-abzug" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds/bar_dev.img"
|
||||
: >"$LOG"
|
||||
set +e
|
||||
OUT=$(TEST_SIGN_DIR="$KEYDIR_FULL" run_deploy "$SANDBOX" pi-test 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
[ "$RC" -eq 0 ] && pass "Exit-Code 0" || fail "Exit-Code $RC: $OUT"
|
||||
if [ "$(cat "$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds/bar_dev.img" 2>/dev/null)" = "alter-bar-abzug" ]; then
|
||||
pass "das nicht neu gebaute Ziel blieb im Satz 'ohne-wlan' erhalten"
|
||||
else
|
||||
fail "das nicht neu gebaute Ziel wurde aus dem Satz 'ohne-wlan' entfernt - --delete lief trotz unvollstaendigem Satz"
|
||||
fi
|
||||
[ -f "$SANDBOX_STATE/opt/ninlight-station/images/migrate-nocreds/foo_dev.img" ] \
|
||||
&& pass "das gebaute Ziel kam dazu" || fail "das gebaute Ziel fehlt im Satz 'ohne-wlan'"
|
||||
|
||||
echo
|
||||
echo "=== Szenario 31: das alte, namenlose migrate/ wird beim Deploy entfernt ==="
|
||||
# Bis zum Umschalter hiess das einzige Verzeichnis "migrate" und enthielt die Abzuege MIT
|
||||
# Zugangsdaten. Es wird von niemandem mehr gelesen - bliebe es liegen, haelt der naechste
|
||||
# Mensch am Pi es fuer den gueltigen Satz.
|
||||
SANDBOX="$TMPROOT/s31"; STUBBIN="$TMPROOT/bin31"; LOG="$TMPROOT/s31.log"; SANDBOX_STATE="$TMPROOT/s31-state"
|
||||
setup_sandbox "$SANDBOX"
|
||||
setup_stubbin "$STUBBIN" "$LOG"
|
||||
mkdir -p "$SANDBOX/build/foo"
|
||||
echo "foo-image" >"$SANDBOX/build/foo/ninlight_foo_ota.img"
|
||||
mkdir -p "$SANDBOX_STATE/opt/ninlight-station/images/migrate"
|
||||
echo "altbestand" >"$SANDBOX_STATE/opt/ninlight-station/images/migrate/foo_dev.img"
|
||||
: >"$LOG"
|
||||
set +e
|
||||
OUT=$(run_deploy "$SANDBOX" pi-test 2>&1)
|
||||
RC=$?
|
||||
set -e
|
||||
[ "$RC" -eq 0 ] && pass "Exit-Code 0" || fail "Exit-Code $RC: $OUT"
|
||||
[ ! -e "$SANDBOX_STATE/opt/ninlight-station/images/migrate" ] \
|
||||
&& pass "der Altbestand images/migrate wurde entfernt" \
|
||||
|| fail "images/migrate liegt noch da"
|
||||
|
||||
echo
|
||||
if [ "$FAILED" -eq 0 ]; then
|
||||
echo "Alle Tests bestanden."
|
||||
|
||||
Reference in New Issue
Block a user