diff --git a/warp.sh b/warp.sh index 12962b8..81d4d54 100644 --- a/warp.sh +++ b/warp.sh @@ -1,652 +1,652 @@ -#!/bin/bash -set -o pipefail - -# ══════════════════════════════════════════════════════════════ -# WARP Manager v1.0 — Cloudflare WARP SOCKS5 Proxy for 3X-UI -# Channel: https://www.youtube.com/@antenkaru -# ══════════════════════════════════════════════════════════════ - -WARP_VERSION="1.0" -WARP_DIR="/etc/warp-manager" -WARP_CONF="$WARP_DIR/config" -WARP_LOG="/var/log/warp-manager.log" -DEFAULT_PORT=40000 - -RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m' -YELLOW='\033[1;33m'; MAGENTA='\033[0;35m'; WHITE='\033[1;37m' -BLUE='\033[0;34m'; NC='\033[0m' - -SOCKS_PORT="" -MY_IP="" - -# ─── Config ─────────────────────────────────────────────────── - -init_config() { - mkdir -p "$WARP_DIR" - if [ ! -f "$WARP_CONF" ]; then - cat > "$WARP_CONF" <<'CONF' -SOCKS_PORT="40000" -CONF - fi - source "$WARP_CONF" - SOCKS_PORT="${SOCKS_PORT:-$DEFAULT_PORT}" -} - -save_config_val() { - local key="$1" value="$2" - if grep -q "^${key}=" "$WARP_CONF" 2>/dev/null; then - sed -i "s|^${key}=.*|${key}=\"${value}\"|" "$WARP_CONF" - else - echo "${key}=\"${value}\"" >> "$WARP_CONF" - fi - source "$WARP_CONF" -} - -# ─── Logging ────────────────────────────────────────────────── - -log_action() { - echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$WARP_LOG" -} - -# ─── System ─────────────────────────────────────────────────── - -check_root() { - if [ "$EUID" -ne 0 ]; then - echo -e "${RED}[ERROR] Запустите скрипт с правами root!${NC}"; exit 1 - fi -} - -get_my_ip() { - MY_IP=$(curl -s4 --max-time 5 ifconfig.me 2>/dev/null || echo "N/A") -} - -get_warp_ip() { - local warp_ip - warp_ip=$(curl -s4 --max-time 5 --proxy socks5h://127.0.0.1:${SOCKS_PORT} ifconfig.me 2>/dev/null || echo "N/A") - echo "$warp_ip" -} - -detect_os() { - if [ -f /etc/os-release ]; then - . /etc/os-release - OS_ID="$ID" - OS_VERSION="$VERSION_ID" - OS_CODENAME="$VERSION_CODENAME" - else - OS_ID="unknown" - fi -} - -is_warp_installed() { - command -v warp-cli &>/dev/null -} - -is_warp_running() { - local st - st=$(warp-cli --accept-tos status 2>/dev/null) - echo "$st" | grep -qi "status.*connected" && ! echo "$st" | grep -qi "disconnected" -} - -get_warp_status_text() { - if ! is_warp_installed; then - echo "Не установлен" - return - fi - local status - status=$(warp-cli --accept-tos status 2>/dev/null | head -5) - if echo "$status" | grep -qi "disconnected"; then - echo "Отключён" - elif echo "$status" | grep -qi "connected"; then - echo "Подключён" - elif echo "$status" | grep -qi "registration missing"; then - echo "Нет регистрации" - else - echo "Неизвестно" - fi -} - -# ─── Install ────────────────────────────────────────────────── - -install_warp() { - clear - echo -e "\n${CYAN}━━━ Установка Cloudflare WARP ━━━${NC}\n" - - if is_warp_installed; then - echo -e "${YELLOW}WARP уже установлен.${NC}" - echo -e "Используйте меню для управления.\n" - read -p "Нажмите Enter..." - return - fi - - detect_os - if [[ "$OS_ID" != "ubuntu" && "$OS_ID" != "debian" ]]; then - echo -e "${RED}[ERROR] Поддерживаются только Ubuntu и Debian.${NC}" - echo -e "${WHITE}Ваша ОС: ${YELLOW}${OS_ID} ${OS_VERSION}${NC}" - read -p "Нажмите Enter..." - return - fi - - echo -e "${YELLOW}[1/6]${NC} Добавление GPG-ключа Cloudflare..." - curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor -o /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg 2>/dev/null - if [ $? -ne 0 ]; then - echo -e "${RED}[ERROR] Не удалось добавить GPG-ключ.${NC}" - read -p "Нажмите Enter..."; return - fi - echo -e "${GREEN} ✓ GPG-ключ добавлен${NC}" - - echo -e "${YELLOW}[2/6]${NC} Добавление репозитория..." - local codename="$OS_CODENAME" - if [ -z "$codename" ]; then - codename=$(lsb_release -cs 2>/dev/null || echo "focal") - fi - echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ ${codename} main" \ - > /etc/apt/sources.list.d/cloudflare-client.list - echo -e "${GREEN} ✓ Репозиторий добавлен (${codename})${NC}" - - echo -e "${YELLOW}[3/6]${NC} Установка пакета cloudflare-warp..." - export DEBIAN_FRONTEND=noninteractive - apt-get update -y > /dev/null 2>&1 - apt-get install -y cloudflare-warp > /dev/null 2>&1 - if ! command -v warp-cli &>/dev/null; then - echo -e "${RED}[ERROR] Установка не удалась. Проверьте совместимость ОС.${NC}" - echo -e "${WHITE}Попробуйте: ${CYAN}apt-get install cloudflare-warp${NC}" - read -p "Нажмите Enter..."; return - fi - echo -e "${GREEN} ✓ cloudflare-warp установлен${NC}" - - echo -e "${YELLOW}[4/6]${NC} Регистрация аккаунта WARP..." - warp-cli --accept-tos registration new > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo -e "${RED}[ERROR] Регистрация не удалась.${NC}" - read -p "Нажмите Enter..."; return - fi - echo -e "${GREEN} ✓ Аккаунт зарегистрирован${NC}" - - echo -e "${YELLOW}[5/6]${NC} Настройка режима SOCKS5-прокси..." - warp-cli --accept-tos mode proxy > /dev/null 2>&1 - warp-cli --accept-tos proxy port "${SOCKS_PORT}" > /dev/null 2>&1 - save_config_val "SOCKS_PORT" "${SOCKS_PORT}" - echo -e "${GREEN} ✓ Режим: SOCKS5 на 127.0.0.1:${SOCKS_PORT}${NC}" - - echo -e "${YELLOW}[6/6]${NC} Подключение..." - warp-cli --accept-tos connect > /dev/null 2>&1 - sleep 2 - - if is_warp_running; then - local wip - wip=$(get_warp_ip) - echo -e "${GREEN} ✓ WARP подключён!${NC}" - echo -e " ${WHITE}WARP IP: ${GREEN}${wip}${NC}" - log_action "INSTALL: WARP installed and connected, port=${SOCKS_PORT}, warp_ip=${wip}" - else - echo -e "${YELLOW} ⚠ WARP установлен, но подключение не подтверждено.${NC}" - echo -e " ${WHITE}Попробуйте: ${CYAN}warp-cli connect${NC}" - log_action "INSTALL: WARP installed, connection unconfirmed" - fi - - echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo -e "${WHITE}Для интеграции с 3X-UI используйте пункт меню ${YELLOW}5${WHITE}.${NC}" - echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - read -p "Нажмите Enter..." -} - -# ─── Start / Stop ───────────────────────────────────────────── - -start_warp() { - if ! is_warp_installed; then - echo -e "\n${RED}WARP не установлен. Сначала выполните установку (п.1).${NC}" - read -p "Нажмите Enter..."; return - fi - if is_warp_running; then - echo -e "\n${YELLOW}WARP уже подключён.${NC}" - read -p "Нажмите Enter..."; return - fi - echo -e "\n${YELLOW}Подключение WARP...${NC}" - warp-cli --accept-tos connect > /dev/null 2>&1 - sleep 2 - if is_warp_running; then - echo -e "${GREEN}[OK] WARP подключён.${NC}" - log_action "START: WARP connected" - else - echo -e "${RED}[ERROR] Не удалось подключить. Проверьте: warp-cli status${NC}" - fi - read -p "Нажмите Enter..." -} - -stop_warp() { - if ! is_warp_installed; then - echo -e "\n${RED}WARP не установлен.${NC}" - read -p "Нажмите Enter..."; return - fi - if ! is_warp_running; then - echo -e "\n${YELLOW}WARP уже отключён.${NC}" - read -p "Нажмите Enter..."; return - fi - echo -e "\n${YELLOW}Отключение WARP...${NC}" - warp-cli --accept-tos disconnect > /dev/null 2>&1 - echo -e "${GREEN}[OK] WARP отключён.${NC}" - log_action "STOP: WARP disconnected" - read -p "Нажмите Enter..." -} - -# ─── Status ─────────────────────────────────────────────────── - -show_status() { - clear - echo -e "\n${CYAN}━━━ Статус WARP ━━━${NC}\n" - - if ! is_warp_installed; then - echo -e " ${WHITE}Статус: ${RED}Не установлен${NC}" - echo -e "\n ${WHITE}Установите WARP через пункт меню 1.${NC}" - echo "" - read -p "Нажмите Enter..."; return - fi - - local status_text warp_ip - status_text=$(get_warp_status_text) - - local status_color="$RED" - [[ "$status_text" == "Подключён" ]] && status_color="$GREEN" - [[ "$status_text" == "Отключён" ]] && status_color="$YELLOW" - - echo -e " ${WHITE}Статус: ${status_color}${status_text}${NC}" - echo -e " ${WHITE}Порт SOCKS5: ${CYAN}127.0.0.1:${SOCKS_PORT}${NC}" - echo -e " ${WHITE}Реальный IP: ${GREEN}${MY_IP}${NC}" - - if is_warp_running; then - warp_ip=$(get_warp_ip) - echo -e " ${WHITE}WARP IP: ${GREEN}${warp_ip}${NC}" - fi - - echo "" - echo -e " ${CYAN}── warp-cli status ──${NC}" - warp-cli --accept-tos status 2>/dev/null | while IFS= read -r line; do - echo -e " ${WHITE}$line${NC}" - done - - echo "" - echo -e " ${CYAN}── warp-cli settings ──${NC}" - warp-cli --accept-tos settings 2>/dev/null | head -10 | while IFS= read -r line; do - echo -e " ${WHITE}$line${NC}" - done - - echo "" - read -p "Нажмите Enter..." -} - -# ─── 3X-UI JSON ────────────────────────────────────────────── - -show_xui_json() { - clear - echo -e "\n${CYAN}━━━ Конфигурация для 3X-UI ━━━${NC}\n" - echo -e "${WHITE}Добавьте в ${YELLOW}Xray Settings → Outbounds${WHITE} (JSON):${NC}\n" - - echo -e "${GREEN}── 1. Outbound (добавить в массив outbounds) ──${NC}\n" - cat < /dev/null 2>&1 - echo -e "${GREEN} ✓${NC}" - - echo -e "${YELLOW}[2/4] Удаление регистрации...${NC}" - warp-cli --accept-tos registration delete > /dev/null 2>&1 - echo -e "${GREEN} ✓${NC}" - - echo -e "${YELLOW}[3/4] Новая регистрация...${NC}" - warp-cli --accept-tos registration new > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo -e "${RED}[ERROR] Регистрация не удалась.${NC}" - read -p "Нажмите Enter..."; return - fi - echo -e "${GREEN} ✓${NC}" - - echo -e "${YELLOW}[4/4] Подключение...${NC}" - warp-cli --accept-tos mode proxy > /dev/null 2>&1 - warp-cli --accept-tos proxy port "${SOCKS_PORT}" > /dev/null 2>&1 - warp-cli --accept-tos connect > /dev/null 2>&1 - sleep 2 - - if is_warp_running; then - local wip - wip=$(get_warp_ip) - echo -e "${GREEN} ✓ Готово! Новый WARP IP: ${wip}${NC}" - log_action "REKEY: new registration, warp_ip=${wip}" - else - echo -e "${YELLOW} ⚠ Регистрация обновлена, подключение не подтверждено.${NC}" - log_action "REKEY: new registration, connection unconfirmed" - fi - read -p "Нажмите Enter..." -} - -# ─── Change port ────────────────────────────────────────────── - -change_port() { - if ! is_warp_installed; then - echo -e "\n${RED}WARP не установлен.${NC}" - read -p "Нажмите Enter..."; return - fi - - echo -e "\n${CYAN}━━━ Изменение порта SOCKS5 ━━━${NC}\n" - echo -e "${WHITE}Текущий порт: ${GREEN}${SOCKS_PORT}${NC}\n" - - local new_port - while true; do - echo -e "Введите новый порт (1024-65535):" - read -p "> " new_port - if [[ "$new_port" =~ ^[0-9]+$ ]] && (( new_port >= 1024 && new_port <= 65535 )); then - break - fi - echo -e "${RED}Ошибка: порт должен быть числом от 1024 до 65535.${NC}" - done - - warp-cli --accept-tos proxy port "$new_port" > /dev/null 2>&1 - save_config_val "SOCKS_PORT" "$new_port" - SOCKS_PORT="$new_port" - - echo -e "\n${GREEN}[OK] Порт изменён на ${new_port}.${NC}" - echo -e "${WHITE}SOCKS5: ${CYAN}127.0.0.1:${new_port}${NC}" - echo -e "\n${YELLOW}Не забудьте обновить порт в настройках 3X-UI!${NC}" - log_action "PORT: changed to ${new_port}" - read -p "Нажмите Enter..." -} - -# ─── Uninstall ──────────────────────────────────────────────── - -full_uninstall() { - clear - echo -e "\n${RED}╔══════════════════════════════════════════════════════════════╗${NC}" - echo -e "${RED}║ ⚠ ПОЛНОЕ УДАЛЕНИЕ WARP MANAGER ⚠ ║${NC}" - echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" - echo "" - echo -e "${WHITE}Будут удалены:${NC}" - echo -e " ${RED}•${NC} Пакет cloudflare-warp" - echo -e " ${RED}•${NC} Репозиторий и GPG-ключ Cloudflare" - echo -e " ${RED}•${NC} Конфигурация ${WHITE}/etc/warp-manager/${NC}" - echo -e " ${RED}•${NC} Команда ${WHITE}gowarp${NC}" - echo -e " ${RED}•${NC} Логи ${WHITE}/var/log/warp-manager.log${NC}" - echo "" - echo -e "${GREEN}НЕ будет затронуто:${NC}" - echo -e " ${GREEN}•${NC} 3X-UI и Xray (настройки outbound нужно убрать вручную)" - echo -e " ${GREEN}•${NC} Kaskad PRO" - echo -e " ${GREEN}•${NC} Системные пакеты" - echo "" - read -p "$(echo -e "${RED}Удалить WARP Manager полностью? (y/n): ${NC}")" confirm1 - [[ "$confirm1" != "y" ]] && { echo -e "\n${CYAN}Отменено.${NC}"; read -p "Нажмите Enter..."; return; } - - echo "" - echo -e "${YELLOW}Удаление WARP Manager...${NC}\n" - - echo -e " ${YELLOW}[1/6]${NC} Отключение WARP..." - warp-cli --accept-tos disconnect > /dev/null 2>&1 - echo -e " ${GREEN}✓${NC} WARP отключён" - - echo -e " ${YELLOW}[2/6]${NC} Удаление регистрации..." - warp-cli --accept-tos registration delete > /dev/null 2>&1 - echo -e " ${GREEN}✓${NC} Регистрация удалена" - - echo -e " ${YELLOW}[3/6]${NC} Удаление пакета..." - apt-get remove -y cloudflare-warp > /dev/null 2>&1 - apt-get autoremove -y > /dev/null 2>&1 - echo -e " ${GREEN}✓${NC} Пакет удалён" - - echo -e " ${YELLOW}[4/6]${NC} Удаление репозитория и ключа..." - rm -f /etc/apt/sources.list.d/cloudflare-client.list - rm -f /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg - echo -e " ${GREEN}✓${NC} Репозиторий и ключ удалены" - - echo -e " ${YELLOW}[5/6]${NC} Удаление конфигурации..." - rm -rf "$WARP_DIR" - rm -f "$WARP_LOG" - echo -e " ${GREEN}✓${NC} Конфигурация и логи удалены" - - echo -e " ${YELLOW}[6/6]${NC} Удаление команды gowarp..." - rm -f /usr/local/bin/gowarp - echo -e " ${GREEN}✓${NC} Команда gowarp удалена" - - echo "" - echo -e "${GREEN}══════════════════════════════════════════════════════════════${NC}" - echo -e "${GREEN} WARP Manager полностью удалён.${NC}" - echo -e "${WHITE} Не забудьте убрать outbound \"warp\" из настроек 3X-UI!${NC}" - echo -e "${GREEN}══════════════════════════════════════════════════════════════${NC}" - echo "" - log_action "UNINSTALL: full removal completed" - read -p "Нажмите Enter..." - exit 0 -} - -# ═══════════════════════════════════════════════════════════════ -# PROMO -# ═══════════════════════════════════════════════════════════════ - -show_promo() { - clear; echo "" - echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" - echo -e "${MAGENTA}║ ХОСТИНГ СО СКИДКОЙ ДО -60% ║${NC}" - echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" - echo -e "\n${CYAN}🌍 РФ И ЕВРОПА${NC}\n${WHITE} >>> https://vk.cc/ct29NQ${NC}" - printf " ${YELLOW}%-12s${NC} : ${WHITE}%s${NC}\n" "OFF60" "60% скидка" "antenka20" "+20% (3мес)" "antenka6" "+15% (6мес)" "antenka12" "+5% (12мес)" - echo -e "\n${CYAN}🇧🇾 БЕЛАРУСЬ${NC}\n${WHITE} >>> https://vk.cc/cUxAhj${NC}" - printf " ${YELLOW}%-12s${NC} : ${WHITE}%s${NC}\n" "OFF60" "60% скидка" - echo -e "\n${YELLOW}QR-код... (3с)${NC}"; for i in 3 2 1; do echo -ne "$i..."; sleep 1; done; echo "" - echo -e "\n${WHITE}"; command -v qrencode &>/dev/null && qrencode -t ANSIUTF8 "https://vk.cc/ct29NQ" || echo "Ссылки выше."; echo -e "${NC}" - read -p "Нажмите Enter..." -} - -# ═══════════════════════════════════════════════════════════════ -# INFO PAGE -# ═══════════════════════════════════════════════════════════════ - -show_info() { - clear; echo "" - echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" - echo -e "${MAGENTA}║ 📚 WARP Manager v${WARP_VERSION} — Что это и как работает ║${NC}" - echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" - echo "" - echo -e "${CYAN}═══ ЧТО ТАКОЕ CLOUDFLARE WARP ═══${NC}" - echo "" - echo -e "${WHITE} Cloudflare WARP — бесплатный сервис от Cloudflare, который" - echo -e " направляет трафик через глобальную сеть Cloudflare." - echo -e "" - echo -e " Ваш VPS получает «чистый» IP-адрес Cloudflare, который" - echo -e " не заблокирован популярными сервисами.${NC}" - echo "" - echo -e "${CYAN}═══ ЗАЧЕМ НУЖЕН WARP + 3X-UI ═══${NC}" - echo "" - echo -e "${WHITE} Многие сайты блокируют IP дешёвых VPS:" - echo -e " ChatGPT, Netflix, Disney+, Spotify и другие." - echo -e "" - echo -e " WARP решает эту проблему: трафик из 3X-UI идёт через" - echo -e " Cloudflare и получает доверенный IP.${NC}" - echo "" - echo -e "${CYAN}═══ СХЕМА РАБОТЫ ═══${NC}" - echo "" - echo -e "${WHITE} Клиент → 3X-UI (Xray) → SOCKS5 (WARP) → Cloudflare → Интернет${NC}" - echo "" - echo -e "${GREEN} 1.${NC} Скрипт устанавливает ${YELLOW}cloudflare-warp${NC} на сервер" - echo -e "${GREEN} 2.${NC} WARP работает в режиме ${YELLOW}SOCKS5-прокси${NC} на 127.0.0.1:${SOCKS_PORT}" - echo -e "${GREEN} 3.${NC} В 3X-UI добавляется ${YELLOW}outbound${NC} типа SOCKS → warp" - echo -e "${GREEN} 4.${NC} В маршрутизации выбираете какие сайты идут через WARP" - echo "" - echo -e "${CYAN}═══ ЧТО ПОЛУЧАЕТЕ ═══${NC}" - echo "" - echo -e " ${GREEN}✓${NC} Разблокировка ChatGPT, Netflix, Disney+, Spotify" - echo -e " ${GREEN}✓${NC} Чистый IPv4/IPv6 от Cloudflare" - echo -e " ${GREEN}✓${NC} Стабильный маршрут через сеть Cloudflare" - echo -e " ${GREEN}✓${NC} Гибкая маршрутизация: часть сайтов через WARP, остальные напрямую" - echo -e " ${GREEN}✓${NC} Бесплатно (Cloudflare WARP — бесплатный сервис)" - echo "" - echo -e "${MAGENTA}──────────────────────────────────────────────────────────────${NC}" - read -p "Нажмите Enter для продолжения..." -} - -# ═══════════════════════════════════════════════════════════════ -# MAIN MENU -# ═══════════════════════════════════════════════════════════════ - -show_menu() { - while true; do - clear - local status_text status_color - status_text=$(get_warp_status_text) - status_color="$RED" - [[ "$status_text" == "Подключён" ]] && status_color="$GREEN" - [[ "$status_text" == "Отключён" ]] && status_color="$YELLOW" - - echo -e "${MAGENTA}******************************************************" - echo " anten-ka · WARP Manager v${WARP_VERSION}" - echo " YouTube: https://www.youtube.com/@antenkaru" - echo -e "******************************************************${NC}" - echo -e "${WHITE}IP сервера: ${GREEN}${MY_IP}${NC} ${WHITE}WARP: ${status_color}${status_text}${NC}" - if is_warp_running; then - echo -e "${WHITE}SOCKS5: ${CYAN}127.0.0.1:${SOCKS_PORT}${NC}" - fi - echo -e "------------------------------------------------------" - echo -e " 1) ${GREEN}Установить WARP${NC}" - echo -e " 2) ${CYAN}Запустить WARP${NC}" - echo -e " 3) ${YELLOW}Остановить WARP${NC}" - echo -e " 4) 📊 ${WHITE}Статус и конфигурация${NC}" - echo -e " 5) 📋 ${CYAN}JSON для 3X-UI${NC}" - echo -e " 6) 🔑 ${YELLOW}Перевыпуск ключа${NC}" - echo -e " 7) 🔧 ${WHITE}Изменить порт SOCKS5${NC}" - echo -e " 8) ${YELLOW}PROMO${NC}" - echo -e " 9) ${MAGENTA}📚 Инструкция${NC}" - echo -e "10) ${RED}⚠ Полное удаление${NC}" - echo -e " 0) Выход" - echo -e "------------------------------------------------------" - read -p "Выбор: " ch - case $ch in - 1) install_warp ;; - 2) start_warp ;; - 3) stop_warp ;; - 4) show_status ;; - 5) show_xui_json ;; - 6) rekey_warp ;; - 7) change_port ;; - 8) show_promo ;; - 9) show_info ;; - 10) full_uninstall ;; - 0) exit 0 ;; - esac - done -} - -# ═══════════════════════════════════════════════════════════════ -# STARTUP WITH PROGRESS -# ═══════════════════════════════════════════════════════════════ - -run_startup() { - local total=5 s=0 - - clear; echo "" - echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" - echo -e "${MAGENTA}║ WARP Manager v${WARP_VERSION} — Загрузка ║${NC}" - echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" - echo "" - - ((s++)) - printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Проверка прав root..." "$s" "$total" - check_root - printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Права root подтверждены \n" "$s" "$total" - - ((s++)) - printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Загрузка конфигурации..." "$s" "$total" - init_config - printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Конфигурация загружена \n" "$s" "$total" - - ((s++)) - printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Установка gowarp..." "$s" "$total" - if [ "$(readlink -f "$0" 2>/dev/null)" != "/usr/local/bin/gowarp" ]; then - cp -f "$0" "/usr/local/bin/gowarp"; chmod +x "/usr/local/bin/gowarp" - fi - printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Команда gowarp \n" "$s" "$total" - - ((s++)) - printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Определение IP..." "$s" "$total" - get_my_ip - printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} IP: %-25s \n" "$s" "$total" "$MY_IP" - - ((s++)) - printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Проверка WARP..." "$s" "$total" - local ws - ws=$(get_warp_status_text) - printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} WARP: %-25s \n" "$s" "$total" "$ws" - - echo "" - local w=40 bar="" - for ((i=0; i "$WARP_CONF" <<'CONF' +SOCKS_PORT="40000" +CONF + fi + source "$WARP_CONF" + SOCKS_PORT="${SOCKS_PORT:-$DEFAULT_PORT}" +} + +save_config_val() { + local key="$1" value="$2" + if grep -q "^${key}=" "$WARP_CONF" 2>/dev/null; then + sed -i "s|^${key}=.*|${key}=\"${value}\"|" "$WARP_CONF" + else + echo "${key}=\"${value}\"" >> "$WARP_CONF" + fi + source "$WARP_CONF" +} + +# ─── Logging ────────────────────────────────────────────────── + +log_action() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$WARP_LOG" +} + +# ─── System ─────────────────────────────────────────────────── + +check_root() { + if [ "$EUID" -ne 0 ]; then + echo -e "${RED}[ERROR] Запустите скрипт с правами root!${NC}"; exit 1 + fi +} + +get_my_ip() { + MY_IP=$(curl -s4 --max-time 5 ifconfig.me 2>/dev/null || echo "N/A") +} + +get_warp_ip() { + local warp_ip + warp_ip=$(curl -s4 --max-time 5 --proxy socks5h://127.0.0.1:${SOCKS_PORT} ifconfig.me 2>/dev/null || echo "N/A") + echo "$warp_ip" +} + +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS_ID="$ID" + OS_VERSION="$VERSION_ID" + OS_CODENAME="$VERSION_CODENAME" + else + OS_ID="unknown" + fi +} + +is_warp_installed() { + command -v warp-cli &>/dev/null +} + +is_warp_running() { + local st + st=$(warp-cli --accept-tos status 2>/dev/null) + echo "$st" | grep -qi "status.*connected" && ! echo "$st" | grep -qi "disconnected" +} + +get_warp_status_text() { + if ! is_warp_installed; then + echo "Не установлен" + return + fi + local status + status=$(warp-cli --accept-tos status 2>/dev/null | head -5) + if echo "$status" | grep -qi "disconnected"; then + echo "Отключён" + elif echo "$status" | grep -qi "connected"; then + echo "Подключён" + elif echo "$status" | grep -qi "registration missing"; then + echo "Нет регистрации" + else + echo "Неизвестно" + fi +} + +# ─── Install ────────────────────────────────────────────────── + +install_warp() { + clear + echo -e "\n${CYAN}━━━ Установка Cloudflare WARP ━━━${NC}\n" + + if is_warp_installed; then + echo -e "${YELLOW}WARP уже установлен.${NC}" + echo -e "Используйте меню для управления.\n" + read -p "Нажмите Enter..." + return + fi + + detect_os + if [[ "$OS_ID" != "ubuntu" && "$OS_ID" != "debian" ]]; then + echo -e "${RED}[ERROR] Поддерживаются только Ubuntu и Debian.${NC}" + echo -e "${WHITE}Ваша ОС: ${YELLOW}${OS_ID} ${OS_VERSION}${NC}" + read -p "Нажмите Enter..." + return + fi + + echo -e "${YELLOW}[1/6]${NC} Добавление GPG-ключа Cloudflare..." + curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor -o /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg 2>/dev/null + if [ $? -ne 0 ]; then + echo -e "${RED}[ERROR] Не удалось добавить GPG-ключ.${NC}" + read -p "Нажмите Enter..."; return + fi + echo -e "${GREEN} ✓ GPG-ключ добавлен${NC}" + + echo -e "${YELLOW}[2/6]${NC} Добавление репозитория..." + local codename="$OS_CODENAME" + if [ -z "$codename" ]; then + codename=$(lsb_release -cs 2>/dev/null || echo "focal") + fi + echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ ${codename} main" \ + > /etc/apt/sources.list.d/cloudflare-client.list + echo -e "${GREEN} ✓ Репозиторий добавлен (${codename})${NC}" + + echo -e "${YELLOW}[3/6]${NC} Установка пакета cloudflare-warp..." + export DEBIAN_FRONTEND=noninteractive + apt-get update -y > /dev/null 2>&1 + apt-get install -y cloudflare-warp > /dev/null 2>&1 + if ! command -v warp-cli &>/dev/null; then + echo -e "${RED}[ERROR] Установка не удалась. Проверьте совместимость ОС.${NC}" + echo -e "${WHITE}Попробуйте: ${CYAN}apt-get install cloudflare-warp${NC}" + read -p "Нажмите Enter..."; return + fi + echo -e "${GREEN} ✓ cloudflare-warp установлен${NC}" + + echo -e "${YELLOW}[4/6]${NC} Регистрация аккаунта WARP..." + warp-cli --accept-tos registration new > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo -e "${RED}[ERROR] Регистрация не удалась.${NC}" + read -p "Нажмите Enter..."; return + fi + echo -e "${GREEN} ✓ Аккаунт зарегистрирован${NC}" + + echo -e "${YELLOW}[5/6]${NC} Настройка режима SOCKS5-прокси..." + warp-cli --accept-tos mode proxy > /dev/null 2>&1 + warp-cli --accept-tos proxy port "${SOCKS_PORT}" > /dev/null 2>&1 + save_config_val "SOCKS_PORT" "${SOCKS_PORT}" + echo -e "${GREEN} ✓ Режим: SOCKS5 на 127.0.0.1:${SOCKS_PORT}${NC}" + + echo -e "${YELLOW}[6/6]${NC} Подключение..." + warp-cli --accept-tos connect > /dev/null 2>&1 + sleep 2 + + if is_warp_running; then + local wip + wip=$(get_warp_ip) + echo -e "${GREEN} ✓ WARP подключён!${NC}" + echo -e " ${WHITE}WARP IP: ${GREEN}${wip}${NC}" + log_action "INSTALL: WARP installed and connected, port=${SOCKS_PORT}, warp_ip=${wip}" + else + echo -e "${YELLOW} ⚠ WARP установлен, но подключение не подтверждено.${NC}" + echo -e " ${WHITE}Попробуйте: ${CYAN}warp-cli connect${NC}" + log_action "INSTALL: WARP installed, connection unconfirmed" + fi + + echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e "${WHITE}Для интеграции с 3X-UI используйте пункт меню ${YELLOW}5${WHITE}.${NC}" + echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + read -p "Нажмите Enter..." +} + +# ─── Start / Stop ───────────────────────────────────────────── + +start_warp() { + if ! is_warp_installed; then + echo -e "\n${RED}WARP не установлен. Сначала выполните установку (п.1).${NC}" + read -p "Нажмите Enter..."; return + fi + if is_warp_running; then + echo -e "\n${YELLOW}WARP уже подключён.${NC}" + read -p "Нажмите Enter..."; return + fi + echo -e "\n${YELLOW}Подключение WARP...${NC}" + warp-cli --accept-tos connect > /dev/null 2>&1 + sleep 2 + if is_warp_running; then + echo -e "${GREEN}[OK] WARP подключён.${NC}" + log_action "START: WARP connected" + else + echo -e "${RED}[ERROR] Не удалось подключить. Проверьте: warp-cli status${NC}" + fi + read -p "Нажмите Enter..." +} + +stop_warp() { + if ! is_warp_installed; then + echo -e "\n${RED}WARP не установлен.${NC}" + read -p "Нажмите Enter..."; return + fi + if ! is_warp_running; then + echo -e "\n${YELLOW}WARP уже отключён.${NC}" + read -p "Нажмите Enter..."; return + fi + echo -e "\n${YELLOW}Отключение WARP...${NC}" + warp-cli --accept-tos disconnect > /dev/null 2>&1 + echo -e "${GREEN}[OK] WARP отключён.${NC}" + log_action "STOP: WARP disconnected" + read -p "Нажмите Enter..." +} + +# ─── Status ─────────────────────────────────────────────────── + +show_status() { + clear + echo -e "\n${CYAN}━━━ Статус WARP ━━━${NC}\n" + + if ! is_warp_installed; then + echo -e " ${WHITE}Статус: ${RED}Не установлен${NC}" + echo -e "\n ${WHITE}Установите WARP через пункт меню 1.${NC}" + echo "" + read -p "Нажмите Enter..."; return + fi + + local status_text warp_ip + status_text=$(get_warp_status_text) + + local status_color="$RED" + [[ "$status_text" == "Подключён" ]] && status_color="$GREEN" + [[ "$status_text" == "Отключён" ]] && status_color="$YELLOW" + + echo -e " ${WHITE}Статус: ${status_color}${status_text}${NC}" + echo -e " ${WHITE}Порт SOCKS5: ${CYAN}127.0.0.1:${SOCKS_PORT}${NC}" + echo -e " ${WHITE}Реальный IP: ${GREEN}${MY_IP}${NC}" + + if is_warp_running; then + warp_ip=$(get_warp_ip) + echo -e " ${WHITE}WARP IP: ${GREEN}${warp_ip}${NC}" + fi + + echo "" + echo -e " ${CYAN}── warp-cli status ──${NC}" + warp-cli --accept-tos status 2>/dev/null | while IFS= read -r line; do + echo -e " ${WHITE}$line${NC}" + done + + echo "" + echo -e " ${CYAN}── warp-cli settings ──${NC}" + warp-cli --accept-tos settings 2>/dev/null | head -10 | while IFS= read -r line; do + echo -e " ${WHITE}$line${NC}" + done + + echo "" + read -p "Нажмите Enter..." +} + +# ─── 3X-UI JSON ────────────────────────────────────────────── + +show_xui_json() { + clear + echo -e "\n${CYAN}━━━ Конфигурация для 3X-UI ━━━${NC}\n" + echo -e "${WHITE}Добавьте в ${YELLOW}Xray Settings → Outbounds${WHITE} (JSON):${NC}\n" + + echo -e "${GREEN}── 1. Outbound (добавить в массив outbounds) ──${NC}\n" + cat < /dev/null 2>&1 + echo -e "${GREEN} ✓${NC}" + + echo -e "${YELLOW}[2/4] Удаление регистрации...${NC}" + warp-cli --accept-tos registration delete > /dev/null 2>&1 + echo -e "${GREEN} ✓${NC}" + + echo -e "${YELLOW}[3/4] Новая регистрация...${NC}" + warp-cli --accept-tos registration new > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo -e "${RED}[ERROR] Регистрация не удалась.${NC}" + read -p "Нажмите Enter..."; return + fi + echo -e "${GREEN} ✓${NC}" + + echo -e "${YELLOW}[4/4] Подключение...${NC}" + warp-cli --accept-tos mode proxy > /dev/null 2>&1 + warp-cli --accept-tos proxy port "${SOCKS_PORT}" > /dev/null 2>&1 + warp-cli --accept-tos connect > /dev/null 2>&1 + sleep 2 + + if is_warp_running; then + local wip + wip=$(get_warp_ip) + echo -e "${GREEN} ✓ Готово! Новый WARP IP: ${wip}${NC}" + log_action "REKEY: new registration, warp_ip=${wip}" + else + echo -e "${YELLOW} ⚠ Регистрация обновлена, подключение не подтверждено.${NC}" + log_action "REKEY: new registration, connection unconfirmed" + fi + read -p "Нажмите Enter..." +} + +# ─── Change port ────────────────────────────────────────────── + +change_port() { + if ! is_warp_installed; then + echo -e "\n${RED}WARP не установлен.${NC}" + read -p "Нажмите Enter..."; return + fi + + echo -e "\n${CYAN}━━━ Изменение порта SOCKS5 ━━━${NC}\n" + echo -e "${WHITE}Текущий порт: ${GREEN}${SOCKS_PORT}${NC}\n" + + local new_port + while true; do + echo -e "Введите новый порт (1024-65535):" + read -p "> " new_port + if [[ "$new_port" =~ ^[0-9]+$ ]] && (( new_port >= 1024 && new_port <= 65535 )); then + break + fi + echo -e "${RED}Ошибка: порт должен быть числом от 1024 до 65535.${NC}" + done + + warp-cli --accept-tos proxy port "$new_port" > /dev/null 2>&1 + save_config_val "SOCKS_PORT" "$new_port" + SOCKS_PORT="$new_port" + + echo -e "\n${GREEN}[OK] Порт изменён на ${new_port}.${NC}" + echo -e "${WHITE}SOCKS5: ${CYAN}127.0.0.1:${new_port}${NC}" + echo -e "\n${YELLOW}Не забудьте обновить порт в настройках 3X-UI!${NC}" + log_action "PORT: changed to ${new_port}" + read -p "Нажмите Enter..." +} + +# ─── Uninstall ──────────────────────────────────────────────── + +full_uninstall() { + clear + echo -e "\n${RED}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${RED}║ ⚠ ПОЛНОЕ УДАЛЕНИЕ WARP MANAGER ⚠ ║${NC}" + echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e "${WHITE}Будут удалены:${NC}" + echo -e " ${RED}•${NC} Пакет cloudflare-warp" + echo -e " ${RED}•${NC} Репозиторий и GPG-ключ Cloudflare" + echo -e " ${RED}•${NC} Конфигурация ${WHITE}/etc/warp-manager/${NC}" + echo -e " ${RED}•${NC} Команда ${WHITE}gowarp${NC}" + echo -e " ${RED}•${NC} Логи ${WHITE}/var/log/warp-manager.log${NC}" + echo "" + echo -e "${GREEN}НЕ будет затронуто:${NC}" + echo -e " ${GREEN}•${NC} 3X-UI и Xray (настройки outbound нужно убрать вручную)" + echo -e " ${GREEN}•${NC} Kaskad PRO" + echo -e " ${GREEN}•${NC} Системные пакеты" + echo "" + read -p "$(echo -e "${RED}Удалить WARP Manager полностью? (y/n): ${NC}")" confirm1 + [[ "$confirm1" != "y" ]] && { echo -e "\n${CYAN}Отменено.${NC}"; read -p "Нажмите Enter..."; return; } + + echo "" + echo -e "${YELLOW}Удаление WARP Manager...${NC}\n" + + echo -e " ${YELLOW}[1/6]${NC} Отключение WARP..." + warp-cli --accept-tos disconnect > /dev/null 2>&1 + echo -e " ${GREEN}✓${NC} WARP отключён" + + echo -e " ${YELLOW}[2/6]${NC} Удаление регистрации..." + warp-cli --accept-tos registration delete > /dev/null 2>&1 + echo -e " ${GREEN}✓${NC} Регистрация удалена" + + echo -e " ${YELLOW}[3/6]${NC} Удаление пакета..." + apt-get remove -y cloudflare-warp > /dev/null 2>&1 + apt-get autoremove -y > /dev/null 2>&1 + echo -e " ${GREEN}✓${NC} Пакет удалён" + + echo -e " ${YELLOW}[4/6]${NC} Удаление репозитория и ключа..." + rm -f /etc/apt/sources.list.d/cloudflare-client.list + rm -f /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg + echo -e " ${GREEN}✓${NC} Репозиторий и ключ удалены" + + echo -e " ${YELLOW}[5/6]${NC} Удаление конфигурации..." + rm -rf "$WARP_DIR" + rm -f "$WARP_LOG" + echo -e " ${GREEN}✓${NC} Конфигурация и логи удалены" + + echo -e " ${YELLOW}[6/6]${NC} Удаление команды gowarp..." + rm -f /usr/local/bin/gowarp + echo -e " ${GREEN}✓${NC} Команда gowarp удалена" + + echo "" + echo -e "${GREEN}══════════════════════════════════════════════════════════════${NC}" + echo -e "${GREEN} WARP Manager полностью удалён.${NC}" + echo -e "${WHITE} Не забудьте убрать outbound \"warp\" из настроек 3X-UI!${NC}" + echo -e "${GREEN}══════════════════════════════════════════════════════════════${NC}" + echo "" + log_action "UNINSTALL: full removal completed" + read -p "Нажмите Enter..." + exit 0 +} + +# ═══════════════════════════════════════════════════════════════ +# PROMO +# ═══════════════════════════════════════════════════════════════ + +show_promo() { + clear; echo "" + echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${MAGENTA}║ ХОСТИНГ СО СКИДКОЙ ДО -60% ║${NC}" + echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" + echo -e "\n${CYAN}🌍 РФ И ЕВРОПА${NC}\n${WHITE} >>> https://vk.cc/ct29NQ${NC}" + printf " ${YELLOW}%-12s${NC} : ${WHITE}%s${NC}\n" "OFF60" "60% скидка" "antenka20" "+20% (3мес)" "antenka6" "+15% (6мес)" "antenka12" "+5% (12мес)" + echo -e "\n${CYAN}🇧🇾 БЕЛАРУСЬ${NC}\n${WHITE} >>> https://vk.cc/cUxAhj${NC}" + printf " ${YELLOW}%-12s${NC} : ${WHITE}%s${NC}\n" "OFF60" "60% скидка" + echo -e "\n${YELLOW}QR-код... (3с)${NC}"; for i in 3 2 1; do echo -ne "$i..."; sleep 1; done; echo "" + echo -e "\n${WHITE}"; command -v qrencode &>/dev/null && qrencode -t ANSIUTF8 "https://vk.cc/ct29NQ" || echo "Ссылки выше."; echo -e "${NC}" + read -p "Нажмите Enter..." +} + +# ═══════════════════════════════════════════════════════════════ +# INFO PAGE +# ═══════════════════════════════════════════════════════════════ + +show_info() { + clear; echo "" + echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${MAGENTA}║ 📚 WARP Manager v${WARP_VERSION} — Что это и как работает ║${NC}" + echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + echo -e "${CYAN}═══ ЧТО ТАКОЕ CLOUDFLARE WARP ═══${NC}" + echo "" + echo -e "${WHITE} Cloudflare WARP — бесплатный сервис от Cloudflare, который" + echo -e " направляет трафик через глобальную сеть Cloudflare." + echo -e "" + echo -e " Ваш VPS получает «чистый» IP-адрес Cloudflare, который" + echo -e " не заблокирован популярными сервисами.${NC}" + echo "" + echo -e "${CYAN}═══ ЗАЧЕМ НУЖЕН WARP + 3X-UI ═══${NC}" + echo "" + echo -e "${WHITE} Многие сайты блокируют IP дешёвых VPS:" + echo -e " ChatGPT, Netflix, Disney+, Spotify и другие." + echo -e "" + echo -e " WARP решает эту проблему: трафик из 3X-UI идёт через" + echo -e " Cloudflare и получает доверенный IP.${NC}" + echo "" + echo -e "${CYAN}═══ СХЕМА РАБОТЫ ═══${NC}" + echo "" + echo -e "${WHITE} Клиент → 3X-UI (Xray) → SOCKS5 (WARP) → Cloudflare → Интернет${NC}" + echo "" + echo -e "${GREEN} 1.${NC} Скрипт устанавливает ${YELLOW}cloudflare-warp${NC} на сервер" + echo -e "${GREEN} 2.${NC} WARP работает в режиме ${YELLOW}SOCKS5-прокси${NC} на 127.0.0.1:${SOCKS_PORT}" + echo -e "${GREEN} 3.${NC} В 3X-UI добавляется ${YELLOW}outbound${NC} типа SOCKS → warp" + echo -e "${GREEN} 4.${NC} В маршрутизации выбираете какие сайты идут через WARP" + echo "" + echo -e "${CYAN}═══ ЧТО ПОЛУЧАЕТЕ ═══${NC}" + echo "" + echo -e " ${GREEN}✓${NC} Разблокировка ChatGPT, Netflix, Disney+, Spotify" + echo -e " ${GREEN}✓${NC} Чистый IPv4/IPv6 от Cloudflare" + echo -e " ${GREEN}✓${NC} Стабильный маршрут через сеть Cloudflare" + echo -e " ${GREEN}✓${NC} Гибкая маршрутизация: часть сайтов через WARP, остальные напрямую" + echo -e " ${GREEN}✓${NC} Бесплатно (Cloudflare WARP — бесплатный сервис)" + echo "" + echo -e "${MAGENTA}──────────────────────────────────────────────────────────────${NC}" + read -p "Нажмите Enter для продолжения..." +} + +# ═══════════════════════════════════════════════════════════════ +# MAIN MENU +# ═══════════════════════════════════════════════════════════════ + +show_menu() { + while true; do + clear + local status_text status_color + status_text=$(get_warp_status_text) + status_color="$RED" + [[ "$status_text" == "Подключён" ]] && status_color="$GREEN" + [[ "$status_text" == "Отключён" ]] && status_color="$YELLOW" + + echo -e "${MAGENTA}******************************************************" + echo " anten-ka · WARP Manager v${WARP_VERSION}" + echo " YouTube: https://www.youtube.com/@antenkaru" + echo -e "******************************************************${NC}" + echo -e "${WHITE}IP сервера: ${GREEN}${MY_IP}${NC} ${WHITE}WARP: ${status_color}${status_text}${NC}" + if is_warp_running; then + echo -e "${WHITE}SOCKS5: ${CYAN}127.0.0.1:${SOCKS_PORT}${NC}" + fi + echo -e "------------------------------------------------------" + echo -e " 1) ${GREEN}Установить WARP${NC}" + echo -e " 2) ${CYAN}Запустить WARP${NC}" + echo -e " 3) ${YELLOW}Остановить WARP${NC}" + echo -e " 4) 📊 ${WHITE}Статус и конфигурация${NC}" + echo -e " 5) 📋 ${CYAN}JSON для 3X-UI${NC}" + echo -e " 6) 🔑 ${YELLOW}Перевыпуск ключа${NC}" + echo -e " 7) 🔧 ${WHITE}Изменить порт SOCKS5${NC}" + echo -e " 8) ${YELLOW}PROMO${NC}" + echo -e " 9) ${MAGENTA}📚 Инструкция${NC}" + echo -e "10) ${RED}⚠ Полное удаление${NC}" + echo -e " 0) Выход" + echo -e "------------------------------------------------------" + read -p "Выбор: " ch + case $ch in + 1) install_warp ;; + 2) start_warp ;; + 3) stop_warp ;; + 4) show_status ;; + 5) show_xui_json ;; + 6) rekey_warp ;; + 7) change_port ;; + 8) show_promo ;; + 9) show_info ;; + 10) full_uninstall ;; + 0) exit 0 ;; + esac + done +} + +# ═══════════════════════════════════════════════════════════════ +# STARTUP WITH PROGRESS +# ═══════════════════════════════════════════════════════════════ + +run_startup() { + local total=5 s=0 + + clear; echo "" + echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${MAGENTA}║ WARP Manager v${WARP_VERSION} — Загрузка ║${NC}" + echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}" + echo "" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Проверка прав root..." "$s" "$total" + check_root + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Права root подтверждены \n" "$s" "$total" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Загрузка конфигурации..." "$s" "$total" + init_config + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Конфигурация загружена \n" "$s" "$total" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Установка gowarp..." "$s" "$total" + if [ "$(readlink -f "$0" 2>/dev/null)" != "/usr/local/bin/gowarp" ]; then + cp -f "$0" "/usr/local/bin/gowarp"; chmod +x "/usr/local/bin/gowarp" + fi + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} Команда gowarp \n" "$s" "$total" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Определение IP..." "$s" "$total" + get_my_ip + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} IP: %-25s \n" "$s" "$total" "$MY_IP" + + ((s++)) + printf " ${CYAN}[%d/%d]${NC} ${YELLOW}⏳${NC} Проверка WARP..." "$s" "$total" + local ws + ws=$(get_warp_status_text) + printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}✓${NC} WARP: %-25s \n" "$s" "$total" "$ws" + + echo "" + local w=40 bar="" + for ((i=0; i