diff --git a/provision/init-phone.sh b/provision/init-phone.sh new file mode 100755 index 0000000..4c3bdea --- /dev/null +++ b/provision/init-phone.sh @@ -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 " + 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 </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:/ /' diff --git a/provision/provision.sh b/provision/provision.sh index 3c5525d..808513f 100755 --- a/provision/provision.sh +++ b/provision/provision.sh @@ -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 ' "$ZIEL" + hinweis "Repo: $REPO_URL" + printf ' Startskript nach %s übertragen? [J/n] > ' "$ZIEL" read -r UEBERTRAGEN /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 < 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. diff --git a/spike/README.md b/spike/README.md index e85331a..6072740 100644 --- a/spike/README.md +++ b/spike/README.md @@ -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`.