diff --git a/tools/station/deploy.sh b/tools/station/deploy.sh index 6bc791c..b0ab712 100755 --- a/tools/station/deploy.sh +++ b/tools/station/deploy.sh @@ -9,6 +9,10 @@ shift || true HERE=$(cd "$(dirname "$0")" && pwd) ROOT=$(cd "$HERE/../.." && pwd) MKIMAGE="$ROOT/tools/mkimage/nl_mkimage.py" +# /usr/bin/ssh statt einem ssh im PATH, das sich anders verhaelt (siehe A3-Notiz im +# Abnahmebericht). Ueberschreibbar, damit tests/test_deploy.sh gegen einen Stub statt +# einen echten Pi laufen kann - dasselbe Prinzip wie bei NINLIGHT_STATION_ROOT unten. +SSH_BIN=${NINLIGHT_SSH_BIN:-/usr/bin/ssh} declare -a FILES=() if [ $# -gt 0 ]; then @@ -54,11 +58,12 @@ echo "== uebertragen ==" # /tmp/ninlight-images auf dem Pi ist nur eine fluechtige Ablage fuer diesen # Lauf - hier darf --delete unbedingt ran, das betrifft nicht das live # ausgelieferte Verzeichnis. -rsync -a -c --delete "$STAGE/" "$HOST:/tmp/ninlight-images/" -rsync -a "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/" +# -e: rsync soll fuer den Transport zum Pi denselben ssh wie oben benutzen. +rsync -a -c --delete -e "$SSH_BIN" "$STAGE/" "$HOST:/tmp/ninlight-images/" +rsync -a -e "$SSH_BIN" "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/" # Pfade als Variablen mit Default: so kann ein Test die Installation gegen # ein Sandbox-Verzeichnis statt gegen echte Systempfade laufen lassen. -ssh "$HOST" bash -s -- "$FULL_SYNC" <<'REMOTE' +"$SSH_BIN" "$HOST" bash -s -- "$FULL_SYNC" <<'REMOTE' set -e FULL_SYNC=$1 ROOT_DIR=${NINLIGHT_STATION_ROOT:-/opt/ninlight-station} diff --git a/tools/station/setup_pi.sh b/tools/station/setup_pi.sh index 0ebcfff..bdf72d9 100755 --- a/tools/station/setup_pi.sh +++ b/tools/station/setup_pi.sh @@ -6,17 +6,22 @@ set -euo pipefail HOST=${1:?Aufruf: tools/station/setup_pi.sh } HERE=$(cd "$(dirname "$0")" && pwd) +# /usr/bin/ssh und /usr/bin/scp statt Varianten im PATH, die sich anders verhalten koennen. +# Ueberschreibbar (wie NINLIGHT_STATION_ROOT in deploy.sh), damit ein Test gegen Stubs statt +# einen echten Pi laufen kann. +SSH_BIN=${NINLIGHT_SSH_BIN:-/usr/bin/ssh} +SCP_BIN=${NINLIGHT_SCP_BIN:-/usr/bin/scp} echo "== Voraussetzungen auf $HOST pruefen ==" -ssh "$HOST" 'set -e +"$SSH_BIN" "$HOST" 'set -e systemctl is-active --quiet NetworkManager || { echo "NetworkManager laeuft nicht - dieser Plan setzt ihn voraus" >&2; exit 1; } nmcli -t -f DEVICE,STATE device | grep -q "^wlan0:" || { echo "wlan0 wird nicht von NetworkManager verwaltet" >&2; exit 1; } python3 -c "import sys; sys.exit(0 if sys.version_info >= (3,11) else 1)" || { echo "Python 3.11+ noetig" >&2; exit 1; } echo " ok"' echo "== Konfiguration ==" -scp -q "$HERE/station.conf.example" "$HOST:/tmp/ninlight-station.conf.example" -ssh "$HOST" 'set -e +"$SCP_BIN" -q "$HERE/station.conf.example" "$HOST:/tmp/ninlight-station.conf.example" +"$SSH_BIN" "$HOST" 'set -e if [ -f /etc/ninlight-station.conf ]; then echo " /etc/ninlight-station.conf existiert bereits, bleibt unveraendert" else @@ -26,8 +31,8 @@ ssh "$HOST" 'set -e rm -f /tmp/ninlight-station.conf.example' echo "== Server, CLI und Unit installieren ==" -scp -q "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/" -ssh "$HOST" 'set -e +"$SCP_BIN" -q "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/" +"$SSH_BIN" "$HOST" 'set -e sudo install -d -m 0755 /opt/ninlight-station /opt/ninlight-station/images sudo install -m 0755 /tmp/server.py /opt/ninlight-station/server.py sudo install -m 0755 /tmp/ninlight-station /usr/local/bin/ninlight-station @@ -49,7 +54,7 @@ echo "== NetworkManager-Profil ==" # stattdessen direkt als NetworkManager-Keyfile (0600 root:root) # geschrieben; das Passwort landet nur in einer Root-Datei, nie in einer # Prozessliste. -ssh "$HOST" bash -s <<'REMOTE' +"$SSH_BIN" "$HOST" bash -s <<'REMOTE' set -e eval "$(sudo cat /etc/ninlight-station.conf)" CONN_FILE="/etc/NetworkManager/system-connections/${AP_CONNECTION}.nmconnection" diff --git a/tools/station/tests/test_deploy.sh b/tools/station/tests/test_deploy.sh index 504fc84..5b63823 100755 --- a/tools/station/tests/test_deploy.sh +++ b/tools/station/tests/test_deploy.sh @@ -114,6 +114,7 @@ run_deploy() { # in der Sandbox muessen sie fuer "install" eigens angelegt werden. mkdir -p "$SANDBOX_STATE/usr/local/bin" "$SANDBOX_STATE/etc/systemd/system" PATH="$STUBBIN:$PATH" \ + NINLIGHT_SSH_BIN="$STUBBIN/ssh" \ NINLIGHT_STATION_ROOT="$SANDBOX_STATE/opt/ninlight-station" \ NINLIGHT_STATION_BIN="$SANDBOX_STATE/usr/local/bin/ninlight-station" \ NINLIGHT_STATION_UNIT="$SANDBOX_STATE/etc/systemd/system/ninlight-station.service" \ @@ -232,6 +233,7 @@ echo "foo-image" >"$SANDBOX/build/foo/ninlight_foo_ota.img" set +e OUT=$(FAKE_SYSTEMCTL_ACTIVE_EXIT=0 FAKE_SYSTEMCTL_RESTART_EXIT=1 \ PATH="$STUBBIN:$PATH" \ + NINLIGHT_SSH_BIN="$STUBBIN/ssh" \ NINLIGHT_STATION_ROOT="$SANDBOX_STATE/opt/ninlight-station" \ NINLIGHT_STATION_BIN="$SANDBOX_STATE/usr/local/bin/ninlight-station" \ NINLIGHT_STATION_UNIT="$SANDBOX_STATE/etc/systemd/system/ninlight-station.service" \ @@ -250,6 +252,29 @@ else pass "'Dienst laeuft nicht' wird nicht faelschlich gemeldet" fi +echo +echo "=== Szenario 6: deploy.sh/setup_pi.sh nutzen ohne Override /usr/bin/ssh (bzw. scp) ===" +# Die anderen Szenarien laufen mit NINLIGHT_SSH_BIN auf einen Stub umgebogen - das prueft die +# Logik, aber nicht mehr, WELCHEN ssh das Skript ohne Override tatsaechlich waehlt. Der Nutzer +# verlangt ausdruecklich /usr/bin/ssh und /usr/bin/scp statt einer Variante im PATH; das hier +# ist die Absicherung dagegen, dass der Default beim naechsten Umbau stillschweigend zurueck +# auf ein PATH-"ssh" rutscht. +if grep -q 'SSH_BIN=\${NINLIGHT_SSH_BIN:-/usr/bin/ssh}' "$STATION_DIR/deploy.sh"; then + pass "deploy.sh: Default fuer SSH_BIN ist /usr/bin/ssh" +else + fail "deploy.sh: Default fuer SSH_BIN ist nicht mehr /usr/bin/ssh" +fi +if grep -q 'SSH_BIN=\${NINLIGHT_SSH_BIN:-/usr/bin/ssh}' "$STATION_DIR/setup_pi.sh"; then + pass "setup_pi.sh: Default fuer SSH_BIN ist /usr/bin/ssh" +else + fail "setup_pi.sh: Default fuer SSH_BIN ist nicht mehr /usr/bin/ssh" +fi +if grep -q 'SCP_BIN=\${NINLIGHT_SCP_BIN:-/usr/bin/scp}' "$STATION_DIR/setup_pi.sh"; then + pass "setup_pi.sh: Default fuer SCP_BIN ist /usr/bin/scp" +else + fail "setup_pi.sh: Default fuer SCP_BIN ist nicht mehr /usr/bin/scp" +fi + echo if [ "$FAILED" -eq 0 ]; then echo "Alle Tests bestanden."