Fix multi-container: install WARP on ALL containers, always show container selector, discover without overwriting CONTAINER

Made-with: Cursor
This commit is contained in:
anten-ka
2026-03-22 13:25:50 +03:00
parent 061e5c190d
commit 71e386cdec

97
warp.sh
View File

@@ -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