aboutsummaryrefslogtreecommitdiffhomepage
path: root/helper/bwrap/static.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-01-15 10:57:10 +0900
committerOphestra <cat@gensokyo.uk>2025-01-15 13:07:06 +0900
commit3e11ce6868182f1a3f74d5bf6c1db761097666fa (patch)
tree85c611acc2aadb5b5b7818ad5a6a0769a6d71fa4 /helper/bwrap/static.go
parent562f5ed7971603a4e4e3315a7fe4188153bfc205 (diff)
helper/bwrap: separate sequential/static args
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'helper/bwrap/static.go')
-rw-r--r--helper/bwrap/static.go249
1 files changed, 249 insertions, 0 deletions
diff --git a/helper/bwrap/static.go b/helper/bwrap/static.go
new file mode 100644
index 00000000..7a8535cc
--- /dev/null
+++ b/helper/bwrap/static.go
@@ -0,0 +1,249 @@
+package bwrap
+
+import (
+ "slices"
+ "strconv"
+)
+
+/*
+ static boolean args
+*/
+
+type BoolArg int
+
+func (b BoolArg) Unwrap() []string {
+ return boolArgs[b]
+}
+
+const (
+ UnshareAll BoolArg = iota
+ UnshareUser
+ UnshareIPC
+ UnsharePID
+ UnshareNet
+ UnshareUTS
+ UnshareCGroup
+ ShareNet
+
+ UserNS
+ Clearenv
+
+ NewSession
+ DieWithParent
+ AsInit
+)
+
+var boolArgs = [...][]string{
+ UnshareAll: {"--unshare-all", "--unshare-user"},
+ UnshareUser: {"--unshare-user"},
+ UnshareIPC: {"--unshare-ipc"},
+ UnsharePID: {"--unshare-pid"},
+ UnshareNet: {"--unshare-net"},
+ UnshareUTS: {"--unshare-uts"},
+ UnshareCGroup: {"--unshare-cgroup"},
+ ShareNet: {"--share-net"},
+
+ UserNS: {"--disable-userns", "--assert-userns-disabled"},
+ Clearenv: {"--clearenv"},
+
+ NewSession: {"--new-session"},
+ DieWithParent: {"--die-with-parent"},
+ AsInit: {"--as-pid-1"},
+}
+
+func (c *Config) boolArgs() Builder {
+ b := boolArg{
+ UserNS: !c.UserNS,
+ Clearenv: c.Clearenv,
+
+ NewSession: c.NewSession,
+ DieWithParent: c.DieWithParent,
+ AsInit: c.AsInit,
+ }
+
+ if c.Unshare == nil {
+ b[UnshareAll] = true
+ b[ShareNet] = c.Net
+ } else {
+ b[UnshareUser] = c.Unshare.User
+ b[UnshareIPC] = c.Unshare.IPC
+ b[UnsharePID] = c.Unshare.PID
+ b[UnshareNet] = c.Unshare.Net
+ b[UnshareUTS] = c.Unshare.UTS
+ b[UnshareCGroup] = c.Unshare.CGroup
+ }
+
+ return &b
+}
+
+type boolArg [len(boolArgs)]bool
+
+func (b *boolArg) Len() (l int) {
+ for i, v := range b {
+ if v {
+ l += len(boolArgs[i])
+ }
+ }
+ return
+}
+
+func (b *boolArg) Append(args *[]string) {
+ for i, v := range b {
+ if v {
+ *args = append(*args, BoolArg(i).Unwrap()...)
+ }
+ }
+}
+
+/*
+ static integer args
+*/
+
+type IntArg int
+
+func (i IntArg) Unwrap() string {
+ return intArgs[i]
+}
+
+const (
+ UID IntArg = iota
+ GID
+)
+
+var intArgs = [...]string{
+ UID: "--uid",
+ GID: "--gid",
+}
+
+func (c *Config) intArgs() Builder {
+ return &intArg{
+ UID: c.UID,
+ GID: c.GID,
+ }
+}
+
+type intArg [len(intArgs)]*int
+
+func (n *intArg) Len() (l int) {
+ for _, v := range n {
+ if v != nil {
+ l += 2
+ }
+ }
+ return
+}
+
+func (n *intArg) Append(args *[]string) {
+ for i, v := range n {
+ if v != nil {
+ *args = append(*args, IntArg(i).Unwrap(), strconv.Itoa(*v))
+ }
+ }
+}
+
+/*
+ static string args
+*/
+
+type StringArg int
+
+func (s StringArg) Unwrap() string {
+ return stringArgs[s]
+}
+
+const (
+ Hostname StringArg = iota
+ Chdir
+ UnsetEnv
+ LockFile
+)
+
+var stringArgs = [...]string{
+ Hostname: "--hostname",
+ Chdir: "--chdir",
+ UnsetEnv: "--unsetenv",
+ LockFile: "--lock-file",
+}
+
+func (c *Config) stringArgs() Builder {
+ n := stringArg{
+ UnsetEnv: c.UnsetEnv,
+ LockFile: c.LockFile,
+ }
+
+ if c.Hostname != "" {
+ n[Hostname] = []string{c.Hostname}
+ }
+ if c.Chdir != "" {
+ n[Chdir] = []string{c.Chdir}
+ }
+
+ return &n
+}
+
+type stringArg [len(stringArgs)][]string
+
+func (s *stringArg) Len() (l int) {
+ for _, arg := range s {
+ l += len(arg) * 2
+ }
+ return
+}
+
+func (s *stringArg) Append(args *[]string) {
+ for i, arg := range s {
+ for _, v := range arg {
+ *args = append(*args, StringArg(i).Unwrap(), v)
+ }
+ }
+}
+
+/*
+ static pair args
+*/
+
+type PairArg int
+
+func (p PairArg) Unwrap() string {
+ return pairArgs[p]
+}
+
+const (
+ SetEnv PairArg = iota
+)
+
+var pairArgs = [...]string{
+ SetEnv: "--setenv",
+}
+
+func (c *Config) pairArgs() Builder {
+ var n pairArg
+ n[SetEnv] = make([][2]string, len(c.SetEnv))
+ keys := make([]string, 0, len(c.SetEnv))
+ for k := range c.SetEnv {
+ keys = append(keys, k)
+ }
+ slices.Sort(keys)
+ for i, k := range keys {
+ n[SetEnv][i] = [2]string{k, c.SetEnv[k]}
+ }
+
+ return &n
+}
+
+type pairArg [len(pairArgs)][][2]string
+
+func (p *pairArg) Len() (l int) {
+ for _, v := range p {
+ l += len(v) * 3
+ }
+ return
+}
+
+func (p *pairArg) Append(args *[]string) {
+ for i, arg := range p {
+ for _, v := range arg {
+ *args = append(*args, PairArg(i).Unwrap(), v[0], v[1])
+ }
+ }
+}