#!/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 "$@"