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>
114 lines
4.6 KiB
Bash
Executable File
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)."
|