mirror of https://github.com/k3d-io/k3d
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
1.9 KiB
100 lines
1.9 KiB
package run
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
)
|
|
|
|
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)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// check if we're already in a subshell
|
|
subShell := os.ExpandEnv("$__K3D_CLUSTER__")
|
|
if len(subShell) > 0 {
|
|
return fmt.Errorf("Error: Already in subshell of cluster %s", subShell)
|
|
}
|
|
|
|
// get path of shell executable
|
|
shellPath, err := exec.LookPath(shell)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// set shell specific options (command line flags)
|
|
shellOptions := shells[shell].Options
|
|
|
|
cmd := exec.Command(shellPath, shellOptions...)
|
|
|
|
if len(command) > 0 {
|
|
cmd.Args = append(cmd.Args, "-c", command)
|
|
|
|
}
|
|
|
|
// Set up stdio
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stdin = os.Stdin
|
|
cmd.Stderr = os.Stderr
|
|
|
|
// Set up Promot
|
|
setPrompt := fmt.Sprintf("%s=[%s} %s", shells[shell].Prompt, cluster, os.Getenv(shells[shell].Prompt))
|
|
|
|
// Set up KUBECONFIG
|
|
setKube := fmt.Sprintf("KUBECONFIG=%s", kubeConfigPath)
|
|
|
|
// Declare subshell
|
|
subShell = fmt.Sprintf("__K3D_CLUSTER__=%s", cluster)
|
|
|
|
newEnv := append(os.Environ(), setPrompt, setKube, subShell)
|
|
|
|
cmd.Env = newEnv
|
|
|
|
return cmd.Run()
|
|
}
|
|
|