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() {