Thomas Stallinger a415de1eaa feat: Autoklicker auf AT-SPI umgestellt statt Bildschirmkoordinaten
xdotool/Enter-Taste-Ansatz war nicht zuverlaessig genug (Metacity erzeugt
mehrere ueberlappende X11-Fenster aehnlicher Groesse, 'groesstes Fenster'-
Heuristik traf wiederholt das falsche; Enter aktiviert auf der
Partitionierungs-Uebersicht einen Ausklapp-Pfeil statt 'Jetzt
installieren' - siehe ADR-0023-Nachtrag).

- live-updates/usr/share/ubiquity/tuxflotte-atspi-env.sh (neu): aktiviert
  GTK_MODULES=gail:atk-bridge + Session-/A11y-Bus VOR dem GTK-Start von
  Ubiquity - muss vor dem Init passieren, eine Bruecke wird von einer
  bereits laufenden GTK-App nicht nachgeladen.
- initrd-hooks/casper-bottom/99casperboot: bindet obige Datei per
  Ein-Zeilen-Sed-Patch in start-ubiquity-dm ein (dry-run gegen den echten
  Datei-Inhalt verifiziert).
- live-updates/opt/tuxflotte/scripts/atspi_click.py (neu): findet+klickt
  den passenden 'Weiter'-Button ueber Rolle+Name im Accessibility-Baum,
  feste deutsche Werteliste (Sprache per Preseed fest de_DE), niemals
  Zurueck/Abbrechen/Beenden.
- autoclicker.sh: ruft atspi_click.py in Schleife statt xdotool/Enter auf,
  wartet auf den ubiquity-Prozess statt auf den X-Socket.

Noch nicht live verifiziert - naechster Schritt: QEMU-Testlauf auf lenny.

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

107 lines
4.1 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
else
misses=$((misses + 1))
log "kein Treffer (${misses}): ${out}"
fi
sleep 2
done
log "Autoklicker beendet (${clicks} Klick(s) insgesamt)."