112 lines
4.7 KiB
Bash
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
|