All checks were successful
continuous-integration/drone/push Build is passing
181 lines
7.3 KiB
Python
181 lines
7.3 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Простая утилита для проверки WebSocket подключений
|
||
"""
|
||
|
||
import requests
|
||
import json
|
||
import sys
|
||
from datetime import datetime
|
||
|
||
# Конфигурация
|
||
BASE_URL = "http://192.168.219.108"
|
||
EMERGENCY_PORT = "8002"
|
||
|
||
# Тестовые данные для авторизации
|
||
TEST_EMAIL = "shadow85@list.ru"
|
||
TEST_PASSWORD = "R0sebud1985"
|
||
|
||
|
||
def get_auth_token():
|
||
"""Получить токен авторизации"""
|
||
try:
|
||
response = requests.post(
|
||
f"{BASE_URL}:8000/api/v1/auth/login",
|
||
json={"email": TEST_EMAIL, "password": TEST_PASSWORD}
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
token = response.json()["access_token"]
|
||
print(f"✅ Авторизация успешна")
|
||
return token
|
||
else:
|
||
print(f"❌ Ошибка авторизации: {response.status_code}")
|
||
print(f" Ответ: {response.text}")
|
||
return None
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка подключения: {e}")
|
||
return None
|
||
|
||
|
||
def check_websocket_connections(token):
|
||
"""Проверить WebSocket подключения"""
|
||
print("\n" + "="*60)
|
||
print("📊 СТАТИСТИКА WEBSOCKET ПОДКЛЮЧЕНИЙ")
|
||
print("="*60)
|
||
|
||
try:
|
||
# Общая статистика
|
||
stats_response = requests.get(
|
||
f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/stats",
|
||
headers={"Authorization": f"Bearer {token}"}
|
||
)
|
||
|
||
if stats_response.status_code == 200:
|
||
stats = stats_response.json()
|
||
print(f"🔢 Всего активных подключений: {stats.get('total_connections', 0)}")
|
||
print(f"📨 Сообщений отправлено: {stats.get('total_messages_sent', 0)}")
|
||
print(f"👥 Подключенные пользователи: {stats.get('connected_users', [])}")
|
||
print(f"⏰ Время проверки: {stats.get('timestamp', 'N/A')}")
|
||
else:
|
||
print(f"❌ Ошибка получения статистики: {stats_response.status_code}")
|
||
return
|
||
|
||
# Детальная информация о подключениях
|
||
connections_response = requests.get(
|
||
f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/connections",
|
||
headers={"Authorization": f"Bearer {token}"}
|
||
)
|
||
|
||
if connections_response.status_code == 200:
|
||
connections = connections_response.json()
|
||
|
||
if connections.get('connection_details'):
|
||
print("\n" + "="*60)
|
||
print("🔍 ДЕТАЛИ ПОДКЛЮЧЕНИЙ")
|
||
print("="*60)
|
||
|
||
for user_id, details in connections['connection_details'].items():
|
||
print(f"\n👤 Пользователь {user_id}:")
|
||
print(f" 🕐 Подключен: {details.get('connected_at', 'N/A')}")
|
||
print(f" 🌐 IP адрес: {details.get('client_host', 'N/A')}")
|
||
print(f" 🔌 Порт: {details.get('client_port', 'N/A')}")
|
||
print(f" 📤 Сообщений: {details.get('message_count', 0)}")
|
||
print(f" ⏱️ Время онлайн: {details.get('duration_seconds', 0)} сек")
|
||
print(f" 💓 Последний пинг: {details.get('last_ping', 'N/A')}")
|
||
print(f" ✅ Статус: {details.get('status', 'unknown')}")
|
||
else:
|
||
print("\n📭 Нет активных WebSocket подключений")
|
||
else:
|
||
print(f"❌ Ошибка получения деталей: {connections_response.status_code}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка проверки: {e}")
|
||
|
||
|
||
def ping_all_connections(token):
|
||
"""Пинг всех подключений"""
|
||
print("\n" + "="*60)
|
||
print("📡 ПРОВЕРКА ВСЕХ ПОДКЛЮЧЕНИЙ (PING)")
|
||
print("="*60)
|
||
|
||
try:
|
||
response = requests.post(
|
||
f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/ping",
|
||
headers={"Authorization": f"Bearer {token}"}
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print(f"✅ Пинг выполнен успешно")
|
||
print(f"📊 Активных подключений: {result.get('active_connections', 0)}")
|
||
print(f"❌ Отключенных пользователей: {result.get('disconnected_users', [])}")
|
||
print(f"⏰ Время пинга: {result.get('ping_time', 'N/A')}")
|
||
|
||
if result.get('disconnected_users'):
|
||
print("⚠️ Обнаружены неактивные подключения:")
|
||
for user_id in result['disconnected_users']:
|
||
print(f" - Пользователь {user_id}")
|
||
else:
|
||
print(f"❌ Ошибка пинга: {response.status_code}")
|
||
print(f" Ответ: {response.text}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка пинга: {e}")
|
||
|
||
|
||
def send_test_broadcast(token):
|
||
"""Отправить тестовое сообщение"""
|
||
print("\n" + "="*60)
|
||
print("📢 ОТПРАВКА ТЕСТОВОГО СООБЩЕНИЯ")
|
||
print("="*60)
|
||
|
||
test_message = f"Тестовое сообщение от {datetime.now().strftime('%H:%M:%S')}"
|
||
|
||
try:
|
||
response = requests.post(
|
||
f"{BASE_URL}:{EMERGENCY_PORT}/api/v1/websocket/broadcast",
|
||
params={"message": test_message},
|
||
headers={"Authorization": f"Bearer {token}"}
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print(f"✅ Сообщение отправлено: '{test_message}'")
|
||
print(f"👥 Получатели: {result.get('recipients', [])}")
|
||
print(f"📝 Данные сообщения: {json.dumps(result.get('data', {}), indent=2, ensure_ascii=False)}")
|
||
else:
|
||
print(f"❌ Ошибка отправки: {response.status_code}")
|
||
print(f" Ответ: {response.text}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Ошибка отправки: {e}")
|
||
|
||
|
||
def main():
|
||
"""Главная функция"""
|
||
print("🚀 WebSocket Connection Monitor v1.0")
|
||
print(f"🌐 Сервер: {BASE_URL}:{EMERGENCY_PORT}")
|
||
print(f"👤 Тестовый пользователь: {TEST_EMAIL}")
|
||
|
||
# Получаем токен
|
||
token = get_auth_token()
|
||
if not token:
|
||
print("❌ Не удалось получить токен авторизации")
|
||
sys.exit(1)
|
||
|
||
# Выполняем проверки
|
||
check_websocket_connections(token)
|
||
ping_all_connections(token)
|
||
send_test_broadcast(token)
|
||
|
||
print("\n" + "="*60)
|
||
print("✅ ПРОВЕРКА ЗАВЕРШЕНА")
|
||
print("="*60)
|
||
print("💡 Для постоянного мониторинга запускайте этот скрипт периодически")
|
||
print("💡 Или используйте test_websocket_monitoring.py для полного тестирования")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |