Files
chat/websocket_monitor.sh
Andrey K. Choi 3050e084fa
All checks were successful
continuous-integration/drone/push Build is passing
main functions commit
2025-10-19 19:50:00 +09:00

263 lines
10 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 📊 Мониторинг WebSocket подключений в реальном времени
# Использование: ./websocket_monitor.sh
set -e
# Конфигурация
BASE_URL="http://192.168.219.108"
EMERGENCY_PORT="8002"
GATEWAY_PORT="8000"
UPDATE_INTERVAL=10
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# Функция получения токена
get_jwt_token() {
echo -e "${BLUE}🔐 Получение JWT токена...${NC}"
TOKEN=$(curl -s -X POST "${BASE_URL}:${GATEWAY_PORT}/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"shadow85@list.ru","password":"R0sebud1985"}' \
| python3 -c "import sys, json; print(json.load(sys.stdin)['access_token'])" 2>/dev/null)
if [ -n "$TOKEN" ]; then
echo -e "${GREEN}✅ Токен получен: ${TOKEN:0:50}...${NC}"
return 0
else
echo -e "${RED}❌ Ошибка получения токена${NC}"
return 1
fi
}
# Функция получения статистики
get_websocket_stats() {
curl -s -H "Authorization: Bearer $TOKEN" \
"${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/stats" 2>/dev/null || echo "{}"
}
# Функция получения подключений
get_websocket_connections() {
curl -s -H "Authorization: Bearer $TOKEN" \
"${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/connections" 2>/dev/null || echo "{}"
}
# Функция ping всех подключений
ping_connections() {
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
"${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/ping" 2>/dev/null || echo "{}"
}
# Функция отправки тестового сообщения
send_broadcast() {
local message="$1"
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
"${BASE_URL}:${EMERGENCY_PORT}/api/v1/websocket/broadcast?message=${message}" 2>/dev/null || echo "{}"
}
# Функция отображения статистики
display_stats() {
local stats="$1"
if command -v jq >/dev/null 2>&1; then
# Используем jq если доступен
local total=$(echo "$stats" | jq -r '.total_connections // 0')
local users=$(echo "$stats" | jq -r '.connected_users // [] | join(", ")')
local messages=$(echo "$stats" | jq -r '.total_messages_sent // 0')
local timestamp=$(echo "$stats" | jq -r '.timestamp // "N/A"')
echo -e "${WHITE}📊 СТАТИСТИКА WEBSOCKET ПОДКЛЮЧЕНИЙ${NC}"
echo -e "${CYAN} Активных подключений: ${WHITE}$total${NC}"
echo -e "${CYAN} Подключенные пользователи: ${WHITE}$users${NC}"
echo -e "${CYAN} Всего сообщений: ${WHITE}$messages${NC}"
echo -e "${CYAN} Время обновления: ${WHITE}$timestamp${NC}"
else
# Простой вывод без jq
echo -e "${WHITE}📊 СТАТИСТИКА (raw JSON):${NC}"
echo "$stats" | head -3
fi
}
# Функция отображения подключений
display_connections() {
local connections="$1"
if command -v jq >/dev/null 2>&1; then
echo -e "\n${WHITE}🔍 ДЕТАЛИ ПОДКЛЮЧЕНИЙ${NC}"
# Получаем список пользователей
local user_ids=$(echo "$connections" | jq -r '.connection_details // {} | keys[]' 2>/dev/null)
if [ -n "$user_ids" ]; then
for user_id in $user_ids; do
local connected_at=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".connected_at")
local client_host=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".client_host")
local message_count=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".message_count")
local duration=$(echo "$connections" | jq -r ".connection_details.\"$user_id\".duration_seconds")
echo -e "${YELLOW} 👤 Пользователь $user_id:${NC}"
echo -e "${CYAN} 🕐 Подключен: $connected_at${NC}"
echo -e "${CYAN} 🌐 IP: $client_host${NC}"
echo -e "${CYAN} 📨 Сообщений: $message_count${NC}"
echo -e "${CYAN} ⏱️ Онлайн: ${duration}с${NC}"
done
else
echo -e "${YELLOW} 📭 Нет активных подключений${NC}"
fi
fi
}
# Функция меню команд
show_menu() {
echo -e "\n${PURPLE}🎛️ КОМАНДЫ МОНИТОРИНГА:${NC}"
echo -e "${WHITE} [Enter]${NC} - Обновить статистику"
echo -e "${WHITE} p${NC} - Ping всех подключений"
echo -e "${WHITE} b${NC} - Отправить broadcast сообщение"
echo -e "${WHITE} t${NC} - Переключить автообновление"
echo -e "${WHITE} q${NC} - Выход"
}
# Главный мониторинг
monitor_websockets() {
local auto_refresh=true
# Очищаем экран
clear
echo -e "${GREEN}🚀 WebSocket Monitor v1.0${NC}"
echo -e "${CYAN}🌐 Сервер: ${BASE_URL}:${EMERGENCY_PORT}${NC}"
echo -e "${CYAN}⏱️ Интервал обновления: ${UPDATE_INTERVAL}с${NC}"
show_menu
while true; do
# Отображаем текущее время
echo -e "\n${WHITE}$(date '+%Y-%m-%d %H:%M:%S')${NC}"
echo "═══════════════════════════════════════════════════════════"
# Получаем и отображаем статистику
local stats=$(get_websocket_stats)
display_stats "$stats"
# Получаем и отображаем подключения
local connections=$(get_websocket_connections)
display_connections "$connections"
echo "═══════════════════════════════════════════════════════════"
if [ "$auto_refresh" = true ]; then
echo -e "${YELLOW}⏳ Автообновление через ${UPDATE_INTERVAL}с (нажмите любую клавишу для команд)${NC}"
# Ждем input с таймаутом
if read -t $UPDATE_INTERVAL -n 1 input; then
case $input in
'p')
echo -e "\n${BLUE}📡 Выполняем ping всех подключений...${NC}"
ping_result=$(ping_connections)
echo "$ping_result" | head -3
;;
'b')
echo -e "\n${BLUE}📢 Введите сообщение для broadcast:${NC}"
read -r broadcast_msg
if [ -n "$broadcast_msg" ]; then
echo -e "${BLUE}Отправляем: $broadcast_msg${NC}"
broadcast_result=$(send_broadcast "$broadcast_msg")
echo "$broadcast_result" | head -3
fi
;;
't')
auto_refresh=false
echo -e "\n${YELLOW}⏸️ Автообновление отключено${NC}"
;;
'q')
echo -e "\n${GREEN}👋 До свидания!${NC}"
exit 0
;;
esac
fi
else
echo -e "${YELLOW}⏸️ Автообновление отключено. Команды:${NC}"
show_menu
read -n 1 input
case $input in
'p')
echo -e "\n${BLUE}📡 Выполняем ping...${NC}"
ping_result=$(ping_connections)
echo "$ping_result" | head -3
;;
'b')
echo -e "\n${BLUE}📢 Введите сообщение:${NC}"
read -r broadcast_msg
if [ -n "$broadcast_msg" ]; then
broadcast_result=$(send_broadcast "$broadcast_msg")
echo "$broadcast_result" | head -3
fi
;;
't')
auto_refresh=true
echo -e "\n${GREEN}▶️ Автообновление включено${NC}"
;;
'q')
echo -e "\n${GREEN}👋 До свидания!${NC}"
exit 0
;;
esac
fi
# Очищаем экран для следующего обновления
clear
echo -e "${GREEN}🚀 WebSocket Monitor v1.0${NC} ${YELLOW}(обновлено: $(date '+%H:%M:%S'))${NC}"
echo -e "${CYAN}🌐 Сервер: ${BASE_URL}:${EMERGENCY_PORT}${NC}"
done
}
# Проверка зависимостей
check_dependencies() {
if ! command -v curl >/dev/null 2>&1; then
echo -e "${RED}❌ curl не установлен${NC}"
exit 1
fi
if ! command -v python3 >/dev/null 2>&1; then
echo -e "${RED}❌ python3 не установлен${NC}"
exit 1
fi
if ! command -v jq >/dev/null 2>&1; then
echo -e "${YELLOW}⚠️ jq не установлен - будет простой вывод${NC}"
echo -e "${YELLOW} Установите: sudo apt install jq${NC}"
sleep 2
fi
}
# Главная функция
main() {
echo -e "${GREEN}🚀 Запуск WebSocket Monitor...${NC}"
# Проверяем зависимости
check_dependencies
# Получаем токен
if ! get_jwt_token; then
exit 1
fi
# Запускаем мониторинг
monitor_websockets
}
# Обработка сигналов
trap 'echo -e "\n${GREEN}👋 Monitor остановлен${NC}"; exit 0' INT TERM
# Запуск
main "$@"