Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
6.8 KB bash
#!/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