Neuer Service tuxflotte-installer.service startet installer.sh beim Boot direkt auf tty1 (Type=idle, Conflicts=getty@tty1.service) - kein manuelles Anmelden/sudo mehr noetig, egal ob Auto-Modus oder interaktiver Test-/Entwicklungslauf. Wrapper boot-autostart.sh spiegelt die Ausgabe zusaetzlich nach /var/log/tuxflotte-installer.log. log_step() (scripts/lib/logging.sh) gibt vor jedem Modul einen klar abgesetzten "[n/12] <Label>"-Block aus - gilt fuer Dev- UND Produktiv-Build gleichermassen (die tty-Konsole ist die einzige UI, die eine Person vor dem Geraet sieht, kein Kiosk-Browser mehr). scripts/build_boot_medium.sh buendelt lb clean/config/build (loeste die bisherigen Hand-Aufrufe ab) und steuert per --dev-Flag einen SSH- Debug-Zugang (tuxflotte/test123) - ohne --dev bleibt SSH deaktiviert, keine gebackenen Zugangsdaten (Produktiv-Default). Zwei echte, live gefundene Bugs unterwegs behoben: - Debians trixie-sshd_config deaktiviert PasswordAuthentication per Default - fuer den Dev-Testzugang explizit wieder aktiviert. - Ein ExecStopPost, der getty@tty1.service nach Dienstende neu startet, ist unzuverlaessig (Race mit dem eigenen TTY-Teardown, Job wurde angestossen, blieb aber inactive/dead). Geloest durch einen deterministischen Fallback in boot-autostart.sh selbst: die Konsole faellt nach installer.sh in eine interaktive Shell statt auf einen eventuell nie zurueckkehrenden getty zu warten. Live verifiziert in der enterprise-QEMU-VM (zwei frische Enrollment- Sessions, echte anode-Aktivierung, "Bekanntes Geraet erkannt"-Pfad): Boot laeuft ohne jede manuelle Anmeldung direkt in installer.sh, alle 12 Fortschritts-Banner erscheinen korrekt nummeriert, Commit-Gate und kontrollierter Abbruch funktionieren, SSH-Login mit Passwort funktioniert, Fallback-Shell nach Programmende reagiert auf Eingaben.
42 lines
899 B
Bash
42 lines
899 B
Bash
#!/usr/bin/env bash
|
|
|
|
load_config() {
|
|
local config_file="$1"
|
|
|
|
if [[ -f "$config_file" ]]; then
|
|
# shellcheck disable=SC1090
|
|
source "$config_file"
|
|
log_info "Konfiguration geladen: $config_file"
|
|
else
|
|
log_warn "Keine Konfiguration gefunden: $config_file"
|
|
fi
|
|
}
|
|
|
|
run_module() {
|
|
local module="$1"
|
|
local mode="${2:-normal}"
|
|
|
|
[[ -f "$module" ]] || error_exit "Modul nicht gefunden: $module"
|
|
|
|
log_step "$(basename "$module")"
|
|
log_info "Starte Modul: $(basename "$module")"
|
|
|
|
if [[ "${DRY_RUN:-false}" == true && "$mode" != "always" ]]; then
|
|
log_warn "Dry-Run: Modul übersprungen: $module"
|
|
return 0
|
|
fi
|
|
|
|
# shellcheck disable=SC1090
|
|
"$module"
|
|
|
|
log_success "Modul abgeschlossen: $(basename "$module")"
|
|
}
|
|
|
|
require_root() {
|
|
[[ "$EUID" -eq 0 ]] || error_exit "Installer muss als root ausgeführt werden."
|
|
}
|
|
|
|
command_exists() {
|
|
command -v "$1" >/dev/null 2>&1
|
|
}
|