a.gritsenko 98b1d44671 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.
2026-09-25 18:09:02 +03:00

altsp-downloader

Скрипт для ALT SP Server: скачивает один или несколько пакетов вместе со всеми зависимостями и собирает из них автономный локальный apt-rpm репозиторий (схема classic), готовый для переноса на машину без интернета.

Требования

  • ALT Linux / ALT SP Server, apt-rpm (apt-get, rpm).
  • Доступ к реальным (интернет) репозиториям на машине, где запускается скрипт.
  • root / sudo.

Пакет apt-repo-tools (для genbasedir) устанавливается скриптом автоматически, если отсутствует.

Использование

sudo ./altsp-download-repo.sh [-o|--output DIR] [-a|--archive] PKG1 [PKG2 ...]
  • Пакеты передаются аргументами командной строки — можно указать сразу несколько для batch-скачивания.
  • -o/--output DIR — каталог репозитория (по умолчанию ./altsp-repo).
  • --skip-update — пропустить apt-get update перед скачиванием.
  • -a/--archive — дополнительно упаковать готовый репозиторий в <каталог>.tar.gz, чтобы перенести его одним файлом.

Пример:

sudo ./altsp-download-repo.sh -o /srv/offline-repo -a bash mc htop

Повторные запуски с другим набором пакетов дополняют существующий каталог репозитория, не скачивая заново уже имеющиеся пакеты.

Если часть пакетов не удалось скачать (опечатка в имени, пакет отсутствует в репозитории, сетевой сбой), скрипт выводит предупреждение по каждому такому пакету, но всё равно собирает репозиторий/архив из того, что удалось скачать. Коды возврата:

  • 0 — все пакеты скачаны успешно;
  • 1 — фатальная ошибка (например, не скачался вообще ни один пакет);
  • 2 — репозиторий/архив собраны, но часть пакетов пропущена.

Как это работает

Зависимости резолвятся против пустой rpm-базы (rpm --initdb во временном fakeroot + apt-get -o RPM::RootDir=...), поэтому скачивается полное дерево зависимостей запрошенных пакетов, а не только то, чего не хватает на машине, где запущен скрипт. Это важно, так как репозиторий предназначен для переноса на другую, возможно не идентичную по составу пакетов машину.

Скачанные .rpm раскладываются по архитектурам (<repo>/<arch>/RPMS.classic/), для каждой архитектуры генерируются метаданные через genbasedir (<repo>/<arch>/base/).

Установка на офлайн-машине

Результат работы скрипта (README.txt внутри каталога репозитория) содержит готовые строки для sources.list, например:

rpm file:/srv/offline-repo x86_64 classic

Затем:

apt-get update
apt-get install <имена пакетов>

Подпись репозитория не требуется — тег вроде [cert8] указывать не нужно.

S
Description
No description provided
Readme
42 KiB
Languages
Shell 100%