in src/terraform/providers/terraform-provider-avere/ssh.go [73:132]
func SSHCommand(host string, username string, authMethod ssh.AuthMethod, cmd string, port int) (bytes.Buffer, bytes.Buffer, error) {
var stdoutBuf, stderrBuf bytes.Buffer
sshConfig := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
authMethod,
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
connection, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", host, port), sshConfig)
if err != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("failed to create connection: %s", err)
}
session, err := connection.NewSession()
if err != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("failed to get new session: %s", err)
}
defer session.Close()
stdoutIn, err := session.StdoutPipe()
if err != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("Unable to setup stdout for session: %s", err)
}
stderrIn, err := session.StderrPipe()
if err != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("Unable to setup stderr for session: %s", err)
}
if err := session.Start(cmd); err != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("failed to start the command: %s", err)
}
var wg sync.WaitGroup
wg.Add(1)
var errStdout, errStderr error
go func() {
_, errStdout = io.Copy(&stdoutBuf, stdoutIn)
wg.Done()
}()
_, errStderr = io.Copy(&stderrBuf, stderrIn)
wg.Wait()
if err := session.Wait(); err != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("cmd.Run failed with %s", err)
}
if errStdout != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("failed to capture stdout: %s", errStdout)
}
if errStderr != nil {
return stdoutBuf, stderrBuf, fmt.Errorf("failed to capture stderr: %s", errStderr)
}
return stdoutBuf, stderrBuf, nil
}