From 2d3c2fbc6d091afeca782a17e39cce7e5ad65c86 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 10 Aug 2026 18:27:40 +0200 Subject: [PATCH] =?UTF-8?q?Vorabpr=C3=BCfung:=20proot-distro=20und=20Rootf?= =?UTF-8?q?s=20vor=20jedem=20Beweis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aus dem Gerätelauf: S2 lief bis Stufe 1 durch und scheiterte dann an 'proot-distro: cannot execute: required file not found'. Danach meldete die Auswertung folgerichtig 'S2 gescheitert' — was den Beweis inhaltlich belastet, obwohl nur die Grundlage fehlte. Genau diese Verwechslung soll der Spike nicht produzieren. Alle Beweise prüfen jetzt vorab, ob proot-distro ausführbar ist und das Rootfs steht, und brechen sonst mit klarer Ansage ab statt mitten im Test aufzulaufen. Die Meldung selbst ist irreführend: 'required file not found' heißt nicht, dass proot-distro fehlt — bash hat es gefunden und nennt den vollen Pfad. Es fehlt der Interpreter aus dessen Shebang-Zeile. Die Prüfung sagt das ausdrücklich und nennt Datei und Shebang, statt den Suchenden an der falschen Stelle graben zu lassen. 00-bootstrap versucht in dem Fall selbsttätig eine Neuinstallation. Dazu die Berechtigungsprüfung entschärft: dumpsys verlangt die DUMP-Berechtigung, die eine gewöhnliche App nicht hat. Das Fehlschlagen ist erwartbar und kein Warnsignal; die Meldung nennt jetzt den Weg über adb statt Ratlosigkeit zu säen. Co-Authored-By: Claude Opus 5 (1M context) --- spike/00-bootstrap-termux.sh | 18 +++++++++++++ spike/01-s1-plasma-mobile.sh | 6 +++++ spike/02-s2-mikrofon.sh | 16 ++++++++++-- spike/03-s3-pipewire-kamera.sh | 6 +++++ spike/lib.sh | 47 ++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) diff --git a/spike/00-bootstrap-termux.sh b/spike/00-bootstrap-termux.sh index 9a116b6..efafc99 100755 --- a/spike/00-bootstrap-termux.sh +++ b/spike/00-bootstrap-termux.sh @@ -118,6 +118,24 @@ try termux-wake-lock && ok "Wake-Lock aktiv" || warn "Wake-Lock nicht gesetzt" # ── Debian-Rootfs ──────────────────────────────────────────────────────────── section "Debian-Rootfs" +# Erst prüfen, ob proot-distro überhaupt LÄUFT. Ein installiertes Paket, dessen +# Shebang-Interpreter fehlt, meldet sich mit "cannot execute: required file not +# found" — eine Meldung, die aussieht als fehle das Programm, obwohl es da ist. +if ! proot-distro list >/dev/null 2>&1; then + fail "proot-distro ist installiert, lässt sich aber nicht ausführen" + PD="$(command -v proot-distro)" + log " Datei: $PD" + log " Shebang: $(head -1 "$PD" 2>/dev/null)" + hint "Meist fehlt der Interpreter aus der Shebang-Zeile, nicht das Programm." + hint "Reparaturversuch:" + try pkg install -y bash coreutils proot proot-distro + if ! proot-distro list >/dev/null 2>&1; then + fail "Bleibt defekt — ohne proot-distro geht es nicht weiter." + exit 1 + fi + ok "Nach der Neuinstallation läuft proot-distro" +fi + if proot-distro list --installed 2>/dev/null | grep -q "^$DISTRO\b" \ || [ -d "$PREFIX/var/lib/proot-distro/installed-rootfs/$DISTRO" ]; then ok "$DISTRO bereits installiert" diff --git a/spike/01-s1-plasma-mobile.sh b/spike/01-s1-plasma-mobile.sh index 3e0dd84..9ea134d 100755 --- a/spike/01-s1-plasma-mobile.sh +++ b/spike/01-s1-plasma-mobile.sh @@ -27,6 +27,12 @@ log "HPOS Phase 0 · S1 — Plasma Mobile in proot" log "Auflösung: ${BREITE}x${HOEHE} GPU-Profil: $GPU_PROFIL" log "Protokoll: $LOG" +voraussetzungen_pruefen "$DISTRO" || { + log "" + fail "Abbruch: die Grundlage steht nicht. S1 wäre nicht aussagekräftig." + exit 1 +} + # ── Alte Reste einsammeln ──────────────────────────────────────────────────── section "Aufräumen" pkill -f termux-x11 2>/dev/null && ok "alten X-Server beendet" || hint "kein alter X-Server" diff --git a/spike/02-s2-mikrofon.sh b/spike/02-s2-mikrofon.sh index 5bd8da0..1696665 100755 --- a/spike/02-s2-mikrofon.sh +++ b/spike/02-s2-mikrofon.sh @@ -24,20 +24,32 @@ WAV="$OUT_DIR/$WAV_NAME" log "HPOS Phase 0 · S2 — Mikrofon im Linux" log "Protokoll: $LOG" +voraussetzungen_pruefen "$DISTRO" || { + log "" + fail "Abbruch: die Grundlage steht nicht. S2 wäre nicht aussagekräftig." + exit 1 +} + # ── Berechtigung ───────────────────────────────────────────────────────────── # Der häufigste Grund für eine formal korrekte, aber stumme Aufnahme: PulseAudio # läuft IM Termux-Prozess und öffnet das Mikrofon über OpenSL ES von dort aus. # Eine Berechtigung, die nur Termux:API hat, nützt ihm deshalb nichts. section "Mikrofonberechtigung von Termux" BERECHTIGT="unbekannt" -if RECHTE=$(dumpsys package com.termux 2>/dev/null | grep -i 'RECORD_AUDIO'); then +RECHTE=$(dumpsys package com.termux 2>/dev/null | grep -i 'RECORD_AUDIO' || true) +if [ -n "$RECHTE" ]; then log "$(printf '%s' "$RECHTE" | sed 's/^/ /')" case "$RECHTE" in *granted=true*) BERECHTIGT=ja; ok "com.termux darf aufnehmen" ;; *granted=false*) BERECHTIGT=nein; fail "com.termux darf NICHT aufnehmen" ;; esac else - warn "Konnte den Berechtigungsstatus nicht auslesen" + # Erwartbar: dumpsys verlangt die DUMP-Berechtigung, die eine gewöhnliche App + # nicht hat. Kein Grund zur Sorge, aber der Status bleibt hier eben offen. + warn "Status von hier aus nicht auslesbar (dumpsys ist Apps verwehrt)" + hint "Vom PC prüfen: adb shell dumpsys package com.termux | grep RECORD_AUDIO" + hint "Setzen: adb shell pm grant com.termux android.permission.RECORD_AUDIO" + hint "Oder am Gerät: Einstellungen → Apps → Termux → Berechtigungen → Mikrofon" fi if [ "$BERECHTIGT" = nein ]; then diff --git a/spike/03-s3-pipewire-kamera.sh b/spike/03-s3-pipewire-kamera.sh index bb3b378..6ca6144 100755 --- a/spike/03-s3-pipewire-kamera.sh +++ b/spike/03-s3-pipewire-kamera.sh @@ -17,6 +17,12 @@ DISTRO=debian log "HPOS Phase 0 · S3 — Virtuelle PipeWire-Kamera" log "Protokoll: $LOG" + +voraussetzungen_pruefen "$DISTRO" || { + log "" + fail "Abbruch: die Grundlage steht nicht. S3 wäre nicht aussagekräftig." + exit 1 +} log "" log "Voraussetzung: ein laufender X-Server aus S1." log "Falls nicht, in einer zweiten Sitzung: termux-x11 :0 &" diff --git a/spike/lib.sh b/spike/lib.sh index 3528732..bf6fa67 100755 --- a/spike/lib.sh +++ b/spike/lib.sh @@ -65,6 +65,53 @@ require_termux() { fi } +# Prüft, ob die Grundlage steht, BEVOR ein Beweis losläuft. Ohne das scheitert ein +# Test mitten im Ablauf und sieht aus wie ein inhaltlicher Fehlschlag, obwohl nur +# die Vorbereitung fehlt — die irreführendste Sorte Fehler. +voraussetzungen_pruefen() { + local distro="${1:-debian}" fehlt=0 + + section "Voraussetzungen" + + if ! have proot-distro; then + fail "proot-distro ist nicht installiert" + hint "Nachholen mit: bash spike/00-bootstrap-termux.sh" + return 1 + fi + + # 'cannot execute: required file not found' heißt NICHT, dass das Skript fehlt. + # Es heißt, dass der Interpreter aus seiner Shebang-Zeile fehlt. Der Unterschied + # kostet sonst eine halbe Stunde Suche an der falschen Stelle. + local pfad interpreter + pfad="$(command -v proot-distro)" + if ! proot-distro list >/dev/null 2>&1; then + fail "proot-distro lässt sich nicht ausführen" + interpreter="$(head -1 "$pfad" 2>/dev/null | sed 's|^#!||; s| .*||')" + log " Datei: $pfad" + log " Shebang: ${interpreter:-(keine)}" + if [ -n "$interpreter" ] && [ ! -x "$interpreter" ]; then + fail "Der Interpreter $interpreter fehlt oder ist nicht ausführbar." + hint "Das ist die Ursache, nicht proot-distro selbst." + hint "Reparieren mit: pkg install -y bash coreutils proot proot-distro" + else + hint "Reparieren mit: pkg reinstall -y proot-distro" + fi + return 1 + fi + ok "proot-distro ausführbar" + + if proot-distro list --installed 2>/dev/null | grep -q "^$distro\b" \ + || [ -d "$PREFIX/var/lib/proot-distro/installed-rootfs/$distro" ]; then + ok "$distro-Rootfs vorhanden" + else + fail "$distro-Rootfs fehlt" + hint "Nachholen mit: bash spike/00-bootstrap-termux.sh" + fehlt=1 + fi + + return $fehlt +} + # Fragt am Ende jedes Beweises nach dem, was nur ein Mensch beurteilen kann: # ob es tatsächlich funktioniert hat. Das Ergebnis geht ins Protokoll. verdict() {