Logs live at swarm level now (VictoriaLogs, read through Grafana
Explore). The hive dashboard's own journal viewer goes, with
everything that existed only to serve it:
- frontend: /logs.html, logs.js, logs.css, the H0M3 "Logs" tile and
the per-agent menu's "journal logs ->" link. The build-log list
rules BU1LDS used from logs.css move into builds.css.
- hive-c0re: GET /api/journal/{name} and GET /api/journal-host, and
priv_client::read_container_journal.
- hive-priv / hive-priv-sock: the ReadContainerJournal request, its
JournalQuery/JournalOutput wire types and the journalctl -M executor.
- nix: hive-c0re's systemd-journal supplementary group, whose only
reader was the journal-host handler.
- docs: the L0GS section, the API entry and the security table row.
Closes #5113
Closes #3819
78 lines
2 KiB
CSS
78 lines
2 KiB
CSS
/* ─── /core.html — C0R3 page ───────────────────────────────────────
|
|
Kept state (tombstones) and container load. Section rules imported
|
|
from system-sections.css (shared with dashboard.css + builds.css). */
|
|
@import "./system-sections.css";
|
|
|
|
body.core-shell {
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
/* Fill the header row next to the ← home back-link, same as the
|
|
builds sub-tab strip. */
|
|
.core-tabbar {
|
|
flex: 1;
|
|
}
|
|
|
|
.core-main {
|
|
padding: 1.2em 1.5em 2em;
|
|
}
|
|
|
|
/* createTabStrip toggles the native `hidden` attribute on inactive
|
|
panes; ensure it wins over any inherited display. */
|
|
.core-pane[hidden] {
|
|
display: none;
|
|
}
|
|
|
|
/* ─── K3PT ST4T3 container cards ────────────────────────────────────
|
|
core.html doesn't load dashboard.css (that's the operator SPA),
|
|
so the .container-row card styles aren't inherited. Redefine them
|
|
here so tombstone entries look like proper cards (similar to agent
|
|
cards on the main dashboard) rather than bare list items. */
|
|
.containers {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0.5em 0 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5em;
|
|
}
|
|
.container-row {
|
|
background: var(--bg-elev);
|
|
border: 1px solid var(--border);
|
|
border-radius: 4px;
|
|
padding: 0.55em 0.8em 0.5em;
|
|
}
|
|
.container-row.tombstone {
|
|
border-style: dashed;
|
|
background: color-mix(in srgb, var(--bg-elev) 35%, transparent);
|
|
opacity: 0.85;
|
|
}
|
|
.container-row .head {
|
|
display: flex;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
gap: 0.5em;
|
|
margin-bottom: 0.4em;
|
|
}
|
|
.container-row .head .name {
|
|
font-size: 1.05em;
|
|
font-weight: bold;
|
|
}
|
|
.container-row.tombstone .head .name {
|
|
color: var(--muted);
|
|
}
|
|
.container-row .head .meta {
|
|
margin-left: auto;
|
|
font-size: 0.88em;
|
|
color: var(--muted);
|
|
}
|
|
.container-row .actions {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.4em;
|
|
}
|
|
.container-row .actions form.inline {
|
|
display: inline-block;
|
|
margin: 0;
|
|
}
|