fix: setup_pi.sh und deploy.sh nutzen /usr/bin/ssh und /usr/bin/scp
Auf dem Rechner des Nutzers liegt im PATH ein ssh, das sich anders verhaelt als das System-ssh - die Skripte sollen sich darauf nicht verlassen. setup_pi.sh und deploy.sh riefen ssh, scp und rsync bisher ohne vollen Pfad auf. Beide Skripte nutzen jetzt SSH_BIN/SCP_BIN mit Default /usr/bin/ssh bzw. /usr/bin/scp, ueberschreibbar per NINLIGHT_SSH_BIN/NINLIGHT_SCP_BIN - dasselbe Prinzip wie NINLIGHT_STATION_ROOT weiter unten in deploy.sh, das Tests ohne echten Pi ermoeglicht. rsync bekommt "-e $SSH_BIN", damit auch dessen Transport ueber /usr/bin/ssh laeuft. Die Beispielaufrufe in setup_pi.sh's Abschlussmeldung und in der README bleiben bewusst bei schlichtem "ssh" - dort geht es um das, was der Nutzer selbst eintippt. test: tools/station/tests/test_deploy.sh auf den neuen Override umgestellt (NINLIGHT_SSH_BIN zeigt auf den ssh-Stub) und um ein Szenario ergaenzt, das den /usr/bin/ssh- bzw. /usr/bin/scp-Default in beiden Skripten absichert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
3032178247
commit
456058956c
@@ -9,6 +9,10 @@ shift || true
|
|||||||
HERE=$(cd "$(dirname "$0")" && pwd)
|
HERE=$(cd "$(dirname "$0")" && pwd)
|
||||||
ROOT=$(cd "$HERE/../.." && pwd)
|
ROOT=$(cd "$HERE/../.." && pwd)
|
||||||
MKIMAGE="$ROOT/tools/mkimage/nl_mkimage.py"
|
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=()
|
declare -a FILES=()
|
||||||
if [ $# -gt 0 ]; then
|
if [ $# -gt 0 ]; then
|
||||||
@@ -54,11 +58,12 @@ echo "== uebertragen =="
|
|||||||
# /tmp/ninlight-images auf dem Pi ist nur eine fluechtige Ablage fuer diesen
|
# /tmp/ninlight-images auf dem Pi ist nur eine fluechtige Ablage fuer diesen
|
||||||
# Lauf - hier darf --delete unbedingt ran, das betrifft nicht das live
|
# Lauf - hier darf --delete unbedingt ran, das betrifft nicht das live
|
||||||
# ausgelieferte Verzeichnis.
|
# ausgelieferte Verzeichnis.
|
||||||
rsync -a -c --delete "$STAGE/" "$HOST:/tmp/ninlight-images/"
|
# -e: rsync soll fuer den Transport zum Pi denselben ssh wie oben benutzen.
|
||||||
rsync -a "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/"
|
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
|
# Pfade als Variablen mit Default: so kann ein Test die Installation gegen
|
||||||
# ein Sandbox-Verzeichnis statt gegen echte Systempfade laufen lassen.
|
# 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
|
set -e
|
||||||
FULL_SYNC=$1
|
FULL_SYNC=$1
|
||||||
ROOT_DIR=${NINLIGHT_STATION_ROOT:-/opt/ninlight-station}
|
ROOT_DIR=${NINLIGHT_STATION_ROOT:-/opt/ninlight-station}
|
||||||
|
|||||||
@@ -6,17 +6,22 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
HOST=${1:?Aufruf: tools/station/setup_pi.sh <pi-host>}
|
HOST=${1:?Aufruf: tools/station/setup_pi.sh <pi-host>}
|
||||||
HERE=$(cd "$(dirname "$0")" && pwd)
|
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 =="
|
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; }
|
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; }
|
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; }
|
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 " ok"'
|
||||||
|
|
||||||
echo "== Konfiguration =="
|
echo "== Konfiguration =="
|
||||||
scp -q "$HERE/station.conf.example" "$HOST:/tmp/ninlight-station.conf.example"
|
"$SCP_BIN" -q "$HERE/station.conf.example" "$HOST:/tmp/ninlight-station.conf.example"
|
||||||
ssh "$HOST" 'set -e
|
"$SSH_BIN" "$HOST" 'set -e
|
||||||
if [ -f /etc/ninlight-station.conf ]; then
|
if [ -f /etc/ninlight-station.conf ]; then
|
||||||
echo " /etc/ninlight-station.conf existiert bereits, bleibt unveraendert"
|
echo " /etc/ninlight-station.conf existiert bereits, bleibt unveraendert"
|
||||||
else
|
else
|
||||||
@@ -26,8 +31,8 @@ ssh "$HOST" 'set -e
|
|||||||
rm -f /tmp/ninlight-station.conf.example'
|
rm -f /tmp/ninlight-station.conf.example'
|
||||||
|
|
||||||
echo "== Server, CLI und Unit installieren =="
|
echo "== Server, CLI und Unit installieren =="
|
||||||
scp -q "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/"
|
"$SCP_BIN" -q "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/"
|
||||||
ssh "$HOST" 'set -e
|
"$SSH_BIN" "$HOST" 'set -e
|
||||||
sudo install -d -m 0755 /opt/ninlight-station /opt/ninlight-station/images
|
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/server.py /opt/ninlight-station/server.py
|
||||||
sudo install -m 0755 /tmp/ninlight-station /usr/local/bin/ninlight-station
|
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)
|
# stattdessen direkt als NetworkManager-Keyfile (0600 root:root)
|
||||||
# geschrieben; das Passwort landet nur in einer Root-Datei, nie in einer
|
# geschrieben; das Passwort landet nur in einer Root-Datei, nie in einer
|
||||||
# Prozessliste.
|
# Prozessliste.
|
||||||
ssh "$HOST" bash -s <<'REMOTE'
|
"$SSH_BIN" "$HOST" bash -s <<'REMOTE'
|
||||||
set -e
|
set -e
|
||||||
eval "$(sudo cat /etc/ninlight-station.conf)"
|
eval "$(sudo cat /etc/ninlight-station.conf)"
|
||||||
CONN_FILE="/etc/NetworkManager/system-connections/${AP_CONNECTION}.nmconnection"
|
CONN_FILE="/etc/NetworkManager/system-connections/${AP_CONNECTION}.nmconnection"
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ run_deploy() {
|
|||||||
# in der Sandbox muessen sie fuer "install" eigens angelegt werden.
|
# in der Sandbox muessen sie fuer "install" eigens angelegt werden.
|
||||||
mkdir -p "$SANDBOX_STATE/usr/local/bin" "$SANDBOX_STATE/etc/systemd/system"
|
mkdir -p "$SANDBOX_STATE/usr/local/bin" "$SANDBOX_STATE/etc/systemd/system"
|
||||||
PATH="$STUBBIN:$PATH" \
|
PATH="$STUBBIN:$PATH" \
|
||||||
|
NINLIGHT_SSH_BIN="$STUBBIN/ssh" \
|
||||||
NINLIGHT_STATION_ROOT="$SANDBOX_STATE/opt/ninlight-station" \
|
NINLIGHT_STATION_ROOT="$SANDBOX_STATE/opt/ninlight-station" \
|
||||||
NINLIGHT_STATION_BIN="$SANDBOX_STATE/usr/local/bin/ninlight-station" \
|
NINLIGHT_STATION_BIN="$SANDBOX_STATE/usr/local/bin/ninlight-station" \
|
||||||
NINLIGHT_STATION_UNIT="$SANDBOX_STATE/etc/systemd/system/ninlight-station.service" \
|
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
|
set +e
|
||||||
OUT=$(FAKE_SYSTEMCTL_ACTIVE_EXIT=0 FAKE_SYSTEMCTL_RESTART_EXIT=1 \
|
OUT=$(FAKE_SYSTEMCTL_ACTIVE_EXIT=0 FAKE_SYSTEMCTL_RESTART_EXIT=1 \
|
||||||
PATH="$STUBBIN:$PATH" \
|
PATH="$STUBBIN:$PATH" \
|
||||||
|
NINLIGHT_SSH_BIN="$STUBBIN/ssh" \
|
||||||
NINLIGHT_STATION_ROOT="$SANDBOX_STATE/opt/ninlight-station" \
|
NINLIGHT_STATION_ROOT="$SANDBOX_STATE/opt/ninlight-station" \
|
||||||
NINLIGHT_STATION_BIN="$SANDBOX_STATE/usr/local/bin/ninlight-station" \
|
NINLIGHT_STATION_BIN="$SANDBOX_STATE/usr/local/bin/ninlight-station" \
|
||||||
NINLIGHT_STATION_UNIT="$SANDBOX_STATE/etc/systemd/system/ninlight-station.service" \
|
NINLIGHT_STATION_UNIT="$SANDBOX_STATE/etc/systemd/system/ninlight-station.service" \
|
||||||
@@ -250,6 +252,29 @@ else
|
|||||||
pass "'Dienst laeuft nicht' wird nicht faelschlich gemeldet"
|
pass "'Dienst laeuft nicht' wird nicht faelschlich gemeldet"
|
||||||
fi
|
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
|
echo
|
||||||
if [ "$FAILED" -eq 0 ]; then
|
if [ "$FAILED" -eq 0 ]; then
|
||||||
echo "Alle Tests bestanden."
|
echo "Alle Tests bestanden."
|
||||||
|
|||||||
Reference in New Issue
Block a user