#!/usr/bin/env bash
set -uo pipefail
IFS=$'\n\t'
PHOBOS_DIR="/opt/Phobos"
SCRIPT_DIR="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
CLIENT_SCRIPT="$SCRIPT_DIR/phobos-client.sh"
SYSTEM_SCRIPT="$SCRIPT_DIR/phobos-system.sh"
CONFIG_SCRIPT="$SCRIPT_DIR/vps-obfuscator-config.sh"
if [[ $(id -u) -ne 0 ]]; then
echo "Требуются root привилегии. Запустите: sudo phobos"
exit 1
fi
show_header() {
clear
echo "=========================================="
echo " PHOBOS - Панель управления"
echo "=========================================="
echo ""
}
# Helper: Select Client
select_client() {
local clients=()
local i=1
if [[ ! -d "$PHOBOS_DIR/clients" ]] || [[ -z "$(ls -A "$PHOBOS_DIR/clients" 2>/dev/null)" ]]; then
echo "Нет созданных клиентов" >&2
return 1
fi
echo "ДОСТУПНЫЕ КЛИЕНТЫ:" >&2
printf "% -4s % -20s\n" "№" "CLIENT ID" >&2
echo "------------------------" >&2
for d in "$PHOBOS_DIR/clients"/*; do
if [[ -d "$d" ]]; then
local id=$(basename "$d")
clients+=("$id")
printf "% -4s % -20s\n" "$i" "$id" >&2
((i++))
fi
done
echo "" >&2
read -p "Введите номер или имя: " input
if [[ -z "$input" ]]; then return 1; fi
if [[ "$input" =~ ^[0-9]+$ ]] && ((input >= 1 && input <= ${#clients[@]})); then
echo "${clients[$((input-1))]}"
return 0
fi
# Check if name matches
for c in "${clients[@]}"; do
if [[ "$c" == "$input" ]]; then
echo "$c"
return 0
fi
done
echo "Клиент не найден" >&2
return 1
}
# Services Menu
show_services_menu() {
while true; do
show_header
echo "УПРАВЛЕНИЕ СЛУЖБАМИ"
echo ""
local wg_st="STOPPED"
systemctl is-active --quiet wg-quick@wg0 && wg_st="RUNNING"
local obf_st="STOPPED"
systemctl is-active --quiet wg-obfuscator && obf_st="RUNNING"
local http_st="STOPPED"
systemctl is-active --quiet phobos-http && http_st="RUNNING"
echo " 1) WireGuard [$wg_st] - Запуск/Рестарт"
echo " 2) WireGuard - Стоп"
echo " 3) WireGuard - Логи"
echo ""
echo " 4) Obfuscator [$obf_st] - Запуск/Рестарт"
echo " 5) Obfuscator - Стоп"
echo " 6) Obfuscator - Логи"
echo ""
echo " 7) HTTP Server [$http_st] - Запуск/Рестарт"
echo " 8) HTTP Server - Стоп"
echo " 9) HTTP Server - Логи"
echo ""
echo " 10) РЕСТАРТ ВСЕГО"
echo " 11) СТОП ВСЕГО"
echo ""
echo " 0) Назад"
read -p "Выбор: " choice
case $choice in
1) systemctl restart wg-quick@wg0; sleep 1 ;;
2) systemctl stop wg-quick@wg0; sleep 1 ;;
3) journalctl -u wg-quick@wg0 -n 20 --no-pager; read -p "Enter..." ;;
4) systemctl restart wg-obfuscator; sleep 1 ;;
5) systemctl stop wg-obfuscator; sleep 1 ;;
6) journalctl -u wg-obfuscator -n 20 --no-pager; read -p "Enter..." ;;
7) systemctl restart phobos-http; sleep 1 ;;
8) systemctl stop phobos-http; sleep 1 ;;
9) journalctl -u phobos-http -n 20 --no-pager; read -p "Enter..." ;;
10) systemctl restart wg-quick@wg0 wg-obfuscator phobos-http; echo "Перезапущено."; sleep 2 ;;
11) systemctl stop wg-quick@wg0 wg-obfuscator phobos-http; echo "Остановлено."; sleep 2 ;;
0) break ;;
esac
done
}
show_clients_menu() {
while true; do
show_header
echo "УПРАВЛЕНИЕ КЛИЕНТАМИ"
echo ""
echo " 1) Список клиентов"
echo " 2) Создать клиента"
echo " 3) Удалить клиента"
echo " 4) Мониторинг (Live)"
echo " 5) Пересоздать клиента"
echo " 6) Ссылка на установку"
echo ""
echo " 0) Назад"
read -p "Выбор: " choice
case $choice in
1)
show_header
"$CLIENT_SCRIPT" list
echo ""
read -p "Enter..."
;;
2)
show_header
read -p "Имя клиента: " name
[[ -n "$name" ]] && "$CLIENT_SCRIPT" add "$name"
read -p "Enter..."
;;
3)
show_header
if client=$(select_client); then
read -p "Удалить $client? [y/N]: " ans
[[ "$ans" =~ ^[Yy] ]] && "$CLIENT_SCRIPT" remove "$client"
fi
read -p "Enter..."
;;
4) "$SYSTEM_SCRIPT" monitor ;;
5)
show_header
if client=$(select_client); then
read -p "Пересоздать $client? [y/N]: " ans
if [[ "$ans" =~ ^[Yy] ]]; then
"$CLIENT_SCRIPT" rebuild "$client"
fi
fi
read -p "Enter..."
;;
6)
show_header
if client=$(select_client); then
echo ""
if check_result=$("$CLIENT_SCRIPT" check "$client" 2>&1); then
read -p "TTL (сек) [86400]: " ttl
"$CLIENT_SCRIPT" link "$client" "${ttl:-86400}"
else
echo ""
echo "$check_result"
echo ""
read -p "Пересоздать клиента с новыми параметрами? [y/N]: " ans
if [[ "$ans" =~ ^[Yy] ]]; then
"$CLIENT_SCRIPT" rebuild "$client"
"$CLIENT_SCRIPT" package "$client"
read -p "TTL (сек) [86400]: " ttl
"$CLIENT_SCRIPT" link "$client" "${ttl:-86400}"
fi
fi
fi
read -p "Enter..."
;;
0) break ;;
esac
done
}
# System Menu
show_system_menu() {
while true; do
show_header
echo "СИСТЕМНЫЕ ФУНКЦИИ"
echo ""
echo " 1) Health Check"
echo " 2) Очистка (токены, мусор)"
echo " 3) Показать конфиг (env)"
echo ""
echo " 0) Назад"
read -p "Выбор: " choice
case $choice in
1) "$SYSTEM_SCRIPT" status; read -p "Enter..." ;;
2) "$SYSTEM_SCRIPT" cleanup; read -p "Enter..." ;;
3) cat "$PHOBOS_DIR/server/server.env"; echo ""; read -p "Enter..." ;;
0) break ;;
esac
done
}
# Main
while true; do
show_header
echo "ГЛАВНОЕ МЕНЮ"
echo ""
echo " 1) Управление клиентами"
echo " 2) Управление службами"
echo " 3) Настройка Obfuscator"
echo " 4) Системные функции"
echo ""
echo " 0) Выход"
echo ""
read -p "Ваш выбор: " choice
case $choice in
1) show_clients_menu ;;
2) show_services_menu ;;
3) "$CONFIG_SCRIPT" ;;
4) show_system_menu ;;
0) exit 0 ;;
*) echo "Неверный выбор"; sleep 1 ;;
esac
done