forked from coop-cloud/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:
parent
56c3e070f5
commit
e589709cb0
|
@ -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")...)...)
|
||||||
|
|
Loading…
Reference in New Issue