Bot multi-container: container selector in cl, cc:* handler, rc restarts all, back to containers button

Made-with: Cursor
This commit is contained in:
anten-ka
2026-03-22 13:46:04 +03:00
parent 796de24e92
commit 195345d6f4

60
warp.sh
View File

@@ -1452,9 +1452,29 @@ bot_handle_callback() {
fi ;; fi ;;
cl) cl)
awg_discover_containers 2>/dev/null
if [ ${#AWG_ALL_CONTAINERS[@]} -gt 1 ]; then
local t="📦 <b>Выберите контейнер:</b>\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} <code>${cn}</code>\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 awg_get_client_ips; awg_parse_clients_table; awg_load_clients
local warp_set=" ${AWG_SELECTED_IPS[*]+"${AWG_SELECTED_IPS[*]}"} " local warp_set=" ${AWG_SELECTED_IPS[*]+"${AWG_SELECTED_IPS[*]}"} "
local t="👥 <b>Клиенты WARP</b> (${#AWG_SELECTED_IPS[@]} из ${#AWG_CLIENT_IPS[@]})\n\n" local t="👥 <b>Клиенты WARP</b> — <code>${CONTAINER}</code>\n(${#AWG_SELECTED_IPS[@]} из ${#AWG_CLIENT_IPS[@]})\n\n"
local kbd="" local kbd=""
if [ ${#AWG_CLIENT_IPS[@]} -eq 0 ]; then if [ ${#AWG_CLIENT_IPS[@]} -eq 0 ]; then
t+="<i>Нет клиентов в конфиге VPN.</i>" t+="<i>Нет клиентов в конфиге VPN.</i>"
@@ -1483,10 +1503,24 @@ bot_handle_callback() {
first=0 first=0
done done
kbd+=",[{\"text\":\"Все\",\"callback_data\":\"ct:all\"},{\"text\":\"☐ Никого\",\"callback_data\":\"ct:none\"}]" 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 fi
tg_edit "$chat_id" "$msg_id" "$t" "$kbd" ;; 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:*) ct:*)
local idx="${data#ct:}" local idx="${data#ct:}"
awg_get_client_ips; awg_load_clients awg_get_client_ips; awg_load_clients
@@ -1513,19 +1547,25 @@ bot_handle_callback() {
docker restart "$CONTAINER" >/dev/null 2>&1 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 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" 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) rc)
if ! has_awg_mode; then if ! has_awg_mode; then
tg_edit "$chat_id" "$msg_id" " Только для AmneziaWG." "$(kbd_back)"; return tg_edit "$chat_id" "$msg_id" " Только для AmneziaWG." "$(kbd_back)"; return
fi fi
tg_edit "$chat_id" "$msg_id" "🔄 Перезапуск контейнера..." "" awg_discover_containers 2>/dev/null
docker restart "$CONTAINER" >/dev/null 2>&1; sleep 5 local result=""
if docker exec "$CONTAINER" sh -c "true" 2>/dev/null; then for cn in "${AWG_ALL_CONTAINERS[@]}"; do
tg_edit "$chat_id" "$msg_id" "✅ Контейнер перезапущен." "$(kbd_back)"; log_action "BOT AWG RESTART" tg_edit "$chat_id" "$msg_id" "🔄 Перезапуск ${cn}..." ""
else docker restart "$cn" >/dev/null 2>&1; sleep 5
tg_edit "$chat_id" "$msg_id" "⚠️ Контейнер не отвечает." "$(kbd_back)" if docker exec "$cn" sh -c "true" 2>/dev/null; then
fi ;; result+="${cn} перезапущен\n"
else
result+="⚠️ ${cn} не отвечает\n"
fi
done
tg_edit "$chat_id" "$msg_id" "🔄 <b>Перезапуск контейнеров</b>\n\n${result}" "$(kbd_back)"
log_action "BOT AWG RESTART: ${#AWG_ALL_CONTAINERS[@]} containers" ;;
sys) sys)
local s; s=$(get_system_stats) local s; s=$(get_system_stats)