dashboard: per-container journald viewer
new GET /api/journal/{name}?unit=&lines= shells out journalctl -M
<container> -b --no-pager --output=short-iso --lines=<N> (cap 5000).
optional unit filter, restricted to hive-ag3nt.service /
hive-m1nd.service so the shell-out can't be coerced into reading
unrelated units. validates the container name against the live list
before invoking journalctl.
frontend renders a collapsed '↳ logs · <container>' details block
on each container row. expanding triggers a lazy fetch; refresh
button re-fetches; unit dropdown switches between the harness
service (default) and the full machine journal. output sits in a
24em-tall monospace pre, auto-scrolled to the bottom on fresh
fetch.
hive-c0re's systemd unit already runs as root, so journalctl has
the access it needs.
This commit is contained in:
parent
79a46f359a
commit
0385d96bf3
4 changed files with 173 additions and 11 deletions
|
|
@ -143,6 +143,53 @@ a:hover {
|
|||
opacity: 0.85;
|
||||
}
|
||||
.container-row.tombstone .name { color: var(--muted); }
|
||||
/* Per-container journald viewer: collapsed by default, fetches
|
||||
lazily on expand. The output is in monospace inside a bordered
|
||||
<pre>; controls (unit select + refresh) sit above. */
|
||||
.journal {
|
||||
margin-top: 0.5em;
|
||||
font-size: 0.85em;
|
||||
}
|
||||
.journal > summary {
|
||||
cursor: pointer;
|
||||
color: var(--muted);
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
.journal > summary:hover { color: var(--cyan); }
|
||||
.journal .journal-body {
|
||||
margin-top: 0.4em;
|
||||
padding-top: 0.4em;
|
||||
border-top: 1px dashed var(--border);
|
||||
}
|
||||
.journal-controls {
|
||||
display: flex;
|
||||
gap: 0.5em;
|
||||
margin-bottom: 0.4em;
|
||||
align-items: center;
|
||||
}
|
||||
.journal-unit {
|
||||
font-family: inherit;
|
||||
font-size: 0.9em;
|
||||
background: var(--bg-elev);
|
||||
color: var(--fg);
|
||||
border: 1px solid var(--border);
|
||||
padding: 0.2em 0.4em;
|
||||
}
|
||||
.journal-refresh { font-size: 0.75em; padding: 0.15em 0.5em; }
|
||||
.journal-output {
|
||||
margin: 0;
|
||||
background: #11111b;
|
||||
color: var(--fg);
|
||||
border: 1px solid var(--purple-dim);
|
||||
padding: 0.5em 0.7em;
|
||||
max-height: 24em;
|
||||
overflow: auto;
|
||||
font-size: 0.85em;
|
||||
line-height: 1.4;
|
||||
white-space: pre;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
.pending-state {
|
||||
color: var(--amber);
|
||||
font-size: 0.85em;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue