aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/launch.machinectl.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/launch.machinectl.go')
-rw-r--r--internal/app/launch.machinectl.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/internal/app/launch.machinectl.go b/internal/app/launch.machinectl.go
new file mode 100644
index 00000000..21b9d40b
--- /dev/null
+++ b/internal/app/launch.machinectl.go
@@ -0,0 +1,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
+}