v2.1: MODE=both support - 3X-UI and AmneziaWG simultaneously, dual bot handlers, 4 bugs fixed

Made-with: Cursor
This commit is contained in:
anten-ka
2026-03-20 17:19:47 +03:00
parent 4ad1ac497e
commit dacfba7f62

241
warp.sh
View File

@@ -88,9 +88,12 @@ save_config_val() {
# MODE DETECTION
# ═══════════════════════════════════════════════════════════════
has_3xui_mode() { [[ "$MODE" == "3xui" || "$MODE" == "both" ]]; }
has_awg_mode() { [[ "$MODE" == "amnezia" || "$MODE" == "both" ]]; }
detect_mode() {
source "$WARP_CONF" 2>/dev/null
if [ -n "${MODE:-}" ] && [[ "$MODE" == "3xui" || "$MODE" == "amnezia" ]]; then
if [ -n "${MODE:-}" ] && [[ "$MODE" == "3xui" || "$MODE" == "amnezia" || "$MODE" == "both" ]]; then
return 0
fi
@@ -106,16 +109,7 @@ detect_mode() {
[ "$has_3xui" -eq 0 ] && command -v x-ui &>/dev/null && has_3xui=1
if [ "$has_amnezia" -eq 1 ] && [ "$has_3xui" -eq 1 ]; then
echo -e "\n${CYAN}Обнаружены оба режима:${NC}"
echo -e " ${GREEN}1)${NC} 3X-UI (SOCKS5-прокси)"
echo -e " ${GREEN}2)${NC} AmneziaWG (Docker WireGuard)"
while true; do
read -p "Выберите режим (1/2): " choice
case "$choice" in
1) MODE="3xui"; break ;;
2) MODE="amnezia"; break ;;
esac
done
MODE="both"
elif [ "$has_amnezia" -eq 1 ]; then
MODE="amnezia"
elif [ "$has_3xui" -eq 1 ]; then
@@ -124,11 +118,13 @@ detect_mode() {
echo -e "\n${YELLOW}Не обнаружено ни 3X-UI, ни AmneziaWG Docker.${NC}"
echo -e " ${GREEN}1)${NC} 3X-UI (SOCKS5-прокси для Xray)"
echo -e " ${GREEN}2)${NC} AmneziaWG (Docker WireGuard)"
echo -e " ${GREEN}3)${NC} Оба режима"
while true; do
read -p "Выберите режим (1/2): " choice
read -p "Выберите режим (1/2/3): " choice
case "$choice" in
1) MODE="3xui"; break ;;
2) MODE="amnezia"; break ;;
3) MODE="both"; break ;;
esac
done
fi
@@ -1096,11 +1092,24 @@ awg_remove_from_start_sh() {
# ═══════════════════════════════════════════════════════════════
get_warp_status() {
if [ "$MODE" = "3xui" ]; then get_warp_status_3xui; else get_warp_status_awg; fi
if [ "$MODE" = "both" ]; then
local s3 sa
s3=$(get_warp_status_3xui); sa=$(get_warp_status_awg)
echo "3X-UI: ${s3} | AWG: ${sa}"
elif [ "$MODE" = "3xui" ]; then
get_warp_status_3xui
else
get_warp_status_awg
fi
}
get_warp_ip() {
if [ "$MODE" = "3xui" ]; then
if [ "$MODE" = "both" ]; then
local ip3 ipa
ip3=$(get_warp_ip_3xui)
awg_detect_warp_exit_ip; ipa="${AWG_WARP_EXIT_IP:-N/A}"
echo "3X-UI: ${ip3} | AWG: ${ipa}"
elif [ "$MODE" = "3xui" ]; then
get_warp_ip_3xui
else
awg_detect_warp_exit_ip; echo "${AWG_WARP_EXIT_IP:-N/A}"
@@ -1108,7 +1117,13 @@ get_warp_ip() {
}
is_warp_running() {
if [ "$MODE" = "3xui" ]; then is_warp_running_3xui; else is_warp_running_awg; fi
if [ "$MODE" = "both" ]; then
is_warp_running_3xui 2>/dev/null || is_warp_running_awg 2>/dev/null
elif [ "$MODE" = "3xui" ]; then
is_warp_running_3xui
else
is_warp_running_awg
fi
}
# ═══════════════════════════════════════════════════════════════
@@ -1180,7 +1195,25 @@ kbd_main_awg() {
JSON
}
kbd_main() { if [ "$MODE" = "3xui" ]; then kbd_main_3xui; else kbd_main_awg; fi; }
kbd_main_both() {
cat <<'JSON'
[
[{"text":"📊 Статус","callback_data":"st"},{"text":"🌐 IP","callback_data":"ip"}],
[{"text":"▶️ Запустить","callback_data":"on"},{"text":"⏹ Остановить","callback_data":"off"}],
[{"text":"🔑 Перевыпуск","callback_data":"rk"}],
[{"text":"📋 JSON 3X-UI","callback_data":"js"},{"text":"👥 Клиенты AWG","callback_data":"cl"}],
[{"text":"🔄 Контейнер","callback_data":"rc"}],
[{"text":"💻 Система","callback_data":"sys"}],
[{"text":"🏢 Хостинг","callback_data":"promo"}]
]
JSON
}
kbd_main() {
if [ "$MODE" = "both" ]; then kbd_main_both
elif [ "$MODE" = "3xui" ]; then kbd_main_3xui
else kbd_main_awg; fi
}
kbd_back() { echo '[[{"text":"⬅️ Меню","callback_data":"m"}]]'; }
kbd_rekey_confirm() { echo '[[{"text":"✅ Да","callback_data":"rk_y"}],[{"text":"⬅️ Отмена","callback_data":"m"}]]'; }
@@ -1192,9 +1225,11 @@ bot_main_menu() {
local ws wip="" extra=""
ws=$(get_warp_status)
is_warp_running && wip=" | WARP IP: $(get_warp_ip)"
[ "$MODE" = "amnezia" ] && extra="\nКонтейнер: <code>${CONTAINER:-N/A}</code>"
[ "$MODE" = "3xui" ] && extra="\nSOCKS5: <code>127.0.0.1:${SOCKS_PORT}</code>"
local mode_label="3X-UI"; [ "$MODE" = "amnezia" ] && mode_label="AmneziaWG"
if has_3xui_mode; then extra+="\nSOCKS5: <code>127.0.0.1:${SOCKS_PORT}</code>"; fi
if has_awg_mode; then extra+="\nКонтейнер: <code>${CONTAINER:-N/A}</code>"; fi
local mode_label="3X-UI"
[ "$MODE" = "amnezia" ] && mode_label="AmneziaWG"
[ "$MODE" = "both" ] && mode_label="3X-UI + AWG"
local text="<b>WARP Manager v${WARP_VERSION}</b> (${mode_label})\nСервер: <code>${MY_IP:-N/A}</code>\nСтатус: <b>${ws}</b>${wip}${extra}\n\nВыберите:"
local kbd; kbd=$(kbd_main)
if [ -n "$msg_id" ]; then
@@ -1217,12 +1252,13 @@ bot_handle_callback() {
local ws wip="" extra=""
ws=$(get_warp_status)
is_warp_running && wip="\nWARP IP: <code>$(get_warp_ip)</code>"
if [ "$MODE" = "3xui" ]; then
extra="\nSOCKS5: <code>127.0.0.1:${SOCKS_PORT}</code>"
if has_3xui_mode; then
extra+="\nSOCKS5: <code>127.0.0.1:${SOCKS_PORT}</code>"
local raw; raw=$(warp-cli --accept-tos status 2>/dev/null | head -3)
extra+="\n\n<pre>${raw}</pre>"
else
extra="\nКонтейнер: <code>${CONTAINER}</code>\nПодсеть: <code>${AWG_SUBNET:-N/A}</code>"
[ -n "$raw" ] && extra+="\n\n<pre>${raw}</pre>"
fi
if has_awg_mode; then
extra+="\nКонтейнер: <code>${CONTAINER:-N/A}</code>\nПодсеть: <code>${AWG_SUBNET:-N/A}</code>"
awg_load_clients
extra+="\nКлиентов в WARP: <b>${#AWG_SELECTED_IPS[@]}</b>"
fi
@@ -1231,49 +1267,48 @@ bot_handle_callback() {
ip)
local wip="N/A"; is_warp_running && wip=$(get_warp_ip)
local t="🌐 <b>IP адреса</b>\n\n<b>Реальный:</b> <code>${MY_IP:-N/A}</code>\n<b>WARP:</b> <code>${wip}</code>"
[ "$MODE" = "3xui" ] && t+="\n<b>SOCKS5:</b> <code>127.0.0.1:${SOCKS_PORT}</code>"
if has_3xui_mode; then t+="\n<b>SOCKS5:</b> <code>127.0.0.1:${SOCKS_PORT}</code>"; fi
tg_edit "$chat_id" "$msg_id" "$t" "$(kbd_back)" ;;
on)
if [ "$MODE" = "3xui" ]; then
is_warp_installed_3xui || { tg_edit "$chat_id" "$msg_id" "Не установлен." "$(kbd_back)"; return; }
is_warp_running_3xui && { tg_edit "$chat_id" "$msg_id" "✅ Уже подключён." "$(kbd_back)"; return; }
tg_edit "$chat_id" "$msg_id" "⏳ Подключение..." ""
tg_edit "$chat_id" "$msg_id" "⏳ Запуск..." ""
local result=""
if has_3xui_mode && is_warp_installed_3xui; then
warp-cli --accept-tos connect > /dev/null 2>&1; sleep 3
if is_warp_running_3xui; then
local w; w=$(get_warp_ip_3xui)
tg_edit "$chat_id" "$msg_id" "✅ <b>Подключён</b>\nWARP IP: <code>${w}</code>" "$(kbd_back)"; log_action "BOT 3XUI ON"
else
tg_edit "$chat_id" "$msg_id" "❌ Ошибка." "$(kbd_back)"
result+="✅ 3X-UI: $(get_warp_ip_3xui)\n"; log_action "BOT 3XUI ON"
else result+="❌ 3X-UI: ошибка\n"; fi
fi
else
is_warp_installed_awg || { tg_edit "$chat_id" "$msg_id" "Не установлен." "$(kbd_back)"; return; }
is_warp_running_awg && { tg_edit "$chat_id" "$msg_id" "✅ Уже работает." "$(kbd_back)"; return; }
tg_edit "$chat_id" "$msg_id" "⏳ Запуск..." ""
if has_awg_mode && is_warp_installed_awg; then
awg_warp_up 2>/dev/null
if is_warp_running_awg; then
awg_detect_warp_exit_ip
tg_edit "$chat_id" "$msg_id" "✅ <b>WARP запущен</b>\nWARP IP: <code>${AWG_WARP_EXIT_IP:-?}</code>" "$(kbd_back)"; log_action "BOT AWG ON"
else tg_edit "$chat_id" "$msg_id" "❌ Ошибка." "$(kbd_back)"; fi
fi ;;
result+="✅ AWG: ${AWG_WARP_EXIT_IP:-?}\n"; log_action "BOT AWG ON"
else result+="❌ AWG: ошибка\n"; fi
fi
[ -z "$result" ] && result="❌ WARP не установлен."
tg_edit "$chat_id" "$msg_id" "<b>Запуск WARP</b>\n\n${result}" "$(kbd_back)" ;;
off)
if [ "$MODE" = "3xui" ]; then
is_warp_running_3xui || { tg_edit "$chat_id" "$msg_id" " Уже отключён." "$(kbd_back)"; return; }
local result=""
if has_3xui_mode && is_warp_running_3xui 2>/dev/null; then
warp-cli --accept-tos disconnect > /dev/null 2>&1
tg_edit "$chat_id" "$msg_id" "⏹ <b>WARP отключён.</b>" "$(kbd_back)"; log_action "BOT 3XUI OFF"
else
is_warp_running_awg || { tg_edit "$chat_id" "$msg_id" " Уже остановлен." "$(kbd_back)"; return; }
result+="⏹ 3X-UI отключён\n"; log_action "BOT 3XUI OFF"
fi
if has_awg_mode && is_warp_running_awg 2>/dev/null; then
docker exec "$CONTAINER" sh -c "wg-quick down '$AWG_WARP_CONF' 2>/dev/null || true"
tg_edit "$chat_id" "$msg_id" "⏹ <b>WARP остановлен.</b>" "$(kbd_back)"; log_action "BOT AWG OFF"
fi ;;
result+="⏹ AWG остановлен\n"; log_action "BOT AWG OFF"
fi
[ -z "$result" ] && result=" Уже отключён."
tg_edit "$chat_id" "$msg_id" "<b>Остановка WARP</b>\n\n${result}" "$(kbd_back)" ;;
rk)
tg_edit "$chat_id" "$msg_id" "🔑 <b>Перевыпуск ключа</b>\n\nПродолжить?" "$(kbd_rekey_confirm)" ;;
rk_y)
tg_edit "$chat_id" "$msg_id" "⏳ Перевыпуск..." ""
if [ "$MODE" = "3xui" ]; then
local result=""
if has_3xui_mode; then
warp-cli --accept-tos disconnect > /dev/null 2>&1
warp-cli --accept-tos registration delete > /dev/null 2>&1
warp-cli --accept-tos registration new > /dev/null 2>&1
@@ -1282,27 +1317,28 @@ bot_handle_callback() {
warp-cli --accept-tos connect > /dev/null 2>&1; sleep 3
if is_warp_running_3xui; then
local w; w=$(get_warp_ip_3xui)
tg_edit "$chat_id" "$msg_id" "✅ <b>Ключ перевыпущен</b>\nWARP IP: <code>${w}</code>" "$(kbd_back)"; log_action "BOT 3XUI REKEY: ${w}"
else tg_edit "$chat_id" "$msg_id" "⚠️ Перевыпущен, подключение не подтверждено." "$(kbd_back)"; fi
else
result+="✅ 3X-UI: <code>${w}</code>\n"; log_action "BOT 3XUI REKEY: ${w}"
else result+="⚠️ 3X-UI: не подтверждено\n"; fi
fi
if has_awg_mode; then
docker exec "$CONTAINER" sh -c "wg-quick down '$AWG_WARP_CONF' 2>/dev/null || true"
rm -f "$WGCF_ACCOUNT"
(cd /root && yes | ./wgcf register 2>/dev/null && yes | ./wgcf generate 2>/dev/null)
if [ -f "$WGCF_PROFILE" ]; then
local ep; ep=$(awg_resolve_endpoint 2>/dev/null)
if [ -n "$ep" ]; then
docker cp "$WGCF_PROFILE" "${CONTAINER}:${AWG_WARP_DIR}/wgcf-profile.conf" 2>/dev/null
awg_build_warp_conf "$ep"
awg_warp_up 2>/dev/null
awg_load_clients; awg_apply_rules; awg_patch_start_sh
awg_detect_warp_exit_ip
tg_edit "$chat_id" "$msg_id" "✅ <b>Ключ перевыпущен</b>\nWARP IP: <code>${AWG_WARP_EXIT_IP:-?}</code>" "$(kbd_back)"; log_action "BOT AWG REKEY"
else tg_edit "$chat_id" "$msg_id" "❌ Ошибка endpoint." "$(kbd_back)"; fi
else tg_edit "$chat_id" "$msg_id" "❌ Ошибка генерации профиля." "$(kbd_back)"; fi
fi ;;
result+="✅ AWG: <code>${AWG_WARP_EXIT_IP:-?}</code>\n"; log_action "BOT AWG REKEY"
else result+="❌ AWG: ошибка endpoint\n"; fi
else result+="❌ AWG: ошибка профиля\n"; fi
fi
tg_edit "$chat_id" "$msg_id" "🔑 <b>Перевыпуск ключа</b>\n\n${result}" "$(kbd_back)" ;;
js)
if [ "$MODE" = "3xui" ]; then
if has_3xui_mode; then
local t="📋 <b>Конфигурация для 3X-UI</b>\n\n<b>Outbound:</b>\n<pre>{\n \"tag\": \"warp\",\n \"protocol\": \"socks\",\n \"settings\": {\n \"servers\": [{\"address\": \"127.0.0.1\", \"port\": ${SOCKS_PORT}}]\n }\n}</pre>\n\n<b>Routing:</b>\n<pre>{\"outboundTag\": \"warp\", \"domain\": [\"geosite:openai\",\"geosite:netflix\"]}</pre>"
tg_edit "$chat_id" "$msg_id" "$t" "$(kbd_back)"
else
@@ -1373,7 +1409,7 @@ bot_handle_callback() {
bot_handle_callback "$chat_id" "$msg_id" "" "cl" ;;
rc)
if [ "$MODE" != "amnezia" ]; then
if ! has_awg_mode; then
tg_edit "$chat_id" "$msg_id" " Только для AmneziaWG." "$(kbd_back)"; return
fi
tg_edit "$chat_id" "$msg_id" "🔄 Перезапуск контейнера..." ""
@@ -1389,8 +1425,8 @@ bot_handle_callback() {
local ws; ws=$(get_warp_status)
s+="\n<b>WARP:</b> ${ws}"
s+="\n<b>Режим:</b> ${MODE}"
[ "$MODE" = "3xui" ] && s+="\n<b>SOCKS5:</b> 127.0.0.1:${SOCKS_PORT}"
[ "$MODE" = "amnezia" ] && s+="\n<b>Контейнер:</b> ${CONTAINER:-N/A}"
if has_3xui_mode; then s+="\n<b>SOCKS5:</b> 127.0.0.1:${SOCKS_PORT}"; fi
if has_awg_mode; then s+="\n<b>Контейнер:</b> ${CONTAINER:-N/A}"; fi
tg_edit "$chat_id" "$msg_id" "$s" "$(kbd_back)" ;;
promo)
@@ -1406,7 +1442,7 @@ bot_daemon() {
source "$WARP_CONF"
[ -z "$BOT_TOKEN" ] && { log_action "BOT ERROR: no token"; exit 1; }
get_my_ip
[ "$MODE" = "amnezia" ] && [ -n "$CONTAINER" ] && awg_load_container_data 2>/dev/null
if has_awg_mode && [ -n "$CONTAINER" ]; then awg_load_container_data 2>/dev/null; fi
local offset=0
while true; do
local response
@@ -1540,15 +1576,17 @@ show_info() {
echo -e "${MAGENTA}║ 📚 WARP Manager v${WARP_VERSION}${NC}"
echo -e "${MAGENTA}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""
if [ "$MODE" = "3xui" ]; then
echo -e "${CYAN}═══ РЕЖИМ: 3X-UI ═══${NC}\n"
if has_3xui_mode; then
echo -e "${CYAN}═══ 3X-UI ═══${NC}\n"
echo -e "${WHITE} Клиент → 3X-UI (Xray) → SOCKS5 (WARP) → Cloudflare → Интернет${NC}\n"
echo -e "${GREEN} 1.${NC} cloudflare-warp установлен нативно"
echo -e "${GREEN} 2.${NC} SOCKS5-прокси на 127.0.0.1:${SOCKS_PORT}"
echo -e "${GREEN} 3.${NC} В 3X-UI: outbound SOCKS → warp"
echo -e "${GREEN} 4.${NC} Маршрутизация по доменам в Xray"
else
echo -e "${CYAN}═══ РЕЖИМ: AmneziaWG ═══${NC}\n"
echo ""
fi
if has_awg_mode; then
echo -e "${CYAN}═══ AmneziaWG ═══${NC}\n"
echo -e "${WHITE} Клиент → AmneziaWG Docker → warp WG → Cloudflare → Интернет${NC}\n"
echo -e "${GREEN} 1.${NC} wgcf генерирует WireGuard-профиль WARP"
echo -e "${GREEN} 2.${NC} WG-интерфейс warp внутри Docker-контейнера"
@@ -1575,7 +1613,8 @@ full_uninstall() {
read -p "$(echo -e "${RED}Удалить полностью? (y/n): ${NC}")" c1
[[ "$c1" != "y" ]] && return
if [ "$MODE" = "3xui" ]; then uninstall_3xui; else uninstall_awg; fi
if has_3xui_mode; then uninstall_3xui; fi
if has_awg_mode; then uninstall_awg; fi
rm -rf "$WARP_DIR" "$WARP_LOG"
echo -e " ${GREEN}${NC} Конфигурация и логи"
@@ -1584,7 +1623,7 @@ full_uninstall() {
echo -e "\n${GREEN}══════════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN} WARP Manager полностью удалён.${NC}"
[ "$MODE" = "3xui" ] && echo -e "${WHITE} Уберите outbound \"warp\" из 3X-UI!${NC}"
has_3xui_mode && echo -e "${WHITE} Уберите outbound \"warp\" из 3X-UI!${NC}"
echo -e "${GREEN}══════════════════════════════════════════════════════════════${NC}"
log_action "UNINSTALL: full removal ($MODE)"
read -p "Enter..."
@@ -1600,8 +1639,10 @@ show_menu() {
clear
local st sc
st=$(get_warp_status)
sc="$RED"; [[ "$st" == "Подключён" ]] && sc="$GREEN"; [[ "$st" == "Отключён" ]] && sc="$YELLOW"
local mode_label="3X-UI"; [ "$MODE" = "amnezia" ] && mode_label="AmneziaWG"
sc="$RED"; [[ "$st" == *"Подключён"* ]] && sc="$GREEN"; [[ "$st" == *"Отключён"* && "$st" != *"Подключён"* ]] && sc="$YELLOW"
local mode_label="3X-UI"
[ "$MODE" = "amnezia" ] && mode_label="AmneziaWG"
[ "$MODE" = "both" ] && mode_label="3X-UI + AmneziaWG"
echo -e "${MAGENTA}╔══════════════════════════════════════════════════════╗"
echo -e "║ anten-ka · WARP Manager v${WARP_VERSION}"
@@ -1609,10 +1650,10 @@ show_menu() {
echo -e "╚══════════════════════════════════════════════════════╝${NC}"
echo -e " ${WHITE}IP сервера:${NC} ${GREEN}${MY_IP}${NC} ${WHITE}Режим:${NC} ${CYAN}${mode_label}${NC}"
echo -e " ${WHITE}WARP:${NC} ${sc}${st}${NC}"
if [ "$MODE" = "3xui" ] && is_warp_running; then
if has_3xui_mode && is_warp_running_3xui 2>/dev/null; then
echo -e " ${WHITE}SOCKS5:${NC} ${CYAN}127.0.0.1:${SOCKS_PORT}${NC}"
fi
if [ "$MODE" = "amnezia" ] && [ -n "${CONTAINER:-}" ]; then
if has_awg_mode && [ -n "${CONTAINER:-}" ]; then
echo -e " ${WHITE}Контейнер:${NC} ${CYAN}${CONTAINER}${NC}"
fi
@@ -1623,38 +1664,44 @@ show_menu() {
echo -e " 4) 📊 Статус"
echo -e " 5) 🔑 ${YELLOW}Перевыпуск ключа${NC}"
if [ "$MODE" = "3xui" ]; then
if has_3xui_mode; then
echo -e "\n${CYAN}── 3X-UI ──────────────────────────────────────────────${NC}"
echo -e " 6) 📋 ${CYAN}Настройки SOCKS5 / JSON / Инструкция${NC}"
fi
if [ "$MODE" = "amnezia" ]; then
if has_awg_mode; then
echo -e "\n${CYAN}── AmneziaWG ──────────────────────────────────────────${NC}"
echo -e " 6) 👥 ${GREEN}Управление клиентами WARP${NC}"
echo -e " 7) 👥 ${GREEN}Управление клиентами WARP${NC}"
fi
echo -e "\n${CYAN}── Telegram-бот ───────────────────────────────────────${NC}"
echo -e " 7) 🤖 ${CYAN}Настройка и управление ботом${NC}"
echo -e " 8) 🤖 ${CYAN}Настройка и управление ботом${NC}"
echo -e "\n${CYAN}── Прочее ─────────────────────────────────────────────${NC}"
echo -e " 8) ${YELLOW}PROMO${NC}"
echo -e " 9) ${MAGENTA}📚 Инструкция${NC}"
echo -e " 10) ${RED}⚠ Полное удаление${NC}"
echo -e " 9) ${YELLOW}PROMO${NC}"
echo -e " 10) ${MAGENTA}📚 Инструкция${NC}"
echo -e " 11) ${RED}⚠ Полное удаление${NC}"
echo -e " 0) Выход"
echo -e "${CYAN}──────────────────────────────────────────────────────${NC}"
read -p " Выбор: " ch
case $ch in
1) if [ "$MODE" = "3xui" ]; then install_warp_3xui; else install_warp_awg; fi ;;
2) if [ "$MODE" = "3xui" ]; then start_warp_3xui; else start_warp_awg; fi ;;
3) if [ "$MODE" = "3xui" ]; then stop_warp_3xui; else stop_warp_awg; fi ;;
4) if [ "$MODE" = "3xui" ]; then show_status_3xui; else show_status_awg; fi ;;
5) if [ "$MODE" = "3xui" ]; then rekey_warp_3xui; else rekey_warp_awg; fi ;;
6) if [ "$MODE" = "3xui" ]; then show_3xui_menu; else awg_toggle_clients_ssh; fi ;;
7) bot_menu ;;
8) show_promo ;;
9) show_info ;;
10) full_uninstall ;;
1) if has_3xui_mode; then install_warp_3xui; fi
if has_awg_mode; then install_warp_awg; fi ;;
2) if has_3xui_mode; then start_warp_3xui; fi
if has_awg_mode; then start_warp_awg; fi ;;
3) if has_3xui_mode; then stop_warp_3xui; fi
if has_awg_mode; then stop_warp_awg; fi ;;
4) if has_3xui_mode; then show_status_3xui; fi
if has_awg_mode; then show_status_awg; fi ;;
5) if has_3xui_mode; then rekey_warp_3xui; fi
if has_awg_mode; then rekey_warp_awg; fi ;;
6) has_3xui_mode && show_3xui_menu ;;
7) has_awg_mode && awg_toggle_clients_ssh ;;
8) bot_menu ;;
9) show_promo ;;
10) show_info ;;
11) full_uninstall ;;
0) exit 0 ;;
esac
done
@@ -1665,7 +1712,7 @@ show_menu() {
# ═══════════════════════════════════════════════════════════════
run_startup() {
local total=7 s=0
local total=6 s=0
clear; echo ""
echo -e "${MAGENTA}╔══════════════════════════════════════════════════════════════╗${NC}"
@@ -1702,11 +1749,15 @@ run_startup() {
((s++))
printf " ${CYAN}[%d/%d]${NC} ${YELLOW}${NC} Определение режима..." "$s" "$total"
detect_mode
local mode_label="3X-UI"; [ "$MODE" = "amnezia" ] && mode_label="AmneziaWG"
local mode_label="3X-UI"
[ "$MODE" = "amnezia" ] && mode_label="AmneziaWG"
[ "$MODE" = "both" ] && mode_label="3X-UI + AmneziaWG"
has_awg_mode && ((total++))
has_3xui_mode && ((total++))
printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}${NC} Режим: %-25s \n" "$s" "$total" "$mode_label"
if has_awg_mode; then
((s++))
if [ "$MODE" = "amnezia" ]; then
printf " ${CYAN}[%d/%d]${NC} ${YELLOW}${NC} Docker контейнер..." "$s" "$total"
if awg_pick_container 2>/dev/null; then
awg_load_container_data 2>/dev/null
@@ -1714,10 +1765,12 @@ run_startup() {
else
printf "\r ${CYAN}[%d/%d]${NC} ${YELLOW}${NC} Контейнер не найден \n" "$s" "$total"
fi
else
printf " ${CYAN}[%d/%d]${NC} ${YELLOW}${NC} Проверка WARP..." "$s" "$total"
fi
if has_3xui_mode; then
((s++))
printf " ${CYAN}[%d/%d]${NC} ${YELLOW}${NC} Проверка WARP (3X-UI)..." "$s" "$total"
local ws; ws=$(get_warp_status_3xui)
printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}${NC} WARP: %-25s \n" "$s" "$total" "$ws"
printf "\r ${CYAN}[%d/%d]${NC} ${GREEN}${NC} 3X-UI WARP: %-20s \n" "$s" "$total" "$ws"
fi
echo ""