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