From 195345d6f4fee8cf0bf20aec821b5f20339883f1 Mon Sep 17 00:00:00 2001 From: anten-ka Date: Sun, 22 Mar 2026 13:46:04 +0300 Subject: [PATCH] Bot multi-container: container selector in cl, cc:* handler, rc restarts all, back to containers button Made-with: Cursor --- warp.sh | 60 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/warp.sh b/warp.sh index b46a40c..f48def9 100644 --- a/warp.sh +++ b/warp.sh @@ -1452,9 +1452,29 @@ bot_handle_callback() { fi ;; cl) + awg_discover_containers 2>/dev/null + if [ ${#AWG_ALL_CONTAINERS[@]} -gt 1 ]; then + local t="📦 Выберите контейнер:\n\n" + local kbd="[" + local first=1 + for ci in "${!AWG_ALL_CONTAINERS[@]}"; do + local cn="${AWG_ALL_CONTAINERS[$ci]}" + local has_w="☐" + docker exec "$cn" sh -c "[ -f '/opt/warp/warp.conf' ]" 2>/dev/null && has_w="✅" + [ "$first" -eq 0 ] && kbd+="," + kbd+="[{\"text\":\"${has_w} ${cn}\",\"callback_data\":\"cc:${ci}\"}]" + t+="${has_w} ${cn}\n" + first=0 + done + kbd+=",[{\"text\":\"⬅️ Меню\",\"callback_data\":\"m\"}]]" + tg_edit "$chat_id" "$msg_id" "$t" "$kbd" + return + fi + ;& + cl_show) awg_get_client_ips; awg_parse_clients_table; awg_load_clients local warp_set=" ${AWG_SELECTED_IPS[*]+"${AWG_SELECTED_IPS[*]}"} " - local t="👥 Клиенты WARP (${#AWG_SELECTED_IPS[@]} из ${#AWG_CLIENT_IPS[@]})\n\n" + local t="👥 Клиенты WARP${CONTAINER}\n(${#AWG_SELECTED_IPS[@]} из ${#AWG_CLIENT_IPS[@]})\n\n" local kbd="" if [ ${#AWG_CLIENT_IPS[@]} -eq 0 ]; then t+="Нет клиентов в конфиге VPN." @@ -1483,10 +1503,24 @@ bot_handle_callback() { first=0 done kbd+=",[{\"text\":\"✅ Все\",\"callback_data\":\"ct:all\"},{\"text\":\"☐ Никого\",\"callback_data\":\"ct:none\"}]" - kbd+=",[{\"text\":\"⬅️ Меню\",\"callback_data\":\"m\"}]]" + if [ ${#AWG_ALL_CONTAINERS[@]} -gt 1 ]; then + kbd+=",[{\"text\":\"📦 Контейнеры\",\"callback_data\":\"cl\"},{\"text\":\"⬅️ Меню\",\"callback_data\":\"m\"}]]" + else + kbd+=",[{\"text\":\"⬅️ Меню\",\"callback_data\":\"m\"}]]" + fi fi tg_edit "$chat_id" "$msg_id" "$t" "$kbd" ;; + cc:*) + local ci="${data#cc:}" + awg_discover_containers 2>/dev/null + if [[ "$ci" =~ ^[0-9]+$ ]] && (( ci < ${#AWG_ALL_CONTAINERS[@]} )); then + CONTAINER="${AWG_ALL_CONTAINERS[$ci]}" + save_config_val "CONTAINER" "$CONTAINER" + awg_load_container_data 2>/dev/null + fi + bot_handle_callback "$chat_id" "$msg_id" "" "cl_show" ;; + ct:*) local idx="${data#ct:}" awg_get_client_ips; awg_load_clients @@ -1513,19 +1547,25 @@ bot_handle_callback() { docker restart "$CONTAINER" >/dev/null 2>&1 local _a=0; while [ "$_a" -lt 15 ]; do docker exec "$CONTAINER" sh -c "true" 2>/dev/null && break; sleep 1; ((_a++)); done log_action "BOT AWG TOGGLE: ${#AWG_SELECTED_IPS[@]}, container restarted" - bot_handle_callback "$chat_id" "$msg_id" "" "cl" ;; + bot_handle_callback "$chat_id" "$msg_id" "" "cl_show" ;; rc) if ! has_awg_mode; then tg_edit "$chat_id" "$msg_id" "ℹ️ Только для AmneziaWG." "$(kbd_back)"; return fi - tg_edit "$chat_id" "$msg_id" "🔄 Перезапуск контейнера..." "" - docker restart "$CONTAINER" >/dev/null 2>&1; sleep 5 - if docker exec "$CONTAINER" sh -c "true" 2>/dev/null; then - tg_edit "$chat_id" "$msg_id" "✅ Контейнер перезапущен." "$(kbd_back)"; log_action "BOT AWG RESTART" - else - tg_edit "$chat_id" "$msg_id" "⚠️ Контейнер не отвечает." "$(kbd_back)" - fi ;; + awg_discover_containers 2>/dev/null + local result="" + for cn in "${AWG_ALL_CONTAINERS[@]}"; do + tg_edit "$chat_id" "$msg_id" "🔄 Перезапуск ${cn}..." "" + docker restart "$cn" >/dev/null 2>&1; sleep 5 + if docker exec "$cn" sh -c "true" 2>/dev/null; then + result+="✅ ${cn} перезапущен\n" + else + result+="⚠️ ${cn} не отвечает\n" + fi + done + tg_edit "$chat_id" "$msg_id" "🔄 Перезапуск контейнеров\n\n${result}" "$(kbd_back)" + log_action "BOT AWG RESTART: ${#AWG_ALL_CONTAINERS[@]} containers" ;; sys) local s; s=$(get_system_stats)