diff --git a/warp.sh b/warp.sh index 7bb3d68..45f8c4e 100644 --- a/warp.sh +++ b/warp.sh @@ -537,36 +537,37 @@ awg_discover_containers() { fi CONTAINERS="${AWG_ALL_CONTAINERS[*]}" save_config_val "CONTAINERS" "$CONTAINERS" + return 0 +} + +awg_pick_container() { + awg_discover_containers || return 1 + if [ -n "${CONTAINER:-}" ]; then + docker exec "$CONTAINER" sh -c "true" 2>/dev/null && return 0 + fi CONTAINER="${AWG_ALL_CONTAINERS[0]}" save_config_val "CONTAINER" "$CONTAINER" return 0 } -awg_pick_container() { - if [ -n "${CONTAINER:-}" ]; then - docker exec "$CONTAINER" sh -c "true" 2>/dev/null && return 0 - CONTAINER="" - fi - awg_discover_containers || return 1 +awg_select_container() { + awg_discover_containers 2>/dev/null || return 1 if [ ${#AWG_ALL_CONTAINERS[@]} -eq 1 ]; then CONTAINER="${AWG_ALL_CONTAINERS[0]}" - fi - save_config_val "CONTAINER" "$CONTAINER" - return 0 -} - -awg_select_container() { - awg_discover_containers 2>/dev/null - if [ ${#AWG_ALL_CONTAINERS[@]} -le 1 ]; then - CONTAINER="${AWG_ALL_CONTAINERS[0]:-}" + awg_load_container_data return 0 fi echo -e "\n${CYAN}Выберите контейнер:${NC}" local i=1 for c in "${AWG_ALL_CONTAINERS[@]}"; do - local has_warp="нет" + local has_warp="${DIM}нет${NC}" docker exec "$c" sh -c "[ -f '/opt/warp/warp.conf' ]" 2>/dev/null && has_warp="${GREEN}да${NC}" - echo -e " ${GREEN}$i)${NC} $c [WARP: $has_warp]" + local clients="-" + local cnt; cnt=$(docker exec "$c" sh -c "cat /opt/warp/clients.list 2>/dev/null | grep -c '.' || echo 0" 2>/dev/null | tr -d '\r') + [ "$cnt" != "0" ] && clients="$cnt" + local marker="" + [ "$c" = "${CONTAINER:-}" ] && marker=" ${CYAN}*${NC}" + echo -e " ${GREEN}$i)${NC} $c [WARP: $has_warp | Клиентов: $clients]${marker}" ((i++)) done echo -e " ${DIM}0) Отмена${NC}" @@ -711,40 +712,44 @@ awg_warp_up() { install_warp_awg() { clear; echo -e "\n${CYAN}━━━ Установка WARP (AmneziaWG) ━━━${NC}\n" - if is_warp_installed_awg && is_warp_running_awg; then - echo -e "${YELLOW}WARP уже установлен и работает.${NC}"; read -p "Enter..."; return - fi - if is_warp_installed_awg && ! is_warp_running_awg; then - echo -e "${YELLOW}[*] WARP установлен, поднимаю интерфейс...${NC}" - awg_warp_up && echo -e "${GREEN} ✓ warp поднят${NC}" || echo -e "${RED} Ошибка${NC}" - read -p "Enter..."; return - fi + awg_discover_containers 2>/dev/null || { read -p "Enter..."; return; } - echo -e "${YELLOW}[1/7]${NC} Бэкап контейнера..." - awg_backup; echo -e "${GREEN} ✓${NC}" - - echo -e "${YELLOW}[2/7]${NC} Скачиваю wgcf..." + echo -e "${YELLOW}[1/5]${NC} Скачиваю wgcf..." awg_install_wgcf || { read -p "Enter..."; return; }; echo -e "${GREEN} ✓${NC}" - echo -e "${YELLOW}[3/7]${NC} Регистрация WARP..." + echo -e "${YELLOW}[2/5]${NC} Регистрация WARP..." awg_ensure_account || { read -p "Enter..."; return; }; echo -e "${GREEN} ✓${NC}" - echo -e "${YELLOW}[4/7]${NC} Генерация профиля..." + echo -e "${YELLOW}[3/5]${NC} Генерация профиля..." awg_generate_profile || { read -p "Enter..."; return; }; echo -e "${GREEN} ✓${NC}" - echo -e "${YELLOW}[5/7]${NC} Определение endpoint..." + echo -e "${YELLOW}[4/5]${NC} Определение endpoint..." local ep; ep=$(awg_resolve_endpoint) || { read -p "Enter..."; return; }; echo -e "${GREEN} ✓ ${ep}${NC}" - echo -e "${YELLOW}[6/7]${NC} Сборка warp.conf в контейнере..." - awg_build_warp_conf "$ep"; echo -e "${GREEN} ✓${NC}" - - echo -e "${YELLOW}[7/7]${NC} Поднимаю warp-интерфейс..." - awg_warp_up || { read -p "Enter..."; return; }; echo -e "${GREEN} ✓${NC}" - - awg_detect_warp_exit_ip - [ -n "$AWG_WARP_EXIT_IP" ] && echo -e "\n ${WHITE}WARP IP: ${GREEN}${AWG_WARP_EXIT_IP}${NC}" - echo -e "\n${GREEN}WARP установлен! Управление клиентами — п.6.${NC}" - log_action "AWG INSTALL: endpoint=${ep}, warp_ip=${AWG_WARP_EXIT_IP}" + echo -e "${YELLOW}[5/5]${NC} Установка на контейнеры...\n" + local saved_container="${CONTAINER:-}" + for c in "${AWG_ALL_CONTAINERS[@]}"; do + CONTAINER="$c" + awg_load_container_data 2>/dev/null || continue + echo -e " ${CYAN}► ${c}${NC}" + if docker exec "$c" sh -c "[ -f '/opt/warp/warp.conf' ]" 2>/dev/null; then + if docker exec "$c" sh -c "ip addr show warp >/dev/null 2>&1" 2>/dev/null; then + echo -e " ${GREEN}✓ Уже установлен и работает${NC}" + else + echo -e " ${YELLOW}Поднимаю интерфейс...${NC}" + awg_warp_up 2>/dev/null && echo -e " ${GREEN}✓ warp поднят${NC}" || echo -e " ${RED}✗ Ошибка${NC}" + fi + else + awg_backup 2>/dev/null + awg_build_warp_conf "$ep" + awg_warp_up 2>/dev/null && echo -e " ${GREEN}✓ WARP установлен${NC}" || echo -e " ${RED}✗ Ошибка${NC}" + fi + awg_detect_warp_exit_ip + [ -n "$AWG_WARP_EXIT_IP" ] && echo -e " ${WHITE}WARP IP: ${GREEN}${AWG_WARP_EXIT_IP}${NC}" + done + CONTAINER="$saved_container" + echo -e "\n${GREEN}Готово! Управление клиентами — п.7.${NC}" + log_action "AWG INSTALL: ${#AWG_ALL_CONTAINERS[@]} containers, endpoint=${ep}" read -p "Enter..." } @@ -846,11 +851,7 @@ uninstall_awg() { awg_check_containers() { clear; echo -e "\n${CYAN}━━━ Контейнеры AmneziaWG ━━━${NC}\n" - local saved_container="${CONTAINER:-}" awg_discover_containers 2>/dev/null - # discover persists CONTAINER=first match; restore user's choice (or "") on disk - CONTAINER="$saved_container" - save_config_val "CONTAINER" "$saved_container" if [ ${#AWG_ALL_CONTAINERS[@]} -eq 0 ]; then echo -e " ${RED}Контейнеры не найдены.${NC}" read -p " Enter..."; return @@ -1002,9 +1003,7 @@ awg_get_client_ips() { } awg_toggle_clients_ssh() { - if [ ${#AWG_ALL_CONTAINERS[@]} -gt 1 ]; then - awg_select_container || return - fi + awg_select_container || return awg_get_client_ips; awg_parse_clients_table; awg_load_clients if [ ${#AWG_CLIENT_IPS[@]} -eq 0 ]; then