Start no account's manager to look at its units (hq issue 764)
mesh/merge-gate head 62af89f85d0d merged into trunk 1a2677882380 — pass: builds mesh-host → ace, g14, novox, shanks; no bus step; every machine composes wi…
mesh/repo-check head 62af89f85d0d merged into trunk 1a2677882380 — pass: its merge-check.sh passed
mesh/delivery delivered
mesh/merge-gate head 62af89f85d0d merged into trunk 1a2677882380 — pass: builds mesh-host → ace, g14, novox, shanks; no bus step; every machine composes wi…
mesh/repo-check head 62af89f85d0d merged into trunk 1a2677882380 — pass: its merge-check.sh passed
mesh/delivery delivered
Every 15 s the failed-units look read the own manager of every account the declaration creates, and reading one is a login that starts it: six module accounts' managers on the control node started and stopped all day, most of its journal. A look only reads (ADR 0240 rule 6) and never asks an account's manager (ADR 0177). An account's manager is read now only when the declaration places a user-scoped unit in it, and only after the machine's own manager says user@<uid>.service is active, as the apply asks before it. A manager not running is said away in the units statement, with no failed units; in liveness its units read unknown with the apply's words, never down. The operator's account on a desktop is still read while logged in, since a module places a user unit there (issue 315's Razer daemon stays said).
This commit is contained in:
@@ -8,6 +8,8 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/novox/mesh-host/internal/system"
|
||||
)
|
||||
|
||||
// Runner runs a command and answers what it printed — the apply's own (apply.ExecRunner), so a look
|
||||
@@ -16,9 +18,13 @@ type Runner func(ctx context.Context, name string, args ...string) (string, erro
|
||||
|
||||
// Exec reads the container runtime and the service manager through their command lines: one inspect of
|
||||
// every container, one show of every unit per manager. **Reads only** — the whole of what this file may
|
||||
// ask either of them is `container inspect`, `version` and `show` (ADR 0240 rule 6, and a test holds it).
|
||||
// ask either of them is `container inspect`, `version` and `show`, and of the machine's manager whether an
|
||||
// account's own is active (ADR 0240 rule 6, and a test holds it).
|
||||
type Exec struct {
|
||||
Run Runner
|
||||
// System is what the host was built for: it says how the machine's manager is asked whether an
|
||||
// account's own runs (system.ManagerRunning).
|
||||
System string
|
||||
|
||||
mu sync.Mutex
|
||||
// cri is the runtime that answered, once one has.
|
||||
@@ -146,6 +152,19 @@ func (e *Exec) Units(ctx context.Context, scope, user string, units []string) (m
|
||||
}
|
||||
args := []string{"show", "--property=" + unitProperties, "--"}
|
||||
if scope == "user" && user != "" {
|
||||
// **A look starts no account's manager** (novox/hq issue 764, ADR 0177): reading it is a login,
|
||||
// which starts it when none runs. The machine's manager is asked first; a manager not running is
|
||||
// away — its units unread, said unknown with why, never down — as the apply says them waiting.
|
||||
running, exists, err := system.ManagerRunning(ctx, e.System, system.Runner(e.Run), user)
|
||||
switch {
|
||||
case err != nil:
|
||||
return nil, fmt.Errorf("whether %s's own service manager runs could not be read: %w", user, err)
|
||||
case !exists:
|
||||
return nil, fmt.Errorf("the machine has no account %q, whose own manager these units are in", user)
|
||||
case !running:
|
||||
return nil, fmt.Errorf("%s's own service manager is not running: the account is not logged in "+
|
||||
"and does not linger", user)
|
||||
}
|
||||
args = append([]string{"--user", "--machine=" + user + "@"}, args...)
|
||||
}
|
||||
said, err := e.Run(ctx, "systemctl", append(args, units...)...)
|
||||
|
||||
Reference in New Issue
Block a user