Control Server (FastAPI) с WEB UI (Jinja2 + HTMX) и JSON API для группового администрирования устройств RouterOS 7 через REST. - Устройства: список, статус (модель, канал, версии ROS/FW, uptime, доступные обновления), примечания, пароли шифруются (Fernet); фоновый опрос каждые 30 с и быстрое обнаружение недоступности (таймаут соединения 4 с). - Группы устройств и фильтры (устройства, резервные копии). - Резервные копии: .backup и .rsc (show-sensitive) создаются через REST, скачиваются сервером и загружаются в S3 (Yandex Object Storage). - Обновление ROS/FW и выбор канала, групповые операции задачами. - Интерфейс по утверждённому макету: светлая/тёмная темы, окна, шрифты IBM Plex локально. Docker Compose, SQLite в томе, минимальный набор тестов. - Планы и итоги каждого изменения — в docs/changes/. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
37 lines
5.1 KiB
Markdown
37 lines
5.1 KiB
Markdown
# Итоги: 006 — перенос утверждённого макета в UI и два бага
|
||
|
||
## Баги
|
||
1. **Прошивка не перезагружала устройство.** `upgrade_firmware` ждал `current-firmware == upgrade-firmware`, но `current-firmware`
|
||
меняется только после перезагрузки (на `OZ_Dacha`: `7.22.3` при `upgrade 7.24.4`, задача №12 упала по таймауту).
|
||
Теперь триггер — новая запись журнала «Firmware upgraded successfully, please reboot for changes to take effect!»
|
||
(журнал читается целиком и фильтруется на сервере: REST-фильтр `?message=` по точному тексту ничего не вернул).
|
||
Если запись новее последней загрузки (по `system/clock` − `uptime`) уже есть, то повторная команда не нужна — сразу перезагрузка.
|
||
2. **Нельзя привязать создаваемое устройство к группе.** Форма и маршрут работали, но групп в экземпляре не было (тестовые я удалил
|
||
после проверки), а создать группу из формы было нельзя. Теперь в окне устройства в списке «Группа» есть пункт «+ Новая группа…»:
|
||
группа создаётся и привязывается в одной транзакции (при ошибке лишней группы не остаётся). Если сценарий был другим — сообщить.
|
||
|
||
## Интерфейс (перенос макета)
|
||
- Дизайн-система в `app/ui/static/style.css`: токены и размеры макета 1:1 (контролы h36 r8, метки h22 r6, панели r12), тёмная тема на тех же токенах.
|
||
Шрифты IBM Plex Sans/Mono лежат локально (`static/fonts`, лицензия OFL) — внешний CDN не нужен.
|
||
- Страницы: «Устройства» (заголовок со счётчиками, вкладки групп, карточка с полосой «фильтры ⇄ действия над выбранными», таблица, задачи),
|
||
«Группы», «Резервные копии» (фильтры на `.field`, «Скачать» и «⋯» в строке), вход.
|
||
- Окна (`<dialog>` + HTMX): добавление/изменение устройства, создание/переименование группы; ошибки — внутри окна, успех — обновление страницы.
|
||
Запасные страницы `/devices/new`, `/devices/{id}/edit` сохранены.
|
||
- Логика выбора строк, меню, окон и фильтров — `static/app.js` (без библиотек, кроме htmx).
|
||
|
||
## Проверено
|
||
- `pytest`: 8 из 8 (добавлены: перезагрузка по записи журнала — оба сценария; добавление устройства из окна с группой и «новой группой», окна групп).
|
||
- Реальный браузер (headless Chromium): вход → окно «Новое устройство» → «Новая группа…» → вкладка «QA группа 1» → выбор строк и панель действий,
|
||
меню «Обновление / В группу», меню строки с подменю каналов, живой фильтр без перезагрузки и «Сбросить (N)», страницы «Группы» и «Бэкапы»;
|
||
ошибок JS/консоли нет; тестовые данные удалены (в БД остались `MSK_Home`, `OZ_Dacha`, групп нет).
|
||
- По скриншотам исправлены расхождения с макетом: пробел в «Выбрано: N», двойные границы карточек, «системная» за краем таблицы,
|
||
закрытие подменю каналов, склейка «Сбросить (N)», серые «—» у offline-устройства, знак «+» в списке групп.
|
||
|
||
## Не проверено
|
||
- Реальная перезагрузка по «Обновить FW» на `OZ_Dacha` — нужно подтверждение (перезагрузит роутер); логика проверена на моках и на реальном журнале (чтение).
|
||
- Соответствие макету на других размерах окна и в тёмной теме (проверялось при 1440 px в светлой).
|
||
|
||
## Отличия от макета
|
||
- Календарь в фильтре дат — нативный `<input type="date">`: формат зависит от локали браузера (в макете ISO).
|
||
- Фильтры вкладок и списков в приложении работают; в макете они статичны.
|