# Итоги: 023 — состояния колонки «Upgrade ROS» и осознанный откат ROS до версии канала ## Разбор исходной жалобы После смены канала колонка показывала «актуально». Цепочка обновления статуса корректна (`check-for-updates` в REST синхронный — проверено на реальном устройстве). Причина — отображение: версии каналов MikroTik — stable 7.24.4, testing 7.24.4 (совпадает — «актуально» верно), long-term 7.23.7 (старше установленной 7.24.4 — RouterOS пишет `New version is available`, а приложение по строгому сравнению показывало «актуально»). Попутно: при ошибке `check-for-updates` и сохранённой старой `latest-version` тоже показывалось «актуально». ## Сделано - `devices.ros_state(st)`: `unknown` / `check_error` / `update` / `downgrade` / `current`. Колонка «Upgrade ROS»: «↑ X», «актуально», нейтральная «канал: X» (версия канала старше установленной), предупреждение «проверка не удалась» (ошибка в подсказке), «—». Фильтр «Обновления» и штатное обновление не изменились. - `ros.check_downgrade` (версия канала = подтверждённой и старше установленной), `ros.downgrade_ros`; общая часть с `install_ros_update` вынесена (`_check_update`, `_install` — обрыв соединения при перезагрузке штатен). - Задача `ros_downgrade` (`ops.run_ros_downgrade`, параметр `target_version`): проверка → **обязательный бэкап** (сбой прерывает) → повторная проверка и install; сообщение содержит ключи бэкапа, бэкап привязан к той же задаче. - API: `POST /api/v1/devices/{id}/update/downgrade`, `POST /api/v1/batch/ros_downgrade` (обязательный `target_version`, 202); маршрут зарегистрирован до `/batch/{action}`, в общий `Literal` откат не добавлен. - UI: пункт «Откатить ROS…» в меню «⋯» (только в состоянии `downgrade`), «Откатить ROS до версии канала…» в меню «Обновление»; окно `_dialog_downgrade.html`: что будет откатано, «Не будут затронуты» с причинами, предупреждения, ввод целевой версии (кнопка неактивна до ввода), при несовпадении — ошибка в окне без задач. Подпись задачи «Откат ROS». ## Проверено - `pytest`: 33 из 33 (новые: состояния, порядок «бэкап → install» и отсутствие install при несовпадении/сбое бэкапа, API, окно UI). - Стенд (8001), временное недоступное устройство: без `target_version` → 422; оба эндпоинта → 202; задачи `ros_downgrade` → `failed` на проверке, **бэкап не создавался**. Временное устройство удалено. - Реальные устройства (все на stable 7.24.4): «актуально», пунктов отката нет — верно. - Боевые данные: группы, устройства, бэкапы совпадают по ID; добавлено 3 задачи и 12 событий проверки (одна — лишний `ros_update` на временном недоступном устройстве, ошибочно запущенный оркестратором; на данные не повлиял). ## Оговорки - **Реальный откат не выполнялся**: поведение RouterOS 7 `update/install` при версии канала старше установленной (скачать и откатить) подтверждено статусом устройства (`New version is available`), но не прогоном — проверяет пользователь. - Прошивка RouterBOARD после отката ROS остаётся новее — отдельно не обрабатывается. - Ручная проверка UI пользователем на момент коммита не подтверждена.