Thomas Stallinger 941a58535d fix: noninteractive verworfen, automatic-ubiquity+Autoklicker, drei echte Bugs behoben
- noninteractive-Frontend endgueltig verworfen: PageNoninteractive-Stubs
  fuehren strukturell zur Endlosschleife im choose_partition-Zustands-
  automaten von ubi-partman.py, unabhaengig vom Preseed-Stand.
- Umstieg auf automatic-ubiquity (echte GTK-Oberflaeche) + eigener
  Autoklicker (live-updates/opt/tuxflotte/scripts/autoclicker.sh +
  systemd-Service), ausgeloest per Boot-Keyword tuxflotte-autoclick.
- Bug 1: jq fehlte beim echten Kiosk-Auslauf (kein manueller Vorab-
  Installationsschritt wie in Testlaeufen) - neues Modul
  00_preflight.sh installiert es als allererstes.
- Bug 2: echter Ubiquity-Crash in ubi-prepare.py (TypeError: Argument 1
  does not allow None as a value) - gezielter Sed-Patch im bestehenden
  99casperboot-Hook.
- Bug 3: 'd-i partman/choose_partition select finish' zwang denselben
  Endlosschleifen-Zustandsautomaten wie bei noninteractive, auch im
  GTK-Modus - Zeile ersatzlos entfernt, partman-auto/method+recipe
  genuegen.
- autoclicker.sh: Fenstersuche nach 'ubiquity' korrigiert (Fenstertitel
  ist tatsaechlich 'Installation (as superuser)', enthaelt das Wort nie).
- Alle vier Fixes live per QEMU verifiziert (jeweils frische Disk, realer
  Kiosk-Ausloeser/kexec-Pfad, nicht nur manuelle Nachstellung).

Offen: automatisierter Klick auf 'Jetzt installieren' auf der
Partitionierungs-Uebersichtsseite noch nicht zuverlaessig (Enter trifft
dort einen Ausklapp-Pfeil statt den Button). Siehe ADR-0023-Nachtrag.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 15:16:41 +02:00

112 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
### Klickt automatisiert durch Ubiquitys GTK-Installationsassistenten
### (automatic-ubiquity) - noetig, weil Ubiquitys eigenes "noninteractive"-
### Frontend die gefuehrte Partitionierung nicht zuverlaessig automatisieren
### kann (endlose choose_partition-Schleife in ubi-partman.py, real
### bestaetigt, siehe ADR-0023-Nachtrag). Der GTK-Assistent fuellt jede Seite
### bereits vollstaendig aus dem Preseed vor (siehe preseed.tpl) - es fehlt
### nur der "Weiter"/"Installieren"-Klick pro Seite, den dieses Skript per
### xdotool simuliert.
###
### WICHTIG (real beim Testen entdeckt, siehe ADR-0023-Nachtrag): das
### Ubiquity-Fenster heisst NICHT "ubiquity" - der Fenstertitel ist z.B.
### "Installation (as superuser)". Eine Fenstersuche nach dem Namen "ubiquity"
### (fruehere Version dieses Skripts) findet also nie etwas und wurde hier auf
### eine Suche nach JEDEM sichtbaren, betitelten Fenster umgestellt.
###
### NOCH NICHT GELOEST (bewusst als bekannte Einschraenkung stehen gelassen,
### siehe ADR-0023-Nachtrag): auf der Partitionierungs-Uebersichtsseite
### aktiviert "Enter" NICHT den "Jetzt installieren"-Button, sondern einen
### Ausklapp-Pfeil eines darunterliegenden Status-Panels ("Konfiguration der
### Installation wird ueberprueft ..."). Ein Mausklick per xdotool auf
### errechnete Fensterkoordinaten wurde real ausprobiert, aber sowohl die
### Fenstererkennung (mehrere ueberlappende X11-Fenster gleicher/aehnlicher
### Groesse durch Metacity-Dekoration, "groesstes Fenster"-Heuristik traf
### wiederholt das falsche) als auch die Klick-Koordinaten selbst waren nicht
### zuverlaessig genug fuer den produktiven Einsatz - deshalb hier bewusst
### NICHT eingebaut, um kein Risiko falscher Klicks (z.B. auf eine
### "Formatieren?"-Checkbox) einzugehen. Die Enter-Taste bleibt der sicherere
### Kompromiss: sie tut auf den meisten Seiten das Richtige und ist auf dieser
### einen Seite bestenfalls wirkungslos (klappt nur einen Infobereich auf/zu),
### nie destruktiv.
###
### Wird per systemd-Service (siehe ...service im selben Ausliefer-Layer) bei
### JEDEM Boot gestartet, bricht aber sofort ab, wenn das eigene Boot-Keyword
### "tuxflotte-autoclick" nicht in /proc/cmdline steht - siehe backend_launch()
### in backends/mint/backend.sh, wo dieses Keyword gesetzt wird. Auf einem
### normalen (nicht automatisierten) Boot also wirkungslos.
set -u
LOG=/var/log/tuxflotte-autoclicker.log
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $*" >>"${LOG}"
}
grep -qw tuxflotte-autoclick /proc/cmdline || exit 0
log "tuxflotte-autoclick erkannt, starte Autoklicker."
export DISPLAY=:0
# ubiquity-dm startet X frueh im Boot zu einem nicht exakt vorhersagbaren
# Zeitpunkt - auf den Unix-Socket warten statt auf eine feste Wartezeit zu
# vertrauen.
x_ready=0
for _ in $(seq 1 120); do
if [ -S /tmp/.X11-unix/X0 ]; then
x_ready=1
break
fi
sleep 1
done
if [ "${x_ready}" -ne 1 ]; then
log "X-Server nach 120s nicht erschienen, breche ab."
exit 1
fi
log "X-Server erkannt."
if ! command -v xdotool >/dev/null 2>&1; then
log "xdotool fehlt auf dem Live-Medium, installiere nach."
if ! apt-get install -y xdotool >>"${LOG}" 2>&1; then
log "xdotool-Installation fehlgeschlagen, breche ab."
exit 1
fi
fi
# Bewusst betiteltes Fenster suchen (leerer --name-Ausdruck matcht jeden
# Titel) statt nach "ubiquity" - siehe Kommentar oben, der tatsaechliche
# Fenstertitel enthaelt dieses Wort nie.
main_window() {
xdotool search --onlyvisible --name "" 2>/dev/null | head -n1
}
# Ubiquity-Fenster abwarten, bevor die Klick-Schleife beginnt.
for _ in $(seq 1 60); do
[ -n "$(main_window)" ] && break
sleep 1
done
is_ubiquity_running() {
pgrep -f '/usr/bin/ubiquity' >/dev/null 2>&1
}
log "Starte Klick-Schleife."
# Harte Obergrenze als Sicherheitsnetz (60 Minuten) - falls die Installation
# haengen bleibt, soll dieser Dienst nicht unbegrenzt weiterlaufen.
end=$((SECONDS + 3600))
clicks=0
while [ "${SECONDS}" -lt "${end}" ]; do
if ! is_ubiquity_running; then
log "ubiquity-Prozess nicht mehr aktiv (vermutlich fertig oder abgestuerzt), beende Schleife nach ${clicks} Klick(s)."
break
fi
win="$(main_window)"
if [ -n "${win}" ]; then
xdotool windowactivate --sync "${win}" 2>/dev/null || true
xdotool key --window "${win}" Return 2>/dev/null || true
clicks=$((clicks + 1))
fi
sleep 2
done
log "Autoklicker beendet (${clicks} Klick(s) insgesamt)."