#!/usr/bin/env bash # Erststart-Anzeige (Kunden-ISO-Test 02.10.2026, R6): nach der Installation # legt erst der erste Agent-Lauf per Ansible Benutzer und Software an. Bis # dahin zeigte der Anmeldebildschirm ein Geraet ohne nutzbaren Login. Dieses # Skript laeuft einmalig vor dem Display-Manager (tuxflotte-firstboot.service), # zeigt den Fortschritt auf einer eigenen Konsole und gibt die Anmeldung # frei, sobald der Agent seinen ersten erfolgreichen Lauf gemeldet hat # (agent.py, mark_first_success()) - spaetestens nach TIMEOUT_SECONDS, damit # ein dauerhaft scheiternder Lauf das Geraet nie blockiert. Der Agent # arbeitet danach im Hintergrund weiter. set -uo pipefail FIRST_SUCCESS_MARKER="${TUXFLOTTE_FIRST_SUCCESS_MARKER:-/var/lib/tuxflotte/agent/first-run-ok}" DONE_MARKER="${TUXFLOTTE_FIRSTBOOT_DONE_MARKER:-/var/lib/tuxflotte/firstboot-done}" STATUS_PATH="/run/tuxflotte/agent/status" TIMEOUT_SECONDS="${TUXFLOTTE_FIRSTBOOT_TIMEOUT:-1800}" VT=12 SWITCHED_VT=false finish() { mkdir -p "$(dirname "${DONE_MARKER}")" date --iso-8601=seconds > "${DONE_MARKER}" # Zurueck auf Konsole 1 (VM-Test 03.10.2026): ohne grafische Oberflaeche # (z.B. Debian-Basis-Image) blieb sonst die letzte Fortschrittsanzeige # auf Konsole 12 stehen. Mit Display-Manager uebernimmt der ohnehin. if [[ "${SWITCHED_VT}" == true ]]; then printf '\033[2J\033[H' setterm --cursor on 2>/dev/null || true chvt 1 2>/dev/null || true fi exit 0 } [[ -e "${FIRST_SUCCESS_MARKER}" ]] && finish # Ohne das bliebe der Plymouth-Bootsplash stehen und verdeckte die Konsole. if command -v plymouth >/dev/null 2>&1 && plymouth --ping 2>/dev/null; then plymouth quit fi chvt "${VT}" 2>/dev/null && SWITCHED_VT=true setterm --cursor off 2>/dev/null || true ROLES_PATH="/run/tuxflotte/agent/roles" # "k n": wie viele Schritte des laufenden Agent-Laufs schon begonnen haben # (Schritt-Zuordnung je Rolle schreibt agent.py nach ROLES_PATH). # Bewusst nur ein Zaehler statt der Ansible-Tasknamen (Kunden-ISO-Test # 03.10.2026: die waren mal englisch, mal "... abgewaehlt" - fuer die Person # vor dem Geraet nicht hilfreich). current_progress() { [[ -s "${ROLES_PATH}" ]] || return 0 journalctl -u tuxflotte-agent.service -b -o cat --no-pager 2>/dev/null | awk -v roles_file="${ROLES_PATH}" ' BEGIN { FS = "\t" while ((getline line < roles_file) > 0) { split(line, f, "\t") if (f[1] == "") continue step[f[1]] = (f[2] != "" ? f[2] : f[1]) if (!(step[f[1]] in all)) { all[step[f[1]]] = 1; total++ } } FS = " " } /Applying roles via ansible-pull/ { delete seen; n = 0 } /^TASK \[/ { name = $0; sub(/^TASK \[/, "", name); sub(/ : .*/, "", name); sub(/\].*/, "", name) if ((name in step) && !(step[name] in seen)) { seen[step[name]] = 1; n++ } } END { if (total > 0) { if (n > total) n = total; print n, total } }' } start="$(date +%s)" while true; do [[ -e "${FIRST_SUCCESS_MARKER}" ]] && break elapsed=$(( $(date +%s) - start )) if (( elapsed >= TIMEOUT_SECONDS )); then printf '\033[2J\033[H' printf '\n \033[1mTuxflotte\033[0m\n\n' printf ' Die Einrichtung ist noch nicht abgeschlossen.\n' printf ' Die Anmeldung wird jetzt trotzdem freigegeben, die Einrichtung\n' printf ' läuft im Hintergrund weiter.\n\n' printf ' Fehlen Programme oder Benutzer, bitte die Administration informieren.\n' sleep 15 break fi status="$(cat "${STATUS_PATH}" 2>/dev/null || echo "")" progress="$(current_progress)" printf '\033[2J\033[H' printf '\n \033[1mTuxflotte richtet dieses Gerät ein\033[0m\n\n' printf ' Software und Einstellungen werden installiert. Bitte das Gerät\n' printf ' eingeschaltet und mit dem Netzwerk verbunden lassen.\n' printf ' Die Anmeldung erscheint automatisch, sobald alles fertig ist.\n\n' printf ' Vergangene Zeit: %02d:%02d\n' $((elapsed / 60)) $((elapsed % 60)) case "${status}" in running) printf ' Status: Einrichtung läuft\n' ;; failed) printf ' Status: \033[1;33mein Schritt ist fehlgeschlagen, neuer Versuch in wenigen Minuten\033[0m\n' ;; *) printf ' Status: Verbindung zum Server wird hergestellt\n' ;; esac if [[ "${status}" == "running" && -n "${progress}" ]]; then read -r done_count total_count <<<"${progress}" printf ' Fortschritt: Schritt %s von %s\n' "${done_count}" "${total_count}" fi sleep 2 done finish