aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/launch.machinectl.go
blob: 21b9d40b678017f8d4b56c902f12f4bb2800e7d6 (plain)
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
63
64
65
66
67
package app

import (
	"os/exec"
	"strings"

	"git.ophivana.moe/cat/fortify/internal/state"
	"git.ophivana.moe/cat/fortify/internal/verbose"
)

func (a *app) commandBuilderMachineCtl() (args []string) {
	args = make([]string, 0, 9+len(a.seal.env))

	// shell --uid=$USER
	args = append(args, "shell", "--uid="+a.seal.sys.Username)

	// --quiet
	if !verbose.Get() {
		args = append(args, "--quiet")
	}

	// environ
	envQ := make([]string, len(a.seal.env)+1)
	for i, e := range a.seal.env {
		envQ[i] = "-E" + e
	}
	// add shim payload to environment for shim path
	envQ[len(a.seal.env)] = "-E" + a.shimPayloadEnv()
	args = append(args, envQ...)

	// -- .host
	args = append(args, "--", ".host")

	// /bin/sh -c
	if sh, err := exec.LookPath("sh"); err != nil {
		// hardcode /bin/sh path since it exists more often than not
		args = append(args, "/bin/sh", "-c")
	} else {
		args = append(args, sh, "-c")
	}

	// build inner command expression ran as target user
	innerCommand := strings.Builder{}

	// apply custom environment variables to activation environment
	innerCommand.WriteString("dbus-update-activation-environment --systemd")
	for _, e := range a.seal.env {
		innerCommand.WriteString(" " + strings.SplitN(e, "=", 2)[0])
	}
	innerCommand.WriteString("; ")

	// override message bus address if enabled
	if a.seal.et.Has(state.EnableDBus) {
		innerCommand.WriteString(dbusSessionBusAddress + "=" + "'" + "unix:path=" + a.seal.sys.dbusAddr[0][1] + "' ")
		if a.seal.sys.dbusSystem {
			innerCommand.WriteString(dbusSystemBusAddress + "=" + "'" + "unix:path=" + a.seal.sys.dbusAddr[1][1] + "' ")
		}
	}

	// both license and version flags need to be set to activate shim path
	innerCommand.WriteString("exec " + a.seal.sys.executable + " -V -license")

	// append inner command
	args = append(args, innerCommand.String())

	return
}