From 7826f696564a44013c75fa4fabc86bc3f542912c Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Fri, 20 Aug 2021 14:16:16 -0700 Subject: [PATCH] Support binds in container exec command This addresses issue #88. --- .../app/wwctl/container/exec/child/main.go | 23 +++++++++++++++++++ .../app/wwctl/container/exec/child/root.go | 3 ++- internal/app/wwctl/container/exec/main.go | 11 ++++++++- internal/app/wwctl/container/exec/root.go | 2 ++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/internal/app/wwctl/container/exec/child/main.go b/internal/app/wwctl/container/exec/child/main.go index a7a16fde..d88c2731 100644 --- a/internal/app/wwctl/container/exec/child/main.go +++ b/internal/app/wwctl/container/exec/child/main.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package child @@ -6,6 +7,7 @@ import ( "fmt" "os" "path" + "strings" "syscall" "github.com/hpcng/warewulf/internal/pkg/container" @@ -37,6 +39,27 @@ func CobraRunE(cmd *cobra.Command, args []string) error { syscall.Mount("/etc/resolv.conf", path.Join(containerPath, "/etc/resolv.conf"), "", syscall.MS_BIND, "") } + fmt.Printf("Evaluating bind points\n") + for _, b := range binds { + var source string + var dest string + + bind := strings.Split(b, ":") + source = bind[0] + + if len(bind) == 1 { + dest = source + } else { + dest = bind[1] + } + + err := syscall.Mount(source, path.Join(containerPath, dest), "", syscall.MS_BIND, "") + if err != nil { + fmt.Printf("BIND ERROR: %s\n", err) + os.Exit(1) + } + } + syscall.Chroot(containerPath) os.Chdir("/") diff --git a/internal/app/wwctl/container/exec/child/root.go b/internal/app/wwctl/container/exec/child/root.go index 48aa0d8b..8a9d422b 100644 --- a/internal/app/wwctl/container/exec/child/root.go +++ b/internal/app/wwctl/container/exec/child/root.go @@ -10,10 +10,11 @@ var ( Args: cobra.MinimumNArgs(1), FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true}, } + binds []string ) func init() { - + baseCmd.PersistentFlags().StringArrayVarP(&binds, "bind", "b", []string{}, "bind points") } // GetRootCommand returns the root cobra.Command for the application. diff --git a/internal/app/wwctl/container/exec/main.go b/internal/app/wwctl/container/exec/main.go index 1ad9ff03..9141f23e 100644 --- a/internal/app/wwctl/container/exec/main.go +++ b/internal/app/wwctl/container/exec/main.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux package exec @@ -16,13 +17,21 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { containerName := args[0] + var allargs []string if container.ValidSource(containerName) == false { wwlog.Printf(wwlog.ERROR, "Unknown Warewulf container: %s\n", containerName) os.Exit(1) } - c := exec.Command("/proc/self/exe", append([]string{"container", "exec", "__child"}, args...)...) + fmt.Println(args) + + for _, b := range binds { + allargs = append(allargs, "--bind", b) + } + allargs = append(allargs, args...) + + c := exec.Command("/proc/self/exe", append([]string{"container", "exec", "__child"}, allargs...)...) //c := exec.Command("/bin/sh") c.SysProcAttr = &syscall.SysProcAttr{ diff --git a/internal/app/wwctl/container/exec/root.go b/internal/app/wwctl/container/exec/root.go index ba57cf88..8384ae57 100644 --- a/internal/app/wwctl/container/exec/root.go +++ b/internal/app/wwctl/container/exec/root.go @@ -16,10 +16,12 @@ var ( Args: cobra.MinimumNArgs(1), FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true}, } + binds []string ) func init() { baseCmd.AddCommand(child.GetCommand()) + baseCmd.PersistentFlags().StringArrayVarP(&binds, "bind", "b", []string{}, "Bind a local path into the container (must exist)") } // GetRootCommand returns the root cobra.Command for the application.