Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
2.8 KB bash
#!/usr/bin/env bash

set -uo pipefail
IFS=$'\n\t'

PHOBOS_DIR="/opt/Phobos"
REPO_DIR="$PHOBOS_DIR/repo"
SERVER_ENV="$PHOBOS_DIR/server/server.env"
WG_CONFIG="/etc/wireguard/wg0.conf"
OBF_CONFIG="$PHOBOS_DIR/server/wg-obfuscator.conf"
TOKENS_FILE="$PHOBOS_DIR/tokens/tokens.json"
PACKAGES_DIR="$PHOBOS_DIR/packages"
CLIENTS_DIR="$PHOBOS_DIR/clients"
WWW_DIR="$PHOBOS_DIR/www"

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

LOG_FILE="${LOG_FILE:-}"

_log_to_file() {
  [[ -z "$LOG_FILE" ]] && return
  [[ -d "$(dirname "$LOG_FILE")" ]] && echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$1] $2" >> "$LOG_FILE"
}

log_info() {
  _log_to_file "INFO" "$1"
  echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
  _log_to_file "OK" "$1"
  echo -e "${GREEN}[OK]${NC} $1"
}

log_warn() {
  _log_to_file "WARN" "$1"
  echo -e "${YELLOW}[WARN]${NC} $1" >&2
}

log_error() {
  _log_to_file "ERROR" "$1"
  echo -e "${RED}[ERROR]${NC} $1" >&2
}

die() {
  log_error "$1"
  exit 1
}

check_root() {
  if [[ $(id -u) -ne 0 ]]; then
    die "Требуются root привилегии. Запустите: sudo $0"
  fi
}

load_env() {
  if [[ -f "$SERVER_ENV" ]]; then
    set +e
    source "$SERVER_ENV"
    set -e
  fi

  export OBFUSCATOR_PORT="${OBFUSCATOR_PORT:-51821}"
  export OBFUSCATOR_KEY="${OBFUSCATOR_KEY:-KEY}"
  export OBFUSCATOR_DUMMY="${OBFUSCATOR_DUMMY:-4}"
  export OBFUSCATOR_IDLE="${OBFUSCATOR_IDLE:-300}"
  export OBFUSCATOR_MASKING="${OBFUSCATOR_MASKING:-AUTO}"
  export WG_LOCAL_ENDPOINT="${WG_LOCAL_ENDPOINT:-127.0.0.1:51820}"
  export TOKEN_TTL="${TOKEN_TTL:-86400}"
  export SERVER_PUBLIC_IP_V4="${SERVER_PUBLIC_IP_V4:-0.0.0.0}"
  export SERVER_PUBLIC_IP_V6="${SERVER_PUBLIC_IP_V6:-}"
  export SERVER_WG_PRIVATE_KEY="${SERVER_WG_PRIVATE_KEY:-}"
  export SERVER_WG_PUBLIC_KEY="${SERVER_WG_PUBLIC_KEY:-}"
  export SERVER_WG_IPV4_NETWORK="${SERVER_WG_IPV4_NETWORK:-10.25.0.0/16}"
  export SERVER_WG_IPV6_NETWORK="${SERVER_WG_IPV6_NETWORK:-fd00:10:25::/48}"
}

ensure_dirs() {
  local dirs=("$PHOBOS_DIR" "$PACKAGES_DIR" "$CLIENTS_DIR" "$WWW_DIR" "$WWW_DIR/init" "$WWW_DIR/packages" "$PHOBOS_DIR/bin" "$PHOBOS_DIR/server" "$PHOBOS_DIR/tokens")
  for d in "${dirs[@]}"; do
    mkdir -p "$d"
  done
}

find_free_port() {
  local min=${1:-1024}
  local max=${2:-49151}
  local port
  for _ in {1..100}; do
    port=$((min + RANDOM % (max - min + 1)))
    if ! ss -tlnp | grep -q ":$port " && ! ss -ulnp | grep -q ":$port "; then
      echo "$port"
      return 0
    fi
  done
  return 1
}

get_public_ipv4() {
  local iface
  iface=$(ip route | awk '/^default/{print $5; exit}')
  [[ -z "$iface" ]] && return 1
  local ip
  ip=$(ip -4 addr show dev "$iface" scope global 2>/dev/null | awk '/inet /{print $2}' | cut -d'/' -f1 | head -1)
  [[ -n "$ip" ]] && echo "$ip" && return 0
  return 1
}