tuxflotte-installer/scripts/build_boot_medium.sh
Thomas Stallinger bc13169418 feat(boot-medium): systemd-Autostart, Fortschrittsanzeige, SSH-Dev-Modus (Phase 2)
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.
2026-08-31 14:40:39 +02:00

80 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
# Baut das eigenstaendige Tuxflotte-Boot-Medium (Debian trixie, per
# Debian-live-build) - siehe Plan ~/.claude/plans/inherited-floating-treasure.md
# und Memory project_independent_boot_medium.md.
#
# Ersetzt langfristig scripts/build.sh/build_customer_iso.sh (Casper-Patchen
# einer echten Linux-Mint-Live-ISO): dieses Boot-Medium enthaelt nur
# Tuxflottes eigenen, headless-tauglichen Code (Module 00-40,
# backends/mint-image/) und beruehrt niemals Ubiquity/Casper/eine
# Distributions-Live-Session - macht die Bug-Klasse, die zu dieser
# Architektur gefuehrt hat (siehe Memory-Datei), strukturell unmoeglich.
#
# --dev aktiviert einen SSH-Debug-Zugang (Testzugang tuxflotte/test123,
# analog bestehender Test-Fixtures wie WLAN-Test-Org) - ohne --dev bleibt
# SSH deaktiviert, keine gebackenen Zugangsdaten (Produktiv-Default,
# konsistent damit, dass auch das Golden Image selbst keine Zugangsdaten
# enthaelt). Siehe boot-medium/config/hooks/live/0900-tuxflotte-ssh-mode.hook.chroot.
usage() {
echo "Usage: $0 [--dev]" >&2
echo " --dev SSH-Debug-Zugang aktivieren (tuxflotte/test123)" >&2
}
DEV_BUILD=false
for arg in "$@"; do
case "$arg" in
--dev) DEV_BUILD=true ;;
-h|--help) usage; exit 0 ;;
*) echo "Error: Unbekannter Parameter: $arg" >&2; usage; exit 1 ;;
esac
done
if [[ "${EUID}" -ne 0 ]]; then
echo "Error: muss als root laufen (live-build braucht root fuer chroot/mount)." >&2
exit 1
fi
for cmd in lb; do
command -v "${cmd}" >/dev/null 2>&1 ||
{ echo "Error: fehlendes Werkzeug: ${cmd} (apt-get install live-build)" >&2; exit 1; }
done
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BOOT_MEDIUM_DIR="${REPO_DIR}/boot-medium"
DEV_MARKER="${BOOT_MEDIUM_DIR}/config/includes.chroot/etc/tuxflotte-dev-build"
[[ -d "${BOOT_MEDIUM_DIR}/config" ]] ||
{ echo "Error: ${BOOT_MEDIUM_DIR}/config fehlt - lb config wurde noch nie ausgefuehrt." >&2; exit 1; }
cd "${BOOT_MEDIUM_DIR}"
if [[ "${DEV_BUILD}" == true ]]; then
echo "==> Dev-Build: SSH-Debug-Zugang wird aktiviert (tuxflotte/test123)."
mkdir -p "$(dirname "${DEV_MARKER}")"
touch "${DEV_MARKER}"
else
echo "==> Produktiv-Build: SSH bleibt deaktiviert."
rm -f "${DEV_MARKER}"
fi
echo "==> lb clean"
lb clean
echo "==> lb config"
lb config \
--distribution trixie \
--architectures amd64 \
--archive-areas "main contrib non-free non-free-firmware" \
--binary-images iso-hybrid \
--bootloaders "grub-efi,syslinux" \
--debian-installer none \
--bootappend-live "boot=live components quiet splash vconsole.keymap=de"
echo "==> lb build"
lb build
echo "==> Boot-Medium gebaut: ${BOOT_MEDIUM_DIR}/live-image-amd64.hybrid.iso"