Files
extrepo-data/bootstrap.sh
T
2026-08-10 09:15:55 +02:00

95 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Richtet das inmedias-Paketrepository auf diesem Rechner ein.
# ERZEUGT VON bin/gen-extrepo -- nicht von Hand aendern.
#
# curl -fsSL https://gitea.inmedias.it/apt/extrepo-data/raw/branch/main/bootstrap.sh | sudo bash
set -euo pipefail
EXTREPO_NAME="inmedias"
EXTREPO_DATA_URL="https://gitea.inmedias.it/apt/extrepo-data/raw/branch/main"
KEYRING="/etc/extrepo/keyring.gpg"
log() { printf '\033[1;34m==>\033[0m %s\n' "$*" >&2; }
warn() { printf '\033[1;33m!!\033[0m %s\n' "$*" >&2; }
die() { printf '\033[1;31mE:\033[0m %s\n' "$*" >&2; exit 1; }
[[ $EUID -eq 0 ]] || die "bitte als root ausfuehren (sudo)"
# --- 1. extrepo sicherstellen -------------------------------------------
if ! command -v extrepo >/dev/null 2>&1; then
log "installiere extrepo"
apt-get update -qq
apt-get install -y extrepo
fi
# --- 2. Signing-Key in den extrepo-Keyring ------------------------------
# extrepo prueft index.yaml gegen /etc/extrepo/keyring.gpg. Dieser Keyring ist
# ein dpkg-Conffile: bei einem extrepo-Update fragt dpkg, ob die lokale Version
# behalten werden soll -- dann "behalten" (bzw. bootstrap.sh erneut ausfuehren).
SIGNING_KEY_ASC="$(cat <<'KEYEOF'
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEanl6QBYJKwYBBAHaRw8BAQdAyVwIFGTHoa63VaZOYQh4+SSkRLV3suXLvDzI
KAOPbsS0M2lubWVkaWFzIGV4dHJlcG8tZGF0YSBzaWduaW5nIGtleSA8c2tvQGlu
bWVkaWFzLml0PoiTBBMWCgA7FiEEp2OVqHaXIUhlP/6QxHbpm8q/E4kFAmp5ekAC
GwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQxHbpm8q/E4n5UAEAsZqE
k0+whBaOGAtFKyokr4E7yFpMApHbsuO+oK6dgnEBAIJzVZk2eEEYT3f6iVnpCwKm
49EOLuZr1tD/aLSRidMG
=FMKn
-----END PGP PUBLIC KEY BLOCK-----
KEYEOF
)"
FPR_EXPECTED="A76395A876972148653FFE90C476E99BCABF1389"
if gpg --no-default-keyring --keyring "$KEYRING" --list-keys "$FPR_EXPECTED" >/dev/null 2>&1; then
log "Signing-Key bereits im extrepo-Keyring"
else
log "importiere Signing-Key in ${KEYRING}"
cp -a "$KEYRING" "${KEYRING}.bak-$(date +%Y%m%d%H%M%S)"
tmpkey="$(mktemp)"
printf '%s\n' "$SIGNING_KEY_ASC" | gpg --dearmor > "$tmpkey"
cat "$tmpkey" >> "$KEYRING"
rm -f "$tmpkey"
gpg --no-default-keyring --keyring "$KEYRING" --list-keys "$FPR_EXPECTED" >/dev/null 2>&1 \
|| die "Import fehlgeschlagen"
fi
# --- 3. Passt die extrepo-Konfiguration zu dieser Distribution? ---------
# extrepo laedt <url>/<dist>/<version>/index.yaml; dist und version kommen
# ausschliesslich aus /etc/extrepo/config.yaml.
dist="$(sed -n 's/^dist:[[:space:]]*//p' /etc/extrepo/config.yaml | head -1 | tr -d '"')"
vers="$(sed -n 's/^version:[[:space:]]*//p' /etc/extrepo/config.yaml | head -1 | tr -d '"')"
log "extrepo-Konfiguration: dist=${dist} version=${vers}"
idx_url="${EXTREPO_DATA_URL}/${dist}/${vers}/index.yaml"
code="$(curl -s -o /tmp/inmedias-index.yaml -w '%{http_code}' "$idx_url")"
if [[ "$code" != "200" ]]; then
die "Kein Index unter ${idx_url} (HTTP ${code}).
Setze dist/version in /etc/extrepo/config.yaml auf eine unterstuetzte Kombination
(z.B. dist: debian / version: trixie) und starte erneut."
fi
# Warnen, wenn die ausgelieferte Suite nicht zum echten Codename passt.
. /etc/os-release
real_code="${VERSION_CODENAME:-${UBUNTU_CODENAME:-}}"
idx_suite="$(sed -n 's/^[[:space:]]*Suites:[[:space:]]*//p' /tmp/inmedias-index.yaml | head -1)"
if [[ -n "$real_code" && -n "$idx_suite" && "$real_code" != "$idx_suite" ]]; then
warn "Dieses System ist ${ID} ${real_code}, das Repo liefert hier aber die Suite '${idx_suite}'."
warn "Grund: extrepo leitet den Pfad aus /etc/extrepo/config.yaml ab, nicht aus /etc/os-release."
warn "Fuer uv ist das unkritisch (ein Binary fuer alle Suites). Wenn du exakt"
warn "${real_code} willst, setze version: ${real_code} in /etc/extrepo/config.yaml."
fi
rm -f /tmp/inmedias-index.yaml
# --- 4. Repository aktivieren -------------------------------------------
log "aktiviere Repository '${EXTREPO_NAME}'"
extrepo --url "$EXTREPO_DATA_URL" enable "$EXTREPO_NAME"
log "apt update"
apt-get update
log "fertig. Beispiel: apt-get install uv"