Добавлена поддержка массового удаления сервисов (версия 1.6.6)

This commit is contained in:
Petro1990 2026-03-15 12:03:04 +03:00
parent bb7ee5b16a
commit e70135f5d9
1 changed files with 77 additions and 31 deletions

108
rproxy
View File

@ -3,7 +3,7 @@
# Публикация локальных сервисов через SSH-туннели + nginx на VPS # Публикация локальных сервисов через SSH-туннели + nginx на VPS
# https://github.com/l-ptrol/rProxy # https://github.com/l-ptrol/rProxy
VERSION="1.6.5" VERSION="1.6.6"
export PATH="/opt/bin:/opt/sbin:$PATH" export PATH="/opt/bin:/opt/sbin:$PATH"
CONF_DIR="/opt/etc/rproxy" CONF_DIR="/opt/etc/rproxy"
CONF_FILE="$CONF_DIR/rproxy.conf" CONF_FILE="$CONF_DIR/rproxy.conf"
@ -764,27 +764,53 @@ do_remove_interactive() {
printf "\n" printf "\n"
select_service "Выберите сервис для удаления" "all" || { pause; return; } select_service "Выберите сервис для удаления" "all" || { pause; return; }
local name="$SELECTED_SERVICE" local selected="$SELECTED_SERVICE"
[ "$name" = "__ALL__" ] && { warn "Для удаления выберите конкретный сервис"; pause; return; }
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'? (д/н) [н]: " ssh_cmd "rm -f $REMOTE_NGINX_DIR/rproxy_$name.conf /etc/nginx/rproxy_$name.htpasswd && nginx -t && systemctl reload nginx" >/dev/null 2>&1
case "${REPLY:-н}" in rm -f "$SERVICES_DIR/$name.conf"
д|Д|y|Y|да|yes) ;; rm -f "$(get_pid_file "$name")"
*) msg "Отменено"; pause; return ;; )
esac 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; } for name in $selected; do
is_running "$name" && do_stop_service "$name" 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
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"
warn "Не удалось полностью очистить VPS (возможно файлы уже удалены)" rm -f "$(get_pid_file "$name")"
} )
msg "Сервис '$name' удалён"
rm -f "$SERVICES_DIR/$name.conf" done
rm -f "$(get_pid_file "$name")" fi
msg "Сервис '$name' удалён"
pause pause
} }
@ -894,10 +920,11 @@ select_service() {
local idx=0 local idx=0
for f in "$SERVICES_DIR"/*.conf; do for f in "$SERVICES_DIR"/*.conf; do
[ -f "$f" ] || continue [ -f "$f" ] || continue
. "$f" # Не загружаем весь конфиг здесь, чтобы не перезатирать глобальные SVC_* если не надо
local s_name=$(basename "$f" .conf)
local running=0 local running=0
is_running "$SVC_NAME" && running=1 is_running "$s_name" && running=1
# Фильтр # Фильтр
case "$filter" in case "$filter" in
@ -908,10 +935,16 @@ select_service() {
idx=$((idx + 1)) idx=$((idx + 1))
local st="${RED}○${NC}" local st="${RED}○${NC}"
[ "$running" -eq 1 ] && st="${GREEN}●${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" printf "\n"
[ -z "$services" ] && services="$SVC_NAME" || services="$services $SVC_NAME" [ -z "$services" ] && services="$s_name" || services="$services $s_name"
done done
if [ "$idx" -eq 0 ]; then if [ "$idx" -eq 0 ]; then
@ -923,7 +956,7 @@ select_service() {
draw_separator draw_separator
printf " ${BOLD}903)${NC} Все сервисы\n" printf " ${BOLD}903)${NC} Все сервисы\n"
printf " ${BOLD}0)${NC} Назад\n" printf " ${BOLD}0)${NC} Назад\n"
prompt "Выберите сервис: " prompt "Выберите номер(а) (через пробел или 903): "
[ "$REPLY" = "0" ] && { SELECTED_SERVICE=""; return 1; } [ "$REPLY" = "0" ] && { SELECTED_SERVICE=""; return 1; }
if [ "$REPLY" = "903" ]; then if [ "$REPLY" = "903" ]; then
@ -931,14 +964,27 @@ select_service() {
return 0 return 0
fi fi
# Извлечение имени сервиса по индексу (1-based) с валидацией # Поддержка ввода нескольких номеров через пробел
if echo "$REPLY" | grep -qE '^[0-9]+$'; then local sel_names=""
SELECTED_SERVICE=$(echo "$services" | cut -d' ' -f"$REPLY") 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 else
SELECTED_SERVICE="" SELECTED_SERVICE=""
warn "Неверный выбор"
return 1
fi fi
[ -z "$SELECTED_SERVICE" ] && { warn "Неверный выбор"; return 1; }
return 0
} }
# ══════════════════════════════════════════════════════════════════════ # ══════════════════════════════════════════════════════════════════════