docker/sync.sh aktualisiert

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