# Специфікація проєкту egui_pinger

## Призначення
Графічний інтерфейс для інструментів діагностики мережі (`ping`, `mtr`, `nslookup`, `traceroute` та ін.), розроблений для Windows та Linux. Проєкт має особливий акцент на виявленні та діагностиці проблем, що впливають на якість IP-телефонії (VoIP).

## Ключові функції
- **Мульти-хост моніторинг**: Одночасний пінг кількох серверів (стандартно: 1.1.1.1, 8.8.8.8 та SIP-сервер).
- **Розширена перевірка маршрутів**:
    - Використання ICMP.
    - Використання UDP (зокрема специфічних для SIP портів).
- **Діагностика DNS**: Перевірка роботи DNS-серверів.
- **Аналіз якості мережі**:
    - Моніторинг затримок (Latency).
    - Моніторинг тремтіння затримок (Jitter).
    - Виявлення проблем завантаження каналу через аналіз метрик.
- **Логування та архівування**:
    - Ведення журналу подій.
    - Архів логів з автоматичним "укрупненням" (агрегацією) старих даних для економії місця.
- **Режими роботи та затримки**:
    - Для уникнення можливості розшифрування трафіку через виявлення автоматичних пінгів (pattern analysis), затримки між запитами мають бути випадковими в певних межах (наприклад, 2 с ±0.3 с).
    - **Швидкий режим**: Висока частота опитування для швидкого виловлювання плаваючих проблем ("злову" моменту деградації). Типова затримка — 2 с для всіх сервісів.
    - **Повільний режим**: Фоновий моніторинг для загальної перевірки стану мережі.
        - Для віддалених сервісів: від 1 хв до 5 хв.
        - Для внутрішніх сервісів у локальній мережі: 2 с.
- **Автоматична діагностика**:
    - При виявленні проблеми програма автоматично запускає комплекс діагностичних інструментів.
    - Генерація та збереження детального звіту про інцидент.
- **Режим зупинки (Stop mode)**: можливість вимкнути моніторинг для окремого хоста. При зупинці всі накопичені дані (статистика, графік, внутрішній журнал) миттєво видаляються для забезпечення «чистого старту» при наступному запуску.

## Статистичний аналіз та візуалізація
Серцем розрахунку більшості мережевих метрик є концепція **«ковзного вікна» на 300 останніх запитів (Ping History)**. 
Цей підхід гарантує, що програма відображає *актуальний* стан мережі, а не тягне за собою «шлейф» проблем, які сталися кілька годин або днів тому. 

- **Ковзне вікно (Sliding Window)**: Зберігає результати RTT (Round Trip Time) лише для останніх 300 пінгів. Коли приходить 301-й пінг, найстаріший (1-й) видаляється. Усі метрики якості зв'язку опираються саме на цей масив даних.
- **Втрати пакетів (Глобальна статистика)**: Метрики `Sent` (відправлено) та `Lost` (втрачено) є **глобальними лічильниками**. Вони накопичуються впродовж всього часу роботи програми і ніколи не скидаються. Це дозволяє користувачу знати точну кількість втрачених за день пакунків.
- **Доступність (Availability %)**: На відміну від глобальних втрат, доступність рахується **виключно в межах ковзного вікна 300 пінгів**. Вона показує відсоток успішних доставок серед останніх 300 відправлень. Завдяки цьому, якщо годинами раніше був обрив мережі (глобальні втрати зросли), але зараз усе працює ідеально, доступність швидко відновиться до 100%.

### Детальні метрики латентності 
*Усі нижченаведені метрики рахуються лише для успішних пакетів всередині вікна 300 пінгів:*
- **Mean (Середнє арифметичне)**: Сума всіх RTT з вікна, поділена на кількість успішних діставок.
- **Median (Медіана)**: Значення затримки, яке знаходиться рівно посередині відсортованого за зростанням масиву поточних 300 пінгів. Фільтрує одиничні впливи екстремальних пікових затримок.
- **Min / Max**: Абсолютний мінімум та максимум затримки, зафіксовані серед останніх 300 зразків.
- **P95 (95-й перцентиль)**: Ключовий показник стабільності з'єднання (особливо для геймерів чи VoIP). Відображає поріг затримки, в межі якого вкладаються 95% успішних пінгів. Він відтинає топ-5% найбільших аномалій.
- **StdDev (Стандартне відхилення)**: Демонструє наскільки стабільний пінг (наскільки сильно він "скаче" навколо середнього значення). 

### Метрики тремтіння (Jitter) та якості (MOS)
- **Аномалії (Outliers)**: Пінги, затримка яких перевищує поріг `Mean + 3 * StdDev`. Підраховуються лише в межах ковзного вікна і автоматично "пробачаються" та скидаються, коли виходять за рамки останніх 300 зразків.
- **RTP Jitter (RFC 3550)**: Розраховується ітеративно за спеціальною формулою згладжування, прийнятою у IP-телефонії: `J = J + (|D| - J) / 16`, де `D` — це різниця між RTT поточного і попереднього пакета. Його історія також зберігається у власному 300-елементному ковзному вікні (з якого вираховуються Jitter Mean та Jitter Median).
- **MOS (Mean Opinion Score)**: Синтетична оцінка якості голосу для VoIP (за шкалою від 1.0 «Дуже погано» до 4.5 «Ідеально»). Для її розрахунку беруться:
  1. `Mean RTT` (Середня затримка).
  2. `RTP Jitter` (Тремтіння).
  3. **Відсоток втрат з ковзного вікна** (`100.0 - Availability`).
  *Важливо:* MOS не залежить від глобальних лічильників втрат, тому при стабілізації мережі оцінка швидко відновлюється до високих показників.

## Журнал подій (Log) та збереження
Програма має вбудований журнал (до 100 000 записів у пам'яті для кожного хоста), що забезпечує глибоку діагностику мережі постфактум. Усі події журналу прив'язані до точних часових міток.

- **Події та їх тип**:
  1. **Ping**: Звичайні успішні відповіді.
  2. **Timeout**: Повідомлення про втрачені пакети (обриви).
  3. **Route**: Зміни маршрутів або статусу фінального хоста ("Зв'язок відновлено").
  4. **Incident**: Системні розслідування (Traceroute hop-by-hop), деталі обривів магістралей.
  5. **Statistics**: Кожні 300 пінгів (одне повне ковзне вікно) до журналу скидається "знімок" поточної повної статистики, що дозволяє потім будувати графіки деградації мережі з часом.
- **Файл журналу**: Записи можуть автоматично дописуватися в текстовий файл (опція Append to file). При старті програми та активації цієї опції логується маркер `Журнал почато: дата та час`, а при штатному завершенні роботи — маркер `Журнал закінчено`. Це допомагає розмежовувати різні сесії моніторингу в одному довгому файлі логів.

## Трасування маршруту (Traceroute) та діагностика обривів
Вбудований Traceroute розкриває "чорний ящик" маршрутизації шляхом покрокового опитування вузлів між користувачем і фінальним сервером.

- **Двосторонній парсинг**: Програма запускає нативні утиліти (`traceroute` на Linux, `tracert` на Windows) у фонових потоках (`tokio::spawn`) і розбирає їхній синтаксис (включно зі складними форматами виводу, локалізованими Windows, та повною підтримкою IPv6 довгих адрес).
- **Точка відмови (Failure Deduction)**: При зникненні пінгу до фінального хосту, програма має алгоритм "Hop-by-Hop" діагностики. Вона порівнює останній відомий успішний `traceroute` маршрут з поточним станом. Якщо пакети далі якогось провайдерського роутера не йдуть, програма записує його як `failure_point`.
- **"Dependent targets" (Залежні інциденти)**: Якщо кілька сервісів перестали пінгуватися одночасно, програма виявляє, де стався розрив. Якщо обрив стався на вашому локальному шлюзі (1-й hop), це не проблема хмарного сервісу, а локальна проблема мережі, про що свідчитиме спільний згенерований інцидент.

## Системні інструменти (System Tools)
Вбудоване вікно для запуску стандартних мережевих діагностичних команд прямо з графічного інтерфейсу без потреби відкривати термінал.

- **Статичний набір команд**: Безпечний фіксований список команд для Linux (`ip`, `ss`, `dig`, `nmcli`, `journalctl`) та Windows (`ipconfig`, `netstat`, `nslookup`, `netsh`). Жодна команда не потребує прав адміністратора.
- **Покроковий довідник**: Вкладка «Guide» зі структурованими сценаріями діагностики: «Інтернет не працює», «Обриви з'єднання», «Повільний інтернет», «DNS не працює». Кожен сценарій вказує конкретну команду для запуску та на що звернути увагу у виводі.
- **Опис перед запуском**: Під комбобоксом вибору команди завжди відображається детальний опис того, що робить обрана команда та що шукати у виводі.
- **Неблокуючий запуск**: Команди виконуються у фоновому потоці, щоб не «замерзав» інтерфейс. У полі виводу першим рядком показується повна команда (`$ ip -c addr`) для зручного копіювання в термінал.
- **Повна локалізація**: Усі назви команд, описи та текст довідника перекладені українською мовою.

## Консольна утиліта: `mos`
Крім графічного інтерфейсу, проєкт містить легку та швидку консольну утиліту `mos`, призначену для обробки виводу стандартної команди `ping` через конвеєр (pipe). 

- **Робота через Pipe**: дозволяє отримувати розширену статистику (Mean, Median, P95, RTP Jitter, Availability, Loss, MOS) в реальному часі, просто передаючи вивід системної команди `ping` до `mos`.
- **Ковзне вікно (Sliding Window)**: як і основна програма, утиліта використовує концепцію ковзного вікна (за замовчуванням 300 зразків) для розрахунку метрик.
- **Гнучкість налаштування**: користувач може вибирати, які саме метрики відображати, та змінювати розмір вікна через аргументи командного рядка.
- **Нуль залежностей**: утиліта скомпільована як статичний бінарний файл без зовнішніх залежностей, що робить її ідеальною для використання на серверах або у скриптах.


## Технологічний стек
- **Мова програмування**: Rust.
- **UI фреймворк**: egui.
- **Цільові ОС**: Linux, Windows.

## Мовна політика
- **Інтерфейс програми**: Англійська.
- **README**: Англійська.
- **Документація та специфікація**: Українська.
- **TODO та плани**: Українська.
