Thomas Stallinger 4bf1992eb9 fix: Autoklicker wartet auf Ubiquitys Hintergrundpruefung statt sie zu unterbrechen
Timing-Hypothese fuer den partman-rebuild-cache-Loop: der $bootable{}-Fix
brachte live keine Aenderung (siehe ADR-0023-Nachtrag), was gegen einen
rein rezeptseitigen Fehler spricht. Stattdessen zeigt die 'Etwas
Anderes'-Seite waehrend der Klickphase ein Status-Panel 'Konfiguration
der Installation wird ueberprueft ...' - ein Klick auf 'Jetzt
installieren' WAEHREND dieser Pruefung noch laeuft koennte sie
unterbrechen/neu anstossen statt sie abschliessen zu lassen.

atspi_click.py sucht jetzt vor jedem Klickversuch aktiv nach diesem
sichtbaren Text (find_showing_text(), rollenunabhaengig) und gibt bei
Treffer Exit-Code 3 zurueck, ohne zu klicken. autoclicker.sh behandelt
das als eigenen, nicht als Fehlversuch gezaehlten Zustand.

Noch nicht live verifiziert - naechster Schritt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 17:53:10 +02:00

114 lines
4.6 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.
###
### Klickt ueber AT-SPI (Barrierefreiheits-API), nicht mehr ueber
### Bildschirmkoordinaten/Enter-Taste (siehe atspi_click.py fuer die
### eigentliche Klicklogik). Der fruehere xdotool-Ansatz scheiterte real
### daran, dass Metacity mehrere ueberlappende X11-Fenster aehnlicher
### Groesse erzeugt (WM-Dekorationsrahmen, Hilfsfenster) - weder eine
### "groesstes sichtbares Fenster"-Heuristik noch die Enter-Taste (aktiviert
### auf der Partitionierungs-Uebersichtsseite einen Ausklapp-Pfeil statt des
### "Jetzt installieren"-Buttons) waren zuverlaessig genug (siehe
### ADR-0023-Nachtrag). AT-SPI identifiziert den Button stattdessen ueber
### seine Rolle+seinen Namen im Accessibility-Baum der Anwendung selbst -
### unabhaengig von Fenstergeometrie/-dekoration.
###
### Die AT-SPI-Bruecke selbst (GTK_MODULES=gail:atk-bridge, Session-/A11y-
### Bus) wird NICHT hier, sondern bereits VOR dem GTK-Start von Ubiquity in
### tuxflotte-atspi-env.sh aktiviert (eingebunden von start-ubiquity-dm,
### siehe Sed-Patch in initrd-hooks/casper-bottom/99casperboot) - eine erst
### nachtraeglich aktivierte Bruecke wird von einer bereits laufenden
### GTK-Anwendung nicht mehr nachgeladen.
###
### 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
is_ubiquity_running() {
pgrep -f '/usr/bin/ubiquity' >/dev/null 2>&1
}
# ubiquity-dm startet Ubiquity frueh im Boot zu einem nicht exakt
# vorhersagbaren Zeitpunkt - auf den Prozess warten statt auf eine feste
# Wartezeit zu vertrauen. AT-SPI braucht anders als der fruehere
# xdotool-Ansatz keinen eigenen X-Socket-Check - der Zugriff laeuft ueber
# den Accessibility-Bus, nicht direkt ueber X11.
ubiquity_ready=0
for _ in $(seq 1 120); do
if is_ubiquity_running; then
ubiquity_ready=1
break
fi
sleep 1
done
if [ "${ubiquity_ready}" -ne 1 ]; then
log "ubiquity-Prozess nach 120s nicht erschienen, breche ab."
exit 1
fi
log "ubiquity-Prozess erkannt."
if ! python3 -c 'import pyatspi' >/dev/null 2>&1; then
log "pyatspi fehlt auf dem Live-Medium, installiere nach."
if ! apt-get install -y python3-pyatspi >>"${LOG}" 2>&1; then
log "pyatspi-Installation fehlgeschlagen, breche ab."
exit 1
fi
fi
ATSPI_CLICK=/opt/tuxflotte/scripts/atspi_click.py
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
misses=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
out="$(python3 "${ATSPI_CLICK}" 2>&1)"
rc=$?
if [ "${rc}" -eq 0 ]; then
clicks=$((clicks + 1))
misses=0
log "Klick ${clicks}: ${out}"
elif [ "${rc}" -eq 2 ]; then
log "AT-SPI-Bus nicht erreichbar, breche ab: ${out}"
break
elif [ "${rc}" -eq 3 ]; then
# Ubiquitys eigene Hintergrundpruefung laeuft noch sichtbar (siehe
# atspi_click.py-Nachtrag) - bewusst NICHT als Fehlversuch zaehlen,
# nur abwarten. Real beim Testen entdeckt: ein Klick auf "Jetzt
# installieren" WAEHREND dieser Pruefung fuehrte wiederholt in die
# partman-rebuild-cache-Schleife statt zum eigentlichen Commit.
log "wartet auf Hintergrundpruefung: ${out}"
else
misses=$((misses + 1))
log "kein Treffer (${misses}): ${out}"
fi
sleep 2
done
log "Autoklicker beendet (${clicks} Klick(s) insgesamt)."