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
+54
-17
@@ -37,23 +37,60 @@ ssh "$HOST" 'set -e
|
||||
echo " installiert"'
|
||||
|
||||
echo "== NetworkManager-Profil =="
|
||||
ssh "$HOST" 'set -e
|
||||
. /etc/ninlight-station.conf
|
||||
if nmcli -t -f NAME con show | grep -qx "$AP_CONNECTION"; then
|
||||
sudo nmcli con mod "$AP_CONNECTION" \
|
||||
802-11-wireless.ssid "$SSID" wifi-sec.psk "$PSK" \
|
||||
ipv4.addresses 192.168.8.1/24 ipv4.method shared \
|
||||
connection.autoconnect no
|
||||
echo " Profil $AP_CONNECTION aktualisiert"
|
||||
else
|
||||
sudo nmcli con add type wifi ifname wlan0 con-name "$AP_CONNECTION" ssid "$SSID" \
|
||||
802-11-wireless.mode ap 802-11-wireless.band bg 802-11-wireless.channel 6 \
|
||||
wifi-sec.key-mgmt wpa-psk wifi-sec.proto rsn wifi-sec.pairwise ccmp wifi-sec.group ccmp \
|
||||
wifi-sec.psk "$PSK" \
|
||||
ipv4.method shared ipv4.addresses 192.168.8.1/24 ipv6.method disabled \
|
||||
connection.autoconnect no >/dev/null
|
||||
echo " Profil $AP_CONNECTION angelegt"
|
||||
fi'
|
||||
# Zwei Dinge, die man an einer echten Lampenstation nicht falsch machen darf:
|
||||
# - /etc/ninlight-station.conf ist 0600 root:root (das Passwort soll nicht
|
||||
# jeder lesen koennen). Der SSH-Benutzer ist aber nicht root, direktes
|
||||
# ". /etc/ninlight-station.conf" wuerde also mit "Permission denied"
|
||||
# abbrechen. "sudo cat" + eval liest sie dennoch ein, ohne die Rechte der
|
||||
# Datei aufzuweichen.
|
||||
# - "nmcli ... wifi-sec.psk $PSK" wuerde das Passwort als Kommandozeilen-
|
||||
# argument an einen Prozess uebergeben - fuer jeden lokalen Benutzer per
|
||||
# "ps"/"/proc/<pid>/cmdline" sichtbar. Deshalb wird das Verbindungsprofil
|
||||
# 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'
|
||||
set -e
|
||||
eval "$(sudo cat /etc/ninlight-station.conf)"
|
||||
CONN_FILE="/etc/NetworkManager/system-connections/${AP_CONNECTION}.nmconnection"
|
||||
if sudo test -f "$CONN_FILE"; then
|
||||
UUID=$(sudo sed -n 's/^uuid=//p' "$CONN_FILE" | head -n1)
|
||||
ACTION="aktualisiert"
|
||||
else
|
||||
UUID=$(cat /proc/sys/kernel/random/uuid)
|
||||
ACTION="angelegt"
|
||||
fi
|
||||
TMP=$(mktemp)
|
||||
trap 'rm -f "$TMP"' EXIT
|
||||
{
|
||||
printf '%s\n' '[connection]'
|
||||
printf 'id=%s\n' "$AP_CONNECTION"
|
||||
printf 'uuid=%s\n' "$UUID"
|
||||
printf '%s\n' 'type=wifi'
|
||||
printf '%s\n' 'interface-name=wlan0'
|
||||
printf '%s\n' 'autoconnect=false'
|
||||
printf '\n%s\n' '[wifi]'
|
||||
printf '%s\n' 'mode=ap'
|
||||
printf 'ssid=%s\n' "$SSID"
|
||||
printf '%s\n' 'band=bg'
|
||||
printf '%s\n' 'channel=6'
|
||||
printf '\n%s\n' '[wifi-security]'
|
||||
printf '%s\n' 'key-mgmt=wpa-psk'
|
||||
printf '%s\n' 'proto=rsn'
|
||||
printf '%s\n' 'pairwise=ccmp;'
|
||||
printf '%s\n' 'group=ccmp;'
|
||||
printf 'psk=%s\n' "$PSK"
|
||||
printf '\n%s\n' '[ipv4]'
|
||||
printf '%s\n' 'method=shared'
|
||||
printf '%s\n' 'address1=192.168.8.1/24'
|
||||
printf '\n%s\n' '[ipv6]'
|
||||
printf '%s\n' 'method=disabled'
|
||||
} >"$TMP"
|
||||
sudo install -o root -g root -m 0600 "$TMP" "$CONN_FILE"
|
||||
rm -f "$TMP"
|
||||
sudo nmcli connection load "$CONN_FILE" >/dev/null
|
||||
echo " Profil $AP_CONNECTION $ACTION"
|
||||
REMOTE
|
||||
|
||||
cat <<'EOF'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user