aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/ensure.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/ensure.go')
-rw-r--r--internal/app/ensure.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/app/ensure.go b/internal/app/ensure.go
new file mode 100644
index 00000000..9ab63ff2
--- /dev/null
+++ b/internal/app/ensure.go
@@ -0,0 +1,62 @@
+package app
+
+import (
+ "errors"
+ "fmt"
+ "git.ophivana.moe/cat/fortify/internal/acl"
+ "git.ophivana.moe/cat/fortify/internal/final"
+ "git.ophivana.moe/cat/fortify/internal/verbose"
+ "io/fs"
+ "os"
+ "path"
+)
+
+func (a *App) EnsureRunDir() {
+ if err := os.Mkdir(a.runDirPath, 0700); err != nil && !errors.Is(err, fs.ErrExist) {
+ final.Fatal("Error creating runtime directory:", err)
+ }
+}
+
+func (a *App) EnsureRuntime() {
+ if s, err := os.Stat(a.runtimePath); err != nil {
+ if errors.Is(err, fs.ErrNotExist) {
+ final.Fatal("Runtime directory does not exist")
+ }
+ final.Fatal("Error accessing runtime directory:", err)
+ } else if !s.IsDir() {
+ final.Fatal(fmt.Sprintf("Path '%s' is not a directory", a.runtimePath))
+ } else {
+ if err = acl.UpdatePerm(a.runtimePath, a.UID(), acl.Execute); err != nil {
+ final.Fatal("Error preparing runtime directory:", err)
+ } else {
+ final.RegisterRevertPath(a.runtimePath)
+ }
+ verbose.Printf("Runtime data dir '%s' configured\n", a.runtimePath)
+ }
+}
+
+func (a *App) EnsureShare() {
+ // acl is unnecessary as this directory is world executable
+ if err := os.Mkdir(a.sharePath, 0701); err != nil && !errors.Is(err, fs.ErrExist) {
+ final.Fatal("Error creating shared directory:", err)
+ }
+
+ // workaround for launch method sudo
+ if a.LaunchOption() == LaunchMethodSudo {
+ // ensure child runtime directory (e.g. `/tmp/fortify.%d/%d.share`)
+ cr := path.Join(a.sharePath, a.Uid+".share")
+ if err := os.Mkdir(cr, 0700); err != nil && !errors.Is(err, fs.ErrExist) {
+ final.Fatal("Error creating child runtime directory:", err)
+ } else {
+ if err = acl.UpdatePerm(cr, a.UID(), acl.Read, acl.Write, acl.Execute); err != nil {
+ final.Fatal("Error preparing child runtime directory:", err)
+ } else {
+ final.RegisterRevertPath(cr)
+ }
+ a.AppendEnv("XDG_RUNTIME_DIR", cr)
+ a.AppendEnv("XDG_SESSION_CLASS", "user")
+ a.AppendEnv("XDG_SESSION_TYPE", "tty")
+ verbose.Printf("Child runtime data dir '%s' configured\n", cr)
+ }
+ }
+}