Files
2026-06-25 15:28:46 +03:00

57 lines
3.2 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# collect-on-device.sh — выполняется НА РЕФЕРЕНС-устройстве (на столе, с интернетом).
# Качает в /tmp/btdebs ровно те пакеты, которых не хватает голому target-устройству.
#
# Рядом ожидает (заливаются через adb из collect-debs.ps1):
# packages.list — что хотим в рантайме
# target-installed.txt — что УЖЕ стоит на голом устройстве (опционально)
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
OUT=/tmp/btdebs
PKGS_FILE="$HERE/packages.list"
TGT="$HERE/target-installed.txt"
[ "$(id -u)" -eq 0 ] || { echo "[error] нужен root (adb root или sudo)"; exit 1; }
[ -f "$PKGS_FILE" ] || { echo "[error] нет packages.list"; exit 1; }
rm -rf "$OUT"; mkdir -p "$OUT"
export DEBIAN_FRONTEND=noninteractive
export LANG=C LC_ALL=C # сообщения apt на английском, а не иероглифами
echo "[collect] apt-get update (нужен интернет на этом устройстве)..."
# Acquire::Check-Valid-Until=false — принимаем устаревшие Release (зеркало давно не обновляло)
# || true — не валимся из-за битых репо (напр. bullseye-backports 404); пакеты берём из main
apt-get -o Acquire::Check-Valid-Until=false update || true
WANT="$(grep -vE '^[[:space:]]*#|^[[:space:]]*$' "$PKGS_FILE" | tr '\n' ' ')"
[ -n "$WANT" ] || { echo "[error] packages.list пуст"; exit 1; }
echo "[collect] считаю рекурсивное замыкание зависимостей..."
CLOSURE="$(apt-cache depends --recurse \
--no-recommends --no-suggests --no-conflicts \
--no-breaks --no-replaces --no-enhances $WANT \
| awk '/^[a-zA-Z0-9]/{print $1}' | sed 's/:.*//' | sort -u)"
if [ -f "$TGT" ]; then
echo "[collect] вычитаю пакеты, уже стоящие на целевом (голом) устройстве..."
BASE="$(sed 's/:.*//' "$TGT" | sort -u)"
else
echo "[collect] target-installed.txt не передан — вычитаю то, что стоит здесь"
BASE="$(dpkg-query -W -f='${Package}\n' 2>/dev/null | sed 's/:.*//' | sort -u)"
fi
MISSING="$(comm -23 <(printf '%s\n' "$CLOSURE") <(printf '%s\n' "$BASE"))"
# исключаем альтернативы, конфликтующие с тем, что уже стоит на устройстве:
# *-gles — GLES-варианты Qt (конфликтуют с обычными libqt5*),
# elogind — альтернатива systemd-logind (конфликтует с systemd)
MISSING="$(printf '%s\n' "$MISSING" | grep -vE -- '-gles$|^elogind$|^libelogind0$|^libpam-elogind$' || true)"
cd "$OUT"
ok=0; skip=0
for p in $MISSING; do
if apt-get download "$p" >/dev/null 2>&1; then ok=$((ok+1)); else skip=$((skip+1)); fi
done
echo "[collect] скачано: $ok, пропущено (виртуальные/недоступные): $skip"
ls "$OUT"/*.deb >/dev/null 2>&1 || { echo "[error] ни одного .deb не скачалось"; exit 1; }
echo "COLLECT-OK"