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>
19 lines
1.2 KiB
HTML
19 lines
1.2 KiB
HTML
{% import "_ui.html" as ui %}
|
|
{% set edit = group is not none %}
|
|
{% set action = ('/groups/' ~ group.id ~ '/rename') if edit else '/groups/new' %}
|
|
<form method="post" action="{{ action }}" {% if in_modal %}hx-post="{{ action }}" hx-target="#modal-body"{% endif %}>
|
|
<header class="modal-head">
|
|
<h2 id="modal-title">{{ "Переименовать группу" if edit else "Новая группа" }}</h2>
|
|
{% if in_modal %}<button type="button" class="btn ghost-n icon" data-close aria-label="Закрыть">{{ ui.icon("x") }}</button>{% endif %}
|
|
</header>
|
|
<div class="modal-body">
|
|
{% if error %}<div class="form-err" role="alert">{{ error }}</div>{% endif %}
|
|
<label class="lbl">Название<input class="input" name="name" value="{{ gname }}" maxlength="64" required autofocus></label>
|
|
</div>
|
|
<footer class="modal-foot">
|
|
<span class="grow"></span>
|
|
{% if in_modal %}<button type="button" class="btn ghost-n" data-close>Отмена</button>{% else %}<a class="btn ghost-n" href="/groups">Отмена</a>{% endif %}
|
|
<button class="btn primary">{{ "Сохранить" if edit else "Создать группу" }}</button>
|
|
</footer>
|
|
</form>
|