diff --git a/pkg/devspace/config/versions/latest/schema.go b/pkg/devspace/config/versions/latest/schema.go index f77f172b15..5c2b4ec2f7 100644 --- a/pkg/devspace/config/versions/latest/schema.go +++ b/pkg/devspace/config/versions/latest/schema.go @@ -956,6 +956,9 @@ type SSH struct { // RemoteAddress is the address to listen to inside the container RemoteAddress string `yaml:"remoteAddress,omitempty" json:"remoteAddress,omitempty" jsonschema_description:"RemoteAddress is the address to listen to inside the container."` + + // UseInclude tells DevSpace to use a different file for ssh config + UseInclude bool `yaml:"useInclude,omitempty" json:"useInclude,omitempty"` } type EnvVar struct { diff --git a/pkg/devspace/services/ssh/config.go b/pkg/devspace/services/ssh/config.go index 02e5d679ee..c92178206f 100644 --- a/pkg/devspace/services/ssh/config.go +++ b/pkg/devspace/services/ssh/config.go @@ -21,7 +21,43 @@ var ( MarkerEndPrefix = "# DevSpace End " ) -func configureSSHConfig(host, port string, log log.Logger) error { +func configureSSHConfig(host, port string, useInclude bool, log log.Logger) error { + if useInclude { + return configureSSHConfigSeparateFile(host, port, log) + } + + return configureSSHConfigSameFile(host, port, log) +} + +func configureSSHConfigSameFile(host, port string, log log.Logger) error { + configLock.Lock() + defer configLock.Unlock() + + homeDir, err := homedir.Dir() + if err != nil { + return errors.Wrap(err, "get home dir") + } + + sshConfigPath := filepath.Join(homeDir, ".ssh", "config") + newFile, err := addHost(sshConfigPath, host, port) + if err != nil { + return errors.Wrap(err, "parse ssh config") + } + + err = os.MkdirAll(filepath.Dir(sshConfigPath), 0755) + if err != nil { + log.Debugf("error creating ssh directory: %v", err) + } + + err = ioutil.WriteFile(sshConfigPath, []byte(newFile), 0600) + if err != nil { + return errors.Wrap(err, "write ssh config") + } + + return nil +} + +func configureSSHConfigSeparateFile(host, port string, log log.Logger) error { configLock.Lock() defer configLock.Unlock() diff --git a/pkg/devspace/services/ssh/port.go b/pkg/devspace/services/ssh/port.go index 9a486d4bf9..c798afd51a 100644 --- a/pkg/devspace/services/ssh/port.go +++ b/pkg/devspace/services/ssh/port.go @@ -40,11 +40,18 @@ func NewManager(log log.Logger) PortManager { if err != nil { log.Errorf("error parsing %s: %v", sshConfigPath, err) } - reservedPorts := map[int]bool{} for _, h := range hosts { reservedPorts[h.Port] = true } + sshConfigPath = filepath.Join(homeDir, ".ssh", "devspace_config") + hosts, err = ParseDevSpaceHosts(sshConfigPath) + if err != nil { + log.Errorf("error parsing %s: %v", sshConfigPath, err) + } + for _, h := range hosts { + reservedPorts[h.Port] = true + } return &manager{ reservedPorts: reservedPorts, diff --git a/pkg/devspace/services/ssh/ssh.go b/pkg/devspace/services/ssh/ssh.go index f8c77fbe8a..ea7b12ff54 100644 --- a/pkg/devspace/services/ssh/ssh.go +++ b/pkg/devspace/services/ssh/ssh.go @@ -73,7 +73,10 @@ func startSSH(ctx devspacecontext.Context, name, arch string, sshConfig *latest. // get port port := sshConfig.LocalPort if port == 0 { - sshDevSpaceConfigPath := filepath.Join(homeDir, ".ssh", "devspace_config") + sshDevSpaceConfigPath := filepath.Join(homeDir, ".ssh", "config") + if sshConfig.UseInclude { + sshDevSpaceConfigPath = filepath.Join(homeDir, ".ssh", "devspace_config") + } hosts, err := ParseDevSpaceHosts(sshDevSpaceConfigPath) if err != nil { ctx.Log().Debugf("error parsing %s: %v", sshDevSpaceConfigPath, err) @@ -92,7 +95,7 @@ func startSSH(ctx devspacecontext.Context, name, arch string, sshConfig *latest. } // update ssh config - err = configureSSHConfig(sshHost, strconv.Itoa(port), ctx.Log()) + err = configureSSHConfig(sshHost, strconv.Itoa(port), sshConfig.UseInclude, ctx.Log()) if err != nil { return errors.Wrap(err, "update ssh config") } @@ -104,7 +107,7 @@ func startSSH(ctx devspacecontext.Context, name, arch string, sshConfig *latest. } // update ssh config - err = configureSSHConfig(sshHost, strconv.Itoa(port), ctx.Log()) + err = configureSSHConfig(sshHost, strconv.Itoa(port), sshConfig.UseInclude, ctx.Log()) if err != nil { return errors.Wrap(err, "update ssh config") }