Thomas Stallinger 8615d9fde1 Konsole: kompakte Kreisel/Haken-Anzeige statt Log-Wand + Kernel-Zeitstempel entfernt
Nutzer-Feedback (01.09.2026, echter Hardware-Test) mit mehreren
zusammenhaengenden Konsolen-UX-Punkten:

- "Die Darstellung des Abarbeitens der Skripte und Module ist noch nicht
  schön... Modul XY läuft (kreiselnde Symbole)... gründer Haken als
  erledigt" - neue run_module_quiet() (utils.sh) fuehrt ein Modul im
  Hintergrund aus, zeigt waehrenddessen einen Kreisel auf derselben Zeile,
  am Ende [OK] (gruen) oder [FEHLER] (rot) + volle mitgeschnittene Ausgabe
  bei einem Fehlschlag. Nur im echten Auto-Modus aktiv (dort fragt kein
  Modul interaktiv nach) - 40_backend.sh bleibt bewusst verbose
  (TUXFLOTTE_VERBOSE_MODULES), da dort der neue Download-Fortschrittsbalken
  sichtbar bleiben soll.
- "Bei Entpacken und schreiben des Archivs, kann man das einen
  Fortschrittsbalken... anzeigen lassen?" - curl "--silent" durch
  "--progress-bar" ersetzt (image_deploy.sh).
- "Der Kernel Zeitstempel ist für den Kunden nicht interessant, sondern
  nur verwirrend." - eigentliche Ursache war nicht der GRUB-Splash
  (separater Commit), sondern StandardOutput=journal+console im
  systemd-Unit: journald spiegelt Konsolenausgaben im kmsg-Stil mit
  monotonem "[  12.345678]"-Zeitstempel, sah aus wie ein Kernel-Log.
  Jetzt "StandardOutput/Error=console" (direkt an /dev/tty1, kein
  journald) - journalctl zeigt dadurch nur noch Dienst-Lebenszyklus-
  Meldungen, die volle Ausgabe bleibt vollstaendig in
  /var/log/tuxflotte-installer.log (bereits der dokumentierte Weg).

Zwei echte Bugs beim eigenen Boot-Test dieser Aenderung gefunden+behoben:
(1) log_module_title() gab den Titel per Command-Substitution zurueck -
lief dadurch in einer Subshell, der TUXFLOTTE_STEP_COUNT-Zaehler blieb
immer bei 1 stehen ("[1/12]" bei jedem Modul). Jetzt ueber eine globale
TUXFLOTTE_CURRENT_TITLE-Variable statt Command-Substitution.
(2) Unicode-Kreisel (⠋⠙...) und Haken (✓/✗) wurden von der
vt-Konsolenschriftart nicht abgedeckt, zeigten nur einen generischen
Ersatz-Kasten - auf reines ASCII (|/-\, "[OK]"/"[FEHLER]") umgestellt,
garantiert auf jeder Konsolenschriftart lesbar.

Ausserdem: Beep + "Stick jetzt entfernen"-Hinweis + ENTER-Bestaetigung
(oder automatischer Neustart nach 5 Minuten) direkt vor dem finalen
Reboot in backend.sh (separater Commit, siehe backend_postinstall()).

Live in QEMU boot-getestet (Zaehler/Farben/Kreisel im Rohlog verifiziert,
kompletter Auto-Modus-Durchlauf inkl. Fehlerfall-Dump getestet, voller
End-to-End-Durchlauf bis zum echten Mint-Cinnamon-Login-Bildschirm nach
Reboot bestaetigt).
2026-09-01 15:46:18 +02:00

146 lines
5.4 KiB
Bash

#!/usr/bin/env bash
log_info() {
echo "[INFO ] $*"
}
log_warn() {
echo "[WARN ] $*" >&2
}
log_error() {
echo "[ERROR] $*" >&2
}
log_success() {
echo "[ OK ] $*"
}
# Live gefunden (01.09.2026, echter Hardware-Test): "[[ -t 1 ]]" ist auf
# der echten Konsole IMMER falsch, weil boot-autostart.sh installer.sh
# grundsaetzlich durch "| tee -a logfile" schickt (fuer die persistente
# Logdatei, siehe Phase 2) - installer.sh selbst schreibt deshalb nie
# direkt auf ein tty, sondern immer in eine Pipe. Ergebnis: die geplante
# Fettschrift/Farb-Hervorhebung war auf dem echten Geraet nie aktiv, ganz
# unabhaengig vom Terminal, das der Kunde tatsaechlich vor sich hat.
# boot-autostart.sh prueft "[[ -t 1 ]]" deshalb VOR dem Aufbau dieser Pipe
# (an der Stelle noch zuverlaessig) und exportiert das Ergebnis als
# TUXFLOTTE_TTY_LIVE - hier nur noch auswerten, mit "-t 1" als Fallback
# fuer direkte, nicht ueber boot-autostart.sh gestartete Läufe (z.B.
# manuelles Testen von installer.sh per SSH).
_tuxflotte_console_is_live() {
if [[ -n "${TUXFLOTTE_TTY_LIVE:-}" ]]; then
[[ "${TUXFLOTTE_TTY_LIVE}" == true ]]
else
[[ -t 1 ]]
fi
}
# Klar abgesetzte Fortschrittsanzeige fuer die tty-Konsole des Boot-Mediums
# (kein Desktop, kein Kiosk-Browser - die Terminal-Ausgabe selbst ist die
# einzige UI, die eine Person vor dem Geraet sieht). Gilt fuer Dev- UND
# Produktiv-Build gleichermassen, nicht nur zum Debuggen - siehe Plan
# "Klare Fortschrittsanzeige auf der Konsole". Format/Stil bewusst an die
# bestehenden Banner in 17_device_status.sh angelehnt (Titel + "="-Linie
# gleicher Laenge, keine Sonderzeichen, die auf einer rohen VT-Konsole
# fehlen koennten).
declare -A TUXFLOTTE_STEP_LABELS=(
[00_preflight.sh]="Vorbereitung"
[05_network.sh]="Netzwerkverbindung wird hergestellt"
[10_hardware.sh]="Hardware wird erkannt"
[12_enrollment_auth.sh]="Aktivierungscode wird geprüft"
[15_server_handshake.sh]="Verbindung zu anode wird hergestellt"
[17_device_status.sh]="Gerätestatus wird abgerufen"
[20_profile_selection.sh]="Bereitstellungsvorlage wird ausgewählt"
[25_installation_confirm.sh]="Installationsbestätigung"
[30_runtime_blueprint.sh]="Installationsplan wird aufgelöst"
[40_backend.sh]="Golden Image wird geladen und installiert"
[20_storage.sh]="Speicher-Zusatzprüfung"
[99_finish.sh]="Abschluss"
)
readonly -a TUXFLOTTE_STEP_ORDER=(
00_preflight.sh 05_network.sh 10_hardware.sh 12_enrollment_auth.sh
15_server_handshake.sh 17_device_status.sh 20_profile_selection.sh
25_installation_confirm.sh 30_runtime_blueprint.sh 40_backend.sh
20_storage.sh 99_finish.sh
)
TUXFLOTTE_STEP_COUNT=0
log_step() {
local module_name="$1"
local label="${TUXFLOTTE_STEP_LABELS[$module_name]:-$module_name}"
local total="${#TUXFLOTTE_STEP_ORDER[@]}"
local bold="" reset=""
TUXFLOTTE_STEP_COUNT=$((TUXFLOTTE_STEP_COUNT + 1))
# Klartext-Fallback ohne Terminal (z.B. wenn stdout in eine Log-Datei
# umgeleitet wird) - kein tput-Aufruf, ncurses-bin ist bewusst nicht Teil
# des schlanken Paketsatzes, rohe ANSI-Codes reichen und sind ueberall
# ohne Zusatzpaket verfuegbar.
if _tuxflotte_console_is_live; then
bold=$'\033[1m'
reset=$'\033[0m'
fi
local title
title="[${TUXFLOTTE_STEP_COUNT}/${total}] ${label}"
printf '\n%s%s%s\n' "${bold}" "${title}" "${reset}"
printf '%s\n\n' "$(printf '=%.0s' $(seq 1 ${#title}))"
}
# Kompakte Alternative zu log_step() fuer den unbeaufsichtigten
# Auto-Modus (echte Kunden-Installation, siehe run_module_quiet() in
# utils.sh). Live-Rueckmeldung des Nutzers (01.09.2026) nach dem ersten
# erfolgreichen Hardware-Test: die bisherige Fülle an [INFO]/[WARN]-Zeilen
# je Modul ist "nicht schön für das menschliche Auge" - Vorschlag:
# ein Kreisel waehrend ein Modul laeuft, ein gruener Haken wenn fertig,
# Details nur bei einem Fehlschlag. Ein einziges Ergebnis pro Modul statt
# einer ganzen Log-Wand ist genau das ("dann sind es nicht soviel
# Zeichen").
# Reines ASCII statt Unicode-Braille/Haken-Zeichen (⠋⠙.../✓/✗): live gefunden
# (01.09.2026, QEMU-Regressionstest) - die vt-Konsolenschriftart des
# Boot-Mediums deckt diese Codepoints nicht ab, gerendert wurde nur ein
# generischer Ersatz-Kasten statt eines Haekchens. ASCII-Zeichen sind auf
# jeder Konsolenschriftart garantiert vorhanden, unabhaengig von Hardware/
# Zeichensatz.
_TUXFLOTTE_SPINNER_FRAMES=(\| / - \\)
# Setzt TUXFLOTTE_CURRENT_TITLE statt den Titel per "echo"+Command-
# Substitution zurueckzugeben - Command-Substitution laeuft in einer
# Subshell, deren Variablenaenderungen (hier: der TUXFLOTTE_STEP_COUNT-
# Zaehler) beim Verlassen verloren gehen. Live gefunden (01.09.2026, QEMU-
# Regressionstest): mit "title=\"\$(log_module_title ...)\"" blieb der
# Zaehler wegen genau dieser Subshell dauerhaft bei 1 stehen ("[1/12]" bei
# jedem Modul statt hochzuzaehlen).
log_module_title() {
local module_name="$1"
local label="${TUXFLOTTE_STEP_LABELS[$module_name]:-$module_name}"
local total="${#TUXFLOTTE_STEP_ORDER[@]}"
TUXFLOTTE_STEP_COUNT=$((TUXFLOTTE_STEP_COUNT + 1))
TUXFLOTTE_CURRENT_TITLE="[${TUXFLOTTE_STEP_COUNT}/${total}] ${label}"
}
log_module_ok() {
local title="$1"
if _tuxflotte_console_is_live; then
printf '\r%s \033[1;32m[OK]\033[0m\n' "${title}"
else
printf '%s [OK]\n' "${title}"
fi
}
log_module_failed() {
local title="$1"
if _tuxflotte_console_is_live; then
printf '\r%s \033[1;31m[FEHLER]\033[0m\n' "${title}"
else
printf '%s [FEHLER]\n' "${title}"
fi
}