docker/sync.sh aktualisiert
This commit is contained in:
+37
-11
@@ -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 || \
|
||||
echo "[sync] WARNUNG: repomanage fehlgeschlagen, ueberspringe 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"
|
||||
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"
|
||||
Reference in New Issue
Block a user