Форк pkgsync. Описание работы скрипта в данном README.md
является субъективным и не относится к оригинальному проекту.
Простой скрипт для синхронизации установленных пакетов между машинами на базе Arch Linux.
Конфигурационный файл, по задумке, содержит только пути до основных файлов в виде bash-переменных EXCLUSION_LIST=/путь/до/EXLUSION_LIST
, основные переменные это:
В целом, даже если конфигурационного файла и не будет существовать, все переменные путей до основных файлов в скрипте pkgsync
будут установлены по умолчанию:
EXCLUSION_LIST="${EXCLUSION_LIST:-/etc/pkgsync/pkg_exclude.list}"
BLACKLIST_LIST="${BLACKLIST_LIST:-/etc/pkgsync/pkg_blacklist.list}"
REMOVE_LIST="${REMOVE_LIST:-/etc/pkgsync/pkg_remove.list}"
INSTALL_LIST="${INSTALL_LIST:-/etc/pkgsync/pkg_install.list}"
PRESTART_SCRIPT="${PRESTART_SCRIPT:-/etc/pkgsync/pkg_prestart.sh}"
FINISH_SCRIPT="${FINISH_SCRIPT:-/etc/pkgsync/pkg_finish.sh}"
TMP_DIR="${TMP_DIR:-/tmp}"
По умолчанию конфигурационный файл должен находиться в /etc/default/pkgsync
, но путь можно поменять путём изменения 5 строчки кода файла pkgsync
:
#!/bin/bash
set -e
[[ -e /ваш/путь/до_конфигурационного_файла ]] && . /ваш/путь/до_конфигурационного_файла
Пример оригинального конфигурационного файла.
Все списки содержащие пакеты могут иметь комментарии начинающиеся с
#
, а также могут быть не сортированы
Данный файл содержит список пакетов текущей системы, которые нужно исключить из общего списка INSTALL.
Например:
# /etc/pkgsync/pkg_exclude.list
## Данные пакеты нужны только текущей машине, например пакеты ниже, в большинстве случаев, нужны на ноутбуках, а на стационарном компьютере нет
blueman
bluez
bluez-utils
Данный список будет на разных машинах соответственно разным, учитывайте это.
Данный файл содержит список пакетов, которые нельзя ни удалять ни устанавливать на текущей системе, именно этим он отличается от списка EXCLUDE.
Это означает, что даже если, например, пакет neovim
будет находиться в списке на установку или удаление, он по итогу не установится или не удалится (если будет находиться на текущей системе).
Данный файл содержит список пакетов, которые будут удалены из текущей системы. Данный список должен обновляться постоянно из сессии к сессии, он не должен хранить постоянный список пакетов на удаление, как например INSTALL, а также он не должен иметь с ним совпадений, потому что в таком случае пакет не установится и не удалится (для подобного поведения существует BLACKLIST).
Данный файл содержит общий список пакетов, которые должны быть установлены на всех машинах. Список должен постоянно обновляться из сессии к сессии, список можно расширить через pkgsync
, но не сократить, а также Вы должны позаботиться о синхронизации этого списка между всеми Вашими машинами.
Ваш cкрипт, который запускается перед обновлением, удалением пакетов. Скрипт должен быть исполняемым chmod +x prestart.sh
и выполнятся без ошибок.
Ваш скрипт, который запускается после обновления, удаления пакетов. Скрипт должен быть исполняемым chmod +x finish.sh
и выполнятся без ошибок.
Переменная, которая содержит путь до директории временных файлов скрипта pkgsync
, временные файлы после выполнения скрипта удаляются.
Как работает Ключевой момент работы скрипта основан на команде comm
. Поочерёдно сравниваются разные списки с наименованием пакетов и от их вывода будет зависить итоговый результат. Подробнее о аргументах команды comm
использованных в скрипте pkgsync
. ## Алгоритм работы Пройдёмся по основым 6 командам, где происходит всё.
pacman -Qq | sort | comm -23 - "$TMP_DIR/pkg_exclude.list" > "$TMP_DIR/mypkgs_with_exclusions.txt"
На выходе получаем mypkgs_with_exclusions.txt
.
Используется далее для:
comm -23 "$TMP_DIR/mypkgs_with_exclusions.txt" "$TMP_DIR/pkg_remove.list" > "$TMP_DIR/mypkgs_with_exclusions_without_remove.txt"
На выходе получаем mypkgs_with_exlusions_without_remove.txt
.
Используется далее для:
- получение списка пакетов установленных на текущей системе;
- получение списка пакетов, которые будут установлены на текущей системе;
comm -12 "$TMP_DIR/mypkgs_with_exclusions.txt" "$TMP_DIR/pkg_remove.list" | comm -23 - "$TMP_DIR/pkg_blacklist.list" > "$TMP_DIR/pkg_toremove.list"
На выходе получаем pkg_toremove.list
. Данный файл содержит список пакетов, которые будут удалены с текущей системы.
sort -u "$TMP_DIR/mypkgs_with_exclusions_without_remove.txt" "$TMP_DIR/pkg_install.list" | comm -23 - "$TMP_DIR/pkg_remove.list" > "$TMP_DIR/pkg_installed.list"
На выходе получаем pkg_installed.list
. Данный файл содержит список пакетов, которые будут установлены, а также уже действительно установленных пакетов текущей системы.
Используется далее для:
- получение списка пакетов, которые будут установлены на текущей системе;
- получение списка новых пакетов, которые будут добавлены в общий список
pkg_install.txt
;
comm -13 "$TMP_DIR/mypkgs_with_exclusions_without_remove.txt" "$TMP_DIR/pkg_installed.list" | comm -23 - "$TMP_DIR/pkg_blacklist.list" > "$TMP_DIR/pkg_toinstall.list"
На выходе получаем pkg_toinstall.list
. Данный файл содержит список пакетов, которые будут установлены на текущую систему.
comm -23 "$TMP_DIR/pkg_installed.list" "$TMP_DIR/pkg_install.list" > "$TMP_DIR/pkg_ourinstall.list"
На выходе получаем pkg_ourinstall.list
. Данный файл содержит список пакетов, которые будут добавлены в общий лист pkg_install.txt
.
Важно! Если машин больше 2, то перед внесением изменений в общий установочный список или список пакетов на удаление нужно на всех машинах синхронизировать текущее состояние репозитория и применить изменения, только затем отправлять новые.
Этот скрипт предназначен только для тех дистрибутивов Linux, которые используют pacman для управления пакетами. Все зависимости включены в базовую группу Arch Linux, но приведены здесь для общей информации:
Исполняемый | Arch пакет |
---|---|
bash | bash |
xargs | findutils |
pacman | pacman |
comm | coreutils |
sort | coreutils |
AUR Пакет: https://aur.archlinux.org/packages/pkgsync