mirror of https://github.com/docker/docs.git
71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package drivers
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/docker/machine/libmachine/log"
|
|
"github.com/docker/machine/libmachine/mcnutils"
|
|
"github.com/docker/machine/libmachine/ssh"
|
|
)
|
|
|
|
func GetSSHClientFromDriver(d Driver) (ssh.Client, error) {
|
|
address, err := d.GetSSHHostname()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
port, err := d.GetSSHPort()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
auth := &ssh.Auth{
|
|
Keys: []string{d.GetSSHKeyPath()},
|
|
}
|
|
|
|
client, err := ssh.NewClient(d.GetSSHUsername(), address, port, auth)
|
|
return client, err
|
|
|
|
}
|
|
|
|
func RunSSHCommandFromDriver(d Driver, command string) (string, error) {
|
|
client, err := GetSSHClientFromDriver(d)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
log.Debugf("About to run SSH command:\n%s", command)
|
|
|
|
output, err := client.Output(command)
|
|
log.Debugf("SSH cmd err, output: %v: %s", err, output)
|
|
if err != nil {
|
|
return "", fmt.Errorf(`Something went wrong running an SSH command!
|
|
command : %s
|
|
err : %v
|
|
output : %s
|
|
`, command, err, output)
|
|
}
|
|
|
|
return output, nil
|
|
}
|
|
|
|
func sshAvailableFunc(d Driver) func() bool {
|
|
return func() bool {
|
|
log.Debug("Getting to WaitForSSH function...")
|
|
if _, err := RunSSHCommandFromDriver(d, "exit 0"); err != nil {
|
|
log.Debugf("Error getting ssh command 'exit 0' : %s", err)
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
func WaitForSSH(d Driver) error {
|
|
// Try to dial SSH for 30 seconds before timing out.
|
|
if err := mcnutils.WaitForSpecific(sshAvailableFunc(d), 6, 5*time.Second); err != nil {
|
|
return fmt.Errorf("Too many retries waiting for SSH to be available. Last error: %s", err)
|
|
}
|
|
return nil
|
|
}
|