summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2020-05-20 14:10:56 +0100
committerPaul Buetow <pbuetow@mimecast.com>2020-05-20 14:10:56 +0100
commit724b6c82f591ec696f14dfb7d6e8e133eff1072f (patch)
tree98fffb253e0408f52ec39324c377b7db4a6ae79d /internal
parent02f60d098e659cee33e42f501b2b07508abbae0a (diff)
can specify a private ssh key via command line, no password support yet though
Diffstat (limited to 'internal')
-rw-r--r--internal/clients/args.go1
-rw-r--r--internal/clients/baseclient.go2
-rw-r--r--internal/ssh/client/authmethods.go62
-rw-r--r--internal/version/version.go4
4 files changed, 48 insertions, 21 deletions
diff --git a/internal/clients/args.go b/internal/clients/args.go
index b4852d4..1145a4b 100644
--- a/internal/clients/args.go
+++ b/internal/clients/args.go
@@ -20,4 +20,5 @@ type Args struct {
Timeout int
SSHAuthMethods []gossh.AuthMethod
SSHHostKeyCallback gossh.HostKeyCallback
+ PrivateKeyPathFile string
}
diff --git a/internal/clients/baseclient.go b/internal/clients/baseclient.go
index 10a5559..1c75205 100644
--- a/internal/clients/baseclient.go
+++ b/internal/clients/baseclient.go
@@ -40,7 +40,7 @@ func (c *baseClient) init(maker maker) {
logger.Info("Initiating base client")
c.maker = maker
- c.sshAuthMethods, c.hostKeyCallback = client.InitSSHAuthMethods(c.Args.SSHAuthMethods, c.Args.SSHHostKeyCallback, c.Args.TrustAllHosts, c.throttleCh)
+ c.sshAuthMethods, c.hostKeyCallback = client.InitSSHAuthMethods(c.Args.SSHAuthMethods, c.Args.SSHHostKeyCallback, c.Args.TrustAllHosts, c.throttleCh, c.Args.PrivateKeyPathFile)
discoveryService := discovery.New(c.Discovery, c.ServersStr, discovery.Shuffle)
diff --git a/internal/ssh/client/authmethods.go b/internal/ssh/client/authmethods.go
index a310159..2ff80b2 100644
--- a/internal/ssh/client/authmethods.go
+++ b/internal/ssh/client/authmethods.go
@@ -11,7 +11,7 @@ import (
)
// InitSSHAuthMethods initialises all known SSH auth methods on the client side.
-func InitSSHAuthMethods(sshAuthMethods []gossh.AuthMethod, hostKeyCallback gossh.HostKeyCallback, trustAllHosts bool, throttleCh chan struct{}) ([]gossh.AuthMethod, HostKeyCallback) {
+func InitSSHAuthMethods(sshAuthMethods []gossh.AuthMethod, hostKeyCallback gossh.HostKeyCallback, trustAllHosts bool, throttleCh chan struct{}, privateKeyPath string) ([]gossh.AuthMethod, HostKeyCallback) {
if len(sshAuthMethods) > 0 {
simpleCallback, err := NewSimpleCallback()
if err != nil {
@@ -20,39 +20,65 @@ func InitSSHAuthMethods(sshAuthMethods []gossh.AuthMethod, hostKeyCallback gossh
return sshAuthMethods, simpleCallback
}
- return initKnownHostsAuthMethods(trustAllHosts, throttleCh)
+ return initKnownHostsAuthMethods(trustAllHosts, throttleCh, privateKeyPath)
}
-func initKnownHostsAuthMethods(trustAllHosts bool, throttleCh chan struct{}) ([]gossh.AuthMethod, HostKeyCallback) {
+func initKnownHostsAuthMethods(trustAllHosts bool, throttleCh chan struct{}, privateKeyPath string) ([]gossh.AuthMethod, HostKeyCallback) {
var sshAuthMethods []gossh.AuthMethod
+
+ knownHostsPath := os.Getenv("HOME") + "/.ssh/known_hosts"
+ knownHostsCallback, err := NewKnownHostsCallback(knownHostsPath, trustAllHosts, throttleCh)
+ if err != nil {
+ logger.FatalExit(knownHostsPath, err)
+ }
+ logger.Debug("initKnownHostsAuthMethods", "Added known hosts file path", knownHostsPath)
+
if config.Common.ExperimentalFeaturesEnable {
sshAuthMethods = append(sshAuthMethods, gossh.Password("experimental feature test"))
- logger.Debug("Added experimental method to list of auth methods")
+ logger.Debug("initKnownHostsAuthMethods", "Added experimental method to list of auth methods")
}
- keyPath := os.Getenv("HOME") + "/.ssh/id_rsa"
- if authMethod, err := ssh.PrivateKey(keyPath); err == nil {
- sshAuthMethods = append(sshAuthMethods, authMethod)
- logger.Debug("Added path to list of auth methods", keyPath)
+ // First try to read custom private key path.
+ if privateKeyPath != "" {
+ authMethod, err := ssh.PrivateKey(privateKeyPath)
+ if err == nil {
+ sshAuthMethods = append(sshAuthMethods, authMethod)
+ logger.Debug("initKnownHostsAuthMethods", "Added path to list of auth methods, not adding further methods", privateKeyPath)
+ return sshAuthMethods, knownHostsCallback
+ }
+ logger.FatalExit("Unable to use private SSH key", privateKeyPath, err)
}
- keyPath = os.Getenv("HOME") + "/.ssh/id_dsa"
- if authMethod, err := ssh.PrivateKey(keyPath); err == nil {
+ // Second, try SSH Agent
+ authMethod, err := ssh.Agent()
+ if err == nil {
sshAuthMethods = append(sshAuthMethods, authMethod)
- logger.Debug("Added path to list of auth methods", keyPath)
+ logger.Debug("initKnownHostsAuthMethods", "Added SSH Agent (SSH_AUTH_SOCK) to list of auth methods, not adding further methods")
+ return sshAuthMethods, knownHostsCallback
}
+ logger.Debug("initKnownHostsAuthMethods", "Unable to init SSH Agent auth method", err)
- if authMethod, err := ssh.Agent(); err == nil {
+ // Third, try Linux/UNIX default key paths
+ privateKeyPath = os.Getenv("HOME") + "/.ssh/id_rsa"
+ authMethod, err = ssh.PrivateKey(privateKeyPath)
+ if err == nil {
sshAuthMethods = append(sshAuthMethods, authMethod)
- logger.Debug("Added SSH Agent to list of auth methods")
+ logger.Debug("initKnownHostsAuthmethods", "Added path to list of auth methods, not adding further methods", privateKeyPath)
+ return sshAuthMethods, knownHostsCallback
}
+ logger.Debug("initKnownHostsAuthMethods", "Unable to use private key", privateKeyPath, err)
- knownHostsPath := os.Getenv("HOME") + "/.ssh/known_hosts"
- knownHostsCallback, err := NewKnownHostsCallback(knownHostsPath, trustAllHosts, throttleCh)
- if err != nil {
- logger.FatalExit(knownHostsPath, err)
+ privateKeyPath = os.Getenv("HOME") + "/.ssh/id_dsa"
+ authMethod, err = ssh.PrivateKey(privateKeyPath)
+ if err == nil {
+ sshAuthMethods = append(sshAuthMethods, authMethod)
+ logger.Debug("initKnownHostsAuthmethods", "Added path to list of auth methods, not adding further methods", privateKeyPath)
+ return sshAuthMethods, knownHostsCallback
}
- logger.Debug("Added known hosts file path", knownHostsPath)
+ logger.Debug("initKnownHostsAuthMethods", "Unable to use private key", privateKeyPath, err)
+
+ logger.FatalExit("Unable to find private SSH key information")
+ // Never reach this point.
return sshAuthMethods, knownHostsCallback
}
diff --git a/internal/version/version.go b/internal/version/version.go
index 6e1940c..07f75ec 100644
--- a/internal/version/version.go
+++ b/internal/version/version.go
@@ -11,9 +11,9 @@ const (
// Name of DTail.
Name string = "DTail"
// Version of DTail.
- Version string = "2.2.1"
+ Version string = "2.2.2"
// Additional information for DTail
- Additional string = ""
+ Additional string = "develop"
// ProtocolCompat -ibility version.
ProtocolCompat string = "2"
)