From 10fdacee77b81fcc84ec212a98a3fd049a10624f Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Wed, 9 Feb 2022 10:45:56 +0100 Subject: [PATCH] added wwctl container shell --- internal/app/wwctl/container/exec/main.go | 3 -- internal/app/wwctl/container/exec/root.go | 2 +- internal/app/wwctl/container/root.go | 2 + internal/app/wwctl/container/shell/main.go | 48 ++++++++++++++++++++++ internal/app/wwctl/container/shell/root.go | 35 ++++++++++++++++ 5 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 internal/app/wwctl/container/shell/main.go create mode 100644 internal/app/wwctl/container/shell/root.go diff --git a/internal/app/wwctl/container/exec/main.go b/internal/app/wwctl/container/exec/main.go index cef337b3..6c54853d 100644 --- a/internal/app/wwctl/container/exec/main.go +++ b/internal/app/wwctl/container/exec/main.go @@ -28,9 +28,6 @@ func CobraRunE(cmd *cobra.Command, args []string) error { allargs = append(allargs, "--bind", b) } allargs = append(allargs, args...) - if len(args) == 1 { - allargs = append(allargs, "/usr/bin/bash") - } c := exec.Command("/proc/self/exe", append([]string{"container", "exec", "__child"}, allargs...)...) diff --git a/internal/app/wwctl/container/exec/root.go b/internal/app/wwctl/container/exec/root.go index 96f81b5c..913d4f79 100644 --- a/internal/app/wwctl/container/exec/root.go +++ b/internal/app/wwctl/container/exec/root.go @@ -15,7 +15,7 @@ var ( "This is commonly used with an interactive shell such as /bin/bash\n" + "to run a virtual environment within the container.", RunE: CobraRunE, - Args: cobra.MinimumNArgs(1), + Args: cobra.MinimumNArgs(2), ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) != 0 { return nil, cobra.ShellCompDirectiveNoFileComp diff --git a/internal/app/wwctl/container/root.go b/internal/app/wwctl/container/root.go index 08c13ba5..64034cb7 100644 --- a/internal/app/wwctl/container/root.go +++ b/internal/app/wwctl/container/root.go @@ -6,6 +6,7 @@ import ( "github.com/hpcng/warewulf/internal/app/wwctl/container/exec" "github.com/hpcng/warewulf/internal/app/wwctl/container/imprt" "github.com/hpcng/warewulf/internal/app/wwctl/container/list" + "github.com/hpcng/warewulf/internal/app/wwctl/container/shell" "github.com/hpcng/warewulf/internal/app/wwctl/container/show" "github.com/spf13/cobra" ) @@ -27,6 +28,7 @@ func init() { baseCmd.AddCommand(list.GetCommand()) baseCmd.AddCommand(imprt.GetCommand()) baseCmd.AddCommand(exec.GetCommand()) + baseCmd.AddCommand(shell.GetCommand()) baseCmd.AddCommand(delete.GetCommand()) baseCmd.AddCommand(show.GetCommand()) diff --git a/internal/app/wwctl/container/shell/main.go b/internal/app/wwctl/container/shell/main.go new file mode 100644 index 00000000..4e968b4e --- /dev/null +++ b/internal/app/wwctl/container/shell/main.go @@ -0,0 +1,48 @@ +//go:build linux +// +build linux + +package shell + +import ( + "fmt" + "os" + "os/exec" + "syscall" + + "github.com/hpcng/warewulf/internal/pkg/container" + "github.com/hpcng/warewulf/internal/pkg/wwlog" + "github.com/spf13/cobra" +) + +func CobraRunE(cmd *cobra.Command, args []string) error { + + containerName := args[0] + var allargs []string + + if !container.ValidSource(containerName) { + wwlog.Printf(wwlog.ERROR, "Unknown Warewulf container: %s\n", containerName) + os.Exit(1) + } + + for _, b := range binds { + allargs = append(allargs, "--bind", b) + } + allargs = append(allargs, args...) + allargs = append(allargs, "/usr/bin/bash") + + c := exec.Command("/proc/self/exe", append([]string{"container", "exec"}, allargs...)...) + + //c := exec.Command("/bin/sh") + c.SysProcAttr = &syscall.SysProcAttr{ + Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS, + } + c.Stdin = os.Stdin + c.Stdout = os.Stdout + c.Stderr = os.Stderr + + if err := c.Run(); err != nil { + fmt.Println(err) + os.Exit(1) + } + return nil +} diff --git a/internal/app/wwctl/container/shell/root.go b/internal/app/wwctl/container/shell/root.go new file mode 100644 index 00000000..59f6c56b --- /dev/null +++ b/internal/app/wwctl/container/shell/root.go @@ -0,0 +1,35 @@ +package shell + +import ( + "github.com/hpcng/warewulf/internal/pkg/container" + "github.com/spf13/cobra" +) + +var ( + baseCmd = &cobra.Command{ + DisableFlagsInUseLine: true, + Use: "shell [OPTIONS] CONTAINER", + Short: "Run a shell inside of a Warewulf container", + Long: "Run a interactive shell inside of a warewulf CONTAINER.\n", + RunE: CobraRunE, + Args: cobra.MinimumNArgs(1), + ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + if len(args) != 0 { + return nil, cobra.ShellCompDirectiveNoFileComp + } + list, _ := container.ListSources() + return list, cobra.ShellCompDirectiveNoFileComp + }, + FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true}, + } + binds []string +) + +func init() { + 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. +func GetCommand() *cobra.Command { + return baseCmd +}