Files
extrepo-data/bootstrap.sh
T
2026-08-24 06:07:43 +02:00

132 lines
5.3 KiB
Bash
Executable File

#!/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="hister"
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 <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_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