forked from toolshed/abra
		
	fix: attempt to include IdentityFile if available
This is part of trying to debug:
    coop-cloud/organising#250
And also part of:
    coop-cloud/docs.coopcloud.tech#27
Where I now try to specify the same logic as `ssh -i <my-key-path>` in
the underlying connection logic. This should help with being more
explicit about what key is being used via the SSH config file.
			
			
This commit is contained in:
		@ -563,11 +563,16 @@ func GetHostConfig(hostname, username, port string) (HostConfig, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	idf = ssh_config.Get(hostname, "IdentityFile")
 | 
						idf = ssh_config.Get(hostname, "IdentityFile")
 | 
				
			||||||
 | 
					 | 
				
			||||||
	hostConfig.Host = host
 | 
					 | 
				
			||||||
	if idf != "" {
 | 
						if idf != "" {
 | 
				
			||||||
 | 
							var err error
 | 
				
			||||||
 | 
							idf, err = identityFileAbsPath(idf)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return hostConfig, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		hostConfig.IdentityFile = idf
 | 
							hostConfig.IdentityFile = idf
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hostConfig.Host = host
 | 
				
			||||||
	hostConfig.Port = port
 | 
						hostConfig.Port = port
 | 
				
			||||||
	hostConfig.User = username
 | 
						hostConfig.User = username
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -575,3 +580,25 @@ func GetHostConfig(hostname, username, port string) (HostConfig, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return hostConfig, nil
 | 
						return hostConfig, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func identityFileAbsPath(relPath string) (string, error) {
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						var absPath string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if strings.HasPrefix(relPath, "~/") {
 | 
				
			||||||
 | 
							systemUser, err := user.Current()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return absPath, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							absPath = filepath.Join(systemUser.HomeDir, relPath[2:])
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							absPath, err = filepath.Abs(relPath)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return absPath, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logrus.Debugf("resolved %s to %s to read the ssh identity file", relPath, absPath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return absPath, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ package commandconn
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -34,9 +35,25 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*connhelper.Conne
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errors.Wrap(err, "ssh host connection is not valid")
 | 
								return nil, errors.Wrap(err, "ssh host connection is not valid")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := sshPkg.EnsureHostKey(ctxConnDetails.Host); err != nil {
 | 
							if err := sshPkg.EnsureHostKey(ctxConnDetails.Host); err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							hostConfig, err := sshPkg.GetHostConfig(
 | 
				
			||||||
 | 
								ctxConnDetails.Host,
 | 
				
			||||||
 | 
								ctxConnDetails.User,
 | 
				
			||||||
 | 
								ctxConnDetails.Port,
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if hostConfig.IdentityFile != "" {
 | 
				
			||||||
 | 
								msg := "discovered %s as identity file for %s, using for ssh connection"
 | 
				
			||||||
 | 
								logrus.Debugf(msg, hostConfig.IdentityFile, ctxConnDetails.Host)
 | 
				
			||||||
 | 
								sshFlags = append(sshFlags, fmt.Sprintf("-o IdentityFile=%s", hostConfig.IdentityFile))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return &connhelper.ConnectionHelper{
 | 
							return &connhelper.ConnectionHelper{
 | 
				
			||||||
			Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
 | 
								Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
 | 
				
			||||||
				return New(ctx, "ssh", append(sshFlags, ctxConnDetails.Args("docker", "system", "dial-stdio")...)...)
 | 
									return New(ctx, "ssh", append(sshFlags, ctxConnDetails.Args("docker", "system", "dial-stdio")...)...)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user