Раздел: Security & Network
Идентификатор:netdiag· Экран:ui/network/NetworkDiagnosticsScreen.kt(578) +NetworkDiagnosticsViewModel.kt(476)
Снимок: 2026-10-11
1. Зачем и что это
Проверки выполняет backend (у него есть shell-инструменты), приложение только показывает результат. Это важно: часть проверок (ping, traceroute, SSL) требует инструментов, которых в Android-приложении нет.
2. Как попасть
Хаб инструментов → секция Security & Network → карточка «Диагностика сети» (hub_netdiag_title, подпись «Ping, DNS, TLS, эндпоинты и маршруты», тайл — «Сеть»).
| Откуда ещё | Путь |
|---|---|
| Мост | app_navigate с screen: "netdiag" |
Маршрут: Screen.kt → MainRouter (NetworkDiagnosticsScreen).
3. Экран: элементы и действия
| Элемент | Что делает | Где в коде |
|---|---|---|
| Шапка | Заголовок и кнопки управления | NetworkDiagnosticsScreen:86 |
SummaryCard | Сводка: сколько проверок ок, сколько с ошибкой | SummaryCard |
| Карточки секций | sectionItem с состоянием загрузки/ошибки и повтором | retrySection(name) |
NetworkStatusContent | Тип сети, внешний/локальный IP, наличие интернета | NetNetworkInfo |
DNSItem | Хост, IP-адреса, задержка | NetDNSResult |
EndpointItem | URL, код статуса, заголовки, задержка | NetEndpointResult |
PingItem | min/avg/max, потери | NetPingResult |
SSLItem | Issuer, CN, SAN, срок действия, дней осталось | NetSSLResult |
TracerouteHopItem | Номер хопа, хост, задержка, таймаут | NetTracerouteHop |
ConnectionItem | Протокол, локальный адрес, пир, состояние | NetConnectionInfo |
HealthContent | Задержка и статус健康 backend | NetHealthResult |
HostsCard | Свой список хостов + кнопка Add | addHost / removeHost |
| Диалог Add Host | Ввод своего хоста | AddHostDialog |
| Кнопка копирования | Все результаты текстом в буфер | copyResults |
| Тумблер автообновления | Перезапуск всех проверок каждые 30 с | toggleAutoRefresh |
4. Возможности подробно
Восемь секций
| Секция | Что проверяет | Поля результата |
|---|---|---|
| network | Тип сети, локальный и внешний IP, доступен ли интернет | type, localIp, externalIp, internet |
| dns | Резолв хостов | host, ips, latencyMs, ok |
| endpoint | HTTP-эндпоинты | url, status, latencyMs, headers, ok |
| ping | Доступность и задержки | minMs, avgMs, maxMs, loss, ok |
| ssl | Сертификаты | issuer, cn, sans, expires, daysLeft |
| traceroute | Маршрут по хопам | hop, host, latencyMs, isTimeout |
| connections | Текущие соединения | proto, local, peer, state |
| health | Живость backend | latencyMs, ok |
Каждая секция хранится в своём SectionState<T>: data, loading, error, loadedAt. Поэтому секции не мешают друг другу: упавшая проверка не стирает результаты соседних, а у каждой есть своя кнопка повтора.
Запуск
runAll() прогоняет всё сразу; runNetwork(), runDns(), runEndpoints(), runPing(), runSsl(), runTraceroute(), runConnections(), runHealth() — по отдельности. Все запросы идут на backend: baseUrl(path) строит адрес {backend}/api/v1/diagnostics/{path}.
Автообновление
toggleAutoRefresh() запускает цикл с delay(30_000) и повторяет runAll(). Выключение отменяет задачу. Так сеть проверяется непрерывно, без ручного обновления.
Свои хосты
addHost нормализует хост (trim, lowercase) и не добавляет дубли; removeHost убирает. Свои хосты попадают в DNS, ping и traceroute вместе с дефолтными — так можно проверить конкретный проблемный домен.
Копирование результатов
copyResults() собирает текстовый отчёт со всеми секциями (с временем запуска в формате yyyy-MM-dd HH:mm:ss) и кладёт в буфер — удобно приложить к багу или передать агенту для анализа.
5. Данные: БД, файлы, настройки
| Что | Где лежит | Как меняется | Кто читает |
|---|---|---|---|
| Результаты проверок | Только в состоянии VM | run* | Экран |
| Список своих хостов | В состоянии VM (customHosts) | addHost / removeHost | DNS/ping/traceroute |
Постоянного хранилища нет: после перезапуска экрана проверки выполняются заново.
6. Backend: REST/роуты
| Метод и путь | Назначение | Обработчик |
|---|---|---|
GET /api/v1/diagnostics/network | тип сети, IP, интернет | dg.Network |
GET /api/v1/diagnostics/dns | резолв хостов | dg.DNS |
GET /api/v1/diagnostics/endpoint | проверка HTTP-эндпоинтов | dg.Endpoint |
GET /api/v1/diagnostics/ping | ping | dg.Ping |
GET /api/v1/diagnostics/ssl | сертификаты | dg.SSL |
GET /api/v1/diagnostics/traceroute | трассировка маршрута | dg.Traceroute |
GET /api/v1/diagnostics/connections | текущие соединения | dg.Connections |
POST /api/v1/diagnostics/run-all | все проверки сразу | dg.RunAll |
GET /api/v1/diagnostics/health | живость backend | dg.Health |
Роуты: backend/internal/api/v1/routes.go:375–383, обработчики — backend/internal/handlers/diagnostics.
7. Мост и MCP
| Что | Как | Примечание |
|---|---|---|
| Открыть экран | app_navigate с screen: "netdiag" | BridgeScreenCatalog |
Отдельных MCP-тулов для диагностики сети нет, но агент может вызвать те же REST- эндпоинты backend напрямую.
8. Настройки, конфиг, квоты и лимиты
| Параметр | Значение | Где задаётся |
|---|---|---|
| Интервал автообновления | 30 секунд | toggleAutoRefresh |
| Число секций | 8 | DiagnosticsUiState |
| Формат времени отчёта | yyyy-MM-dd HH:mm:ss | copyResults |
9. Ловушки и ограничения
- Проверки идут с телефона, а не через VPN backend. Backend не использует VPN-туннель устройства, поэтому результат отражает связь самого сервера, а не устройства через VPN.
- Ping и traceroute требуют системных утилит. На backend они есть; в приложении их нет, поэтому раздел живёт именно там.
- Ошибка одной секции не рушит остальные. Секции изолированы в
SectionState, так что можно читать частичный результат. - SSL-проверка показывает
daysLeft— удобно ловить скоро истекающие сертификаты. - Traceroute может долго идти. Пропуски хопов отмечаются
isTimeout— это нормально, а не обрыв. - Автообновление каждые 30 секунд создаёт постоянную нагрузку на backend; при проблемах с сетью разумнее выключить.
- Свои хосты живут только в текущей сессии экрана — после перезапуска их нужно добавить заново.
- Все строки захардкожены по-английски — экран не локализован.
10. Источники правды
app/src/main/java/com/y83/ws/ui/network/NetworkDiagnosticsScreen.kt— экран, карточки секций.app/src/main/java/com/y83/ws/ui/network/NetworkDiagnosticsViewModel.kt— модели, запросы, автообновление.backend/internal/handlers/diagnostics/— выполнение проверок.backend/internal/api/v1/routes.go:375–383— роуты.