aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/setup.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/setup.go')
-rw-r--r--internal/app/setup.go77
1 files changed, 8 insertions, 69 deletions
diff --git a/internal/app/setup.go b/internal/app/setup.go
index 7b5cd2ec..82765dfb 100644
--- a/internal/app/setup.go
+++ b/internal/app/setup.go
@@ -4,13 +4,11 @@ import (
"errors"
"fmt"
"os"
- "os/exec"
"os/user"
"strconv"
"git.ophivana.moe/cat/fortify/internal/state"
"git.ophivana.moe/cat/fortify/internal/system"
- "git.ophivana.moe/cat/fortify/internal/util"
)
type App struct {
@@ -18,78 +16,19 @@ type App struct {
env []string
command []string
+ enablements state.Enablements
*user.User
-}
-
-func (a *App) Run() {
- f := a.launchBySudo
- m, b := false, false
- switch {
- case system.MethodFlags[0]: // sudo
- case system.MethodFlags[1]: // bare
- m, b = true, true
- default: // machinectl
- m, b = true, false
- }
-
- var toolPath string
-
- // dependency checks
- const sudoFallback = "Falling back to 'sudo', some desktop integration features may not work"
- if m {
- if !util.SdBooted() {
- fmt.Println("This system was not booted through systemd")
- fmt.Println(sudoFallback)
- } else if tp, ok := util.Which("machinectl"); !ok {
- fmt.Println("Did not find 'machinectl' in PATH")
- fmt.Println(sudoFallback)
- } else {
- toolPath = tp
- f = func() []string { return a.launchByMachineCtl(b) }
- }
- } else if tp, ok := util.Which("sudo"); !ok {
- state.Fatal("Did not find 'sudo' in PATH")
- } else {
- toolPath = tp
- }
-
- if system.V.Verbose {
- fmt.Printf("Selected launcher '%s' bare=%t\n", toolPath, b)
- }
- cmd := exec.Command(toolPath, f()...)
- cmd.Env = a.env
- cmd.Stdin = os.Stdin
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- cmd.Dir = system.V.RunDir
-
- if system.V.Verbose {
- fmt.Println("Executing:", cmd)
- }
-
- if err := cmd.Start(); err != nil {
- state.Fatal("Error starting process:", err)
- }
-
- if err := state.SaveProcess(a.Uid, cmd); err != nil {
- // process already started, shouldn't be fatal
- fmt.Println("Error registering process:", err)
- }
+ // absolutely *no* method of this type is thread-safe
+ // so don't treat it as if it is
+}
- var r int
- if err := cmd.Wait(); err != nil {
- var exitError *exec.ExitError
- if !errors.As(err, &exitError) {
- state.Fatal("Error running process:", err)
- }
+func (a *App) setEnablement(e state.Enablement) {
+ if a.enablements.Has(e) {
+ panic("enablement " + e.String() + " set twice")
}
- if system.V.Verbose {
- fmt.Println("Process exited with exit code", r)
- }
- state.BeforeExit()
- os.Exit(r)
+ a.enablements |= e.Mask()
}
func New(userName string, args []string) *App {