Nur ein Startskript per adb, Rest über git; Berechtigungen beim Installieren
Bisher schob provision.sh das ganze Repo nach /sdcard. Auf dem Telefon lag damit
eine Kopie, und jede Änderung hätte wieder den PC gebraucht. Jetzt kommt per adb
nur init-phone.sh: es installiert git und klont die Quellen nach ~/hpos. Danach
ist das eine echte Arbeitskopie und Aktualisieren heißt
cd ~/hpos && git pull
Die Repo-Adresse liest provision.sh aus dem origin-Remote und schreibt sie fest
ins übertragene Skript, damit auf einer Bildschirmtastatur nichts abgetippt
werden muss. Bei privaten Repos bietet init-phone.sh an, das Passwort zu
speichern — mit dem ausdrücklichen Hinweis, dass das im Klartext geschieht.
Die Berechtigungen wandern von provision.sh nach install-termux.sh, direkt hinter
die Installation. Eine frisch installierte App ohne Berechtigungen ist eine Falle,
die erst Stunden später zuschnappt: im ersten Gerätelauf als stumme Tonaufnahme
in Beweis S2. RECORD_AUDIO für com.termux wird danach ausdrücklich nachgeprüft,
weil genau daran der Beweis hängt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Executable
+115
@@ -0,0 +1,115 @@
|
||||
#!/data/data/com.termux/files/usr/bin/bash
|
||||
# HPOS — Startpunkt auf dem Telefon.
|
||||
#
|
||||
# Dieses Skript ist absichtlich das EINZIGE, was per adb aufs Telefon kommt.
|
||||
# Alles Weitere holt es sich per git. Der Grund: danach ist das Repo auf dem
|
||||
# Telefon eine Arbeitskopie, keine Kopie. Aktualisieren heißt dann schlicht
|
||||
#
|
||||
# cd ~/hpos && git pull
|
||||
#
|
||||
# statt jedes Mal wieder den PC anzuwerfen und Dateien zu schieben.
|
||||
#
|
||||
# Aufruf in Termux:
|
||||
# bash /sdcard/hpos-init.sh
|
||||
# bash /sdcard/hpos-init.sh https://beispiel/anderes-repo.git
|
||||
set -uo pipefail
|
||||
|
||||
REPO="${1:-${HPOS_REPO:-@@REPO_URL@@}}"
|
||||
ZIEL="$HOME/hpos"
|
||||
|
||||
if [ -t 1 ]; then
|
||||
C_OK=$'\033[32m'; C_WARN=$'\033[33m'; C_ERR=$'\033[31m'
|
||||
C_HEAD=$'\033[1;36m'; C_DIM=$'\033[2m'; C_OFF=$'\033[0m'
|
||||
else
|
||||
C_OK=""; C_WARN=""; C_ERR=""; C_HEAD=""; C_DIM=""; C_OFF=""
|
||||
fi
|
||||
kopf() { printf '\n%s══ %s ══%s\n' "$C_HEAD" "$*" "$C_OFF"; }
|
||||
ok() { printf '%s ✓%s %s\n' "$C_OK" "$C_OFF" "$*"; }
|
||||
warn() { printf '%s !%s %s\n' "$C_WARN" "$C_OFF" "$*"; }
|
||||
fehl() { printf '%s ✗%s %s\n' "$C_ERR" "$C_OFF" "$*"; }
|
||||
hinweis() { printf '%s %s%s\n' "$C_DIM" "$*" "$C_OFF"; }
|
||||
|
||||
case "$REPO" in
|
||||
@@*) fehl "Keine Repo-Adresse hinterlegt."
|
||||
hinweis "Aufruf mit Adresse: bash /sdcard/hpos-init.sh <url>"
|
||||
exit 1 ;;
|
||||
esac
|
||||
|
||||
kopf "HPOS — Ersteinrichtung auf dem Telefon"
|
||||
hinweis "Repo: $REPO"
|
||||
|
||||
# ── git ──────────────────────────────────────────────────────────────────────
|
||||
kopf "git"
|
||||
if command -v git >/dev/null 2>&1; then
|
||||
ok "bereits vorhanden ($(git --version))"
|
||||
else
|
||||
pkg update -y >/dev/null 2>&1
|
||||
if pkg install -y git; then ok "installiert"
|
||||
else fehl "Installation von git fehlgeschlagen"; exit 1; fi
|
||||
fi
|
||||
|
||||
# ── Zugangsdaten ─────────────────────────────────────────────────────────────
|
||||
# Bei einem privaten Repo fragt git bei jedem Zugriff nach dem Passwort. Auf einer
|
||||
# Bildschirmtastatur ist das eine Zumutung, deshalb wird der Speicher angeboten.
|
||||
# Er legt die Zugangsdaten im Klartext unter ~/.git-credentials ab — das gehört
|
||||
# gesagt, damit die Entscheidung bewusst fällt.
|
||||
case "$REPO" in
|
||||
https://*@*)
|
||||
if [ ! -f "$HOME/.git-credentials" ]; then
|
||||
kopf "Zugangsdaten"
|
||||
hinweis "Das Repo verlangt vermutlich ein Passwort."
|
||||
printf ' Nach der Eingabe dauerhaft merken? (Klartext in ~/.git-credentials) [j/N] > '
|
||||
read -r MERKEN
|
||||
case "${MERKEN:-n}" in
|
||||
j|J) git config --global credential.helper store
|
||||
ok "Passwort wird nach der ersten Eingabe gespeichert" ;;
|
||||
*) hinweis "Dann fragt git bei jedem Zugriff erneut." ;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# ── Holen oder aktualisieren ─────────────────────────────────────────────────
|
||||
kopf "Repo"
|
||||
if [ -d "$ZIEL/.git" ]; then
|
||||
ok "Arbeitskopie vorhanden — aktualisiere"
|
||||
if git -C "$ZIEL" pull --ff-only; then
|
||||
ok "aktuell"
|
||||
else
|
||||
warn "git pull fehlgeschlagen."
|
||||
hinweis "Lokale Änderungen? Dann: cd ~/hpos && git stash && git pull"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if git clone "$REPO" "$ZIEL"; then
|
||||
ok "geklont nach $ZIEL"
|
||||
else
|
||||
fehl "git clone fehlgeschlagen."
|
||||
hinweis "Bei privaten Repos: Benutzername und Passwort prüfen."
|
||||
hinweis "Adresse war: $REPO"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
chmod +x "$ZIEL"/spike/*.sh "$ZIEL"/spike/inner/*.sh 2>/dev/null || true
|
||||
|
||||
# ── Weiter ───────────────────────────────────────────────────────────────────
|
||||
kopf "Fertig"
|
||||
cat <<TEXT
|
||||
Das Repo liegt jetzt unter ~/hpos und ist eine Arbeitskopie.
|
||||
Aktualisieren später:
|
||||
|
||||
cd ~/hpos && git pull
|
||||
|
||||
Nächster Schritt:
|
||||
|
||||
cd ~/hpos
|
||||
bash spike/00-bootstrap-termux.sh
|
||||
|
||||
Danach die Beweise der Reihe nach — S1 zuerst, weil er der wackligste ist:
|
||||
|
||||
bash spike/01-s1-plasma-mobile.sh
|
||||
bash spike/02-s2-mikrofon.sh
|
||||
bash spike/03-s3-pipewire-kamera.sh
|
||||
bash spike/04-s4-intent-handoff.sh
|
||||
TEXT
|
||||
@@ -173,6 +173,54 @@ for eintrag in "${DATEIEN[@]}"; do
|
||||
fi
|
||||
done
|
||||
|
||||
# ── Berechtigungen ───────────────────────────────────────────────────────────
|
||||
# Direkt nach der Installation, nicht erst in provision.sh: eine frisch
|
||||
# installierte App ohne Berechtigungen ist eine Falle, die erst Stunden später
|
||||
# zuschnappt — etwa als stumme Tonaufnahme in Beweis S2.
|
||||
#
|
||||
# Wichtig ist vor allem RECORD_AUDIO für com.termux SELBST. PulseAudio läuft im
|
||||
# Termux-Prozess und öffnet das Mikrofon von dort über OpenSL ES; eine
|
||||
# Berechtigung, die nur Termux:API hat, nützt ihm nichts.
|
||||
if [ "$FEHLER" = 0 ]; then
|
||||
kopf "Berechtigungen"
|
||||
erteile() {
|
||||
local paket="$1" perm="$2"
|
||||
if adb shell pm grant "$paket" "$perm" >/dev/null 2>&1; then
|
||||
ok "${perm##*.} → $paket"
|
||||
else
|
||||
warn "${perm##*.} → $paket (abgelehnt)"
|
||||
hint_gegeben=1
|
||||
fi
|
||||
}
|
||||
hint_gegeben=0
|
||||
|
||||
for p in android.permission.RECORD_AUDIO \
|
||||
android.permission.READ_EXTERNAL_STORAGE \
|
||||
android.permission.WRITE_EXTERNAL_STORAGE; do
|
||||
erteile com.termux "$p"
|
||||
done
|
||||
for p in android.permission.RECORD_AUDIO \
|
||||
android.permission.CAMERA \
|
||||
android.permission.ACCESS_FINE_LOCATION \
|
||||
android.permission.READ_EXTERNAL_STORAGE \
|
||||
android.permission.WRITE_EXTERNAL_STORAGE; do
|
||||
erteile com.termux.api "$p"
|
||||
done
|
||||
|
||||
if [ "$hint_gegeben" = 1 ]; then
|
||||
hinweis "Abgelehnt heißt meist: die App meldet diese Berechtigung gar nicht an."
|
||||
hinweis "Das ist unkritisch, solange RECORD_AUDIO für com.termux durchging."
|
||||
fi
|
||||
|
||||
# Kontrolle statt Vertrauen — genau diese eine Berechtigung entscheidet über S2.
|
||||
if adb shell dumpsys package com.termux 2>/dev/null | grep -q 'RECORD_AUDIO.*granted=true'; then
|
||||
ok "Nachgeprüft: com.termux darf aufnehmen"
|
||||
else
|
||||
warn "com.termux hat RECORD_AUDIO NICHT — Beweis S2 wird sonst stumm bleiben."
|
||||
hinweis "Auf dem Telefon: Einstellungen → Apps → Termux → Berechtigungen → Mikrofon"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── Abschluss ────────────────────────────────────────────────────────────────
|
||||
kopf "Ergebnis"
|
||||
adb shell pm list packages 2>/dev/null | tr -d '\r' | grep -E '^package:com\.termux' | sed 's/^package:/ /'
|
||||
|
||||
+33
-15
@@ -266,28 +266,43 @@ case "$HERSTELLER" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# ── Repo aufs Telefon ────────────────────────────────────────────────────────
|
||||
# adb push funktioniert auch über WLAN. Das erspart es, auf dem Telefon Zugangsdaten
|
||||
# für ein privates Repo eintippen zu müssen — auf einer Bildschirmtastatur eine Qual.
|
||||
kopf "Skripte aufs Telefon"
|
||||
# ── Startskript aufs Telefon ─────────────────────────────────────────────────
|
||||
# Bewusst NUR dieses eine Skript, nicht das ganze Repo. Es installiert git und
|
||||
# klont die Quellen — danach ist auf dem Telefon eine Arbeitskopie, keine Kopie.
|
||||
# Aktualisieren heißt dann 'git pull' statt jedes Mal wieder den PC anzuwerfen.
|
||||
kopf "Startskript aufs Telefon"
|
||||
REPO_ROOT="$(cd "$HIER/.." && pwd)"
|
||||
ZIEL=/sdcard/hpos
|
||||
REPO_URL="$(git -C "$REPO_ROOT" remote get-url origin 2>/dev/null || true)"
|
||||
ZIEL=/sdcard/hpos-init.sh
|
||||
|
||||
if [ -z "$REPO_URL" ]; then
|
||||
warn "Keine Repo-Adresse gefunden (kein origin-Remote gesetzt)."
|
||||
hinweis "Ohne sie kann das Telefon die Quellen nicht holen."
|
||||
printf ' Adresse von Hand eingeben (leer = überspringen) > '
|
||||
read -r REPO_URL </dev/tty || REPO_URL=""
|
||||
fi
|
||||
|
||||
if [ "$TROCKEN" = 1 ]; then
|
||||
warn "Trockenlauf — es wird nichts übertragen."
|
||||
elif [ -z "$REPO_URL" ]; then
|
||||
hinweis "Übersprungen."
|
||||
else
|
||||
printf ' Die Spike-Skripte jetzt nach %s übertragen? [J/n] > ' "$ZIEL"
|
||||
hinweis "Repo: $REPO_URL"
|
||||
printf ' Startskript nach %s übertragen? [J/n] > ' "$ZIEL"
|
||||
read -r UEBERTRAGEN </dev/tty || UEBERTRAGEN=n
|
||||
case "${UEBERTRAGEN:-j}" in
|
||||
j|J|"")
|
||||
adb shell rm -rf "$ZIEL" >/dev/null 2>&1
|
||||
if adb push "$REPO_ROOT" "$ZIEL" >/dev/null 2>&1; then
|
||||
# Adresse fest ins Skript schreiben, damit auf dem Telefon nichts
|
||||
# abgetippt werden muss. sed mit | als Trenner, weil URLs Schrägstriche
|
||||
# enthalten.
|
||||
TMP=$(mktemp)
|
||||
sed "s|@@REPO_URL@@|$REPO_URL|" "$HIER/init-phone.sh" >"$TMP"
|
||||
if adb push "$TMP" "$ZIEL" >/dev/null 2>&1; then
|
||||
ok "Übertragen nach $ZIEL"
|
||||
hinweis "In Termux nach ~ kopieren, damit die Dateien ausführbar sein können:"
|
||||
hinweis " cp -r /sdcard/hpos ~/hpos && cd ~/hpos"
|
||||
hinweis "(auf /sdcard gibt es keine Ausführungsrechte — das ist normal)"
|
||||
else
|
||||
warn "Übertragung fehlgeschlagen — dann per git clone auf dem Telefon."
|
||||
warn "Übertragung fehlgeschlagen."
|
||||
fi
|
||||
rm -f "$TMP"
|
||||
;;
|
||||
*) hinweis "Übersprungen." ;;
|
||||
esac
|
||||
@@ -297,11 +312,14 @@ kopf "Fertig"
|
||||
cat <<TEXT
|
||||
Nächste Schritte auf dem Telefon, in Termux:
|
||||
|
||||
cp -r /sdcard/hpos ~/hpos && cd ~/hpos # falls oben übertragen
|
||||
# oder: pkg install -y git && git clone <repo-url> hpos && cd hpos
|
||||
|
||||
bash /sdcard/hpos-init.sh # installiert git und klont das Repo
|
||||
cd ~/hpos
|
||||
bash spike/00-bootstrap-termux.sh
|
||||
|
||||
Ab dann genügt zum Aktualisieren:
|
||||
|
||||
cd ~/hpos && git pull
|
||||
|
||||
Danach die Beweise der Reihe nach — S1 zuerst, weil er der wackligste ist.
|
||||
Ergebnisse gehören nach docs/spike-protokoll.md.
|
||||
|
||||
|
||||
+15
-2
@@ -73,10 +73,14 @@ Bildschirmtastatur eingetippt werden müssen.
|
||||
## Ablauf
|
||||
|
||||
```bash
|
||||
# Einmalig, vom PC. Fragt selbst nach USB oder WLAN.
|
||||
# Einmalig, vom PC. Fragt selbst nach USB oder WLAN, installiert Termux
|
||||
# und legt ein Startskript nach /sdcard/hpos-init.sh.
|
||||
./provision/provision.sh
|
||||
|
||||
# Auf dem Telefon in Termux
|
||||
# Auf dem Telefon in Termux: git installieren und das Repo holen
|
||||
bash /sdcard/hpos-init.sh
|
||||
cd ~/hpos
|
||||
|
||||
bash spike/00-bootstrap-termux.sh
|
||||
|
||||
# Beweise in dieser Reihenfolge — S1 zuerst, weil er der wackligste ist
|
||||
@@ -86,6 +90,15 @@ bash spike/03-s3-pipewire-kamera.sh
|
||||
bash spike/04-s4-intent-handoff.sh
|
||||
```
|
||||
|
||||
**Aktualisieren später** — kein PC nötig, kein erneutes Übertragen:
|
||||
|
||||
```bash
|
||||
cd ~/hpos && git pull
|
||||
```
|
||||
|
||||
Per adb kommt bewusst nur das Startskript aufs Telefon, nicht das Repo selbst.
|
||||
Dadurch liegt dort eine echte Arbeitskopie statt einer Kopie.
|
||||
|
||||
Jedes Skript fragt am Ende nach deiner Beurteilung und schreibt sie nach
|
||||
`spike/out/ergebnisse.tsv`. Rohprotokolle liegen daneben in `spike/out/*.log`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user