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.
79 lines
3.9 KiB
Markdown
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]` указывать не нужно.
|