#!/usr/bin/env bash # # Richtet das Paketrepository sko auf diesem Rechner ein. # ERZEUGT VON bin/gen-extrepo -- nicht von Hand aendern. # # curl -fsSL https://gitea.inmedias.it/sko/extrepo-data/raw/branch/main/bootstrap.sh | sudo bash set -euo pipefail EXTREPO_NAME="sko" EXTREPO_DATA_URL="https://gitea.inmedias.it/sko/extrepo-data/raw/branch/main" EXAMPLE_PACKAGE="" 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----- mDMEaou98BYJKwYBBAHaRw8BAQdAdOsWK3Vzp4jUf4+nG04sOSugsKAyh4n8k3X7 1WqQMQ+0LnNrbyBleHRyZXBvLWRhdGEgc2lnbmluZyBrZXkgPHNrb0Bpbm1lZGlh cy5pdD6IkwQTFgoAOxYhBIpdx19IRqJM1qCnhB4g9L5rvfi9BQJqi73wAhsDBQsJ CAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEB4g9L5rvfi9nwcBAKXMQ0DCgk+f cPNtcpn3wYzw0x280EsBLZzWqRauLf54AQDDyoP/UvSinEwtu/7wn6KsB+6w6STK 0lyfVjF8UKnUCg== =vbh5 -----END PGP PUBLIC KEY BLOCK----- KEYEOF )" FPR_EXPECTED="8A5DC75F4846A24CD6A0A7841E20F4BE6BBDF8BD" 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_tmp="$(mktemp)" trap 'rm -f "$idx_tmp"' EXIT idx_url="${EXTREPO_DATA_URL}/${dist}/${vers}/index.yaml" code="$(curl -s -o "$idx_tmp" -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' "$idx_tmp" | 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 "Bei Paketen, die dasselbe Binary auf allen Suites nutzen, ist das folgenlos." warn "Wenn du exakt ${real_code} willst, setze version: ${real_code} in /etc/extrepo/config.yaml." fi rm -f "$idx_tmp" trap - EXIT # --- 4. Repository aktivieren ------------------------------------------- log "aktiviere Repository '${EXTREPO_NAME}'" # extrepo ohne Kommando beendet sich mit Fehlercode und schreibt die Usage nach # stderr. Die Ausgabe deshalb erst einsammeln und dann durchsuchen: als Pipeline # waere der Test wegen "set -o pipefail" immer unwahr -- dann nimmt auch ein # aktuelles extrepo den unnoetigen Umweg ueber config.yaml. extrepo_usage="$(extrepo 2>&1 || true)" if grep -q -- '--url' <<<"$extrepo_usage"; then extrepo --url "$EXTREPO_DATA_URL" enable "$EXTREPO_NAME" else # Aeltere extrepo-Versionen (0.9 auf jammy) kennen --url nicht und wuerden # 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 if [[ -n "$EXAMPLE_PACKAGE" ]]; then log "fertig. Beispiel: apt-get install ${EXAMPLE_PACKAGE}" else log "fertig. Repository '${EXTREPO_NAME}' ist eingebunden." fi