Files

112 lines
4.7 KiB
Bash

#!/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