All checks were successful
continuous-integration/drone/push Build is passing
263 lines
10 KiB
Bash
Executable File
263 lines
10 KiB
Bash
Executable File
#!/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 "$@" |