#!/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)."