# OpenWrt RMM Checklist Практический чеклист разработки. Он дополняет `ROADMAP.md`: roadmap описывает направление, а этот файл фиксирует, что уже сделано, что делаем следующим и что считается готовностью этапов. ## Статусы - `[x]` - сделано и проверено. - `[~]` - частично сделано, требует доработки. - `[ ]` - не начато. ## Текущий фокус - [x] Первый вертикальный сценарий: enrollment -> heartbeat -> command queue -> command result. - [x] Сервер на Go. - [x] SQLite storage для MVP. - [x] Shell-agent для OpenWrt. - [x] HTTP polling вместо постоянного соединения. - [x] Operator bearer token для MVP. - [~] Command lifecycle: timeout, retry, history. - [x] OpenWrt package skeleton. - [~] Минимальный web UI. ## Этап 0: Подготовка проекта - [x] Выбрать backend stack: Go. - [x] Выбрать storage для MVP: SQLite. - [x] Выбрать agent transport: outbound HTTP polling. - [x] Выбрать agent MVP format: POSIX shell. - [x] Создать базовую структуру репозитория. - [x] Создать `ROADMAP.md`. - [x] Создать документацию: - [x] `docs/architecture.md` - [x] `docs/api.md` - [x] `docs/openwrt.md` - [~] Зафиксировать минимальные версии OpenWrt. - [ ] Создать `docs/security.md`. - [ ] Описать threat model. - [ ] Описать release/versioning policy. ## Этап 1: MVP Agent - [x] Создать shell-agent. - [x] Добавить конфигурационный файл агента через `/etc/rmm-agent.conf`. - [x] Реализовать enrollment по shared token. - [x] Сохранять `DEVICE_ID` и `DEVICE_TOKEN`. - [x] Реализовать heartbeat. - [x] Отправлять inventory: - [x] hostname; - [x] OpenWrt version; - [x] `ubus call system board`; - [x] network interfaces; - [x] default route. - [x] Отправлять metrics: - [x] `ubus call system info`; - [x] `/proc/loadavg`; - [x] `/proc/uptime`. - [~] Добавить расширенный сбор метрик: - [ ] memory usage в нормализованном виде; - [ ] disk usage; - [ ] WAN IP; - [ ] DHCP leases; - [ ] Wi-Fi clients; - [ ] interface counters/errors. - [x] Реализовать polling команд. - [x] Реализовать отправку результата команды. - [x] Добавить allowlist команд на агенте: - [x] `ping`; - [x] `traceroute`; - [x] `reboot`; - [x] `service_restart`; - [x] `opkg_list_installed`. - [x] Добавить OpenWrt procd init script. - [x] Добавить локальный буфер событий/результатов при потере связи. - [x] Добавить backoff при сетевых ошибках. - [x] Добавить lock-файл, чтобы не запускать несколько копий агента. - [ ] Добавить shell syntax check в CI/dev scripts. ## Этап 2: MVP Server API - [x] Создать Go module. - [x] Реализовать HTTP server. - [x] Реализовать SQLite migrations. - [x] Реализовать device enrollment. - [x] Реализовать per-device bearer token. - [x] Реализовать heartbeat endpoint. - [x] Хранить текущее состояние устройства. - [x] Реализовать command queue. - [x] Реализовать shell-friendly `commands/next`. - [x] Реализовать command result endpoint. - [x] Реализовать device list endpoint. - [x] Реализовать device detail endpoint. - [x] Реализовать create command endpoint. - [x] Добавить allowlist команд на сервере. - [x] Добавить operator bearer token: - [x] `RMM_OPERATOR_TOKEN`; - [x] защита `/api/devices`; - [x] защита `/api/devices/{id}`; - [x] защита `/api/devices/{id}/commands`. - [x] Разнести сервер по пакетам: - [x] `server/cmd/rmm-server`; - [x] `server/internal/httpapi`; - [x] `server/internal/store`; - [x] `server/internal/model`. - [x] Добавить API smoke test. - [x] Проверить `go build ./server/cmd/rmm-server`. - [x] Проверить `go test ./...`. - [x] Добавить endpoint истории команд: `GET /api/devices/{id}/commands`. - [x] Добавить command detail endpoint. - [x] Добавить timeout для `claimed` команд. - [x] Добавить повторную выдачу зависших команд. - [x] Добавить статус `cancelled`. - [x] Добавить отмену команды. - [x] Добавить basic audit log. - [ ] Добавить request id. - [ ] Добавить structured logging. - [ ] Добавить graceful shutdown. ## Этап 3: MVP Web UI - [ ] Выбрать frontend stack. - [x] Создать `web/`. - [~] Добавить настройку API base URL. - [x] Добавить ввод/хранение operator token для MVP. - [x] Реализовать список устройств. - [x] Показать online/offline. - [x] Реализовать карточку устройства. - [x] Показать inventory. - [x] Показать metrics. - [x] Показать network interfaces. - [x] Реализовать запуск команды `ping`. - [x] Реализовать запуск команды `traceroute`. - [x] Показать историю команд. - [x] Показать результат команды. - [x] Добавить basic error states. - [x] Добавить loading states. - [x] Проверить UI в браузере. ## Этап 4: Command Lifecycle - [x] Добавить поля/индексы для lifecycle, если текущей схемы недостаточно. - [x] Определить таймаут `claimed` команд. - [x] Вернуть зависшие `claimed` команды в `queued` или `expired`. - [ ] Добавить `expires_at`. - [x] Добавить `attempt_count`. - [ ] Добавить `max_attempts`. - [x] Добавить `cancelled`. - [x] Добавить endpoint отмены команды. - [x] Добавить command history per device. - [x] Покрыть lifecycle тестами. - [x] Обновить `docs/api.md`. ## Этап 5: OpenWrt Package - [x] Создать `agent/package/Makefile`. - [x] Описать package metadata. - [x] Установить `/usr/bin/rmm-agent`. - [x] Установить `/etc/init.d/rmm-agent`. - [x] Добавить default config. - [ ] Решить формат конфигурации: - [x] `/etc/rmm-agent.conf`; - [ ] `/etc/config/rmm-agent`. - [ ] Добавить postinst/prerm scripts. - [ ] Проверить установку на OpenWrt. - [x] Описать build/install flow в `docs/openwrt.md`. ## Этап 6: Security Hardening - [x] Shared enrollment token для MVP. - [x] Per-device bearer token. - [x] Operator bearer token для MVP. - [x] Allowlist команд на сервере. - [x] Allowlist команд на агенте. - [x] Redaction sensitive command output. - [~] Audit log для operator actions. - [ ] Audit log для agent actions. - [ ] Token rotation для устройств. - [ ] Secure enrollment flow вместо постоянного shared token. - [ ] Hash device tokens в базе. - [ ] Rate limits. - [ ] Replay protection. - [ ] Command signatures. - [ ] RBAC. - [ ] Organization isolation. - [ ] mTLS или signed device tokens. ## Этап 7: OpenWrt Configuration Management - [~] Спроектировать safe UCI operation model. - [x] Добавить read-only UCI inventory command. - [x] Добавить backup текущей конфигурации. - [~] Добавить preview diff. - [~] Добавить apply/commit/revert workflow. - [x] Добавить restore из последнего локального backup. - [x] Добавить commit with connectivity confirmation. - [~] Управление Wi-Fi SSID. - [ ] Управление firewall rules. - [~] Управление DHCP. - [ ] Управление static routes. - [ ] Тесты на недопустимые изменения. ## Этап 8: Monitoring And Alerts - [x] Online/offline detection на основе `last_seen_at`. - [~] Базовые system metrics через heartbeat. - [ ] История heartbeat. - [ ] Хранение временных рядов метрик. - [ ] WAN status. - [ ] Packet loss checks. - [ ] Latency checks. - [ ] Alert rules. - [ ] Alert state. - [ ] Email notification. - [ ] Telegram notification. - [ ] Webhook notification. ## Этап 9: Remote Access - [ ] Спроектировать reverse tunnel. - [ ] Выбрать транспорт tunnel. - [ ] Временный SSH-доступ через сервер. - [ ] Browser-based terminal. - [ ] TCP port forwarding. - [ ] Доступ к LuCI через tunnel. - [ ] Ограничение доступа по времени. - [ ] Audit events для remote sessions. ## Этап 10: Packages And Updates - [x] Команда `opkg_list_installed`. - [ ] Нормализованный список установленных пакетов. - [ ] `opkg update`. - [ ] Проверка доступных обновлений. - [ ] Установка пакета. - [ ] Удаление пакета. - [ ] История изменений пакетов. - [ ] Защита опасных операций подтверждением. - [ ] Совместимость с конкретными версиями OpenWrt. ## Этап 11: Fleet Management - [ ] Группы устройств. - [ ] Теги. - [ ] Поиск и фильтры. - [ ] Массовые команды. - [ ] Rollout limits. - [ ] Canary-группы. - [ ] Политики. - [ ] Шаблоны конфигурации. - [ ] Отчет о применении изменений. ## Этап 12: Production Hardening - [ ] Structured logging. - [ ] Server metrics. - [ ] Health checks глубже, чем `/healthz`. - [ ] DB backup/restore. - [ ] Версионированные миграции. - [ ] Graceful shutdown. - [ ] Retry policies. - [ ] E2E tests agent-server. - [ ] Load tests. - [ ] CI pipeline. - [ ] Release artifacts. - [ ] OpenWrt package build automation. ## Definition Of Done: MVP - [x] Agent enrollment работает. - [x] Heartbeat работает. - [x] Basic inventory передается. - [x] Device list API работает. - [x] Device detail API работает. - [x] Command queue работает. - [x] Command result работает. - [x] Allowlist команд есть на сервере и агенте. - [x] Offline detection есть на server API. - [x] Basic audit log. - [x] Web UI показывает устройство online. - [x] OpenWrt package устанавливает агент как service. - [ ] MVP проверен на реальном OpenWrt-устройстве. ## Ближайшие задачи 1. [ ] Собрать `rmm-agent.ipk` в OpenWrt buildroot. 2. [ ] Проверить агента на реальном OpenWrt. 3. [x] Создать минимальный web UI. 4. [ ] Добавить расширенные metrics/inventory. 5. [ ] Добавить `max_attempts` и более явный command expiry. 6. [x] Начать UCI managed configuration. 7. [x] Добавить UCI backup command. 8. [x] Добавить UCI preview command. 9. [x] Добавить UCI presets в UI. 10. [x] Улучшить command output UX. 11. [x] Добавить agent lock/backoff/result buffer.