Merge pull request #70 from rancher/feature/auto-shell-and-zsh

[Feature] auto mode and zsh support for shell command
pull/76/head
Andy Zhou 5 years ago committed by GitHub
commit d1a709365f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      cli/commands.go
  2. 59
      cli/shell.go
  3. 4
      main.go

@ -354,10 +354,7 @@ func GetKubeConfig(c *cli.Context) error {
return nil return nil
} }
// Shell starts a new subshell with the KUBECONFIG pointing to the selected cluster
func Shell(c *cli.Context) error { func Shell(c *cli.Context) error {
if c.String("shell") != "bash" { return subShell(c.String("name"), c.String("shell"), c.String("command"))
return fmt.Errorf("%s is not supported. Only bash is supported", c.String("shell"))
}
return bashShell(c.String("name"), c.String("command"))
} }

@ -4,25 +4,74 @@ import (
"fmt" "fmt"
"os" "os"
"os/exec" "os/exec"
"path"
) )
func bashShell(cluster string, command string) error { type shell struct {
Name string
Options []string
Prompt string
Env map[string]string
}
var shells = map[string]shell{
"bash": {
Name: "bash",
Options: []string{
"--noprofile", // don't load .profile/.bash_profile
"--norc", // don't load .bashrc
},
Prompt: "PS1",
},
"zsh": {
Name: "zsh",
Options: []string{
"--no-rcs", // don't load .zshrc
},
Prompt: "PROMPT",
},
}
// subShell
func subShell(cluster, shell, command string) error {
// check if the selected shell is supported
if shell == "auto" {
shell = path.Base(os.Getenv("SHELL"))
}
supported := false
for supportedShell := range shells {
if supportedShell == shell {
supported = true
}
}
if !supported {
return fmt.Errorf("ERROR: selected shell [%s] is not supported", shell)
}
// get kubeconfig for selected cluster
kubeConfigPath, err := getKubeConfig(cluster) kubeConfigPath, err := getKubeConfig(cluster)
if err != nil { if err != nil {
return err return err
} }
// check if we're already in a subshell
subShell := os.ExpandEnv("$__K3D_CLUSTER__") subShell := os.ExpandEnv("$__K3D_CLUSTER__")
if len(subShell) > 0 { if len(subShell) > 0 {
return fmt.Errorf("Error: Already in subshell of cluster %s", subShell) return fmt.Errorf("Error: Already in subshell of cluster %s", subShell)
} }
bashPath, err := exec.LookPath("bash") // get path of shell executable
shellPath, err := exec.LookPath(shell)
if err != nil { if err != nil {
return err return err
} }
cmd := exec.Command(bashPath, "--noprofile", "--norc") // set shell specific options (command line flags)
shellOptions := shells[shell].Options
cmd := exec.Command(shellPath, shellOptions...)
if len(command) > 0 { if len(command) > 0 {
cmd.Args = append(cmd.Args, "-c", command) cmd.Args = append(cmd.Args, "-c", command)
@ -35,7 +84,7 @@ func bashShell(cluster string, command string) error {
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
// Set up Promot // Set up Promot
setPS1 := fmt.Sprintf("PS1=[%s}%s", cluster, os.Getenv("PS1")) setPrompt := fmt.Sprintf("%s=[%s} %s", shells[shell].Prompt, cluster, os.Getenv(shells[shell].Prompt))
// Set up KUBECONFIG // Set up KUBECONFIG
setKube := fmt.Sprintf("KUBECONFIG=%s", kubeConfigPath) setKube := fmt.Sprintf("KUBECONFIG=%s", kubeConfigPath)
@ -43,7 +92,7 @@ func bashShell(cluster string, command string) error {
// Declare subshell // Declare subshell
subShell = fmt.Sprintf("__K3D_CLUSTER__=%s", cluster) subShell = fmt.Sprintf("__K3D_CLUSTER__=%s", cluster)
newEnv := append(os.Environ(), setPS1, setKube, subShell) newEnv := append(os.Environ(), setPrompt, setKube, subShell)
cmd.Env = newEnv cmd.Env = newEnv

@ -61,8 +61,8 @@ func main() {
}, },
cli.StringFlag{ cli.StringFlag{
Name: "shell, s", Name: "shell, s",
Value: "bash", Value: "auto",
Usage: "Sub shell type. Only bash is supported. (default bash)", Usage: "which shell to use. One of [auto, bash, zsh]",
}, },
}, },
Action: run.Shell, Action: run.Shell,

Loading…
Cancel
Save