Files
arm/atxpi/webui/static/index.html
T
toros a1997b00ac feat(webui): FastAPI REST + WebSocket-консоль + MCP-эндпоинт + браузерный UI
- server.py: /api/power/*, /api/status, /api/history, /ws/console, /mcp (MCPServer streamable-http)
- auth: Bearer-токен (ATXPI_WEB_TOKEN) для /api/* и /mcp/*; WS — через ?token=
- статика: index.html, app.js, style.css + vendored xterm.js (работает офлайн на Pi)
- lightweight: один процесс uvicorn, без node/сборки
- install.sh: отдаю сервис-юзеру владение atxpi/ и /etc/atxpi (pyc/tmp/audit)
2026-09-08 22:55:20 +05:00

51 lines
1.9 KiB
HTML

<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>atxpi — управление сервером</title>
<link rel="stylesheet" href="/static/style.css">
<link rel="stylesheet" href="/static/vendor/xterm.css">
</head>
<body>
<!-- Логин -->
<div id="login" class="hidden">
<div class="card">
<h1>atxpi</h1>
<p class="muted">Введите токен доступа (ATXPI_WEB_TOKEN)</p>
<input id="tok" type="password" placeholder="Токен" autocomplete="off">
<button class="btn primary" onclick="login()">Войти</button>
<p id="loginMsg" class="err"></p>
</div>
</div>
<!-- Приложение -->
<main id="app" class="hidden">
<header>
<h1>⚡ atxpi</h1>
<span id="powerState" class="badge"></span>
<span class="spacer"></span>
<button class="btn" onclick="doPower('on')" title="Нажать кнопку питания">⏻ ON</button>
<button class="btn" onclick="doPower('off')" title="Принудительно выключить (долгое нажатие)">⭘ OFF</button>
<button class="btn" onclick="doPower('reset')" title="Аппаратный сброс">↻ Reset</button>
<button class="btn" onclick="doPower('cycle')" title="Жёсткий перезапуск">⟳ Cycle</button>
</header>
<section id="status" class="status-line"></section>
<section class="console-panel">
<div class="console-bar">
<span>RS232-консоль</span>
<span id="consoleState" class="muted">не подключена</span>
<span class="spacer"></span>
<button class="btn" onclick="toggleConsole()">Подключить</button>
</div>
<div id="term"></div>
</section>
</main>
<script src="/static/vendor/xterm.js"></script>
<script src="/static/app.js"></script>
</body>
</html>