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