Добавлена поддержка массового удаления сервисов (версия 1.6.6)
This commit is contained in:
parent
bb7ee5b16a
commit
e70135f5d9
88
rproxy
88
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"
|
||||
|
||||
prompt "Удалить сервис '$name'? (д/н) [н]: "
|
||||
if [ "$selected" = "__ALL__" ]; then
|
||||
prompt "Удалить ВСЕ сервисы? (д/н) [н]: "
|
||||
case "${REPLY:-н}" in
|
||||
д|Д|y|Y|да|yes) ;;
|
||||
*) msg "Отменено"; pause; return ;;
|
||||
esac
|
||||
|
||||
load_service "$name" || { pause; return; }
|
||||
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"
|
||||
|
||||
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 (возможно файлы уже удалены)"
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
for name in $selected; do
|
||||
msg "Удаление сервиса '$name'..."
|
||||
(
|
||||
load_service "$name" || exit 1
|
||||
is_running "$name" && do_stop_service "$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
|
||||
}
|
||||
|
||||
# ══════════════════════════════════════════════════════════════════════
|
||||
|
|
|
|||
Loading…
Reference in New Issue