feat: Aufsetz- und Ausliefer-Skripte der Recovery-Station
setup_pi.sh ist idempotent und laesst eine vorhandene Konfiguration in Ruhe; deploy.sh prueft jedes Image mit nl_mkimage --verify, bevor es etwas uebertraegt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
df8e796f1e
commit
fda732d6c4
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
# Liefert Firmware-Images und den Stationscode an den Pi aus.
|
||||
#
|
||||
# Aufruf: tools/station/deploy.sh <pi-host> [target ...]
|
||||
# Ohne target-Argumente werden alle in build/*/ gefundenen _ota.img uebertragen.
|
||||
set -euo pipefail
|
||||
HOST=${1:?Aufruf: tools/station/deploy.sh <pi-host> [target ...]}
|
||||
shift || true
|
||||
HERE=$(cd "$(dirname "$0")" && pwd)
|
||||
ROOT=$(cd "$HERE/../.." && pwd)
|
||||
MKIMAGE="$ROOT/tools/mkimage/nl_mkimage.py"
|
||||
|
||||
declare -a FILES=()
|
||||
if [ $# -gt 0 ]; then
|
||||
for t in "$@"; do
|
||||
f="$ROOT/build/$t/ninlight_${t}_ota.img"
|
||||
[ -f "$f" ] || { echo "Fehler: $f fehlt - erst bauen" >&2; exit 1; }
|
||||
FILES+=("$f")
|
||||
done
|
||||
else
|
||||
while IFS= read -r f; do FILES+=("$f"); done < <(find "$ROOT/build" -maxdepth 2 -name 'ninlight_*_ota.img' | sort)
|
||||
[ ${#FILES[@]} -gt 0 ] || { echo "Fehler: keine Images unter $ROOT/build gefunden" >&2; exit 1; }
|
||||
fi
|
||||
|
||||
echo "== Images pruefen =="
|
||||
STAGE=$(mktemp -d)
|
||||
trap 'rm -rf "$STAGE"' EXIT
|
||||
printf '%-26s %-10s %s\n' GERAET VERSION BYTES
|
||||
for f in "${FILES[@]}"; do
|
||||
base=$(basename "$f")
|
||||
target=${base#ninlight_}; target=${target%_ota.img}
|
||||
# Ein Image, das die Pruefung nicht besteht, wuerde jede Lampe ablehnen -
|
||||
# das faellt sonst erst am Geraet auf.
|
||||
out=$(python3 "$MKIMAGE" --verify "$f" --expect-device "$target") || {
|
||||
echo "Fehler: $base besteht die Trailer-Pruefung nicht, nichts uebertragen" >&2; exit 1; }
|
||||
# shellcheck disable=SC2086
|
||||
set -- $out
|
||||
printf '%-26s %-10s %s\n' "$1" "$2" "$3"
|
||||
cp "$f" "$STAGE/$base"
|
||||
done
|
||||
|
||||
echo "== uebertragen =="
|
||||
rsync -a --delete "$STAGE/" "$HOST:/tmp/ninlight-images/"
|
||||
rsync -a "$HERE/server.py" "$HERE/ninlight-station" "$HERE/ninlight-station.service" "$HOST:/tmp/"
|
||||
ssh "$HOST" 'set -e
|
||||
sudo install -d -m 0755 /opt/ninlight-station/images
|
||||
sudo rsync -a --delete /tmp/ninlight-images/ /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
|
||||
sudo install -m 0644 /tmp/ninlight-station.service /etc/systemd/system/ninlight-station.service
|
||||
rm -rf /tmp/ninlight-images /tmp/server.py /tmp/ninlight-station /tmp/ninlight-station.service
|
||||
sudo systemctl daemon-reload
|
||||
systemctl is-active --quiet ninlight-station && { sudo systemctl restart ninlight-station; echo " Dienst neu gestartet"; } || echo " Dienst laeuft nicht (Station ist aus)"'
|
||||
|
||||
echo "fertig."
|
||||
Reference in New Issue
Block a user