test / test (push) Canceled after 0s
The pages of the mockups accepted in 87fa0a4, built from the kit's partials
(written by a Sonnet agent into the working tree, reviewed here):
- Account: "Send me notifications" in the Profile form, saved with the
profile; an unticked box is off.
- Server > Settings: the instance switch (box 03), and box 04 Notification
mail with the DKIM and SPF records of the server's own name, drawn with the
record partial of a domain's DNS page and checked in DNS. Sending rate
limits are box 02 in the left column. A record that is not in place is
tagged as a warning, not a failure: notifications are sent without it.
- Server > Health: card 06 Notification mail with the state of each record
and a link to Settings, beside Configuration (07); part of the polled
fragment; Re-check DNS forces it too. Overview does not run this check.
- help.go: the Notifications topic and the clauses in Settings and Your
account, word for word with help.html.
If the server's key cannot be read the pages still render: the DKIM record
is left out and SPF is shown unchecked.
e2e: the administrator gets a mailbox behind the sink and the server's DKIM
record from Settings is published; the level-2 refusal of the next step must
then arrive as a notification from postmaster@mail.e2e.test, signed as that
name with the key Settings shows, and must not be a row of the Outbound log.
The rotation step now waits for Postfix to be running: it follows a step that
restarts the container, and logrotate's `postfix reload` failed in between.
On the test server, for this tree: go vet clean, go test ./... 23 packages
ok, make e2e ok (147 s); the notification reached the sink 28 s after the
refusal.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
4.0 KiB
HTML
81 lines
4.0 KiB
HTML
{{/* The polled part of Health: two rows of boxes, in the page and in its
|
|
fragment (GET /server/health/fragment) alike. panel.js polls the first row
|
|
(data-poll, outerHTML) and htmx swaps the second into place by its id when
|
|
the fragment marks it out of band (.Refresh) — the two rows are siblings, and
|
|
a fragment can replace only the element that asked for it. The Notification
|
|
mail card is the third thing the fragment swaps in by id: it sits in a row of
|
|
the page with the static Configuration box, so it is a column of its own. */}}
|
|
{{define "health_body"}}<div class="columns" id="health-machine" data-poll aria-live="polite" hx-get="/server/health/fragment" hx-trigger="load" hx-swap="outerHTML">
|
|
<div class="column is-6">
|
|
{{template "box_open" .Machine}}
|
|
<div class="table-container"><table class="table is-fullwidth">
|
|
<thead><tr><th>Resource</th><th>Usage</th><th>Detail</th></tr></thead>
|
|
<tbody>{{range .MachineRows}}
|
|
<tr><td>{{.Resource}}</td><td>{{if .Gauge}}<progress class="progress is-small {{.Gauge.Bar}} mb-1" value="{{.Gauge.Percent}}" max="100"></progress>{{.Gauge.Text}}{{else if .Usage}}<span class="sp-nowrap">{{.Usage}}</span>{{else}}<span class="sp-muted">—</span>{{end}}</td><td class="sp-muted">{{range .Detail}}<div>{{.}}</div>{{end}}</td></tr>{{end}}
|
|
</tbody>
|
|
</table></div>
|
|
{{template "box_close"}}
|
|
</div>
|
|
<div class="column is-6">
|
|
{{template "box_open" .Processes}}
|
|
{{if .ProcessError}}
|
|
{{template "body_open"}}
|
|
<p class="has-text-danger">Could not ask supervisord for the process list.</p>
|
|
{{template "body_close"}}
|
|
{{else}}
|
|
<div class="table-container"><table class="table is-fullwidth">
|
|
<thead><tr><th>Program</th><th>State</th><th>Detail</th></tr></thead>
|
|
<tbody>{{range .ProcessRows}}
|
|
<tr><td>{{.Name}}</td><td>{{template "tag" .State}}</td><td class="sp-muted">{{.Detail}}</td></tr>{{end}}
|
|
</tbody>
|
|
</table></div>
|
|
{{end}}
|
|
{{template "box_close"}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="columns" id="health-checks"{{if .Refresh}} hx-swap-oob="true"{{end}}>
|
|
<div class="column is-4">
|
|
{{template "box_open" .Certificate}}
|
|
{{template "body_open"}}
|
|
{{if .CertFacts}}{{template "facts" .CertFacts}}{{end}}
|
|
<p class="mt-4 {{if .CertProblem}}has-text-danger{{else}}sp-muted{{end}}">{{.CertDetail}}</p>
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
</div>
|
|
<div class="column is-4">
|
|
{{template "box_open" .Sockets}}
|
|
<div class="table-container"><table class="table is-fullwidth">
|
|
<thead><tr><th>Milter</th><th>State</th></tr></thead>
|
|
<tbody>{{range .SocketRows}}
|
|
<tr><td>{{.Name}}{{if .Note}} <span class="sp-muted">· {{.Note}}</span>{{end}}<br><span class="sp-muted sp-mono sp-small">{{.Path}}</span>{{if .Detail}}<br><span class="sp-muted sp-small">{{.Detail}}</span>{{end}}</td><td>{{template "tag" .State}}</td></tr>{{end}}
|
|
</tbody>
|
|
</table></div>
|
|
{{template "box_close"}}
|
|
</div>
|
|
<div class="column is-4">
|
|
{{template "box_open" .Hostname}}
|
|
{{template "body_open"}}
|
|
{{template "facts" .HostFacts}}
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
</div>
|
|
</div>{{if .Refresh}}
|
|
{{template "health_mail" .}}{{end}}{{end}}
|
|
|
|
{{/* health_mail is the Notification mail card (the page calls it inside its own
|
|
row; the fragment sends it out of band). */}}
|
|
{{define "health_mail"}}<div class="column is-6" id="health-mail"{{if .Refresh}} hx-swap-oob="true"{{end}}>
|
|
{{template "box_open" .NotifyMail}}
|
|
<div class="table-container"><table class="table is-fullwidth">
|
|
<thead><tr><th>Record</th><th>State</th></tr></thead>
|
|
<tbody>{{range .NotifyRows}}
|
|
<tr><td>{{.Name}}<br><span class="sp-muted sp-mono sp-small">{{.Host}}</span></td><td>{{template "tag" .State}}</td></tr>{{end}}
|
|
</tbody>
|
|
</table></div>
|
|
{{template "body_open"}}
|
|
<p class="sp-muted">{{template "inline" .NotifyNote}}</p>
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
</div>{{end}}
|