#!/usr/bin/env bash ENABLED=yes [[ ${ENABLED} == "yes" ]] || exit 0 DEBUGMODE=no SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/update; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null debug_mode "$0" "$@" ## Настройка подключения репозиториев ## REPOSITORY=disable|enable ## *disable # Отключить управление списком репозиториев, по умолчанию ## # Используются репозитории из пакета pacman, по умолчанию: core,extra,community,multilib,modules ## enable # Включить управление списком репозиториев ## # Используются системные репозитории core,extra,community,multilib,modules и указанные в параметре REPOSITORY[*] ## only # Включить управление списком репозиториев ## # Используются только репозитории указанные в параметре REPOSITORY[*] ## Порядок указания репозиториев важен ## По умолчанию включены системные репозитории, имена: core,extra,community,multilib,modules ## REPOSITORY[]=,,...,;;;disable ## # Произвольное имя репозитория. Обязательный ## # Имена системных репозиториев: core,extra,community,multilib,modules ## # Полный URL-адрес места, где можно найти базу данных, пакеты и подписи (если доступны) для этого репозитория. Обязательный ## # Возможно указать несколько, через запятую (,) ## # Символ $ обязательно экранировать \$ ## # Если указан доступный файл, то подключить как дополнительный файл расширения конфигурации (Include = ) ## file:// # URL префикс для репозитория в каталоге ## ftp:// # URL префикс для репозитория FTP ## http:// # URL префикс для репозитория HTTP ## https:// # URL префикс для репозитория HTTPS ## # Уровень проверки подписи репозитория, можно выбрать одну из основных и вторую из дополнительных, разделитель запятая. Не обязательный ## # Последовательность имеет значение, т.к. накладываются правила каскадно. По умолчанию: Required,DatabaseOptional ## Never # Проверка подписи выполняться не будет. Основная ## PackageNever # Только для пакетов. Дополнительная ## DatabaseNever # Только для базы данных. Дополнительная ## Optional # Подписи будут проверяться при их наличии, но неподписанные базы данных и пакеты также будут приниматься. Основная ## PackageOptional # Только для пакетов. Дополнительная ## *DatabaseOptional # Только для базы данных. Дополнительная ## *Required # Подписи будут необходимы для всех пакетов и баз данных. Основная ## PackageRequired # Только для пакетов. Дополнительная ## DatabaseRequired # Только для базы данных. Дополнительная ## TrustedOnly # Если подпись проверяется для пакетов и базы, она должна находиться в связке ключей и быть полностью доверенной; маргинальное доверие не применимо ## PackageTrustedOnly # Если подпись проверяется только для пакетов ## DatabaseTrustedOnly # Если подпись проверяется только для базы данных ## TrustAll # Если подпись проверена, она должна находиться в связке ключей, но ей не требуется назначать уровень доверия (например, неизвестное или предельное доверие) ## PackageTrustAll # Если подпись проверена только для пакетов ## DatabaseTrustAll # Если подпись проверена только для базы данных ## # Уровень использования этого репозитория. Не обязательный ## *All # Включать все перечисленные функции для репозитория, по умолчанию ## Sync # Включать обновления для этого репозитория ## Search # Включать поиск этого репозитория ## Install # Включать установку пакетов из этого репозитория во время операции --sync ## Upgrade # Позволить этому репозиторию быть действительным источником пакетов при выполнении --sysupgrade ## disable # Временно отключить управление репозиторием, либо после = указать - пример: REPOSITORY[modules]=-/etc/pacman.d/mirrorlist ## REPOSITORY[core]=/etc/pacman.d/mirrorlist;;;disable ## REPOSITORY[modules]="https://repo.ublinux.ru/2405/\$repo/\$arch" ## REPOSITORY[modules]='https://repo.ublinux.ru/2405/$repo/$arch' ## REPOSITORY[mymodules]=http://192.168.0.1:8080/repo/2204;;;disable ## REPOSITORY[webmyrepo]=http://myweb.org/myrepo;never ## REPOSITORY[localmyrepo]=file:///home/myrepo;never;All ## REPOSITORY[myrepo]=/home/myrepo/mirrorlist exec_01_repository(){ repository_enable_only(){ local FILE_SOURCE_DEFAULT="/usr/lib/ublinux/default" local FILE_SOURCE_UPDATE="${SYSCONF}/update" local FILE_PACMAN_CONF="${ROOTFS}/etc/pacman.conf" local REPOSITORY_LIST= local PACMAN_CONF_DATA= # Удалим все действующие репозитории awk -i inplace -v b=2 '/^\[.*\]$/{f=1; c++} !(f && c>=b); /^\s*$/{f=0}' ${FILE_PACMAN_CONF} # Удалить в конце файла все пустые строки sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' -i ${FILE_PACMAN_CONF} [[ ${REPOSITORY[0]} == "enable" ]] && REPOSITORY_LIST+=$(grep -oE "^[[:blank:]]*REPOSITORY\[.*]=" ${FILE_SOURCE_DEFAULT} 2>/dev/null)$'\n' REPOSITORY_LIST+=$(grep -oE "^[[:blank:]]*REPOSITORY\[.*]=" ${FILE_SOURCE_UPDATE} 2>/dev/null) local REPOSITORY_NAME= REPOSITORY_VAR= while IFS='=' read -u3 REPOSITORY_NAME REPOSITORY_VAR; do [[ ${REPOSITORY_NAME} =~ ^.*'['(.*)']' ]] && REPOSITORY_NAME=${BASH_REMATCH[1]} || continue [[ -n ${REPOSITORY[${REPOSITORY_NAME}]} ]] \ && while IFS=';' read -u4 REPOSITORY_SERVER_PATHS REPOSITORY_SIGLEVEL REPOSITORY_USAGE REPOSITORY_DISABLE NULL; do [[ ${REPOSITORY_SERVER_PATHS} =~ ^("disable"|"-") ]] && continue [[ ${REPOSITORY_DISABLE} = @("disable"|"off"|"no") ]] && continue PACMAN_CONF_DATA+=$'\n' PACMAN_CONF_DATA+="[${REPOSITORY_NAME}]"$'\n' [[ -n ${REPOSITORY_SIGLEVEL} ]] && PACMAN_CONF_DATA+="SigLevel = ${REPOSITORY_SIGLEVEL}"$'\n' [[ -n ${REPOSITORY_USAGE} ]] && PACMAN_CONF_DATA+="Usage = ${REPOSITORY_USAGE}"$'\n' [[ -n ${REPOSITORY_SERVER_PATHS} ]] \ && while IFS= read -u5 REPOSITORY_SERVER_PATH; do if [[ ${REPOSITORY_SERVER_PATH} =~ ^"/" ]]; then PACMAN_CONF_DATA+="Include = ${REPOSITORY_SERVER_PATH}"$'\n' elif [[ ${REPOSITORY_SERVER_PATH} =~ ^("file:"|"ftp:"|"http:"|"https:") ]]; then PACMAN_CONF_DATA+="Server = ${REPOSITORY_SERVER_PATH}"$'\n' fi done 5<<< "${REPOSITORY_SERVER_PATHS//,/$'\n'}" #echo "${REPOSITORY_NAME} == ${REPOSITORY_SERVER_PATHS} :: ${REPOSITORY_SIGLEVEL} :: ${REPOSITORY_USAGE} :: ${REPOSITORY_DISABLE} :: ${NULL}" done 4<<< "${REPOSITORY[${REPOSITORY_NAME}]}" done 3< <(awk -v RS="[\n]+" '!n[$0]++' <<< "${REPOSITORY_LIST}") echo "${PACMAN_CONF_DATA}" >> ${FILE_PACMAN_CONF} } repository_disable(){ # Отключить управление репозиториями, восстановить из пакета pacman.conf find /memory/bundles -maxdepth 3 -path "*/etc/*" -type f -name "pacman.conf" -exec cp -af {} "/etc/" \; -quit } [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local PARAM="$@" if [[ -n ${PARAM} ]]; then REPOSITORY_NAME=${PARAM%%=*} REPOSITORY_VAR=${PARAM#*=} fi if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#REPOSITORY[@]} != 0 ]]; then if [[ ${REPOSITORY[0]} == @("enable"|"only") ]]; then repository_enable_only elif [[ ${REPOSITORY[0]} == "disable" ]]; then repository_disable ubconfig --noexecute remove [update] REPOSITORY fi elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then if [[ ${REPOSITORY[0]} == @("enable"|"only") ]]; then repository_enable_only elif [[ ${REPOSITORY_NAME} == "REPOSITORY" ]]; then # Удаление параметра REPOSITORY= . Отключить управление репозиториями repository_disable fi fi } ## pacredir (https://github.com/eworm-de/pacredir) ## Опубликовать локальный репозиторий в локальной сети и подключиться к сети распределённых репозиториев ## При установке пакета пакет ищется в распределённой сети репозиториев и устанавливается самой последней доступной версией ## REPOPUBLIC_NET=disable|no|none|enable|yes,db,,..., ## disable|no|none # Отключить все репозитории от сети распределённых репозиториев ## enable|yes # Подключить все репозитории к сети распределённых репозиториев ## db # Получать БД пакетов pacman от сети распределённых репозиториев ## # Подключенное имя репозитория, например: core,extra,community,multilib,modules ## REPOPUBLIC_NET=enable,db ## REPOPUBLIC_NET=db,community,modules exec_02_repopublic_net(){ disable_pacredir(){ systemctl disable pacserve.service pacredir.service systemctl stop pacserve.service pacredir.service sed -E "/Include = \/etc\/pacman.d\/pacredir/d" -i ${FILE_PACMAN_CONF} } [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local FILE_PACMAN_CONF="${ROOTFS}/etc/pacman.conf" local FILE_PACREDIR_CONF="${ROOTFS}/etc/pacman.d/pacredir" if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#REPOPUBLIC_NET[@]} != 0 ]]; then local DB_CACHE= local REPOPUBLIC_NET_DISABLE= local DATA_PACMAN_CONF=$(cat ${FILE_PACMAN_CONF}) #sed -E "/Include = \/etc\/pacman.d\/pacredir/d" <<< ${DATA_PACMAN_CONF} local DATA_PACMAN_CONF=${DATA_PACMAN_CONF//$'\n'Include = \/etc\/pacman.d\/pacredir/} while IFS= read -u3 REPOPUBLIC_NET_REPOSITORY; do if [[ ${REPOPUBLIC_NET_REPOSITORY,,} == @("disable"|"no"|"none") ]]; then # Отключить управление REPOPUBLIC_NET_DISABLE=yes break elif [[ ${REPOPUBLIC_NET_REPOSITORY,,} == "db" ]]; then # Включить запрос БД pacman из кеш сервера DB_CACHE=yes elif [[ ${REPOPUBLIC_NET_REPOSITORY,,} == @("enable"|"yes") ]]; then # Добавить ко всем репозиториям в pacman.conf: Include = /etc/pacman.d/pacredir DATA_PACMAN_CONF=$(sed -E "0,/^\[.*\]$/! s/(^\[.*\]$)/\1\nInclude = \/etc\/pacman.d\/pacredir/" <<< ${DATA_PACMAN_CONF}) #" else # Добавить к указанному репозиторию, работать через кеш сервер DATA_PACMAN_CONF=$(sed -E "/\[${REPOPUBLIC_NET_REPOSITORY}\]/a Include = \/etc\/pacman.d\/pacredir" <<< ${DATA_PACMAN_CONF}) fi done 3<<< "${REPOPUBLIC_NET//,/$'\n'}" if [[ -n ${REPOPUBLIC_NET_DISABLE} ]]; then disable_pacredir else [[ -n ${DB_CACHE} ]] && sed -E "s/^#(Server = )/\1/" -i ${FILE_PACREDIR_CONF} || sed -E "s/^(Server = )/#\1/" -i ${FILE_PACREDIR_CONF} echo "${DATA_PACMAN_CONF}" > ${FILE_PACMAN_CONF} systemctl restart pacserve.service pacredir.service fi elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then disable_pacredir fi } ## darkhttpd or miniserve ## Опубликовать хранилище или репозиторий в виде локального WEB ресурса ## Если необходимо опубликовать выборочные репозитории, то создать новый каталог хранилища в который переместить симлинки выбранных репозиториев. Опубликовать новый каталог хранилища. ## REPOPUBLIC_WEB[[:]]=enable|yes|disable|no|none:listing:::: ## # Путь до каталога хранилища, который будет опубликован ## :repo1,repo2 # Путь до каталога хранилища и выбранные репозитории из хранилища которые будут опубликованы ## enable|yes # Включить публикацию ## disable|no|none # Выключить публикацию ## listing # Включить WEB обозреватель файлов. Не обязятельный ## # Порт по которому доступен репозиторий. По умолчанию: 8080. Не обязательный ## # Параметры авторизации, имя пользователя. Не обязательный ## # Параметры авторизации, открытый пароль или тип хеша. Не обязательный ## # Не зашифрованный пароль ## sha256 # Использовать зашифрованный пароль SHA256, применять только совместно с ## sha512 # Использовать зашифрованный пароль SHA512, применять только совместно с ## # Параметры авторизации, не зашифрованный или зашифрованный пароль SHA256 или SHA512. Не обязательный ## # Получить SHA шифр из пароля: echo -n "PASSWORD" | sha512sum | cut -f 1 -d ' ' ## REPOPUBLIC_WEB[/home/storage]=enable:listing ## REPOPUBLIC_WEB[/home/storage:repo-1,repo-2]=enable:listing::ublinux:123 ## REPOPUBLIC_WEB[/home/storage:repo-1,repo-2]=enable:listing::ublinux:sha512:123 ## REPOPUBLIC_WEB[/home/storage:repo-1,repo-2]=enable:listing::ublinux:sha256:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 exec_03_repopublic_web(){ kill_web_service(){ local REPOPUBLIC_WEB_PATH=$1 if [[ -n ${REPOPUBLIC_WEB_PATH} ]]; then # Убить процесс с указанным каталогом pkill -f "darkhttpd ${REPOPUBLIC_WEB_PATH}" pkill -f "miniserve .* ${REPOPUBLIC_WEB_PATH}" else # Убить все процессы pkill -f "darkhttpd .* ${PATH_LOG_REPOPUBLIC_WEB}" pkill -f "miniserve .* --title UBLinux Repository:" fi } mount_bind_storage(){ umount "${PATH_NEW_REPOPUBLIC_WEB_PATH}"/* 2>/dev/null install -dm755 "${PATH_NEW_REPOPUBLIC_WEB_PATH}/pool" mount --bind -o ro "${SRC_REPOPUBLIC_WEB_PATH_POOL}" "${PATH_NEW_REPOPUBLIC_WEB_PATH}/pool" while IFS= read -u4 SELECT_SRC_REPOPUBLIC_WEB_PATH_REPO; do if [[ -d ${SRC_REPOPUBLIC_WEB_PATH_POOL%/*}/${SELECT_SRC_REPOPUBLIC_WEB_PATH_REPO} ]]; then install -dm755 "${PATH_NEW_REPOPUBLIC_WEB_PATH}/${SELECT_SRC_REPOPUBLIC_WEB_PATH_REPO}" mount --bind -o ro "${SRC_REPOPUBLIC_WEB_PATH_POOL%/*}/${SELECT_SRC_REPOPUBLIC_WEB_PATH_REPO}" "${PATH_NEW_REPOPUBLIC_WEB_PATH}/${SELECT_SRC_REPOPUBLIC_WEB_PATH_REPO}" else echo "WARNING: repository '${SRC_REPOPUBLIC_WEB_PATH_POOL%/*}/${SELECT_SRC_REPOPUBLIC_WEB_PATH_REPO}' not found!" fi done 4<<< ${SRC_REPOPUBLIC_WEB_PATH_REPOLIST//,/$'\n'} } [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local PATH_NEW_REPOPUBLIC_WEB_PATH="${ROOTFS}/srv/http/repopublic_web" local PATH_LOG_REPOPUBLIC_WEB="${ROOTFS}/var/log/repopublic_web" if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#REPOPUBLIC_WEB[@]} != 0 ]]; then local ARGS_DRAKHTTPD=" --daemon --chroot --no-server-id --uid http --gid http --mimetypes /etc/conf.d/mimetypes --log ${PATH_LOG_REPOPUBLIC_WEB}/darkhttpd.log" local ARGS_MINISERV=" --color-scheme archlinux --color-scheme-dark archlinux --hide-theme-selector --hide-version-footer --dirs-first --title 'UBLinux Repository: '" [[ -d ${PATH_LOG_REPOPUBLIC_WEB} ]] || install -dm755 "${PATH_LOG_REPOPUBLIC_WEB}" while IFS= read -u3 REPOPUBLIC_WEB_PATHS; do local CREATE_BIND_STORAGE= if [[ ${REPOPUBLIC_WEB_PATHS} =~ ":" ]]; then # Указано хранилище и репозитории для публикации SRC_REPOPUBLIC_WEB_PATH_POOL="${REPOPUBLIC_WEB_PATHS%:*}/pool" SRC_REPOPUBLIC_WEB_PATH_REPOLIST=${REPOPUBLIC_WEB_PATHS#*:} if [[ -d ${SRC_REPOPUBLIC_WEB_PATH_POOL} ]]; then REPOPUBLIC_WEB_PATH=${PATH_NEW_REPOPUBLIC_WEB_PATH} CREATE_BIND_STORAGE=yes else # Публикуемый каталог не содержит pool всех пакетов, публикуем каталог храниища REPOPUBLIC_WEB_PATH=${REPOPUBLIC_WEB_PATHS} fi else # Указано только хранилище REPOPUBLIC_WEB_PATH=${REPOPUBLIC_WEB_PATHS} fi IFS=: read -r SELECT_STATUS SELECT_LISTING SELECT_PORT SELECT_AUTH_NAME SELECT_AUTH_PASS SELECT_AUTH_HASH NULL <<< "${REPOPUBLIC_WEB[${REPOPUBLIC_WEB_PATHS}]}" if [[ ${SELECT_STATUS} == @("enable"|"yes") ]]; then [[ -n ${CREATE_BIND_STORAGE} ]] && mount_bind_storage [[ ${SELECT_LISTING} == "listing" ]] || { ARGS_DRAKHTTPD+=" --no-listing"; ARGS_MINISERV+=" --disable-indexing"; } [[ -n ${SELECT_PORT} ]] && ARGS_DRAKHTTPD+=" --port ${SELECT_PORT}" && ARGS_MINISERV+=" --port ${SELECT_PORT}" || { ARGS_DRAKHTTPD+=" --port 80"; ARGS_MINISERV+=" --port 80"; } if [[ -n ${SELECT_AUTH_NAME} && -n ${SELECT_AUTH_PASS} ]]; then if [[ -z ${SELECT_AUTH_HASH} ]]; then ARGS_DRAKHTTPD+=" --auth ${SELECT_AUTH_NAME}:${SELECT_AUTH_PASS}"; ARGS_MINISERV+=" --auth ${SELECT_AUTH_NAME}:${SELECT_AUTH_PASS}" else ARGS_DRAKHTTPD= [[ ${SELECT_AUTH_PASS,,} == "sha256" && ${#SELECT_AUTH_HASH} -ne 64 ]] && SELECT_AUTH_HASH=$(echo -n "${SELECT_AUTH_HASH}" | sha256sum | cut -f 1 -d ' ') [[ ${SELECT_AUTH_PASS,,} == "sha512" && ${#SELECT_AUTH_HASH} -ne 128 ]] && SELECT_AUTH_HASH=$(echo -n "${SELECT_AUTH_HASH}" | sha512sum | cut -f 1 -d ' ') ARGS_MINISERV+=" --auth ${SELECT_AUTH_NAME}:${SELECT_AUTH_PASS}:${SELECT_AUTH_HASH}" fi fi if [[ -n ${ARGS_DRAKHTTPD} ]]; then # Без шифрованного пароля, используем darkhttpd kill_web_service "${REPOPUBLIC_WEB_PATH}" darkhttpd "${REPOPUBLIC_WEB_PATH}" ${ARGS_DRAKHTTPD} else # C шифрованным паролем, используем miniserve kill_web_service "${REPOPUBLIC_WEB_PATH}" eval setsid miniserve ${ARGS_MINISERV} -- "${REPOPUBLIC_WEB_PATH}" 1>"${PATH_LOG_REPOPUBLIC_WEB}"/miniserve.log 2>&1 & fi elif [[ ${SELECT_STATUS} == @("disable"|"no"|"none") ]]; then kill_web_service "${REPOPUBLIC_WEB_PATH}" umount "${PATH_NEW_REPOPUBLIC_WEB_PATH}"/* 2>/dev/null rm -rdf "${PATH_NEW_REPOPUBLIC_WEB_PATH}" fi done 3< <(printf "%s\n" "${!REPOPUBLIC_WEB[@]}") elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then kill_web_service umount "${PATH_NEW_REPOPUBLIC_WEB_PATH}"/* 2>/dev/null rm -rdf "${PATH_NEW_REPOPUBLIC_WEB_PATH}" fi } ## pacoloco (https://github.com/anatol/pacoloco) ## Опубликовать ленивое зеркало подключенных репозиториев в виде локального WEB ресурса. ## Получая запрос от пользователя, загружает с удалённого репозитория пакет и сохраняет в кеше передавая его пользователю. ## REPOPUBLIC_CACHE[]=enable|disable::@,...,@ ## # Путь до каталога файлов кеша, если не указан, то по умолчанию: /mnt/livedata/ublinux-data/repopublic_cache ## enable # Включить публикацию ## disable # Выключить публикацию ## # Порт по которому доступен репозиторий. По умолчанию: 8080. Не обязательный ## ## # Произвольное имя репозитория ## # Полный адрес репозитория URL или файл ## # Если не указано @, то по умолчанию системные /etc/pacman.d/mirrorlist ## # Возможно указать несколько, через запятую. ## # Файл списка зеркал, подключается как список зеркал с синтаксисом /etc/pacman.d/mirrorlist ## # Важно: в подключенном списке не должно быть адреса текущего сервера ## http:// # URL префикс для репозитория на HTTP ## https:// # URL префикс для репозитория на HTTPS ## REPOPUBLIC_CACHE[/mnt/livedata/ublinux-data/repopublic_cache]=enable ## REPOPUBLIC_CACHE[/mnt/livedata/ublinux-data/repopublic_cache]=enable:80:myrepo@http://192.168.0.1:8080/repo/2204 exec_04_repopublic_cache(){ true } ## Настройка автообновления системы ## AUTOUPDATE=enable | :: ## enable # Включает автообновление с параметрами modsys:boot:core,extra,community,multilib,ublinux,modules ## # Режимы обновления ## *modsys # Вначале обновлять все модули и после систему ## module # Обновлять только модули ## system # Обновлять всё в порядке указанных репозиториев ## # Интервал обновления ## *boot # Каждую загрузку ## 12h # Каждые 12 часов ## 7d # Каждые 7 дней ## 1m # Один раз в месяц ## # Имена репозиториев с которых будет происходить обновление. Если не указано, то по умолчанию: core,extra,community,multilib,ublinux,modules ## AUTOUPDATE=enable exec_autoupdate(){ true } ## Удалить старые версии дубликато пакетов в базе pacman exec_remove_duplicated_pacman(){ PATH_PACMAN_DB="/var/lib/pacman/local/" # Из всех дубликатов приложений в базе pacman удалить старые версии cd ${PATH_PACMAN_DB}; rm -rdf $(ls -1vr ${PATH_PACMAN_DB} | sed -En 's/((.*)-([^-]+)-([^-]+))/\2|\1/p' | awk -F '|' 'prefixes[$1]++ {print $2}') #' # Ситуация для которой нет обработки # Если в полном сохранении пользователь обновиляет систему и в очередное обновление обновил только модули, то изменения останутся старыми, т.к. /changes/ имеет верхний слой # т.е. по факту прилложения останутся старыми. Новые файлы из модуля будут видны, и далее могут не дать обновить на новые пакеты. Поэтому старые пакеты из базы pacman удаляем # т.е. в базе pacman будут новые пакеты, а по факту файлы/бинарники старые # Одно из решений - после установки модулей проверять какие пакеты в базе дублируются и эти файлы этих приложений из модуля переписать в корень #sudo rsync -hrlptgoDHAXEU --existing --update --exclude ".wh.*" --progress /memory/bundles/010-core-2204-2-x86_64.ubm/ / } ################ ##### MAIN ##### ################ # Если файл подключен как ресурс с функциями, то выйти return 0 2>/dev/null && return 0 if [[ -z $@ ]]; then while read -ru3 FUNCTION; do $"${FUNCTION##* }" done 3< <(declare -F | grep "declare -f exec_") else FUNCTION= while [[ $# -gt 0 ]]; do [[ -z ${1} ]] || { declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; } shift done eval ${FUNCTION#*; } fi