Files
ayurishchevandClaude Sonnet 5 4c1841b61b ros_control: централизованное управление парком MikroTik RouterOS
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>
2026-09-19 13:13:29 +03:00

5.1 KiB
Raw Permalink Blame History

Итоги: 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).
  • Фильтры вкладок и списков в приложении работают; в макете они статичны.