From 98b1d4467190cdd027fffce763adba6385fe8d40 Mon Sep 17 00:00:00 2001 From: "a.gritsenko" Date: Fri, 25 Sep 2026 18:09:02 +0300 Subject: [PATCH] Don't abort the whole build if some packages fail to download Download packages one at a time instead of a single batch apt-get call, so a typo'd or unavailable package name (or a transient network error on one package) no longer aborts the entire run. Failed packages are collected, printed as a warning, and the repo/archive are still built from whatever succeeded. Exit codes: 0 = all packages downloaded, 1 = fatal (nothing downloaded at all), 2 = repo/archive built but some packages were skipped. Verified manually against the ALT SP Server test machine. --- README.md | 9 +++++++++ altsp-download-repo.sh | 38 +++++++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 199504a..d3a114b 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,15 @@ sudo ./altsp-download-repo.sh -o /srv/offline-repo -a bash mc htop Повторные запуски с другим набором пакетов дополняют существующий каталог репозитория, не скачивая заново уже имеющиеся пакеты. +Если часть пакетов не удалось скачать (опечатка в имени, пакет отсутствует +в репозитории, сетевой сбой), скрипт выводит предупреждение по каждому +такому пакету, но всё равно собирает репозиторий/архив из того, что +удалось скачать. Коды возврата: + +- `0` — все пакеты скачаны успешно; +- `1` — фатальная ошибка (например, не скачался вообще ни один пакет); +- `2` — репозиторий/архив собраны, но часть пакетов пропущена. + ## Как это работает Зависимости резолвятся против **пустой** rpm-базы (`rpm --initdb` во diff --git a/altsp-download-repo.sh b/altsp-download-repo.sh index 9c0377c..f208d7d 100644 --- a/altsp-download-repo.sh +++ b/altsp-download-repo.sh @@ -25,6 +25,14 @@ usage() { Повторные запуски с другим набором пакетов дополняют существующий каталог репозитория, не скачивая заново уже имеющиеся пакеты. +Если часть пакетов не удалось скачать, остальные всё равно собираются +в репозиторий/архив; список пропущенных выводится предупреждением. + +Коды возврата: + 0 — все пакеты скачаны успешно + 1 — фатальная ошибка (ничего не скачано и т.п.) + 2 — репозиторий/архив собраны, но часть пакетов пропущена + Пример: sudo $SCRIPT_NAME -o /srv/offline-repo -a bash mc htop EOF @@ -85,11 +93,17 @@ if [[ ! -d "$FAKEROOT/var/lib/rpm" ]]; then rpm --root="$FAKEROOT" --initdb fi -echo "Скачивание пакетов и зависимостей: ${PACKAGES[*]}" >&2 -apt-get \ - -o RPM::RootDir="$FAKEROOT" \ - -o Dir::Cache::Archives="$ARCHIVES" \ - -y -d install "${PACKAGES[@]}" +FAILED_PACKAGES=() +for pkg in "${PACKAGES[@]}"; do + echo "Скачивание пакета и зависимостей: $pkg" >&2 + if ! apt-get \ + -o RPM::RootDir="$FAKEROOT" \ + -o Dir::Cache::Archives="$ARCHIVES" \ + -y -d install "$pkg"; then + echo "ПРЕДУПРЕЖДЕНИЕ: не удалось скачать '$pkg' — пропускаю, продолжаю с остальными" >&2 + FAILED_PACKAGES+=("$pkg") + fi +done echo "Раскладка пакетов по архитектурам..." >&2 shopt -s nullglob @@ -103,6 +117,14 @@ for rpmfile in "$ARCHIVES"/*.rpm; do done shopt -u nullglob +shopt -s nullglob +arch_dirs=("$OUTDIR"/*/RPMS.classic) +shopt -u nullglob +if [[ ${#arch_dirs[@]} -eq 0 ]]; then + echo "Ошибка: ни один пакет не был успешно скачан (${FAILED_PACKAGES[*]})." >&2 + exit 1 +fi + for archdir in "$OUTDIR"/*/RPMS.classic; do [[ -d "$archdir" ]] || continue arch=$(basename "$(dirname "$archdir")") @@ -175,3 +197,9 @@ echo "Инструкция: $README" if [[ -n "$ARCHIVE_PATH" ]]; then echo "Архив: $ARCHIVE_PATH" fi + +if [[ ${#FAILED_PACKAGES[@]} -gt 0 ]]; then + echo + echo "ПРЕДУПРЕЖДЕНИЕ: не скачаны ${#FAILED_PACKAGES[@]} пакет(ов): ${FAILED_PACKAGES[*]}" + exit 2 +fi