From bd40524c9ca809ac5d4926d41e8e0767c7d23b4d Mon Sep 17 00:00:00 2001 From: asmeron Date: Mon, 26 Jan 2026 16:40:07 +0600 Subject: [PATCH] Add new option REPOPUBLIC_FTP[*] --- ublinux/functions | 1 + ublinux/rc.local.d/43-repository | 93 ++++++++++++++++++++++++------ ublinux/templates/ublinux-data.ini | 12 ++-- 3 files changed, 85 insertions(+), 21 deletions(-) diff --git a/ublinux/functions b/ublinux/functions index d23f346..b0a2e98 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -884,6 +884,7 @@ ubconfig_exec_system(){ REPOSITORY\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.local.d/43-repository exec_01_repository "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; REPOPUBLIC_NET) ${ROOTFS}/usr/lib/ublinux/rc.local.d/43-repository exec_02_repopublic_net "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; REPOPUBLIC_WEB\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.local.d/43-repository exec_03_repopublic_web "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; + REPOPUBLIC_FTP\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.local.d/43-repository exec_03_repopublic_ftp "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; REPOPUBLIC_CACHE) ${ROOTFS}/usr/lib/ublinux/rc.local.d/43-repository exec_04_repopublic_cache "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; REPOPUBLIC_CACHE\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.local.d/43-repository exec_04_repopublic_cache "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; AUTOUPDATE) ${ROOTFS}/usr/lib/ublinux/rc.local.d/43-repository exec_autoupdate "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; diff --git a/ublinux/rc.local.d/43-repository b/ublinux/rc.local.d/43-repository index 5708fc4..53e1370 100755 --- a/ublinux/rc.local.d/43-repository +++ b/ublinux/rc.local.d/43-repository @@ -318,24 +318,83 @@ exec_03_repopublic_web(){ fi } -# TODO -#BusyBox v1.32.0-nethunter (2020-12-28 12:01:33 AEDT) multi-call binary. -#Usage: ftpd [-wvS] [-a USER] [-t N] [-T N] [DIR] -#FTP server. Chroots to DIR, if this fails (run by non-root), cds to it. -#Should be used as inetd service, inetd.conf line: -# 21 stream tcp nowait root ftpd ftpd /files/to/serve -#Can be run from tcpsvd: -# tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve -# -w Allow upload -# -A No login required, client access occurs under ftpd's UID -# -a USER Enable 'anonymous' login and map it to USER -# -v Log errors to stderr. -vv: verbose log -# -S Log errors to syslog. -SS: verbose log -# -t,-T N Idle and absolute timeout -# busybox tcpsvd -vE 0.0.0.0 21 ftpd -A /data/data/com.termux/files/home +## Опубликовать хранилище или репозиторий в виде локального FTP ресурса +## Если необходимо опубликовать выборочные репозитории, то создать новый каталог хранилища в который переместить симлинки выбранных репозиториев. Опубликовать новый каталог хранилища. +## REPOPUBLIC_FTP[|:,,<...>]=enable|yes|disable|no|none:: +## # Путь до каталога хранилища, который будет опубликован +## :repo1,repo2 # Путь до каталога хранилища и выбранные репозитории из хранилища которые будут опубликованы +## enable|yes # Включить публикацию +## disable|no|none # Выключить публикацию +## # Порт по которому доступен репозиторий. По умолчанию: 21. Не обязательный +## # Пользователь от которого будет работать анонимный пользователь. Не обязательный. +## REPOPUBLIC_FTP[/home/storage]=enable +## REPOPUBLIC_FTP[/home/storage:repo-1,repo-2]=enable:21 +## REPOPUBLIC_FTP[/home/storage:repo-1,repo-2]=enable:21:ftp exec_03_repopublic_ftp(){ -#REPOPUBLIC_WEB - true + kill_ftp_service(){ + local SELECT_PORT=$1 + if [[ -n ${SELECT_PORT} ]]; then + # Убить процесс с указанным каталогом + pkill -f "^busybox tcpsvd -vE 0.0.0.0 ${SELECT_PORT} ftpd .*" + else + # Убить все процессы + pkill -f "^busybox tcpsvd -vE 0.0.0.0 [[:digit:]]+ ftpd .*" + fi + } + mount_bind_storage(){ + umount "${PATH_NEW_REPOPUBLIC_FTP_PATH}"/* 2>/dev/null + install -dm755 "${PATH_NEW_REPOPUBLIC_FTP_PATH}/pool" + mount --bind -o ro "${SRC_REPOPUBLIC_FTP_PATH_POOL}" "${PATH_NEW_REPOPUBLIC_FTP_PATH}/pool" + while IFS= read -u4 SELECT_SRC_REPOPUBLIC_FTP_PATH_REPO; do + if [[ -d ${SRC_REPOPUBLIC_FTP_PATH_POOL%/*}/${SELECT_SRC_REPOPUBLIC_FTP_PATH_REPO} ]]; then + install -dm755 "${PATH_NEW_REPOPUBLIC_FTP_PATH}/${SELECT_SRC_REPOPUBLIC_FTP_PATH_REPO}" + mount --bind -o ro "${SRC_REPOPUBLIC_FTP_PATH_POOL%/*}/${SELECT_SRC_REPOPUBLIC_FTP_PATH_REPO}" "${PATH_NEW_REPOPUBLIC_FTP_PATH}/${SELECT_SRC_REPOPUBLIC_FTP_PATH_REPO}" + else + echo "WARNING: repository '${SRC_REPOPUBLIC_FTP_PATH_POOL%/*}/${SELECT_SRC_REPOPUBLIC_FTP_PATH_REPO}' not found!" + fi + done 4<<< ${SRC_REPOPUBLIC_FTP_PATH_REPOLIST//,/$'\n'} + } + [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && COMMAND=$1 && shift + [[ -n ${COMMAND} ]] || COMMAND="set=" + local PATH_NEW_REPOPUBLIC_FTP_PATH="${ROOTFS}/srv/ftp/repopublic_ftp" + local PATH_LOG_REPOPUBLIC_FTP="${ROOTFS}/var/log/repopublic_ftp" + if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#REPOPUBLIC_FTP[@]} != 0 ]]; then + local ARGS_BUSYBOX_FTPD= + [[ -d ${PATH_LOG_REPOPUBLIC_FTP} ]] || install -dm755 "${PATH_LOG_REPOPUBLIC_FTP}" + while IFS= read -u3 REPOPUBLIC_FTP_PATHS; do + local CREATE_BIND_STORAGE= + if [[ ${REPOPUBLIC_FTP_PATHS} =~ ":" ]]; then + # Указано хранилище и репозитории для публикации + SRC_REPOPUBLIC_FTP_PATH_POOL="${REPOPUBLIC_FTP_PATHS%:*}/pool" + SRC_REPOPUBLIC_FTP_PATH_REPOLIST=${REPOPUBLIC_FTP_PATHS#*:} + if [[ -d ${SRC_REPOPUBLIC_FTP_PATH_POOL} ]]; then + REPOPUBLIC_FTP_PATH=${PATH_NEW_REPOPUBLIC_FTP_PATH} + CREATE_BIND_STORAGE=yes + else + # Публикуемый каталог не содержит pool всех пакетов, публикуем каталог храниища + REPOPUBLIC_FTP_PATH=${REPOPUBLIC_FTP_PATHS} + fi + else + # Указано только хранилище + REPOPUBLIC_FTP_PATH=${REPOPUBLIC_FTP_PATHS} + fi + IFS=: read -r SELECT_STATUS SELECT_PORT SELECT_MAP_USERNAME NULL <<< "${REPOPUBLIC_FTP[${REPOPUBLIC_FTP_PATHS}]}" + if [[ ${SELECT_STATUS} == @("enable"|"yes") ]]; then + [[ -n ${CREATE_BIND_STORAGE} ]] && mount_bind_storage + [[ -n ${SELECT_MAP_USERNAME} ]] && SELECT_MAP_USERNAME="-a ${SELECT_MAP_USERNAME}" + kill_ftp_service ${SELECT_PORT:-21} + setsid busybox tcpsvd -vE 0.0.0.0 ${SELECT_PORT:-21} ftpd -vv ${SELECT_MAP_USERNAME} -A "${REPOPUBLIC_FTP_PATH}" 1>"${PATH_LOG_REPOPUBLIC_FTP}"/busybox_ftpd.log 2>&1 & + elif [[ ${SELECT_STATUS} == @("disable"|"no"|"none") ]]; then + kill_ftp_service ${SELECT_PORT:-21} + umount "${PATH_NEW_REPOPUBLIC_FTP_PATH}"/* 2>/dev/null + rm -rf "${PATH_NEW_REPOPUBLIC_FTP_PATH}" + fi + done 3< <(printf "%s\n" "${!REPOPUBLIC_FTP[@]}") + elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then + kill_ftp_service + umount "${PATH_NEW_REPOPUBLIC_FTP_PATH}"/* 2>/dev/null + rm -rf "${PATH_NEW_REPOPUBLIC_FTP_PATH}" + fi } ## pacoloco (https://github.com/anatol/pacoloco) diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index 52dd8b9..be80b6d 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -442,9 +442,11 @@ VERSION= ## Опубликовать хранилище или репозиторий в виде локального WEB ресурса ## Если необходимо опубликовать выборочные репозитории, то создать новый каталог хранилища в который переместить симлинки выбранных репозиториев. Опубликовать новый каталог хранилища. +## Каталог лога /var/log/repopublic_web/ ## REPOPUBLIC_WEB[|:,,<...>]=enable|yes|disable|no|none:listing:::: -## # Путь до каталога хранилища, который будет опубликован +## # Путь до каталога хранилища, который будет опубликован. Запрещено в имене каталога использовать символ ':' ## :repo1,repo2 # Путь до каталога хранилища и выбранные репозитории из хранилища которые будут опубликованы +## # Указанный каталог хранилица должен содержать каталоги указанных репозиториев ## enable|yes # Включить публикацию ## disable|no|none # Выключить публикацию ## listing # Включить WEB обозреватель файлов. Не обязательный @@ -465,10 +467,12 @@ VERSION= ## REPOPUBLIC_WEB[/home/storage:repo-1,repo-2]=enable:listing::ublinux:sha256:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ## Опубликовать хранилище или репозиторий в виде локального FTP ресурса -## Если необходимо опубликовать выборочные репозитории, то создать новый каталог хранилища в который переместить симлинки выбранных репозиториев. Опубликовать новый каталог хранилища. +## Если необходимо опубликовать выборочные репозитории, то создать новый каталог хранилища в который переместить симлинки выбранных репозиториев. Опубликовать новый каталог хранилища +## Каталог лога /var/log/repopublic_ftp/ ## REPOPUBLIC_FTP[|:,,<...>]=enable|yes|disable|no|none:: -## # Путь до каталога хранилища, который будет опубликован -## :repo1,repo2 # Путь до каталога хранилища и выбранные репозитории из хранилища которые будут опубликованы +## # Путь до каталога хранилища, который будет опубликован. Запрещено в имене каталога использовать символ ':' +## :repo1,repo2 # Путь до каталога хранилища и выбранные репозитории из хранилища которые будут опубликованы. +## # Указанный каталог хранилица должен содержать каталоги указанных репозиториев ## enable|yes # Включить публикацию ## disable|no|none # Выключить публикацию ## # Порт по которому доступен репозиторий. По умолчанию: 21. Не обязательный