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.
This commit is contained in:
Thomas Stallinger 2026-09-01 10:52:25 +02:00
parent 0874c2fd0f
commit ebd827ee2f
2 changed files with 120 additions and 46 deletions

View File

@ -22,6 +22,15 @@ readonly CONNECTION_EXPORT="${RUNTIME_DIR}/connection.nmconnection"
readonly SERVER_URL="${TUXFLOTTE_SERVER_URL:-https://anode.tuxflotte.de/health}" readonly SERVER_URL="${TUXFLOTTE_SERVER_URL:-https://anode.tuxflotte.de/health}"
readonly SERVER_TIMEOUT="${TUXFLOTTE_SERVER_TIMEOUT:-10}" 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 NMCLI="${NMCLI:-nmcli}"
readonly CURL="${CURL:-curl}" readonly CURL="${CURL:-curl}"
@ -500,6 +509,55 @@ export_connection_profile() {
log "Aktives Verbindungsprofil wurde geschützt vorgemerkt." 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() { main() {
require_root require_root
require_command "${NMCLI}" require_command "${NMCLI}"
@ -511,29 +569,8 @@ main() {
log "Prüfe vorhandene Netzwerkverbindungen." log "Prüfe vorhandene Netzwerkverbindungen."
if check_existing_connection; then establish_network_connection ||
: fatal "Nach ${MAX_CONNECTION_ATTEMPTS} Versuchen konnte keine Verbindung zum Tuxflotte-Server hergestellt werden."
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
store_network_state store_network_state
export_connection_profile export_connection_profile

View File

@ -22,6 +22,15 @@ readonly CONNECTION_EXPORT="${RUNTIME_DIR}/connection.nmconnection"
readonly SERVER_URL="${TUXFLOTTE_SERVER_URL:-https://anode.tuxflotte.de/health}" readonly SERVER_URL="${TUXFLOTTE_SERVER_URL:-https://anode.tuxflotte.de/health}"
readonly SERVER_TIMEOUT="${TUXFLOTTE_SERVER_TIMEOUT:-10}" 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 NMCLI="${NMCLI:-nmcli}"
readonly CURL="${CURL:-curl}" readonly CURL="${CURL:-curl}"
@ -500,6 +509,55 @@ export_connection_profile() {
log "Aktives Verbindungsprofil wurde geschützt vorgemerkt." 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() { main() {
require_root require_root
require_command "${NMCLI}" require_command "${NMCLI}"
@ -511,29 +569,8 @@ main() {
log "Prüfe vorhandene Netzwerkverbindungen." log "Prüfe vorhandene Netzwerkverbindungen."
if check_existing_connection; then establish_network_connection ||
: fatal "Nach ${MAX_CONNECTION_ATTEMPTS} Versuchen konnte keine Verbindung zum Tuxflotte-Server hergestellt werden."
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
store_network_state store_network_state
export_connection_profile export_connection_profile