diff --git a/docker/sync.sh b/docker/sync.sh index 10720d6..736b873 100644 --- a/docker/sync.sh +++ b/docker/sync.sh @@ -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" \ No newline at end of file