134 Commits
Author SHA1 Message Date
adminandClaude Opus 5.5 fbfc394747 Fingerprint-Datei nur für root, Bootstrap mit Fingerprint als Nachweis
Credentials und Fingerprint mit umask 077 angelegt (kein kurzes
Lesefenster vor dem chmod). platform-docs roadmap/agent-zugang-haertung.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 21:17:28 +01:00
adminandClaude Opus 5.5 eaa6bce003 Installer: Setup Mode und Drittanbieter-CA erfassen, Abbruch wenn Vorlage Secure Boot verlangt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 18:47:06 +01:00
adminandClaude Opus 5.5 3f841f0801 Installer: GRUB_DISTRIBUTOR=Tuxflotte vor grub-install, Firmware-Eintrag heißt Tuxflotte
Damit landen spätere shim-/GRUB-Updates in EFI/tuxflotte, das die
Firmware startet (vorher EFI/ubuntu bzw. EFI/debian).
roadmap/secure-boot-verschluesselung.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 18:05:43 +01:00
adminandClaude Opus 5.5 f5f14888c3 postinstall: Mint-Systembericht (mintreport) im Autostart abschalten
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 09:25:02 +01:00
adminandClaude Opus 5.5 26bc65f6ff postinstall: Agent nach dem Bootstrap von anode laden (ADR-0046 Schritt 3), Gitea als Rückfall
Fassung "freigegeben" der Ausrollstufe, Secret per curl --header @datei
(0600, per trap gelöscht) statt auf der Kommandozeile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 09:52:50 +02:00
adminandClaude Opus 5.5 4929a37175 Fedora-Installer-Versuche archivieren (Tag archiv/fedora-versuche) und aus main entfernen
Nicht mehr genutzt seit dem eigenen Boot-Medium (ADR-0025). Die Testdateien
enthielten u. a. ein WLAN-Passwort im Klartext; es bleibt in der Historie,
die Abhilfe ist ein Passwortwechsel, nicht dieses Entfernen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:58:42 +02:00
adminandClaude Opus 5.5 cee4fe58ad Golden Image und Installer: xattrs inkl. security.* (Datei-Capabilities)
GNU tar uebernimmt beim Auspacken ohne --xattrs-include nur user.*;
security.capability (cap_net_raw an ping u.a.) ging beim Staging-Auspacken
in package_golden_image.sh verloren, image_deploy.sh entpackte zudem ganz
ohne --xattrs. Befund Liebherr-83 15.10.2026 (ping fuer Benutzer kaputt).
Rundlauf mit setcap/tar im User-Namespace geprueft. Wirkt erst mit neu
gepackten Golden Images und neuem Boot-Medium; bestehende Geraete repariert
ansible-content grundsystem.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
archiv/fedora-versuche
2026-10-15 14:05:40 +02:00
adminandClaude Opus 5.5 e7edef06b6 Org-WLAN vom Medium immer systemweit ins Zielsystem schreiben
Bisher kam das Org-WLAN (TUXFLOTTE_WIFI_SSID/-PSK) nur aufs Geraet, wenn
ueber genau dieses WLAN installiert wurde - export_connection_profile()
uebernimmt nur das aktive Profil. Per Kabel installierte Geraete hatten
kein WLAN (Liebherr-83, 14.10.2026). Jetzt immer
tuxflotte-installations-wlan.nmconnection per nmcli --offline, ohne
permissions, PSK in der Datei; Doppel mit dem exportierten Profil wird
entfernt. Eigener Dateiname, damit der absent-Zweig der Rolle org-wlan
ihn nicht loescht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:30:30 +02:00
adminandClaude Opus 5.5 decc7404a8 image_deploy: resolv.conf des Golden Image nach der chroot-Phase wiederherstellen
Der Symlink wurde fuer die chroot-Phase durch eine Kopie der resolv.conf
des Installationsnetzes ersetzt und nie zurueckgesetzt. Installierte
Geraete verloren dadurch nach einem Ortswechsel die Namensaufloesung
(Liebherr-83, 14.10.2026: Agent "Name or service not known"). Jetzt
Symlink-Ziel bzw. Datei sichern und in image_deploy_unbind_mounts()
zurueckspielen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:01:17 +02:00
adminandClaude Opus 5.5 5857a6b939 image_deploy: 127.0.1.1-Zeile des Golden Image ersetzen statt eine zweite anzuhängen
Im installierten System stand neben dem vergebenen Namen noch der der
Referenz-VM in /etc/hosts (Befund 13.10.2026, VM 107).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:16:15 +02:00
adminandClaude Opus 5.5 703d8c6c9f build_customer_iso: Kundendaten als eigene Squashfs-Schicht, ohne root
Statt filesystem.squashfs als root zu entpacken und neu zu packen, kommt
installer.conf in eine kleine Schicht /live/tuxflotte-kunde.squashfs
(live-boot legt alle /live/*.squashfs alphabetisch uebereinander).
mksquashfs -all-root braucht kein root; Bau in Sekunden statt ~1 Minute,
kein GB-Arbeitsplatz mehr. installer.conf (WLAN-PSK) im Live-System jetzt
600 statt 644. Lokal-Test-Pruefung ueber die Dateiliste. Behebt nebenbei
einen set -e-Abbruch, wenn weder Diagnose-Hash noch WLAN gesetzt waren.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 16:19:42 +02:00
adminandClaude Opus 5.5 12f4de3bf1 Geraete-Fingerabdruck: feste Hardware-MAC (permaddr) statt aktueller - WLAN-MAC-Randomisierung im Live-System erzeugte neue Geraeteeintraege
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 13:54:09 +02:00
adminandClaude Opus 5.5 f804db8a33 isolinux: langen Vorlagennamen sauber kuerzen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 13:21:15 +02:00
adminandClaude Opus 5.5 437bdc79df Abbruch sauber (kein ERR-Trap im Auto-Modus), statt root-Shell Neustart per ENTER (Produktiv), isolinux-Menue deutsch (VM-Tests T3/T4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 13:13:45 +02:00
adminandClaude Opus 5.5 e494b5835b Postinstall: gnome-initial-setup global maskieren + Erledigt-Marker in /etc/skel (Ubuntu, VM-Test T2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 12:58:36 +02:00
adminandClaude Opus 5.5 29adae9591 Installer-Konsole: Info-/Warnzeilen im Auto-Modus nur ins Log, GRUB-Fusszeile deutsch, Abschlusskasten wie frueher Hinweis (VM-Test T1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 12:45:01 +02:00
adminandClaude Opus 5.5 580a075224 Hybrid-Grafik: nouveau abschalten + NVIDIA-Energiesparen bei der Installation (B11)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 12:23:11 +02:00
adminandClaude Opus 5.5 38ca3ab5ab Medium-Endstand: Publish-Schritt mit Versionskennung, Vorabpruefung, USB-Ausschluss bei der Zielplatte, Offline-Medium, Neuinstallation ohne Rueckfrage, toram-Reserve, Platzpruefung
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 12:17:31 +02:00
adminandClaude Opus 5.5 030401f800 build_customer_iso.sh: Arbeitsverzeichnis auf anodes Datenplatte (B5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 12:06:46 +02:00
adminandClaude Opus 5.5 b6151172b8 Fruehzeitiger Hinweis: Installationsmedium kann direkt nach dem Start zum naechsten Geraet (toram)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 11:23:51 +02:00
adminandClaude Opus 5.5 b118ede089 Serielle Konsole nur in Testbuilds, Abzieh-Hinweis als Kasten, Willkommensfenster deaktiviert (Kunden-ISO-Test R11/R12/R15)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:24:42 +02:00
adminandClaude Opus 5.5 f073db76c1 Installationsablauf: GRUB-Logo/-Menue, toram-Fortschritt, sichtbare Teilschritte, Abzieh-Hinweis, Erststart-Anzeige (Kunden-ISO-Test R1-R6, R10)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 09:42:52 +02:00
adminandClaude Opus 5.5 995895fbc1 Diagnosezugang pro Organisation + Geheimnisse per stdin an build_customer_iso.sh (ADR-0035)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:18:26 +02:00
adminandClaude Sonnet 5 9296e54407 Fix: Ethernet-Interface-Namensfix wurde faelschlich auch fuer WLAN angewendet
Bare-Metal-Fund (21.09.2026) - das war die eigentliche, finale Ursache der
WLAN-Persistenz-Bugkette von heute: image_deploy_fix_network_interface_name()
war urspruenglich nur fuer den ens18(Referenz-VM)-vs-echte-Hardware-Namen-
Mismatch gedacht, prüfte aber nicht, ob das tatsaechliche Provisionierungs-
interface ueberhaupt Ethernet war. Bei einer WLAN-Provisionierung ersetzte
die Funktion den hartcodierten Ethernet-Namen in /etc/network/interfaces
durch den WLAN-Interface-Namen (z.B. wlp9s0) - mit zwei Folgen: (1)
ifupdowns simples "iface X inet dhcp" kann WPA/WPA2 gar nicht aushandeln,
(2) NetworkManagers ifupdown-Plugin (managed=false) markierte das WLAN-
Interface dadurch dauerhaft als "unmanaged", wodurch das eigentlich korrekt
exportierte/kopierte WLAN-Profil (05_network.sh) nie zum Einsatz kam.

Live auf betroffener Bare-Metal-Hardware verifiziert: Entfernen der
fehlerhaften ifupdown-Zeile + NetworkManager-Neustart aktivierte das
gespeicherte WLAN-Profil sofort, Agent-Checkin lief direkt danach durch.

Jetzt per TUXFLOTTE_NETWORK_TYPE-Pruefung auf Ethernet beschraenkt - WLAN
wird bereits vollstaendig ueber das NetworkManager-Keyfile-Profil abgedeckt,
braucht diesen Fix nicht.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 19:25:14 +02:00
adminandClaude Sonnet 5 4cffaf4753 Temporaerer root-SSH-Zugang im installierten System fuer Lokal-Test-Deployments
Bare-Metal-WLAN-Debugging (21.09.2026): das installierte Zielsystem hat nach
ADR-0026 kein Benutzerkonto und kein bekanntes Passwort - Fehlersuche direkt
nach dem ersten Boot war deshalb nur per Offline-Mount der Zielplatte
moeglich. Analog zum --dev-Mechanismus des Boot-Mediums jetzt root/12345 per
SSH erreichbar, aber NUR wenn ANODE_URL auf einen Lokal-Test-Build hindeutet
(http://, nicht https:// wie im Produktivpfad) - der Produktivpfad bleibt
unveraendert ohne jeden bekannten Zugang.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 19:00:03 +02:00
adminandClaude Sonnet 5 c158961388 Fix (2. Anlauf): WLAN-Profil-Export - FILENAME ist eine Listen-, keine Detail-Spalte
Der erste Fix (cb2cc3b, "GENERAL.FILENAME") war ebenfalls falsch - empirisch
mit echtem nmcli auf VM 107 geprueft: nmcli lehnt "GENERAL.FILENAME" fuer
die Detailansicht ("connection show <name>") explizit als ungueltiges Feld
ab, genau wie zuvor "connection.filename". FILENAME existiert nur als
Spalte der LISTEN-Ansicht ("nmcli connection show" ohne Namensargument,
alle Verbindungen) - jetzt korrekt darueber gefiltert statt ein
nicht-existentes Detail-Feld abzufragen.

Empirisch verifiziert (VM 107, echtes nmcli):
- Testweise angelegtes WLAN-Profil: FILENAME zeigt korrekt auf
  /etc/NetworkManager/system-connections/test-wifi.nmconnection
- Echte aktive Ethernet-Verbindung: FILENAME zeigt auf
  /run/NetworkManager/system-connections/... (nicht persistent, harmlos -
  bestaetigt gleichzeitig, dass die bisherige Warnung fuer
  automatisch erzeugte Ethernet-Profile OHNE explizites Speichern korrekt
  und erwartet ist, nur WLAN-Profile muessen tatsaechlich exportiert werden)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 17:53:46 +02:00
adminandClaude Sonnet 5 cb2cc3b221 Fix: WLAN-Persistenz war seit Einfuehrung nie funktionsfaehig (falsches nmcli-Feld)
Bare-Metal-Fund (21.09.2026, Mint+Ubuntu): frisch installierte Geraete
hatten nach dem ersten Reboot keine WLAN-Verbindung mehr - Agent konnte sich
dadurch nie melden (bestaetigt: agent/bootstrap lief, aber niemals ein
agent/checkin danach). Ursache: export_connection_profile() fragte
"connection.filename" ab - das ist kein gueltiges nmcli-Feld (gehoert zur
connection.*-Eigenschaftsgruppe, die den Dateipfad nicht kennt), lieferte
deshalb IMMER eine leere Zeile. Der tatsaechliche Pfad steht im
laufzeitbezogenen GENERAL-Abschnitt (GENERAL.FILENAME). Die "WARNUNG:
NetworkManager-Profil konnte nicht exportiert werden."-Zeile erschien
seitdem (01.09.2026) bei JEDEM Testlauf, wurde aber bisher als harmlos
abgetan statt als eigentliche Ursache erkannt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 17:09:39 +02:00
adminandClaude Sonnet 5 7922a77a3b Regressionsfix: serielle Installer-Konsole faelschlich an --local-test-anode-url gekoppelt
Bare-Metal-Fund (21.09.2026, unmittelbar nach dem letzten Fix): die
ttyS0-Umleitung aus Commit 23edd3a war an --local-test-anode-url gebunden -
aber dieses Flag steht sowohl fuer die serielle Proxmox-Testumgebung (VM 107,
kein Bildschirm) als auch fuer Bare-Metal-Tests mit echtem Monitor. Auf
echter Hardware blieb dadurch tty1 von tuxflotte-installer.service
unbeeinflusst (Conflicts zeigte jetzt auf serial-getty@ttyS0 statt
getty@tty1) - der Anwender sah nur noch live-configs Standard-Autologin-
Loop auf dem Bildschirm, waehrend der eigentliche Installer unbeobachtet
auf ttyS0 lief. Neues eigenstaendiges Flag --serial-installer-console
entkoppelt das sauber - NUR fuer die VM-107-Testumgebung gedacht, Bare-Metal-
Tests bleiben wie vorgesehen auf tty1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 13:53:35 +02:00
adminandClaude Sonnet 5 4252db20fd Lokal-Test-Builds: SSH+root/12345 automatisch aktivieren (kein separates --dev noetig)
Bare-Metal-Runde 21.09.2026: haendisches ssh.service-Unmasking+root-Passwort-
Setzen live an der Konsole hat die Fehlersuche direkt beschleunigt (SSH statt
serieller/lokaler Konsole mit US-Layout auf physischer Hardware). Jetzt fest
im Dev-Build-Hook: root/12345 zusaetzlich zu tuxflotte/test123, PermitRootLogin
aktiviert. --local-test-anode-url impliziert automatisch --dev, da diese
Builds per Definition reine Testartefakte sind (build_customer_iso.sh bricht
ohnehin ab, falls lokale Test-Spuren im Quell-Image gefunden werden) - kein
Risiko, dass das in eine echte Kunden-ISO durchsickert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 13:32:03 +02:00
adminandClaude Sonnet 5 9a40236df3 Fix: Ethernet-Kabel wird ignoriert, wenn Link-Verhandlung noch laeuft
Bare-Metal-Fund (21.09.2026): get_ethernet_devices() filtert Interfaces mit
NM-Status "unavailable" heraus - direkt nach dem Boot kann das noch bis zu
ein paar Sekunden dauern, bis die Link-Verhandlung mit Switch/Router
abgeschlossen ist. Da establish_network_connection() sofort erfolgreich
zurueckkehrt, sobald der Anwender WLAN-Zugangsdaten eingibt, bekam Ethernet
nie eine zweite Chance. try_ethernet() bekommt jetzt ein kurzes,
eigenstaendiges Nachfass-Fenster (4 Versuche a 2s) bevor auf die
interaktive WLAN-Abfrage zurueckgefallen wird.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 13:21:40 +02:00
adminandClaude Sonnet 5 16a0494f44 Fix: verwirrende Doppel-Fehlermeldung + unklarer WLAN-PSK-Prompt
Bare-Metal-Test (21.09.2026, Debian) fand zwei echte UX-Bugs:

- run_module() im normalen (nicht-Auto-)Modus rief das Modul nackt auf
  ("$module" ohne ||-Absicherung) - ein sauberer, bereits klar gemeldeter
  fatal()-Fehlschlag im Modul loeste zusaetzlich den generischen ERR-Trap
  aus errors.sh aus ("Unerwarteter Fehler in Zeile 199"), obwohl der
  eigentliche Grund eine Zeile darueber schon klar stand. Jetzt wird der
  Exit-Code abgefangen und sauber weitergereicht, kein zweiter,
  verwirrender Fehler mehr.
- connect_wifi() nutzte "nmcli --ask", dessen generischer "Password:"-
  Prompt keinen Bezug zur gewaehlten SSID hatte - fuer den Anwender nicht
  eindeutig, was genau erwartet wird. Eigener Prompt mit SSID-Bezug und
  Doppelpunkt, Passwort direkt per "password" statt "--ask" uebergeben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 13:00:10 +02:00
adminandClaude Sonnet 5 23edd3a6db Serielle Konsole fuer Proxmox-Testumgebung: GRUB dauerhaft, Installer-Phase nur im Lokal-Test-Build
Golden Image bekommt permanent GRUB_TERMINAL=serial (harmlos ohne
seriellen Port, Voraussetzung fuer qm-terminal-Verifikation ohne
Passwort-Reset-Umweg). Die tty1-gebundene Installer-Phase wird nur bei
--local-test-anode-url auf ttyS0 umgebogen, ueber einen Trap immer wieder
auf den Produktivstand zurueckgesetzt, damit ein Produktiv-Build nie
versehentlich die Testvariante ausliefert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-21 11:55:44 +02:00
adminandClaude Sonnet 5 7e21f45fb7 Fix: fehlendes flatpak im Golden Image blockierte mehrere App-Merkmale
Live gefunden (19.09.2026, direkt im Anschluss an den git-Fix, gleicher
QEMU-Testlauf): "Executable 'flatpak' was not found on the system" -
sechs Rollen (brave/onlyoffice/libreoffice/gdevelop/turbowarp/auto-update)
nutzen das community.general.flatpak-Modul, ohne selbst sicherzustellen,
dass flatpak ueberhaupt installiert ist. Auf Mint/Ubuntu bisher
unauffaellig (dort vermutlich schon im Golden Image vorhanden), auf dem
neuen schlanken Debian-Backend fehlte es komplett - ein fataler
Task-Fehler blockierte wieder den gesamten restlichen ansible-pull-Lauf.

flatpak zur bestehenden jq/curl/python3/ansible/git-Absicherung in
backend_postinstall() ergaenzt (alle drei Backends).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 19:28:45 +02:00
adminandClaude Sonnet 5 891d5d16c3 Fix: fehlendes git im Golden Image blockierte jeden ansible-pull-Lauf
Live gefunden (19.09.2026, direkt nach dem Netzwerk-Interface-Fix - erster
Testlauf mit tatsaechlich erfolgreichem Agent-Checkin): "Failed to find
required executable 'git' in paths: ...". Netzwerk und Checkin liefen
korrekt, aber OHNE git konnte ansible-pull nie ein einziges Merkmal
anwenden - das ansible-Debian-Paket zieht git nicht zwingend als
Abhaengigkeit, und package_golden_image.sh's Bereinigung hatte es aus dem
Golden Image entfernt.

git zur bestehenden jq/curl/python3/ansible-Nachinstallations-Pruefung in
backend_postinstall() ergaenzt (alle drei Backends).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 18:48:48 +02:00
adminandClaude Sonnet 5 c2c553b94e Fix: hartcodierten Netzwerk-Interface-Namen im Golden Image beim Deployment korrigieren
Live gefunden (19.09.2026, erster QEMU-E2E-Testlauf, Debian): Der Agent
checkte nach dem Reboot nie ein, weil das Golden Image ein statisches
/etc/network/interfaces (ifupdown) mit dem Interface-Namen der Proxmox-
Referenz-VM ("ens18") mitbringt - auf der QEMU-Testhardware heisst das
Interface "ens3", auf echten Rechnern waere es z.B. "enp2s0"/"eno1". Das
Zielsystem bekam dadurch nie eine IP-Adresse.

image_deploy_fix_network_interface_name() ersetzt den hartcodierten Namen
durch den tatsaechlich erkannten (aus /run/tuxflotte/network/state.env,
von 05_network.sh bereits zuverlaessig ermittelt - Live-Medium und
Zielsystem laufen zwangslaeufig auf derselben Hardware, der Name ist
deterministisch identisch, kein Raten noetig). Bewusst konservativ: nur
wenn genau ein Ethernet-Interface-Name im Golden Image gefunden wird,
sonst wird nichts angefasst. Kein Fatal-Fehler, falls die Datei fehlt
(NetworkManager-basierte Golden Images sind unbetroffen).

Reales Risiko auch fuer Bare-Metal-Rollouts (nicht nur QEMU-Tests) -
betrifft potenziell jede Zielhardware, deren Interface-Name von der
Proxmox-Referenz-VM abweicht.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 17:31:28 +02:00
adminandClaude Sonnet 5 44f089a95b build_boot_medium.sh: scripts/backends automatisch ins Boot-Medium synchronisieren
Behebt die Ursache des vorherigen Fixes (25f6987) strukturell: statt zwei
Baumkopien manuell in Sync zu halten, kopiert der Build sie jetzt selbst
per rsync (mit Ausschlussliste fuer die bewusst host-seitigen Build-
Skripte und das nicht ausgelieferte Fedora-Backend). Jede kuenftige
Aenderung an scripts/lib/backends landet dadurch automatisch im naechsten
Boot-Medium-Build, die Drift-Klasse aus 25f6987 kann strukturell nicht
mehr auftreten.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 16:30:21 +02:00
adminandClaude Sonnet 5 25f6987948 Fix: image_deploy.sh Boot-Medium-Kopie nicht mit Phase-3-Aenderungen synchronisiert
Live in QEMU gefunden (19.09.2026, erster Testlauf der neuen Lokal-Test-ISO
mit custom-Partitionierung): "image_deploy_partition_custom: command not
found" - die Custom-Partitionierungsfunktionen (Commit 020aa66) wurden nur
in scripts/lib/image_deploy.sh ergaenzt, die zweite, tatsaechlich ins
Boot-Medium gepackte Kopie unter boot-medium/config/includes.chroot/...
blieb auf dem Phase-1/2-Stand stehen. Genau die Sync-Falle, die im Roadmap-
Dokument als Risiko benannt wurde.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 16:29:20 +02:00
adminandClaude Sonnet 5 020aa66bfa Custom-Partitionierungsschema (extra_partitions) im Golden-Image-Deployment
image_deploy_partition_custom()/_format_custom()/_mount_custom() sowie eine
um extra_partitions erweiterte image_deploy_write_fstab() ergaenzen das
bisherige starre ESP+Root-Layout um eine variable Anzahl zusaetzlicher
Partitionen (Mountpoint/Prozentanteil-der-Gesamtplatte/Dateisystem), ohne
das bestehende scheme:"single" in irgendeiner Weise zu veraendern (eigene
Funktionen statt Erweiterung der bestehenden).

Alle drei Backends (mint/debian/ubuntu-image) verzweigen in backend_launch()
auf das Schema aus der Bereitstellungsvorlage und validieren extra_partitions
zusaetzlich defensiv in backend_validate() (Prozentsumme, doppelte
Mountpoints, Dateisystem-Whitelist ext4/btrfs - zfs/Fedora bewusst nicht).

Gegenstueck (API+GUI+DB) ist in provisioning-server/kundenplattform bereits
committet. Teil von platform-docs/roadmap/e2e-testrunde-lokale-
adressierung.md Phase 3.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 14:57:59 +02:00
adminandClaude Sonnet 5 5bc8d108a6 Lokal-Test-Adressierung + Golden-Image-Embedding fuer LAN-E2E-Tests
--local-test-anode-url an build_boot_medium.sh macht anode per Klartext-
HTTP direkt im LAN erreichbar statt ueber Pangolin/Internet (anode hat
kein LAN-gueltiges TLS-Zertifikat, Split-Horizon-DNS auf https://
anode.tuxflotte.de wuerde daher an Zertifikatsfehlern scheitern).
--embed-golden-image backt das Golden-Image-Archiv direkt auf die ISO
(includes.binary, ausserhalb des squashfs), damit auch das beim
Deployment kein Netzwerktransfer mehr ist. Beide Flags sind rein additiv
und beeinflussen den Produktivpfad (kein Flag) nicht.

Betrifft beide Skriptbaum-Kopien (scripts/backends und boot-medium/
config/includes.chroot/...), da es dafuer kein Sync-Tooling gibt.

Siehe platform-docs/roadmap/e2e-testrunde-lokale-adressierung.md fuer
den vollstaendigen Plan inkl. offener Verifikationspunkte (toram-
Verhalten bei includes.binary, exakter Live-Medium-Mountpunkt).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 14:43:29 +02:00
adminandClaude Sonnet 5 d3daed475a boot-medium: enable proposed-updates flag + add dracut-live chroot hook
- config/chroot: LB_PROPOSED_UPDATES="false" (explicit default alongside
  the existing backports/updates flags)
- new hooks/normal/5050-dracut.hook.chroot: adapts the live medium for
  dracut-live instead of initramfs-tools (removes initramfs-tools/live-boot
  packages, fixes hardcoded /run/live/medium path for Calamares)

Both files were live-build-generated config left uncommitted in the
working tree, found while checking for unfixed work before shutting
down idle sessions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BmjSLwQhrnVK3FX2VX9Tbw
2026-09-12 16:11:07 +02:00
adminandClaude Sonnet 5 4bb04cc8c9 golden-image: apt-get purge braucht eigene Retry-Variante (Paket-nicht-gefunden-Folgefehler)
Der generische apt_chroot_with_retry() aus dem vorherigen Commit war fuer
apt-get purge falsch: ein echter Testlauf zeigte, dass der erste Versuch
beim Transaktionsende-Absturz laut dpkg.log fast immer schon fast alle
Pakete entfernt hat - ein zweiter Versuch mit der IDENTISCHEN,
vollstaendigen TRIM_PACKAGES-Liste scheiterte dann an 'Paket X kann nicht
gefunden werden' fuer jedes bereits entfernte Paket (apt-get bricht bei
einem einzigen unbekannten Namen die gesamte Kommandozeile ab). Neue
apt_purge_with_retry() prueft vor jedem Versuch per dpkg-query neu, was
von TRIM_PACKAGES wirklich noch installiert ist, und purgt nur das.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HDFX6o1ZMxKVFLYiMjERR
2026-09-12 15:10:00 +02:00
adminandClaude Sonnet 5 66a6067528 golden-image: Retry fuer apt-get purge/autoremove im chroot (Absturz am Transaktionsende)
apt-get purge/autoremove scheitert im chroot reproduzierbar (4x live
beobachtet, mit jeweils voellig unterschiedlichen Paketen/Triggern) am
Ende der jeweiligen dpkg-Transaktion mit einem knappen, unuebersetzten
'E: Sub-process returned an error code' (exit 100) - kein paketspezifisches
Problem, sondern etwas Generisches am Transaktionsende. Root Cause trotz
intensiver Diagnose (3 volle Testlaeufe gegen golden-linux-mint/103 +
interaktive chroot-Session) nicht gefunden - ausgeschlossen: OOM-Kill,
AppArmor-DENIED, kaputte dpkg-Datenbank, devpts-Rechte-Varianten.

Laut dpkg.log ist die eigentliche Paketarbeit beim Absturz jedes Mal schon
vollstaendig fertig, ein 'dpkg --configure -a' danach ist immer sofort
sauber. Pragmatischer Workaround statt weiterer Root-Cause-Suche:
apt_chroot_with_retry() versucht den jeweiligen chroot-Aufruf bis zu
dreimal - der zweite Versuch sieht dann 'nichts mehr zu tun' und liefert
exit 0.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HDFX6o1ZMxKVFLYiMjERR
2026-09-12 15:06:31 +02:00
adminandClaude Sonnet 5 8196166c90 golden-image: Trimming-Mounts fixen (Incident 11.09.2026), Trimming-Feature committen
Zwei Bugs behoben, die den Mount-Incident vom 11.09.2026 verursacht haben
(rm -rf gegen einen noch teilweise gemounteten Pfad hat echte
Geraetedateien auf dem Build-Host geloescht, u.a. /dev/null):

1. mount --rbind /dev -> normaler --bind + eigene, frische devpts-Instanz
   nur fuer dev/pts. --rbind hat die STAGING_DIR-Devpts-Instanz 1:1 mit der
   des eigenen Terminals geteilt - beim Aufraeumen war der Sub-Mount
   dadurch 'busy', was zu einem manuellen Lazy-Unmount (umount -l)
   verleitet hat.

2. unmount_chroot_binds() nutzt jetzt nirgends mehr umount -l/-R (Lazy-
   /rekursiver Unmount) - stattdessen normaler umount mit begrenztem Retry
   je Mount. cleanup() prueft zusaetzlich UNABHAENGIG per mountpoint -q
   nach, bevor rm -rf auf STAGING_DIR laeuft, und verweigert das Loeschen,
   falls doch noch etwas eingehaengt ist, statt stillschweigend
   weiterzumachen.

Gleichzeitig wird damit das inhaltlich bereits fertige, bisher nur
uncommitted auf controller liegende Trimming-Feature (echter Testlauf
11.09.2026, 37 Pakete/910MB) mit committed - siehe Kommentar im Skript fuer
die vollstaendige Paketauswahl-Analyse.

Noch offen: naechster echter Testlauf des reparierten Mount-/Unmount-
Zyklus gegen golden-linux-mint/103 (bisher nur syntaktisch/statisch
geprueft, nicht real gegen chroot+apt getestet).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011HDFX6o1ZMxKVFLYiMjERR
2026-09-12 13:38:23 +02:00
adminandClaude Sonnet 5 7c52e5fb90 Kritischer Fix: ansible-core fehlte in allen drei Golden-Images
Live gefunden (09.09.2026, beim Vorbereiten eines Kolibri/Veyon-Tests
auf golden-linux-mint): ansible ist auf KEINEM der drei Golden-Images
(Mint/Debian/Ubuntu) tatsaechlich installiert - nur zufaellige
bash-completion-Stub-Dateien vom bash-completion-Paket vorhanden
(taeuschen bei einer oberflaechlichen Pruefung echte Installation vor),
keine echten Binaries. Der Provisioning-Agent ruft aber ansible-pull
bei JEDEM Checkin auf.

Bisher durch den fruehen 'nichts zu tun'-Ausstieg in agent.py
maskiert (kein ansible-pull-Aufruf ohne zugewiesene
Blueprints/Auftraege) - seit der heutigen Webapp-Aenderung
(webapp-shortcuts-Rolle immer getaggt, siehe admin/provisioning-agent)
haette das ab sofort auf JEDEM Geraet fehlgeschlagen.

Fix in backend_postinstall() aller drei Backends (mint-image/
debian-image/ubuntu-image): ansible-pull-Verfuegbarkeit zusaetzlich zu
jq/curl/python3 sichergestellt, Paket 'ansible' (nicht nur
'ansible-core') gewaehlt, weil es die community.general-Collection
gleich mitbringt (von brave/onlyoffice/libreoffice/gdevelop/turbowarp
gebraucht - sonst waere ein zusaetzlicher ansible-galaxy-Schritt
noetig). Boot-Medium-Payload-Kopie synchronisiert.

Noch zu tun: Boot-Medium neu bauen+deployen (wie beim GRUB-Timeout-Fix
heute frueher), dann echten Neu-Deploy-Test fahren, um den Fix
tatsaechlich zu beweisen statt nur den Code zu lesen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
2026-09-09 18:27:32 +02:00
adminandClaude Sonnet 5 b5cc14e469 Boot-Medium: GRUB/Isolinux-Timeout setzen (10s statt unendlich wartend)
Bei Phase 1 (Debian-E2E-Test, 08.09.2026) gefunden: live-builds
Standardvorlagen setzen weder fuer GRUB (UEFI-Pfad) noch fuer
Isolinux (BIOS-Pfad) einen Timeout - GRUB-Default ist -1 (wartet
unendlich auf Tastendruck), Isolinux' 'timeout 0' bedeutet ebenfalls
'Timeout deaktiviert', nicht 'kein Timeout'. Fuer echte
unbeaufsichtigte 'Stick rein, warten'-Installationen ohne
anwesenden Techniker waere das ein Show-Stopper.

Fix per live-build-Standard-Override-Mechanismus
(config/bootloaders/<name>/, gleiches Muster wie schon beim
Splash-Bild): beide Bootloader auf 10s gesetzt, danach automatischer
Start des Standard-Eintrags (default=0 bzw. 'menu default' sind
bereits gesetzt).

Verifiziert: Timeout-Werte im tatsaechlich gebauten ISO per
xorriso-Extraktion bestaetigt (set timeout=10 / timeout 100). QEMU-
Boot mit unveraendertem Menue lief 100+s mit durchgehend >100% CPU
(kein Idle-Warten am Menue) - Bildschirm-Screendump zur visuellen
Bestaetigung blieb in dieser Sandbox-Umgebung technisch unzuverlaessig
(bekanntes Problem, siehe Ubuntu-E2E-Debugging vom selben Tag),
statische Config-Verifikation + CPU-Aktivitaets-Nachweis reichen als
Ersatz.

Noch offen: neues Boot-Medium muss noch auf anode deployed werden
(gebaute ISO liegt lokal, altes Basis-Image auf anode ist noch ohne
diesen Fix) - reines 'git pull' reicht dafuer nicht, siehe bestehende
Lehre in project_independent_boot_medium.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
2026-09-09 11:56:42 +02:00
admin 4f34d80777 Boot-Medium-Payload: ubuntu-image-Backend synchronisieren 2026-09-09 08:10:35 +02:00
admin 4f3ea1b1aa Phase 1: neues backends/ubuntu-image/ (dritte Referenz-Distribution) 2026-09-09 07:26:25 +02:00
admin 2eef840287 build_customer_iso.sh: Ausgabe-ISO zurueck an provisioning-server chownen 2026-09-08 18:06:01 +02:00
admin d20328ed80 debian-image: headless ist Absicht, nicht offene Frage (User-Entscheidung)
Desktop kommt bei Debian per Ansible-Blueprint nach dem ersten Boot -
Debian erlaubt das grosszuegiger als Mint/Ubuntu. Reiner
Kommentar-Update, keine Verhaltensaenderung (Boot-Medium-ISO muss dafuer
nicht neu gebaut werden).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LpNs8yZeQkHgMWx6WNT1QH
2026-09-08 17:07:23 +02:00
admin 63df40d920 Phase 1: neues backends/debian-image/ (zweite Referenz-Distribution)
Strukturell identisch zu backends/mint-image/backend.sh (image_deploy.sh
ist bereits komplett distributionsunabhaengig, postinstall.sh ist per
Symlink geteilt - beides beim Anlegen bestaetigt, keine Mint-spezifische
Annahme gefunden). Referenz-VM ist "golden-debian" (VM 104 auf
tuxflotte-pve).

WICHTIG, noch offen: golden-debian ist aktuell ein schlankes, headless
Debian-13-Basissystem OHNE Desktop-Umgebung - anders als golden-linux-mint
(volle Cinnamon-Desktop). Ob das Absicht ist (Desktop kommt per
Ansible-Blueprint nach dem ersten Boot, urspruengliche ADR-0024-Idee) oder
noch unvollstaendig, ist NICHT entschieden - GOLDEN_IMAGE_URL zeigt
deshalb bewusst auf ein als "-base" benanntes Archiv statt den Stand als
fertiges Desktop-Image zu behaupten.

Ausserdem gefunden: boot-medium/config/includes.chroot/opt/tuxflotte/ ist
eine manuell gepflegte Kopie von backends/+scripts/+config/, kein
automatischer Sync aus dem Top-Level-Repo - die vorherige
target_disk_rank-Aenderung an backends/mint-image/backend.sh fehlte hier
deshalb zunaechst und wird mit diesem Commit nachgezogen.

Siehe platform-docs/roadmap/multi-distro-merkmal-workspace-creator.md,
Phase 1 (zweite Referenz-Distribution).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LpNs8yZeQkHgMWx6WNT1QH
2026-09-08 16:01:42 +02:00