docker/sync.sh aktualisiert

This commit is contained in:
2026-08-26 11:47:44 +02:00
parent d8de0640d5
commit 2e52757ec7
+36 -10
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# Synct die Paket-Whitelist aus Git und laedt die selektierten Pakete
# (inkl. Abhaengigkeiten) aus den jeweils angegebenen Fremd-Repos.
# aus den jeweils angegebenen Fremd-Repos.
# Erzeugt anschliessend RPM- und AppStream-Metadaten.
set -euo pipefail
@@ -44,6 +44,7 @@ mkdir -p "$DEST"
# --- 2. Pro Quelle: temporaeres Repo aktivieren, Pakete gezielt ziehen --
source_count=$(yq -o=json '.sources | length' "$PACKAGES_FILE")
download_failed=0
for i in $(seq 0 $((source_count - 1))); do
src=$(yq -o=json ".sources[$i]" "$PACKAGES_FILE")
@@ -51,6 +52,10 @@ for i in $(seq 0 $((source_count - 1))); do
baseurl=$(echo "$src" | jq -r '.baseurl')
gpgkey=$(echo "$src" | jq -r '.gpgkey // empty')
# Standard: false. Nur bei echten Fremd-Repos aktivieren, deren
# Abhaengigkeiten die Clients nicht ueber ihre Basis-Repos bekommen.
resolve_deps=$(echo "$src" | jq -r '.resolve_deps // false')
# Paketeintraege koennen Strings ODER Mappings mit Metadaten sein.
mapfile -t packages < <(
echo "$src" | jq -r '.packages[] | if type == "string" then . else .name end'
@@ -68,7 +73,7 @@ for i in $(seq 0 $((source_count - 1))); do
echo "[tmp-${name}]"
echo "name=${name}"
echo "baseurl=${baseurl}"
echo "enabled=1"
echo "enabled=0"
if [ -n "$gpgkey" ]; then
echo "gpgcheck=1"
echo "gpgkey=${gpgkey}"
@@ -77,21 +82,37 @@ for i in $(seq 0 $((source_count - 1))); do
fi
} > "$repofile"
# Bei Fehlschlag (z.B. Paket nicht gefunden) diese Quelle nicht den
# gesamten Lauf abbrechen lassen, aber laut melden.
if ! dnf download --resolve --alldeps \
--disablerepo='*' --enablerepo="tmp-${name}" \
--destdir="$DEST" "${packages[@]}"; then
echo "[sync] WARNUNG: Download fuer Quelle '$name' teilweise fehlgeschlagen."
# Die Basis-Repos des Containers bleiben aktiviert, damit dnf
# Abhaengigkeiten wie glibc oder libstdc++ ueberhaupt aufloesen kann.
# Ohne sie scheitert bereits die Aufloesung, nicht erst der Download.
dl_args=(--destdir="$DEST" --enablerepo="tmp-${name}")
if [ "$resolve_deps" = "true" ]; then
echo "[sync] Quelle '$name': Abhaengigkeiten werden mitgespiegelt"
# Bewusst OHNE --alldeps: bereits im Container installierte Pakete
# (glibc & Co.) haben die Clients ohnehin und muessen nicht ins Repo.
dl_args+=(--resolve)
fi
if ! dnf download "${dl_args[@]}" "${packages[@]}"; then
echo "[sync] WARNUNG: Download fuer Quelle '$name' fehlgeschlagen."
download_failed=1
fi
rm -f "$repofile"
done
# --- 3. Alte Paketversionen aufraeumen -----------------------------------
echo "[sync] Raeume veraltete Paketversionen auf"
dnf repomanage --old "$DEST" | xargs -r rm -f || \
# repomanage braucht bereits vorhandene Metadaten. Beim allerersten Lauf
# gibt es noch keine, deshalb der Existenztest.
if [ -f "$DEST/repodata/repomd.xml" ]; then
echo "[sync] Raeume veraltete Paketversionen auf"
if ! dnf repomanage --old "$DEST" | xargs -r rm -f; then
echo "[sync] WARNUNG: repomanage fehlgeschlagen, ueberspringe Aufraeumen."
fi
else
echo "[sync] Erster Lauf, kein Aufraeumen noetig."
fi
# --- 4. RPM-Metadaten neu erzeugen ---------------------------------------
echo "[sync] Aktualisiere Repo-Metadaten"
@@ -130,4 +151,9 @@ fi
# repomd.xml komplett neu schreibt.
modifyrepo_c --mdtype=appstream "$ASWORK/appstream.xml.gz" "$DEST/repodata/"
if [ "$download_failed" -ne 0 ]; then
echo "[sync] $(date -Iseconds) Sync-Lauf mit Fehlern abgeschlossen"
exit 1
fi
echo "[sync] $(date -Iseconds) Sync-Lauf abgeschlossen"