fix: Rechte-Bug und Passwort-Leck im NM-Profil, Loesch-Bug in deploy.sh
setup_pi.sh sourcte /etc/ninlight-station.conf (0600 root:root) als unprivilegierter Benutzer und scheiterte damit bei jedem Lauf, bevor das NetworkManager-Profil angelegt wurde. Die Konfiguration wird jetzt per "sudo cat" gelesen; ninlight-station macht denselben Fallback fuer den dokumentierten Aufruf als normaler Benutzer, ohne die Datei fuer alle lesbar zu machen. Das AP-Profil wird nicht mehr per "nmcli ... wifi-sec.psk $PSK" angelegt (das WLAN-Passwort waere sonst fuer jeden lokalen Prozess in der Kommandozeile sichtbar), sondern als NetworkManager-Keyfile (0600 root:root) geschrieben und per "nmcli connection load" eingelesen. deploy.sh loeschte bei einem gezielten Deploy eines einzelnen Geraetetyps per "rsync --delete" alle Images anderer Geraetetypen aus dem live ausgelieferten Verzeichnis. --delete laeuft jetzt nur noch beim Vollabgleich (kein target-Argument); ein gezielter Deploy ersetzt nur die genannten Dateien. Dabei zusaetzlich -c (Checksumme statt Groesse+Zeitstempel) ergaenzt, sonst uebersieht rsync ein neues Image mit zufaellig gleicher Byte-Groesse. Ausserdem meldet deploy.sh jetzt einen fehlgeschlagenen Dienst-Neustart als Fehler statt ihn mit "Dienst laeuft nicht" zu verwechseln. Stub-Tests unter tools/station/tests/test_deploy.sh (ssh/rsync im PATH ersetzt, Installationsschritt laeuft gegen ein Sandbox-Verzeichnis) decken beide Bugfixes sowie die bereits bestehenden Faelle ab: Image besteht die Trailer-Pruefung nicht, keine Images gefunden. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
fda732d6c4
commit
d23b0d4e02
+51
-10
@@ -12,12 +12,17 @@ MKIMAGE="$ROOT/tools/mkimage/nl_mkimage.py"
|
||||
|
||||
declare -a FILES=()
|
||||
if [ $# -gt 0 ]; then
|
||||
# Gezielter Deploy: nur die genannten Geraetetypen werden ersetzt, alle
|
||||
# anderen Images im Zielverzeichnis bleiben unangetastet (siehe FULL_SYNC
|
||||
# unten).
|
||||
FULL_SYNC=0
|
||||
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
|
||||
FULL_SYNC=1
|
||||
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
|
||||
@@ -40,16 +45,52 @@ for f in "${FILES[@]}"; do
|
||||
done
|
||||
|
||||
echo "== uebertragen =="
|
||||
rsync -a --delete "$STAGE/" "$HOST:/tmp/ninlight-images/"
|
||||
# -c (Inhaltsvergleich per Checksumme statt Groesse+Zeitstempel): ein neues
|
||||
# Image kann zufaellig dieselbe Byte-Groesse wie das alte haben, und bei
|
||||
# schnell aufeinanderfolgenden Deploys reicht rsyncs Sekundenaufloesung fuer
|
||||
# den Zeitstempel nicht, um das als Aenderung zu erkennen. Ohne -c wuerde
|
||||
# rsync ein solches Update dann stillschweigend ueberspringen.
|
||||
#
|
||||
# /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/"
|
||||
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)"'
|
||||
# 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'
|
||||
set -e
|
||||
FULL_SYNC=$1
|
||||
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/images"
|
||||
if [ "$FULL_SYNC" -eq 1 ]; then
|
||||
# Vollabgleich: alle Images ausserhalb der aktuellen Auslieferung entfernen.
|
||||
echo " voller Abgleich - Images ausserhalb der Auswahl werden entfernt"
|
||||
sudo rsync -a -c --delete /tmp/ninlight-images/ "$ROOT_DIR/images/"
|
||||
else
|
||||
# Gezielter Deploy: nur die uebertragenen Dateien ersetzen/ergaenzen, alle
|
||||
# anderen Geraetetypen im Zielverzeichnis bleiben erhalten (kein --delete).
|
||||
echo " gezielter Deploy - andere Geraetetypen im Zielverzeichnis bleiben erhalten"
|
||||
sudo rsync -a -c /tmp/ninlight-images/ "$ROOT_DIR/images/"
|
||||
fi
|
||||
sudo install -m 0755 /tmp/server.py "$ROOT_DIR/server.py"
|
||||
sudo install -m 0755 /tmp/ninlight-station "$BIN_PATH"
|
||||
sudo install -m 0644 /tmp/ninlight-station.service "$UNIT_PATH"
|
||||
rm -rf /tmp/ninlight-images /tmp/server.py /tmp/ninlight-station /tmp/ninlight-station.service
|
||||
sudo systemctl daemon-reload
|
||||
if systemctl is-active --quiet ninlight-station; then
|
||||
if sudo systemctl restart ninlight-station; then
|
||||
echo " Dienst neu gestartet"
|
||||
else
|
||||
echo " Fehler: Dienst lief, Neustart nach dem Deploy ist aber fehlgeschlagen" >&2
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo " Dienst laeuft nicht (Station ist aus)"
|
||||
fi
|
||||
REMOTE
|
||||
|
||||
echo "fertig."
|
||||
|
||||
Reference in New Issue
Block a user