Use the builtin timeout provided by SSH
This commit is contained in:
@@ -161,7 +161,17 @@ type realSSHDialer struct{}
|
||||
var _ sshDialer = &realSSHDialer{}
|
||||
|
||||
func (d *realSSHDialer) Dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) {
|
||||
return ssh.Dial(network, addr, config)
|
||||
conn, err := net.DialTimeout(network, addr, config.Timeout)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
conn.SetReadDeadline(time.Now().Add(30 * time.Second))
|
||||
c, chans, reqs, err := ssh.NewClientConn(conn, addr, config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
conn.SetReadDeadline(time.Time{})
|
||||
return ssh.NewClient(c, chans, reqs), nil
|
||||
}
|
||||
|
||||
// timeoutDialer wraps an sshDialer with a timeout around Dial(). The golang
|
||||
@@ -180,20 +190,8 @@ const sshDialTimeout = 150 * time.Second
|
||||
var realTimeoutDialer sshDialer = &timeoutDialer{&realSSHDialer{}, sshDialTimeout}
|
||||
|
||||
func (d *timeoutDialer) Dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) {
|
||||
var client *ssh.Client
|
||||
errCh := make(chan error, 1)
|
||||
go func() {
|
||||
defer runtime.HandleCrash()
|
||||
var err error
|
||||
client, err = d.dialer.Dial(network, addr, config)
|
||||
errCh <- err
|
||||
}()
|
||||
select {
|
||||
case err := <-errCh:
|
||||
return client, err
|
||||
case <-time.After(d.timeout):
|
||||
return nil, fmt.Errorf("timed out dialing %s:%s", network, addr)
|
||||
}
|
||||
config.Timeout = d.timeout
|
||||
return d.dialer.Dial(network, addr, config)
|
||||
}
|
||||
|
||||
// RunSSHCommand returns the stdout, stderr, and exit code from running cmd on
|
||||
|
Reference in New Issue
Block a user