main functions commit
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-10-19 19:50:00 +09:00
parent ce72785184
commit 3050e084fa
39 changed files with 7149 additions and 186 deletions

263
websocket_monitor.sh Executable file
View File

@@ -0,0 +1,263 @@
#!/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 "$@"