Debians Paket android-tools-adb liefert Version 29 und kennt kein 'adb pair' — das kam erst mit platform-tools 30. Wer beides installiert hat, bekommt je nach PATH-Reihenfolge und Alter der Terminalsitzung mal das eine und mal das andere, und die WLAN-Kopplung scheitert scheinbar grundlos. provision/lib.sh sucht deshalb gezielt eine Fassung, die 'pair' beherrscht, und schiebt eine Shell-Funktion 'adb' davor, sodass die Aufrufstellen unverändert bleiben. Eine ausdrücklich gesetzte Vorgabe ADB= gilt absolut, auch wenn sie kein pair kann — stillschweigend etwas anderes zu nehmen wäre die unangenehmere Überraschung. Fehlt pair, läuft provision.sh mit einer Warnung weiter (für USB reicht es), adb-wireless.sh bricht sauber ab. Die Prüfung kommt bewusst ohne Pipe aus: 'adb pair' ohne Argumente endet mit Code 1, weil es ein Aufruffehler ist. Unter 'set -o pipefail' hätte das die gesamte Pipeline als fehlgeschlagen gelten lassen, obwohl grep den Hilfetext gefunden hatte — die Erkennung meldete dadurch selbst adb 36 als zu alt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
105 lines
4.0 KiB
Bash
105 lines
4.0 KiB
Bash
#!/usr/bin/env bash
|
|
# Gemeinsame Hilfsfunktionen für die Provisioning-Skripte.
|
|
# Wird eingebunden, nicht direkt ausgeführt.
|
|
|
|
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"; }
|
|
|
|
# ── Das richtige adb finden ──────────────────────────────────────────────────
|
|
# Debians Paket android-tools-adb liefert Version 29. 'adb pair' — und damit die
|
|
# Kopplung über WLAN — kam erst mit platform-tools 30. Wer beides installiert hat,
|
|
# bekommt je nach PATH-Reihenfolge mal das eine und mal das andere. Deshalb wird
|
|
# hier gezielt eine Fassung gesucht, die 'pair' beherrscht, statt sich auf PATH
|
|
# zu verlassen.
|
|
#
|
|
# Setzt ADB_BIN und definiert eine Shell-Funktion 'adb', die darauf zeigt —
|
|
# so müssen die Aufrufstellen nichts wissen.
|
|
|
|
# Bewusst ohne Pipe: 'adb pair' ohne Argumente beendet sich mit Code 1, weil es ein
|
|
# Aufruffehler ist. Unter 'set -o pipefail' würde das die ganze Pipeline als
|
|
# fehlgeschlagen gelten lassen — obwohl grep den Hilfetext gefunden hat.
|
|
adb_kann_pair() {
|
|
local aus
|
|
aus="$("$1" pair 2>&1 || true)"
|
|
case "$aus" in *"usage: adb pair"*) return 0 ;; esac
|
|
return 1
|
|
}
|
|
|
|
adb_version() { "$1" version 2>/dev/null | sed -n '2p' | sed 's/^Version //'; }
|
|
|
|
adb_finden() {
|
|
local kandidaten=() k
|
|
|
|
# Eine ausdrücklich gesetzte Vorgabe gilt absolut — auch wenn sie kein 'pair'
|
|
# kann. Wer ADB= setzt, meint es so; stillschweigend etwas anderes zu nehmen
|
|
# wäre die unangenehmere Überraschung.
|
|
if [ -n "${ADB:-}" ]; then
|
|
if [ ! -x "$ADB" ]; then
|
|
fehl "ADB=$ADB ist nicht ausführbar."
|
|
return 1
|
|
fi
|
|
ADB_BIN="$ADB"
|
|
adb_kann_pair "$ADB_BIN" && return 0 || return 2
|
|
fi
|
|
|
|
kandidaten+=(
|
|
"$HOME/Android/Sdk/platform-tools/adb"
|
|
"$HOME/Library/Android/sdk/platform-tools/adb"
|
|
"${ANDROID_HOME:-/nonexistent}/platform-tools/adb"
|
|
"${ANDROID_SDK_ROOT:-/nonexistent}/platform-tools/adb"
|
|
)
|
|
# Alles, was in PATH steht, ebenfalls prüfen — in PATH-Reihenfolge.
|
|
while IFS= read -r k; do kandidaten+=("$k"); done < <(type -pa adb 2>/dev/null)
|
|
|
|
local erstes_gefundenes=""
|
|
for k in "${kandidaten[@]}"; do
|
|
[ -x "$k" ] || continue
|
|
[ -n "$erstes_gefundenes" ] || erstes_gefundenes="$k"
|
|
if adb_kann_pair "$k"; then
|
|
ADB_BIN="$k"
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
# Keines kann pair. Das ältere trotzdem melden — für USB reicht es.
|
|
if [ -n "$erstes_gefundenes" ]; then
|
|
ADB_BIN="$erstes_gefundenes"
|
|
return 2
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
# Muss von jedem Skript einmal aufgerufen werden, bevor adb benutzt wird.
|
|
adb_einrichten() {
|
|
local rc
|
|
adb_finden; rc=$?
|
|
case $rc in
|
|
0) : ;;
|
|
2)
|
|
warn "Gefundenes adb ist zu alt für die WLAN-Kopplung: $(adb_version "$ADB_BIN")"
|
|
hinweis "$ADB_BIN"
|
|
hinweis "'adb pair' gibt es erst ab platform-tools 30. Debians Paket"
|
|
hinweis "android-tools-adb hängt auf Version 29 — damit geht nur USB."
|
|
hinweis "Aktuelle Fassung: developer.android.com/tools/releases/platform-tools"
|
|
;;
|
|
*)
|
|
fehl "Kein adb gefunden."
|
|
hinweis "Entweder android-tools-adb installieren (nur USB) oder die"
|
|
hinweis "platform-tools von Google entpacken (USB und WLAN)."
|
|
exit 1
|
|
;;
|
|
esac
|
|
# Ab hier zeigt 'adb' immer auf die ausgewählte Fassung, unabhängig von PATH.
|
|
adb() { "$ADB_BIN" "$@"; }
|
|
return $rc
|
|
}
|