#!/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|only ## *disable # Отключить управление списком репозиториев, по умолчанию ## # Используются репозитории из пакета pacman, по умолчанию: core,extra,community,multilib,modules ## enable # Включить управление списком репозиториев ## # Используются системные репозитории core,extra,community,multilib,modules и указанные в параметре REPOSITORY[*] ## # Если не указаны дополнитеьные репозитории в параметре REPOSITORY[*] и включен любой режим песочницы, то активен только репозиторий 'modules' ## 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 ## Если требуется создать файл зеркала в пакетном режиме, то пример: ubconfig set [/etc/pacman.d/ub-mirrorlist] "|SERVER=http://repo.ublinux.ru/2405/\$repo/\$arch" "|SERVER=https://repo.ublinux.ru/2405/\$repo/\$arch" ## ## 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(){ local FILE_SOURCE_DEFAULT="/usr/lib/ublinux/default" local FILE_SOURCE_UPDATE="${SYSCONF}/update" local FILE_PACMAN_CONF="${ROOTFS}/etc/pacman.conf" local PACMAN_CONF_DATA= local ARG_UBCONFIG= # Удалим все действующие репозитории 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} local REPOSITORY_LIST= REPOSITORY_LIST_DEFAULT= REPOSITORY_LIST_SOURCE= REPOSITORY_LIST_SOURCE=$(grep -oE "^[[:blank:]]*REPOSITORY\[.*\]" ${FILE_SOURCE_UPDATE} 2>/dev/null) if [[ ${REPOSITORY[0]} == "enable" ]]; then # Если включено управление репозиториями 'enable' + не заданы пользовательские репозитории + режим песочницы, то включить только модули if [[ ${SYSTEMBOOT_STATEMODE,,} == @("sandbox"|"sandbox_ram_home"|"sandbox_hdd"|"sandbox_hdd_home") && ${REPOSITORY_LIST_SOURCE} == "" ]]; then REPOSITORY_LIST_DEFAULT=$(grep -oE "^[[:blank:]]*REPOSITORY\[modules\]" ${FILE_SOURCE_DEFAULT} 2>/dev/null)$'\n' else REPOSITORY_LIST_DEFAULT=$(grep -oE "^[[:blank:]]*REPOSITORY\[.*\]" ${FILE_SOURCE_DEFAULT} 2>/dev/null)$'\n' fi ARG_UBCONFIG="--default" fi REPOSITORY_LIST="${REPOSITORY_LIST_DEFAULT}${REPOSITORY_LIST_SOURCE}" local REPOSITORY_NAME= REPOSITORY_VAR= while IFS='' read -u3 REPOSITORY_NAME; do [[ ${REPOSITORY_NAME} =~ ^.*'['(.*)']' ]] && REPOSITORY_NAME=${BASH_REMATCH[1]} || continue REPOSITORY_VAR=$(ubconfig --quiet --raw ${ARG_UBCONFIG} --source system get [update] REPOSITORY[${REPOSITORY_NAME}] 2>/dev/null) [[ -n ${REPOSITORY_VAR} ]] \ && while IFS=';' read -r -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 -r -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_VAR}" # awk - Из списка удалить вторые дубликаты, не меняя порядок 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 elif [[ ${REPOSITORY[0]} == "disable" ]]; then repository_disable ubconfig --quiet --nocolor --noexecute remove [update] REPOSITORY fi elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then if [[ ${REPOSITORY[0]} == @("enable"|"only") ]]; then repository_enable 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=enable,db,community,modules exec_02_repopublic_net(){ disable_pacredir(){ systemctl --quiet disable pacserve.service pacredir.service systemctl --quiet stop pacserve.service pacredir.service sed -E "/Include = \/etc\/pacman.d\/pacredir/d" -i ${FILE_PACMAN_CONF} sed -E "s/^(Server = )/#\1/" -i ${FILE_PACREDIR_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_ENABLE= local REPOPUBLIC_NET_ENABLE_MANUAL= 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_ENABLE= break elif [[ ${REPOPUBLIC_NET_REPOSITORY,,} == @("enable"|"yes") ]]; then # Включить управление REPOPUBLIC_NET_ENABLE=yes elif [[ ${REPOPUBLIC_NET_REPOSITORY,,} == "db" ]]; then # Включить запрос БД pacman из кеш сервера DB_CACHE=yes else REPOPUBLIC_NET_ENABLE="manual" # Добавить к указанному репозиторию, работать через кеш сервер DATA_PACMAN_CONF=$(sed -E "/\[${REPOPUBLIC_NET_REPOSITORY}\]/a Include = \/etc\/pacman.d\/pacredir" <<< ${DATA_PACMAN_CONF}) fi done 3<<< "${REPOPUBLIC_NET//,/$'\n'}" if [[ -z ${REPOPUBLIC_NET_ENABLE} ]]; then disable_pacredir else # Если не укзаны репозитории, то добавить ко всем репозиториям в pacman.conf: Include = /etc/pacman.d/pacredir [[ ${REPOPUBLIC_NET_ENABLE} == "manual" ]] || DATA_PACMAN_CONF=$(sed -E "0,/^\[.*\]$/! s/(^\[.*\]$)/\1\nInclude = \/etc\/pacman.d\/pacredir/" <<< ${DATA_PACMAN_CONF}) #" [[ -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 --quiet 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 обозреватель файлов. Не обязятельный ## # Порт по которому доступен репозиторий. По умолчанию: 80. Не обязательный ## # Параметры авторизации, имя пользователя. Не обязательный ## # Параметры авторизации, открытый пароль или тип хеша. Не обязательный ## # Не зашифрованный пароль ## 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|yes|disable|no|none ## enable|yes # Включить ленивое зеркало ## disable|no|none # Выключить ленивое зеркало ## ## Если задано только "REPOPUBLIC_CACHE=enable" без указания рпозиториев пользователем, то создаётся зеркало по умолчанию, где "2204" версия текущего дистрибутива: ## : REPOPUBLIC_CACHE[ublinux_2405]=url@http://repo.ublinux.ru/2405,url@https://repo.ublinux.ru/2405 ## На клиенте необходимо указать: ## либо в файле "/etc/pacman.conf" у каждого репозитория: Server=http://ipadress:8080/repo/ublinux_2204/$repo/$arch ## либо в файле "/etc/pacman.d/mirrorlist" для всех репозиториев: Server=http://ipadress:8080/repo/ublinux_2204/$repo/$arch ## либо параметры в конфигурации REPOSITORY[core]='http://ipadress:8080/repo/ublinux_2204/$repo/$arch' ## ## REPOPUBLIC_CACHE[]= ## : # Параметр управления, возможные варианты: ## port # Порт сервиса, по умолчанию: 80 ## cache_dir # Каталог кэша, по умолчанию: /memory/layer-base/1/repopublic_cache ## purge_files_after # Продолжительность бездействия (в секундах), по истечении которой файл должен быть удален из кэша, по умолчанию: 360000 ## # =360000 секунд или 100 часов, =0 никогда не выполнять ## download_timeout # Таймаут (в секундах) для загрузки интернет-кэша, по умолчанию: 3600 ## http_proxy # Работать через прокси. Пример: http://foo.company.com:8989 ## user_agent # Пользовательский агент, используемый для извлечения файлов из репозиториев, по умолчанию: repopublic/1.0 ## prefetch.cron # Cтандартное выражение cron, пример: 0 0 3 * * * * ## # (https://en.wikipedia.org/wiki/Cron#CRON_expression) (https://github.com/gorhill/cronexpr#implementation ) ## prefetch.ttl_unaccessed_in_days # Количество дней подряд, в течение которых не обновляются системы в сети, по умолчанию: 30 ## # Удалять и останавливать пакеты предварительной выборки (и ссылки на базы данных), если они не загружены после ttl_unaccessed_in_days дней, после обновления ## prefetch.ttl_unupdated_in_days # Количество дней подряд, в течение которых не было запрошено обновление, по умолчанию: 300 ## # Удалять и останавливать пакеты предварительной выборки, которые не были обновлены в исходной версии или запрошены в течение ttl_unupdated_in_days ## REPOPUBLIC_CACHE[]=@ ## # Имя репозитория, для подключения клиентов ## : # Тип подключаемого репозитория ## url # Вэб ссылка на репозиторий ## http_proxy # Прокси-сервер, может быть включен для каждого репозитория, затеняя глобальный 'http_proxy' ## mirrorlist # Файл зеркал. Будьте осторожны! Убедитесь, что URL текущего сервера НЕ включен в этот файл! ## # Ресурс, можно указать несколько черз зпятую (,) ## REPOPUBLIC_CACHE[ublinux_2405]="url@http://repo.ublinux.ru/2405,url@https://repo.ublinux.ru/2405" ## REPOPUBLIC_CACHE[myrepo_x86_64]="url@http://my.repo.ru/myrepo/x86_64" ## REPOPUBLIC_CACHE[newrepo]="http_proxy@http://proxy.localnet.ru:8080,url@http://192.168.1.1/newrepo/x86_64" ## REPOPUBLIC_CACHE[ublinux-reflector]="mirrorlist@/etc/pacman.d/reflector_mirrorlist" exec_04_repopublic_cache(){ enable_pacoloco(){ local FILE_PACOLOCO_CONF="${ROOTFS}/etc/pacoloco.yaml" local REPOPUBLIC_CACHE_REPO_MANUAL= [[ -d ${REPOPUBLIC_CACHE[cache_dir]} ]] || install -dm755 ${REPOPUBLIC_CACHE[cache_dir]} chown -R pacoloco:pacoloco ${REPOPUBLIC_CACHE[cache_dir]} true > ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[port]} ]] && yq '.port = '${REPOPUBLIC_CACHE[port]}'' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[cache_dir]} ]] && yq '.cache_dir = "'${REPOPUBLIC_CACHE[cache_dir]}'"' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[purge_files_after]} ]] && yq '.purge_files_after = '${REPOPUBLIC_CACHE[purge_files_after]}'' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[download_timeout]} ]] && yq '.download_timeout = '${REPOPUBLIC_CACHE[download_timeout]}'' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[user_agent]} ]] && yq '.user_agent = "'${REPOPUBLIC_CACHE[user_agent]}'"' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[http_proxy]} ]] && yq '.http_proxy = "'${REPOPUBLIC_CACHE[http_proxy]}'"' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[prefetch.cron]} ]] && yq '.prefetch.cron = "'${REPOPUBLIC_CACHE[prefetch.cron]}'"' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[prefetch.ttl_unaccessed_in_days]} ]] && yq '.prefetch.ttl_unaccessed_in_days = '${REPOPUBLIC_CACHE[prefetch.ttl_unaccessed_in_days]}'' --inplace ${FILE_PACOLOCO_CONF} [[ ${REPOPUBLIC_CACHE[prefetch.ttl_unupdated_in_days]} ]] && yq '.prefetch.ttl_unupdated_in_days = '${REPOPUBLIC_CACHE[prefetch.ttl_unupdated_in_days]}'' --inplace ${FILE_PACOLOCO_CONF} while IFS= read -u3 SELECT_REPOPUBLIC_CACHE; do if [[ ${SELECT_REPOPUBLIC_CACHE,,} == @(0|"port"|"cache_dir"|"purge_files_after"|"download_timeout"|"user_agent"|"http_proxy"|"prefetch.cron"|"prefetch.ttl_unaccessed_in_days"|"prefetch.ttl_unupdated_in_days") ]]; then # Название параметра, не репозиторий true else # Имя репозитория REPOPUBLIC_CACHE_REPO_MANUAL=yes REPOPUBLIC_CACHE_URL_LIST=() while IFS= read -u4 SELECT_REPOPUBLIC_CACHE_URL; do if [[ ${SELECT_REPOPUBLIC_CACHE_URL} =~ (.*)"@"(.*) ]]; then REPOPUBLIC_CACHE_TYPE=${BASH_REMATCH[1]} REPOPUBLIC_CACHE_URL=${BASH_REMATCH[2]} if [[ ${REPOPUBLIC_CACHE_TYPE} == @("url"|"urls") ]]; then REPOPUBLIC_CACHE_URL_LIST+=(${REPOPUBLIC_CACHE_URL}) else yq -p yaml -o yaml '.repos.'${SELECT_REPOPUBLIC_CACHE}'.'${REPOPUBLIC_CACHE_TYPE}' = "'${REPOPUBLIC_CACHE_URL}'"' --inplace ${FILE_PACOLOCO_CONF} fi fi done 4<<< "${REPOPUBLIC_CACHE[${SELECT_REPOPUBLIC_CACHE}]//,/$'\n'}" if [[ ${#REPOPUBLIC_CACHE_URL_LIST[@]} -ge 2 ]]; then REPOPUBLIC_CACHE_TYPE="urls" for SELECT_REPOPUBLIC_CACHE_URL in ${REPOPUBLIC_CACHE_URL_LIST[@]}; do yq -p yaml -o yaml '.repos.'${SELECT_REPOPUBLIC_CACHE}'.'${REPOPUBLIC_CACHE_TYPE}' += ["'${SELECT_REPOPUBLIC_CACHE_URL}'"]' --inplace ${FILE_PACOLOCO_CONF} done else REPOPUBLIC_CACHE_TYPE="url" yq -p yaml -o yaml '.repos.'${SELECT_REPOPUBLIC_CACHE}'.'${REPOPUBLIC_CACHE_TYPE}' = "'${REPOPUBLIC_CACHE_URL}'"' --inplace ${FILE_PACOLOCO_CONF} fi fi done 3< <(printf "%s\n" "${!REPOPUBLIC_CACHE[@]}") if [[ ${REPOPUBLIC_CACHE_REPO_MANUAL} == "" ]]; then VERSION_ID=$(grep "VERSION_ID" ${ROOTFS}/etc/os-release | cut -d= -f2) yq -p yaml -o yaml \ '.repos.ublinux_'${VERSION_ID}'.urls += ["http://repo.ublinux.ru/'${VERSION_ID}'"] | .repos.ublinux_'${VERSION_ID}'.urls += ["https://repo.ublinux.ru/'${VERSION_ID}'"]' --inplace ${FILE_PACOLOCO_CONF} fi systemctl --quiet restart pacoloco.service } disable_pacoloco(){ systemctl --quiet disable pacoloco.service systemctl --quiet stop pacoloco.service find /memory/bundles -maxdepth 3 -path "*/etc/*" -type f -name "pacoloco.yaml" -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 REPOPUBLIC_CACHE_NAME=${PARAM%%=*} REPOPUBLIC_CACHE_VAR=${PARAM#*=} fi if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#REPOPUBLIC_CACHE[@]} != 0 ]]; then if [[ ${REPOPUBLIC_CACHE[0]} == @("enable"|"yes") ]]; then # Включить управление enable_pacoloco elif [[ ${REPOPUBLIC_CACHE[0]} == @("disable"|"no"|"none") ]]; then # Отключить управление disable_pacoloco fi elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then if [[ ${REPOPUBLIC_CACHE[0]} == @("enable"|"yes") ]]; then # Включить управление enable_pacoloco elif [[ ${REPOPUBLIC_CACHE_NAME} == "REPOPUBLIC_CACHE" ]]; then # Отключить управление disable_pacoloco fi fi } ## Настройка автообновления системы ## AUTOUPDATE=enable ## enable # Включает автообновление. Параметрами по умолчанию: modsys boot core,extra,community,multilib,modules ## Настройка режимов обновления ## AUTOUPDATE[mode]=*modsys|modules|system ## *modsys # Вначале обновлять все модули и после систему. Использует [update] REPOSITORY[modules]= ## modules # Обновлять только модули. Использует [update] REPOSITORY[modules]= ## system # Обновлять всё в порядке указанных репозиториев ## Настройка интервала обновления ## AUTOUPDATE[interval]=*boot,30min|12h|*7d|1M ## *boot # Каждую загрузку ## 30min # Каждые 30 минут, возможно указать любую цифру ## 12h # Каждые 12 часов, возможно указать любую цифру ## *7d # Каждые 7 дней, возможно указать любую цифру ## 1M # Один раз в месяц, возможно указать любую цифру ## Настройка репозиториев обновления ## AUTOUPDATE[repos]= ## # Имена репозиториев с которых будет происходить обновление. Если не указано, то по умолчанию системные ## AUTOUPDATE=enable exec_autoupdate(){ enable_autoupdate(){ ONBOOTSEC= ONACTIVESEC= AUTOUPDATE_INTERVAL_SEC= while read -u3 AUTOUPDATE_INTERVAL; do [[ ${AUTOUPDATE_INTERVAL} == "boot" ]] && ONBOOTSEC="OnBootSec=" || ONACTIVESEC="OnActiveSec=" if [[ ${AUTOUPDATE_INTERVAL} =~ ^([[:digit:]])"min"$ ]]; then AUTOUPDATE_INTERVAL_SEC="${BASH_REMATCH[1]}min" elif [[ ${AUTOUPDATE_INTERVAL} =~ ^([[:digit:]])"h"$ ]]; then AUTOUPDATE_INTERVAL_SEC="${BASH_REMATCH[1]}h" elif [[ ${AUTOUPDATE_INTERVAL} =~ ^([[:digit:]])"d"$ ]]; then AUTOUPDATE_INTERVAL_SEC="$((${BASH_REMATCH[1]}*24))h" elif [[ ${AUTOUPDATE_INTERVAL} =~ ^([[:digit:]])"M"$ ]]; then AUTOUPDATE_INTERVAL_SEC="$((${BASH_REMATCH[1]}*24*30))h" fi done 3<<< ${AUTOUPDATE[interval]//,/$'\n'} ONUNITACTIVESEC="OnUnitActiveSec=${AUTOUPDATE_INTERVAL_SEC}" [[ -n ${ONBOOTSEC} ]] & ONBOOTSEC+="${AUTOUPDATE_INTERVAL_SEC}" [[ -n ${ONACTIVESEC} ]] & ONACTIVESEC+="${AUTOUPDATE_INTERVAL_SEC}" cat <<-EOF > "${PATH_AUTOUPDATE_SERVICE}" [Unit] Description=Automatic Update UBLinux After=network-online.target [Service] Type=simple SyslogIdentifier=autoupdate ExecStart=${FILE_LIVE_AUTOUPDATE} TimeoutStopSec=300 KillMode=process KillSignal=SIGINT [Install] WantedBy=multi-user.target EOF cat <<-EOF > "${PATH_AUTOUPDATE_TIMER}" [Unit] Description=Automatic Update UBLinux [Timer] ${ONBOOTSEC} ${ONACTIVESEC} ${ONUNITACTIVESEC} Unit=${AUTOUPDATE_SERVICE} [Install] WantedBy=multi-user.target EOF systemctl --quiet daemon-reload systemctl --quiet restart ${AUTOUPDATE_TIMER} } disable_autoupdate(){ systemctl --quiet disable ${AUTOUPDATE_TIMER} ${AUTOUPDATE_SERVICE} 2>/dev/null systemctl --quiet stop ${AUTOUPDATE_TIMER} ${AUTOUPDATE_SERVICE} 2>/dev/null rm -f "${PATH_AUTOUPDATE_SERVICE}" "${PATH_AUTOUPDATE_TIMER}" systemctl --quiet daemon-reload } [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift [[ -n ${COMMAND} ]] || COMMAND="set=" local PARAM="$@" if [[ -n ${PARAM} ]]; then AUTOUPDATE_NAME=${PARAM%%=*} AUTOUPDATE_VAR=${PARAM#*=} fi FILE_LIVE_AUTOUPDATE="/usr/lib/ublinux/rc.local.d/43-repository live_autoupdate" AUTOUPDATE_SERVICE="ubconfig-autoupdate.service" PATH_AUTOUPDATE_SERVICE="/usr/lib/systemd/system/${AUTOUPDATE_SERVICE}" AUTOUPDATE_TIMER="ubconfig-autoupdate.timer" PATH_AUTOUPDATE_TIMER="/usr/lib/systemd/system/${AUTOUPDATE_TIMER}" if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]]; then if [[ ${AUTOUPDATE[0]} == @("enable"|"yes") ]]; then enable_autoupdate elif [[ ${AUTOUPDATE[0]} == @("disable"|"no") ]]; then disable_autoupdate fi elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then if [[ ${AUTOUPDATE[0]} == @("enable"|"yes") ]]; then enable_autoupdate elif [[ ${AUTOUPDATE_NAME} == "AUTOUPDATE" ]]; then disable_autoupdate fi fi } # Обновление системы, выполняемое сервисом "ubconfig-autoupdate.service" по таймеру "ubconfig-autoupdate.timer" live_autoupdate(){ autoupdate_only_modules(){ # Обновить систему только из репозитория [modules] # Соханить параметры до обновления SAVE_REPOSITORY=$(ubconfig --nocolor --source system get [update] REPOSITORY) SAVE_REPOSITORY_ARRAY=$(ubconfig --nocolor --source system get [update] REPOSITORY[*]) REPOSITORY_MODULES=$(ubconfig --nocolor --source system get [update] REPOSITORY[modules]) [[ ${REPOSITORY_MODULES} == @(""|"(null)") ]] && REPOSITORY_MODULES="REPOSITORY[modules]=/etc/pacman.d/mirrorlist" ubconfig --quiet --nocolor --target system set [update] REPOSITORY=disable ubconfig --quiet --nocolor --target system remove [update] "REPOSITORY[*]" ubconfig --quiet --nocolor --target system set [update] ${REPOSITORY_MODULES} ubconfig --quiet --nocolor --target system set [update] REPOSITORY=only /usr/bin/nice -n 19 /usr/bin/pacman -Syuwq --noconfirm /usr/bin/nice -n 19 /usr/bin/pacman -Suu --noconfirm ubconfig --quiet --nocolor --target system set [update] REPOSITORY=disable ubconfig --quiet --nocolor --target system remove [update] "REPOSITORY[*]" # Восстановить параметры после обновления [[ ${SAVE_REPOSITORY} == @(""|"(null)") ]] || ubconfig --quiet --nocolor --target system set [update] ${SAVE_REPOSITORY} [[ ${SAVE_REPOSITORY_ARRAY} == @(""|"(null)") ]] || ubconfig --quiet --nocolor --target system set [update] ${SAVE_REPOSITORY_ARRAY} } if [[ ${AUTOUPDATE[0]} == @("enable"|"yes") ]]; then FILE_LOG_AUTOUPDATE="/var/log/ubconfig-autoupdate.log" exec &> >(tee -a "${FILE_LOG_AUTOUPDATE}") echo date if [[ ${AUTOUPDATE[mode]} == "modsys" ]]; then # Обновить систему из репозитория [modules] autoupdate_only_modules # Обновить систему из всех подключеных репозиториев /usr/bin/nice -n 19 /usr/bin/pacman -Syuwq --noconfirm /usr/bin/nice -n 19 /usr/bin/pacman -Suu --noconfirm elif [[ ${AUTOUPDATE[mode]} == "modules" ]]; then # Обновить систему из репозитория [modules] autoupdate_only_modules elif [[ ${AUTOUPDATE[mode]} == "system" ]]; then # Обновить систему из всех подключеных репозиториев /usr/bin/nice -n 19 /usr/bin/pacman -Syuwq --noconfirm /usr/bin/nice -n 19 /usr/bin/pacman -Suu --noconfirm fi UPDATE_TIMESTAMP=$(date +'%Y-%m-%d %H:%M') ubconfig --quiet --nocolor set [update] AUTOUPDATE[timestamp]="${UPDATE_TIMESTAMP}" #notify_send "Update ${UPDATE_TIMESTAMP}" -i dialog-warning #notify-send --action 'STOPUPDATE=Остановить обновление' test fi } ## Удалить старые версии дубликато пакетов в базе 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