Files
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

79 lines
3.9 KiB
Markdown

# altsp-downloader
Скрипт для ALT SP Server: скачивает один или несколько пакетов вместе со
всеми зависимостями и собирает из них автономный локальный apt-rpm
репозиторий (схема `classic`), готовый для переноса на машину без
интернета.
## Требования
- ALT Linux / ALT SP Server, apt-rpm (`apt-get`, `rpm`).
- Доступ к реальным (интернет) репозиториям на машине, где запускается
скрипт.
- root / sudo.
Пакет `apt-repo-tools` (для `genbasedir`) устанавливается скриптом
автоматически, если отсутствует.
## Использование
```bash
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`, чтобы перенести его одним файлом.
Пример:
```bash
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
```
Затем:
```bash
apt-get update
apt-get install <имена пакетов>
```
Подпись репозитория не требуется — тег вроде `[cert8]` указывать не нужно.