panel-redesign: three things the first look at the deployed panel showed

Seen by the owner on the test server, on real data (2026-10-10).

  - Overview's Processes card said "7 of 7 running" with six programs
    running and postfix-reload idle. The card counts the programs that
    are meant to stay up; a one-shot helper (health.Process.OneShot) is
    left out of both numbers and named only when it is in trouble.
  - The Milter sockets card clipped its second line ("OpenDKIM,
    send-log,...") once the spam filter was the third socket. The line
    names the sockets that do not answer when some do not; with all
    answering it is their names, or "incl. the spam filter" - the
    mockup's words - when the filter is among them.
  - A real 2048-bit DKIM value did not fit the three rows of its field
    and scrolled inside it. The field is as tall as the value needs
    (3 to 12 rows).

The fixtures had a shortened key, two sockets and no one-shot program,
so none of this showed in the evidence screenshots.

  go test -count=1 ./internal/health/... ./internal/web/...: ok

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mix
2026-10-10 23:39:39 +03:00
co-authored by Claude Opus 5.5
parent ce41a8cf34
commit baa053d250
7 changed files with 97 additions and 14 deletions
+9 -4
View File
@@ -23,6 +23,10 @@ type Process struct {
State string // supervisord's own state word, e.g. RUNNING
Detail string // the rest of the line: pid/uptime, or exit information
Status Status
// OneShot marks a program that is started on demand and exits at once
// (oneShotPrograms): idle is its healthy state, and it is not one of the
// programs that are expected to be running.
OneShot bool
}
// Processes returns the state of every supervised program (architecture.md §
@@ -71,10 +75,11 @@ func parseProcesses(out string) []Process {
}
name, state := fields[0], fields[1]
procs = append(procs, Process{
Name: name,
State: state,
Detail: strings.Join(fields[2:], " "),
Status: processStatus(name, state),
Name: name,
State: state,
Detail: strings.Join(fields[2:], " "),
Status: processStatus(name, state),
OneShot: oneShotPrograms[name],
})
}
return procs