From ebd827ee2ff9d6b59e4defd5c13ae38694ea4058 Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Tue, 1 Sep 2026 10:52:25 +0200 Subject: [PATCH] feat(installer): Netzwerkverbindung mit Wiederholungsversuchen statt Sofortabbruch Live auf echter Hardware gefunden (01.09.2026): eine vorkonfigurierte SSID war im Moment des Scans nicht sichtbar (Kunde stand ungluenstig, das eigene Handy war im selben WLAN aber verbunden) - bisher brach 05_network.sh beim ersten Fehlschlag sofort fatal ab, ohne dem Kunden eine Chance zu geben, den Standort zu wechseln oder ein Netzwerkkabel einzustecken. Neue establish_network_connection()-Schleife (Default: 10 Versuche, 15s Pause, beides per TUXFLOTTE_NETWORK_MAX_ATTEMPTS/ TUXFLOTTE_NETWORK_RETRY_DELAY konfigurierbar) wiederholt bei jedem Versuch die KOMPLETTE Erkennung von vorne (nicht nur WLAN erneut) - damit wird auch ein waehrend der Wartezeit eingestecktes Netzwerkkabel erkannt, nicht nur ein erneuter WLAN-Versuch. Lokal in der enterprise-QEMU-VM verifiziert: Netzwerk-Link waehrend des Boots per virsh domif-setlink kurzzeitig deaktiviert - Retry-Meldung "Verbindungsversuch 1/10 fehlgeschlagen..." erschien korrekt, nach Wiederherstellen des Links lief der Installer beim naechsten Versuch automatisch weiter bis zur Golden-Image-Installation. --- .../tuxflotte/scripts/modules/05_network.sh | 83 ++++++++++++++----- scripts/modules/05_network.sh | 83 ++++++++++++++----- 2 files changed, 120 insertions(+), 46 deletions(-) diff --git a/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/modules/05_network.sh b/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/modules/05_network.sh index 59ef7e1..5df1085 100755 --- a/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/modules/05_network.sh +++ b/boot-medium/config/includes.chroot/opt/tuxflotte/scripts/modules/05_network.sh @@ -22,6 +22,15 @@ readonly CONNECTION_EXPORT="${RUNTIME_DIR}/connection.nmconnection" readonly SERVER_URL="${TUXFLOTTE_SERVER_URL:-https://anode.tuxflotte.de/health}" readonly SERVER_TIMEOUT="${TUXFLOTTE_SERVER_TIMEOUT:-10}" +# Live auf echter Hardware gefunden (01.09.2026): eine vorkonfigurierte SSID +# war im Moment des Scans nicht sichtbar (Kunde stand ungluecklich, Handy im +# selben WLAN war aber verbunden) - bisher brach das Modul beim ersten +# Fehlschlag sofort fatal ab. Ein Kunde kann den Standort wechseln oder ein +# Netzwerkkabel einstecken, wenn er ein paar Sekunden Zeit dazu bekommt - +# deshalb Wiederholungsversuche mit Pause statt sofortigem Abbruch. +readonly MAX_CONNECTION_ATTEMPTS="${TUXFLOTTE_NETWORK_MAX_ATTEMPTS:-10}" +readonly RETRY_DELAY_SECONDS="${TUXFLOTTE_NETWORK_RETRY_DELAY:-15}" + readonly NMCLI="${NMCLI:-nmcli}" readonly CURL="${CURL:-curl}" @@ -500,6 +509,55 @@ export_connection_profile() { log "Aktives Verbindungsprofil wurde geschützt vorgemerkt." } +attempt_connection() { + if check_existing_connection; then + return 0 + fi + + if try_ethernet; then + return 0 + fi + + local wifi_device + wifi_device="$(get_wifi_device || true)" + + if [[ -z "${wifi_device}" ]]; then + warn "Keine funktionierende Ethernet-Verbindung und keine WLAN-Hardware gefunden." + return 1 + fi + + log "Ethernet ist nicht verfügbar. WLAN-Initialisierung wird gestartet." + + if [[ -n "${TUXFLOTTE_WIFI_SSID:-}" ]]; then + connect_wifi_noninteractive "${wifi_device}" + else + connect_wifi "${wifi_device}" + fi +} + +# Wiederholt Ethernet-Prüfung + WLAN-Verbindungsversuch mit Pause dazwischen, +# statt beim ersten Fehlschlag sofort abzubrechen - siehe Fund oben. Prueft +# bei jedem Versuch wieder von vorne (nicht nur WLAN erneut), damit ein in +# der Wartezeit eingestecktes Netzwerkkabel ebenfalls erkannt wird. +establish_network_connection() { + local attempt=1 + + while (( attempt <= MAX_CONNECTION_ATTEMPTS )); do + if attempt_connection; then + return 0 + fi + + if (( attempt < MAX_CONNECTION_ATTEMPTS )); then + warn "Verbindungsversuch ${attempt}/${MAX_CONNECTION_ATTEMPTS} fehlgeschlagen. Neuer Versuch in ${RETRY_DELAY_SECONDS}s - Gerät ggf. näher ans WLAN bringen oder ein Netzwerkkabel einstecken." + sleep "${RETRY_DELAY_SECONDS}" + fi + + ((attempt += 1)) + done + + return 1 +} + main() { require_root require_command "${NMCLI}" @@ -511,29 +569,8 @@ main() { log "Prüfe vorhandene Netzwerkverbindungen." - if check_existing_connection; then - : - elif try_ethernet; then - : - else - local wifi_device - - wifi_device="$(get_wifi_device || true)" - - if [[ -z "${wifi_device}" ]]; then - fatal "Keine funktionierende Ethernet-Verbindung und keine WLAN-Hardware gefunden." - fi - - log "Ethernet ist nicht verfügbar. WLAN-Initialisierung wird gestartet." - - if [[ -n "${TUXFLOTTE_WIFI_SSID:-}" ]]; then - connect_wifi_noninteractive "${wifi_device}" || - fatal "Es konnte keine Verbindung zum Tuxflotte-Server hergestellt werden." - else - connect_wifi "${wifi_device}" || - fatal "Es konnte keine Verbindung zum Tuxflotte-Server hergestellt werden." - fi - fi + establish_network_connection || + fatal "Nach ${MAX_CONNECTION_ATTEMPTS} Versuchen konnte keine Verbindung zum Tuxflotte-Server hergestellt werden." store_network_state export_connection_profile diff --git a/scripts/modules/05_network.sh b/scripts/modules/05_network.sh index 59ef7e1..5df1085 100755 --- a/scripts/modules/05_network.sh +++ b/scripts/modules/05_network.sh @@ -22,6 +22,15 @@ readonly CONNECTION_EXPORT="${RUNTIME_DIR}/connection.nmconnection" readonly SERVER_URL="${TUXFLOTTE_SERVER_URL:-https://anode.tuxflotte.de/health}" readonly SERVER_TIMEOUT="${TUXFLOTTE_SERVER_TIMEOUT:-10}" +# Live auf echter Hardware gefunden (01.09.2026): eine vorkonfigurierte SSID +# war im Moment des Scans nicht sichtbar (Kunde stand ungluecklich, Handy im +# selben WLAN war aber verbunden) - bisher brach das Modul beim ersten +# Fehlschlag sofort fatal ab. Ein Kunde kann den Standort wechseln oder ein +# Netzwerkkabel einstecken, wenn er ein paar Sekunden Zeit dazu bekommt - +# deshalb Wiederholungsversuche mit Pause statt sofortigem Abbruch. +readonly MAX_CONNECTION_ATTEMPTS="${TUXFLOTTE_NETWORK_MAX_ATTEMPTS:-10}" +readonly RETRY_DELAY_SECONDS="${TUXFLOTTE_NETWORK_RETRY_DELAY:-15}" + readonly NMCLI="${NMCLI:-nmcli}" readonly CURL="${CURL:-curl}" @@ -500,6 +509,55 @@ export_connection_profile() { log "Aktives Verbindungsprofil wurde geschützt vorgemerkt." } +attempt_connection() { + if check_existing_connection; then + return 0 + fi + + if try_ethernet; then + return 0 + fi + + local wifi_device + wifi_device="$(get_wifi_device || true)" + + if [[ -z "${wifi_device}" ]]; then + warn "Keine funktionierende Ethernet-Verbindung und keine WLAN-Hardware gefunden." + return 1 + fi + + log "Ethernet ist nicht verfügbar. WLAN-Initialisierung wird gestartet." + + if [[ -n "${TUXFLOTTE_WIFI_SSID:-}" ]]; then + connect_wifi_noninteractive "${wifi_device}" + else + connect_wifi "${wifi_device}" + fi +} + +# Wiederholt Ethernet-Prüfung + WLAN-Verbindungsversuch mit Pause dazwischen, +# statt beim ersten Fehlschlag sofort abzubrechen - siehe Fund oben. Prueft +# bei jedem Versuch wieder von vorne (nicht nur WLAN erneut), damit ein in +# der Wartezeit eingestecktes Netzwerkkabel ebenfalls erkannt wird. +establish_network_connection() { + local attempt=1 + + while (( attempt <= MAX_CONNECTION_ATTEMPTS )); do + if attempt_connection; then + return 0 + fi + + if (( attempt < MAX_CONNECTION_ATTEMPTS )); then + warn "Verbindungsversuch ${attempt}/${MAX_CONNECTION_ATTEMPTS} fehlgeschlagen. Neuer Versuch in ${RETRY_DELAY_SECONDS}s - Gerät ggf. näher ans WLAN bringen oder ein Netzwerkkabel einstecken." + sleep "${RETRY_DELAY_SECONDS}" + fi + + ((attempt += 1)) + done + + return 1 +} + main() { require_root require_command "${NMCLI}" @@ -511,29 +569,8 @@ main() { log "Prüfe vorhandene Netzwerkverbindungen." - if check_existing_connection; then - : - elif try_ethernet; then - : - else - local wifi_device - - wifi_device="$(get_wifi_device || true)" - - if [[ -z "${wifi_device}" ]]; then - fatal "Keine funktionierende Ethernet-Verbindung und keine WLAN-Hardware gefunden." - fi - - log "Ethernet ist nicht verfügbar. WLAN-Initialisierung wird gestartet." - - if [[ -n "${TUXFLOTTE_WIFI_SSID:-}" ]]; then - connect_wifi_noninteractive "${wifi_device}" || - fatal "Es konnte keine Verbindung zum Tuxflotte-Server hergestellt werden." - else - connect_wifi "${wifi_device}" || - fatal "Es konnte keine Verbindung zum Tuxflotte-Server hergestellt werden." - fi - fi + establish_network_connection || + fatal "Nach ${MAX_CONNECTION_ATTEMPTS} Versuchen konnte keine Verbindung zum Tuxflotte-Server hergestellt werden." store_network_state export_connection_profile