1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package main
import (
"context"
"fmt"
"slices"
"strings"
"github.com/johnandersen777/socialweb-computer-kcp/internal/clicfg"
"github.com/johnandersen777/socialweb-computer-kcp/internal/devinstance"
"github.com/johnandersen777/socialweb-computer-kcp/internal/hostcontract"
"github.com/johnandersen777/socialweb-computer-kcp/internal/hostsvc"
)
var installOnlyChecks = []string{hostcontract.CheckAppArmor, hostcontract.CheckStateACL}
var systemdChecks = []string{hostcontract.CheckSystemdVersion, hostcontract.CheckProbeProperties, hostcontract.CheckCgroupV2,
hostcontract.CheckDelegation, hostcontract.CheckLinger, hostcontract.CheckSocketPath, hostcontract.CheckManagerKVM}
func (a *app) vmHostPreflight(ctx context.Context, vals clicfg.Values) error {
backend := hostsvc.BackendProc
if b := vals.String("vm-host-backend"); b != "" {
parsed, err := hostsvc.ParseBackend(b)
if err != nil {
return err
}
backend = parsed
}
exe, err := selfExe()
if err != nil {
return err
}
state, err := devinstance.StateRoot(vals.String("state-dir"), a.env)
if err != nil {
return err
}
cache, err := a.assetCache(vals)
if err != nil {
return err
}
getenv := func(k string) string {
v, _ := a.env.LookupEnv(k)
return v
}
results := hostcontract.Evaluate(hostcontract.Gather(ctx, hostcontract.Options{
Role: hostcontract.RoleBidder, StateDir: state, Self: []string{exe, "check-host"}, PastaPath: vals.String("pasta-path"),
AssetCache: cache, Getenv: getenv,
}))
var lines []string
for _, r := range results {
if r.Status != hostcontract.StatusFail || slices.Contains(installOnlyChecks, r.Name) ||
(backend != hostsvc.BackendSystemdUser && slices.Contains(systemdChecks, r.Name)) {
continue
}
lines = append(lines, fmt.Sprintf(" %s: %s\n fix: %s", r.Name, r.Detail, r.Fix))
}
if len(lines) > 0 {
return fmt.Errorf("this host cannot run bidder VMs as this account; socialweb-computer check-host -role bidder -state-dir %s lists every check:\n%s",
state, strings.Join(lines, "\n"))
}
return nil
}