132 lines
5.3 KiB
Bash
Executable File
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=""
|
|
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
|