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>
5.1 KiB
5.1 KiB
Итоги: 006 — перенос утверждённого макета в UI и два бага
Баги
- Прошивка не перезагружала устройство.
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) уже есть, то повторная команда не нужна — сразу перезагрузка. - Нельзя привязать создаваемое устройство к группе. Форма и маршрут работали, но групп в экземпляре не было (тестовые я удалил после проверки), а создать группу из формы было нельзя. Теперь в окне устройства в списке «Группа» есть пункт «+ Новая группа…»: группа создаётся и привязывается в одной транзакции (при ошибке лишней группы не остаётся). Если сценарий был другим — сообщить.
Интерфейс (перенос макета)
- Дизайн-система в
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). - Фильтры вкладок и списков в приложении работают; в макете они статичны.