#!/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 ///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}'" if extrepo 2>&1 | grep -q -- '--url'; then extrepo --url "$EXTREPO_DATA_URL" enable "$EXTREPO_NAME" else # extrepo 0.9 (jammy) kennt --url noch nicht und wuerde die Option als # Kommando missverstehen. Dann die url in der Konfiguration nur fuer den # Aufruf umbiegen und danach zurueckstellen, damit die offiziellen # extrepo-Eintraege weiter erreichbar bleiben. cfg=/etc/extrepo/config.yaml warn "extrepo $(dpkg-query -W -f='${Version}' extrepo 2>/dev/null) kennt --url nicht" warn "-> setze url in ${cfg} nur voruebergehend um" cp -a "$cfg" "${cfg}.bak-$(date +%Y%m%d%H%M%S)" orig_url="$(sed -n 's/^url:[[:space:]]*//p' "$cfg" | head -1)" restore_url() { [[ -n "${orig_url:-}" ]] && sed -i "s|^url:.*|url: ${orig_url}|" "$cfg"; } trap restore_url EXIT sed -i "s|^url:.*|url: ${EXTREPO_DATA_URL}|" "$cfg" extrepo enable "$EXTREPO_NAME" restore_url trap - EXIT log "url in ${cfg} wieder auf ${orig_url} gesetzt" fi log "apt update" apt-get update log "fertig. Beispiel: apt-get install uv"