100 lines
4.3 KiB
HTML
100 lines
4.3 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{{ hostname }}</title>
|
|
<link rel="stylesheet" href="/static/css/style.css">
|
|
<script src="/static/vendor/htmx.min.js"></script>
|
|
<script src="/static/vendor/chart.umd.min.js"></script>
|
|
</head>
|
|
<body>
|
|
<header class="topbar">
|
|
<h1>{{ hostname }}</h1>
|
|
<nav id="tabs">
|
|
<button class="tab-btn active" data-tab="overview">Overview</button>
|
|
<button class="tab-btn" data-tab="disks">Disks</button>
|
|
<button class="tab-btn" data-tab="processes">Processes</button>
|
|
<button class="tab-btn" data-tab="journal">Journal</button>
|
|
<button class="tab-btn" data-tab="services">Services</button>
|
|
<button class="tab-btn" data-tab="plugins">Plugins</button>
|
|
</nav>
|
|
</header>
|
|
<main>
|
|
<section id="tab-overview" class="tab">
|
|
<div id="overview" class="panel" hx-get="/api/overview" hx-trigger="load, every 2s" hx-swap="outerHTML"></div>
|
|
<div class="charts-grid">
|
|
<div class="chart-card"><h3>CPU / GPU %</h3><canvas id="chart-cpu"></canvas></div>
|
|
<div class="chart-card"><h3>Memory / VRAM %</h3><canvas id="chart-mem"></canvas></div>
|
|
<div class="chart-card"><h3>Disk I/O</h3><canvas id="chart-io"></canvas></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="tab-disks" class="tab hidden">
|
|
<div id="disks" class="panel" hx-get="/api/disks" hx-trigger="load, every 2s" hx-swap="outerHTML"></div>
|
|
</section>
|
|
|
|
<section id="tab-processes" class="tab hidden">
|
|
<form id="proc-controls" class="inline-form" hx-get="/api/processes" hx-target="#processes-body" hx-swap="outerHTML">
|
|
<input id="proc-q" name="q" placeholder="filter name / pid">
|
|
<select name="sort" id="proc-sort">
|
|
<option value="cpu">sort: CPU</option>
|
|
<option value="rss">sort: MEM</option>
|
|
<option value="mem_pct">sort: MEM%</option>
|
|
<option value="io_read">sort: IO read</option>
|
|
<option value="io_write">sort: IO write</option>
|
|
<option value="pid">sort: PID</option>
|
|
<option value="name">sort: Name</option>
|
|
</select>
|
|
<select name="order" id="proc-order">
|
|
<option value="desc">desc</option>
|
|
<option value="asc">asc</option>
|
|
</select>
|
|
<button type="submit">apply</button>
|
|
</form>
|
|
<div id="processes-body" class="panel" hx-get="/api/processes" hx-trigger="load, every 3s" hx-swap="outerHTML" hx-include="#proc-controls"></div>
|
|
</section>
|
|
|
|
<section id="tab-journal" class="tab hidden">
|
|
<div id="journal-status" class="muted small"></div>
|
|
<form id="journal-filters" class="inline-form" hx-get="/api/journal" hx-target="#journal-log" hx-swap="innerHTML">
|
|
<select name="level">
|
|
<option value="all">all</option>
|
|
<option value="warn">warn+</option>
|
|
<option value="err">err+</option>
|
|
</select>
|
|
<input name="unit" placeholder="unit (ssh.service)">
|
|
<input name="search" placeholder="search text">
|
|
<label class="chk"><input type="checkbox" name="hide_sudo" checked> hide sudo</label>
|
|
<button type="submit">filter</button>
|
|
</form>
|
|
<div id="journal-logwrap">
|
|
<input type="hidden" id="journal-cursor" name="cursor" value="">
|
|
<div id="journal-log" hx-get="/api/journal" hx-trigger="load, every 5s" hx-swap="beforeend" hx-include="#journal-filters, #journal-cursor"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="tab-services" class="tab hidden">
|
|
<form id="svc-filters" class="inline-form" hx-get="/api/services" hx-target="#services" hx-swap="outerHTML">
|
|
<input id="svc-q" name="q" placeholder="filter units">
|
|
<select name="sort" id="svc-sort">
|
|
<option value="name">sort: name</option>
|
|
<option value="state">sort: state</option>
|
|
<option value="enabled">sort: enabled</option>
|
|
</select>
|
|
<select name="order" id="svc-order">
|
|
<option value="asc">asc</option>
|
|
<option value="desc">desc</option>
|
|
</select>
|
|
<button type="submit">filter</button>
|
|
</form>
|
|
<div id="services" class="panel" hx-get="/api/services" hx-trigger="load, every 15s" hx-swap="outerHTML" hx-include="#svc-filters"></div>
|
|
</section>
|
|
|
|
<section id="tab-plugins" class="tab hidden">
|
|
<div id="plugins" class="panel" hx-get="/api/plugins" hx-trigger="load" hx-swap="outerHTML"></div>
|
|
</section>
|
|
</main>
|
|
<script src="/static/js/app.js"></script>
|
|
</body>
|
|
</html>
|