From e70135f5d9b476df7dfa7dca5dce568135170d8a Mon Sep 17 00:00:00 2001 From: Petro1990 Date: Sun, 15 Mar 2026 12:03:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BC=D0=B0=D1=81=D1=81=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2=20(=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D1=8F=201.6.6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rproxy | 108 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 31 deletions(-) diff --git a/rproxy b/rproxy index 895de50..7bf5e5b 100644 --- a/rproxy +++ b/rproxy @@ -3,7 +3,7 @@ # Публикация локальных сервисов через SSH-туннели + nginx на VPS # https://github.com/l-ptrol/rProxy -VERSION="1.6.5" +VERSION="1.6.6" export PATH="/opt/bin:/opt/sbin:$PATH" CONF_DIR="/opt/etc/rproxy" CONF_FILE="$CONF_DIR/rproxy.conf" @@ -764,27 +764,53 @@ do_remove_interactive() { printf "\n" select_service "Выберите сервис для удаления" "all" || { pause; return; } - local name="$SELECTED_SERVICE" - [ "$name" = "__ALL__" ] && { warn "Для удаления выберите конкретный сервис"; pause; return; } + local selected="$SELECTED_SERVICE" + + if [ "$selected" = "__ALL__" ]; then + prompt "Удалить ВСЕ сервисы? (д/н) [н]: " + case "${REPLY:-н}" in + д|Д|y|Y|да|yes) ;; + *) msg "Отменено"; pause; return ;; + esac + + for f in "$SERVICES_DIR"/*.conf; do + [ -f "$f" ] || continue + local name=$(basename "$f" .conf) + msg "Удаление сервиса '$name'..." + ( + load_service "$name" || exit 1 + is_running "$name" && do_stop_service "$name" - prompt "Удалить сервис '$name'? (д/н) [н]: " - case "${REPLY:-н}" in - д|Д|y|Y|да|yes) ;; - *) msg "Отменено"; pause; return ;; - esac + ssh_cmd "rm -f $REMOTE_NGINX_DIR/rproxy_$name.conf /etc/nginx/rproxy_$name.htpasswd && nginx -t && systemctl reload nginx" >/dev/null 2>&1 + rm -f "$SERVICES_DIR/$name.conf" + rm -f "$(get_pid_file "$name")" + ) + done + msg "Все сервисы удалены" + else + # Обработка списка сервисов (один или несколько через пробел) + local count=$(echo "$selected" | wc -w) + if [ "$count" -gt 1 ]; then + prompt "Удалить выбранные сервисы ($selected)? (д/н) [н]: " + case "${REPLY:-н}" in + д|Д|y|Y|да|yes) ;; + *) msg "Отменено"; pause; return ;; + esac + fi - load_service "$name" || { pause; return; } - is_running "$name" && do_stop_service "$name" + for name in $selected; do + msg "Удаление сервиса '$name'..." + ( + load_service "$name" || exit 1 + is_running "$name" && do_stop_service "$name" - msg "Удаляю конфиги Nginx и пароли на VPS..." - ssh_cmd "rm -f $REMOTE_NGINX_DIR/rproxy_$name.conf /etc/nginx/rproxy_$name.htpasswd && nginx -t && systemctl reload nginx" >/dev/null 2>&1 || { - warn "Не удалось полностью очистить VPS (возможно файлы уже удалены)" - } - - rm -f "$SERVICES_DIR/$name.conf" - rm -f "$(get_pid_file "$name")" - - msg "Сервис '$name' удалён" + ssh_cmd "rm -f $REMOTE_NGINX_DIR/rproxy_$name.conf /etc/nginx/rproxy_$name.htpasswd && nginx -t && systemctl reload nginx" >/dev/null 2>&1 + rm -f "$SERVICES_DIR/$name.conf" + rm -f "$(get_pid_file "$name")" + ) + msg "Сервис '$name' удалён" + done + fi pause } @@ -894,10 +920,11 @@ select_service() { local idx=0 for f in "$SERVICES_DIR"/*.conf; do [ -f "$f" ] || continue - . "$f" - + # Не загружаем весь конфиг здесь, чтобы не перезатирать глобальные SVC_* если не надо + local s_name=$(basename "$f" .conf) + local running=0 - is_running "$SVC_NAME" && running=1 + is_running "$s_name" && running=1 # Фильтр case "$filter" in @@ -908,10 +935,16 @@ select_service() { idx=$((idx + 1)) local st="${RED}○${NC}" [ "$running" -eq 1 ] && st="${GREEN}●${NC}" - printf " ${BOLD}%d)${NC} %b %-14s %s:%s" "$idx" "$st" "$SVC_NAME" "$SVC_TARGET_HOST" "$SVC_TARGET_PORT" - [ -n "$SVC_DOMAIN" ] && printf " ${DIM}(%s)${NC}" "$SVC_DOMAIN" + + # Получаем данные для отображения без полной загрузки (быстрее) + local s_target_host=$(grep 'SVC_TARGET_HOST=' "$f" | cut -d'"' -f2) + local s_target_port=$(grep 'SVC_TARGET_PORT=' "$f" | cut -d'"' -f2) + local s_domain=$(grep 'SVC_DOMAIN=' "$f" | cut -d'"' -f2) + + printf " ${BOLD}%d)${NC} %b %-14s %s:%s" "$idx" "$st" "$s_name" "$s_target_host" "$s_target_port" + [ -n "$s_domain" ] && printf " ${DIM}(%s)${NC}" "$s_domain" printf "\n" - [ -z "$services" ] && services="$SVC_NAME" || services="$services $SVC_NAME" + [ -z "$services" ] && services="$s_name" || services="$services $s_name" done if [ "$idx" -eq 0 ]; then @@ -923,7 +956,7 @@ select_service() { draw_separator printf " ${BOLD}903)${NC} Все сервисы\n" printf " ${BOLD}0)${NC} Назад\n" - prompt "Выберите сервис: " + prompt "Выберите номер(а) (через пробел или 903): " [ "$REPLY" = "0" ] && { SELECTED_SERVICE=""; return 1; } if [ "$REPLY" = "903" ]; then @@ -931,14 +964,27 @@ select_service() { return 0 fi - # Извлечение имени сервиса по индексу (1-based) с валидацией - if echo "$REPLY" | grep -qE '^[0-9]+$'; then - SELECTED_SERVICE=$(echo "$services" | cut -d' ' -f"$REPLY") + # Поддержка ввода нескольких номеров через пробел + local sel_names="" + local valid=0 + for r in $REPLY; do + if echo "$r" | grep -qE '^[0-9]+$'; then + local n=$(echo "$services" | cut -d' ' -f"$r") + if [ -n "$n" ]; then + [ -z "$sel_names" ] && sel_names="$n" || sel_names="$sel_names $n" + valid=1 + fi + fi + done + + if [ "$valid" -eq 1 ]; then + SELECTED_SERVICE="$sel_names" + return 0 else SELECTED_SERVICE="" + warn "Неверный выбор" + return 1 fi - [ -z "$SELECTED_SERVICE" ] && { warn "Неверный выбор"; return 1; } - return 0 } # ══════════════════════════════════════════════════════════════════════