func cmdEnv(c *cli.Context) { if len(c.Args()) != 1 && !c.Bool("unset") { log.Fatal(improperEnvArgsError) } userShell := c.String("shell") if userShell == "" { shell, err := detectShell() if err != nil { log.Fatal(err) } userShell = shell } t := template.New("envConfig") usageHint := generateUsageHint(c.App.Name, c.Args().First(), userShell) shellCfg := ShellConfig{ DockerCertPath: "", DockerHost: "", DockerTLSVerify: "", MachineName: "", } // unset vars if c.Bool("unset") { switch userShell { case "fish": shellCfg.Prefix = "set -e " shellCfg.Delimiter = "" shellCfg.Suffix = ";\n" case "powershell": shellCfg.Prefix = "Remove-Item Env:\\\\" shellCfg.Delimiter = "" shellCfg.Suffix = "\n" case "cmd": // since there is no way to unset vars in cmd just reset to empty shellCfg.DockerCertPath = "" shellCfg.DockerHost = "" shellCfg.DockerTLSVerify = "" shellCfg.Prefix = "set " shellCfg.Delimiter = "=" shellCfg.Suffix = "\n" default: shellCfg.Prefix = "unset " shellCfg.Delimiter = " " shellCfg.Suffix = "\n" } tmpl, err := t.Parse(envTmpl) if err != nil { log.Fatal(err) } if err := tmpl.Execute(os.Stdout, shellCfg); err != nil { log.Fatal(err) } return } cfg, err := getMachineConfig(c) if err != nil { log.Fatal(err) } if cfg.machineUrl == "" { log.Fatalf("%s is not running. Please start this with %s start %s", cfg.machineName, c.App.Name, cfg.machineName) } dockerHost := cfg.machineUrl if c.Bool("swarm") { if !cfg.SwarmOptions.Master { log.Fatalf("%s is not a swarm master", cfg.machineName) } u, err := url.Parse(cfg.SwarmOptions.Host) if err != nil { log.Fatal(err) } parts := strings.Split(u.Host, ":") swarmPort := parts[1] // get IP of machine to replace in case swarm host is 0.0.0.0 mUrl, err := url.Parse(cfg.machineUrl) if err != nil { log.Fatal(err) } mParts := strings.Split(mUrl.Host, ":") machineIp := mParts[0] dockerHost = fmt.Sprintf("tcp://%s:%s", machineIp, swarmPort) } u, err := url.Parse(cfg.machineUrl) if err != nil { log.Fatal(err) } if u.Scheme != "unix" { // validate cert and regenerate if needed valid, err := utils.ValidateCertificate( u.Host, cfg.caCertPath, cfg.serverCertPath, cfg.serverKeyPath, ) if err != nil { log.Fatal(err) } if !valid { log.Debugf("invalid certs detected; regenerating for %s", u.Host) if err := runActionWithContext("configureAuth", c); err != nil { log.Fatal(err) } } } shellCfg = ShellConfig{ DockerCertPath: cfg.machineDir, DockerHost: dockerHost, DockerTLSVerify: "1", UsageHint: usageHint, MachineName: cfg.machineName, } switch userShell { case "fish": shellCfg.Prefix = "set -x " shellCfg.Suffix = "\";\n" shellCfg.Delimiter = " \"" case "powershell": shellCfg.Prefix = "$Env:" shellCfg.Suffix = "\"\n" shellCfg.Delimiter = " = \"" case "cmd": shellCfg.Prefix = "set " shellCfg.Suffix = "\n" shellCfg.Delimiter = "=" default: shellCfg.Prefix = "export " shellCfg.Suffix = "\"\n" shellCfg.Delimiter = "=\"" } tmpl, err := t.Parse(envTmpl) if err != nil { log.Fatal(err) } if err := tmpl.Execute(os.Stdout, shellCfg); err != nil { log.Fatal(err) } }
func cmdConfig(c *cli.Context) { cfg, err := getMachineConfig(c) if err != nil { log.Fatal(err) } dockerHost, err := getHost(c).Driver.GetURL() if err != nil { log.Fatal(err) } if c.Bool("swarm") { if !cfg.SwarmOptions.Master { log.Fatalf("%s is not a swarm master", cfg.machineName) } u, err := url.Parse(cfg.SwarmOptions.Host) if err != nil { log.Fatal(err) } parts := strings.Split(u.Host, ":") swarmPort := parts[1] // get IP of machine to replace in case swarm host is 0.0.0.0 mUrl, err := url.Parse(dockerHost) if err != nil { log.Fatal(err) } mParts := strings.Split(mUrl.Host, ":") machineIp := mParts[0] dockerHost = fmt.Sprintf("tcp://%s:%s", machineIp, swarmPort) } log.Debug(dockerHost) u, err := url.Parse(cfg.machineUrl) if err != nil { log.Fatal(err) } if u.Scheme != "unix" { // validate cert and regenerate if needed valid, err := utils.ValidateCertificate( u.Host, cfg.caCertPath, cfg.serverCertPath, cfg.serverKeyPath, ) if err != nil { log.Fatal(err) } if !valid { log.Debugf("invalid certs detected; regenerating for %s", u.Host) if err := runActionWithContext("configureAuth", c); err != nil { log.Fatal(err) } } } fmt.Printf("--tlsverify --tlscacert=%q --tlscert=%q --tlskey=%q -H=%s", cfg.caCertPath, cfg.clientCertPath, cfg.clientKeyPath, dockerHost) }
func cmdEnv(c *cli.Context) { userShell := filepath.Base(os.Getenv("SHELL")) if c.Bool("unset") { switch userShell { case "fish": fmt.Printf("set -e DOCKER_TLS_VERIFY;\nset -e DOCKER_CERT_PATH;\nset -e DOCKER_HOST;\n") default: fmt.Println("unset DOCKER_TLS_VERIFY DOCKER_CERT_PATH DOCKER_HOST") } return } cfg, err := getMachineConfig(c) if err != nil { log.Fatal(err) } if cfg.machineUrl == "" { log.Fatalf("%s is not running. Please start this with docker-machine start %s", cfg.machineName, cfg.machineName) } dockerHost := cfg.machineUrl if c.Bool("swarm") { if !cfg.SwarmOptions.Master { log.Fatalf("%s is not a swarm master", cfg.machineName) } u, err := url.Parse(cfg.SwarmOptions.Host) if err != nil { log.Fatal(err) } parts := strings.Split(u.Host, ":") swarmPort := parts[1] // get IP of machine to replace in case swarm host is 0.0.0.0 mUrl, err := url.Parse(cfg.machineUrl) if err != nil { log.Fatal(err) } mParts := strings.Split(mUrl.Host, ":") machineIp := mParts[0] dockerHost = fmt.Sprintf("tcp://%s:%s", machineIp, swarmPort) } u, err := url.Parse(cfg.machineUrl) if err != nil { log.Fatal(err) } if u.Scheme != "unix" { // validate cert and regenerate if needed valid, err := utils.ValidateCertificate( u.Host, cfg.caCertPath, cfg.serverCertPath, cfg.serverKeyPath, ) if err != nil { log.Fatal(err) } if !valid { log.Debugf("invalid certs detected; regenerating for %s", u.Host) if err := runActionWithContext("configureAuth", c); err != nil { log.Fatal(err) } } } usageHint := generateUsageHint(c.Args().First(), userShell) switch userShell { case "fish": fmt.Printf("set -x DOCKER_TLS_VERIFY 1;\nset -x DOCKER_CERT_PATH %q;\nset -x DOCKER_HOST %s;\n\n%s\n", cfg.machineDir, dockerHost, usageHint) default: fmt.Printf("export DOCKER_TLS_VERIFY=1\nexport DOCKER_CERT_PATH=%q\nexport DOCKER_HOST=%s\n\n%s\n", cfg.machineDir, dockerHost, usageHint) } }