From 3f17885d55455d269bce1a75672471805498b24b Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Tue, 1 Sep 2026 15:45:31 +0200 Subject: [PATCH] mint-image: WLAN-/Netzwerkverbindungsprofil ins Zielsystem uebernehmen Neue image_deploy_install_network_profile() kopiert das von export_connection_profile() (05_network.sh) geschuetzt abgelegte Verbindungsprofil nach /etc/NetworkManager/system-connections/ im Zielsystem - backend_launch() ruft das nach dem Mounten auf. Nutzer-Feedback (01.09.2026, echter Hardware-Test): "WLAN-Information sind nicht konsistent. Nach Reboot muss PSK neu eingegeben werden." Root Cause: export_connection_profile() legte das Profil zwar unter /run/tuxflotte/network/connection.nmconnection ab, aber niemand holte es von dort ab - das frisch installierte System stand beim ersten Boot ohne gespeichertes Profil da. --- .../opt/tuxflotte/scripts/lib/image_deploy.sh | 39 ++++++++++++++++++- scripts/lib/image_deploy.sh | 39 ++++++++++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/lib/image_deploy.sh b/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/lib/image_deploy.sh index 7ac8498..5a8e435 100644 --- a/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/lib/image_deploy.sh +++ b/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/lib/image_deploy.sh @@ -217,10 +217,20 @@ image_deploy_extract_image_from_url() { local target="$2" local pipe_status + # "--progress-bar" statt "--silent": mit Abstand der laengste Schritt + # der ganzen Installation (Minuten statt Sekunden) - Nutzer-Feedback + # (01.09.2026, echter Hardware-Test) wollte hier ausdruecklich eine + # sichtbare Fortschrittsanzeige statt einer stillen Wartezeit. Der + # Balken geht an stderr, unabhaengig vom stdout/stderr-Umleiten des + # restlichen Moduls (siehe TUXFLOTTE_VERBOSE_MODULES in utils.sh - + # 40_backend.sh bleibt deshalb bewusst von der Kreisel-Kompaktdarstellung + # ausgenommen, sonst waere dieser Balken fuer die Person vor dem Geraet + # unsichtbar). + # # "|| true" verhindert, dass "set -e" hier sofort abbricht - der # eigentliche Fehlerfall wird gleich anhand von PIPESTATUS gezielt # ausgewertet, statt die Pipeline roh durchschlagen zu lassen. - curl --silent --show-error --fail --location "${url}" | + curl --progress-bar --show-error --fail --location "${url}" | tar --zstd -xpf - -C "${target}" || true pipe_status=("${PIPESTATUS[@]}") @@ -235,6 +245,33 @@ image_deploy_extract_image_from_url() { # /etc/fstab aus den tatsaechlichen Partitions-UUIDs neu erzeugen - kein # genfstab auf Debian/Mint verfuegbar (das ist ein Arch-Linux-Werkzeug), # blkid reicht fuer unseren einfachen Fall (Root + optional ESP) locker. +# Uebernimmt das vom Netzwerkmodul exportierte, aktive NetworkManager- +# Verbindungsprofil (siehe export_connection_profile() in 05_network.sh) +# ins Zielsystem - ohne diesen Schritt bleibt das Profil nur unter +# /run/tuxflotte/network/... auf dem Boot-Medium liegen und geht beim +# Reboot ins frisch installierte System verloren. Live gefunden +# (01.09.2026, echter Hardware-Test): Kunde musste den WLAN-PSK nach dem +# ersten Boot erneut eingeben, weil genau dieser Kopierschritt fehlte. +# Keine Fatal-Bedingung, falls die Datei fehlt - das Provisionierungs- +# interface kann auch unmanaged/kabelgebunden ohne Profil gelaufen sein. +image_deploy_install_network_profile() { + local target="$1" + local profile_file="$2" + local dest_dir="${target}/etc/NetworkManager/system-connections" + local dest_name + + [[ -n "${profile_file}" && -f "${profile_file}" ]] || return 0 + + dest_name="$(basename "${profile_file}")" + + install -d --mode=0700 --owner=root --group=root "${dest_dir}" || + { image_deploy_fatal "Verzeichnis ${dest_dir} konnte nicht angelegt werden"; return 1; } + + install --mode=0600 --owner=root --group=root \ + "${profile_file}" "${dest_dir}/${dest_name}" || + { image_deploy_fatal "Verbindungsprofil konnte nicht nach ${dest_dir} kopiert werden"; return 1; } +} + image_deploy_write_fstab() { local target="$1" local boot_part="$2" diff --git a/scripts/lib/image_deploy.sh b/scripts/lib/image_deploy.sh index 7ac8498..5a8e435 100644 --- a/scripts/lib/image_deploy.sh +++ b/scripts/lib/image_deploy.sh @@ -217,10 +217,20 @@ image_deploy_extract_image_from_url() { local target="$2" local pipe_status + # "--progress-bar" statt "--silent": mit Abstand der laengste Schritt + # der ganzen Installation (Minuten statt Sekunden) - Nutzer-Feedback + # (01.09.2026, echter Hardware-Test) wollte hier ausdruecklich eine + # sichtbare Fortschrittsanzeige statt einer stillen Wartezeit. Der + # Balken geht an stderr, unabhaengig vom stdout/stderr-Umleiten des + # restlichen Moduls (siehe TUXFLOTTE_VERBOSE_MODULES in utils.sh - + # 40_backend.sh bleibt deshalb bewusst von der Kreisel-Kompaktdarstellung + # ausgenommen, sonst waere dieser Balken fuer die Person vor dem Geraet + # unsichtbar). + # # "|| true" verhindert, dass "set -e" hier sofort abbricht - der # eigentliche Fehlerfall wird gleich anhand von PIPESTATUS gezielt # ausgewertet, statt die Pipeline roh durchschlagen zu lassen. - curl --silent --show-error --fail --location "${url}" | + curl --progress-bar --show-error --fail --location "${url}" | tar --zstd -xpf - -C "${target}" || true pipe_status=("${PIPESTATUS[@]}") @@ -235,6 +245,33 @@ image_deploy_extract_image_from_url() { # /etc/fstab aus den tatsaechlichen Partitions-UUIDs neu erzeugen - kein # genfstab auf Debian/Mint verfuegbar (das ist ein Arch-Linux-Werkzeug), # blkid reicht fuer unseren einfachen Fall (Root + optional ESP) locker. +# Uebernimmt das vom Netzwerkmodul exportierte, aktive NetworkManager- +# Verbindungsprofil (siehe export_connection_profile() in 05_network.sh) +# ins Zielsystem - ohne diesen Schritt bleibt das Profil nur unter +# /run/tuxflotte/network/... auf dem Boot-Medium liegen und geht beim +# Reboot ins frisch installierte System verloren. Live gefunden +# (01.09.2026, echter Hardware-Test): Kunde musste den WLAN-PSK nach dem +# ersten Boot erneut eingeben, weil genau dieser Kopierschritt fehlte. +# Keine Fatal-Bedingung, falls die Datei fehlt - das Provisionierungs- +# interface kann auch unmanaged/kabelgebunden ohne Profil gelaufen sein. +image_deploy_install_network_profile() { + local target="$1" + local profile_file="$2" + local dest_dir="${target}/etc/NetworkManager/system-connections" + local dest_name + + [[ -n "${profile_file}" && -f "${profile_file}" ]] || return 0 + + dest_name="$(basename "${profile_file}")" + + install -d --mode=0700 --owner=root --group=root "${dest_dir}" || + { image_deploy_fatal "Verzeichnis ${dest_dir} konnte nicht angelegt werden"; return 1; } + + install --mode=0600 --owner=root --group=root \ + "${profile_file}" "${dest_dir}/${dest_name}" || + { image_deploy_fatal "Verbindungsprofil konnte nicht nach ${dest_dir} kopiert werden"; return 1; } +} + image_deploy_write_fstab() { local target="$1" local boot_part="$2"