github.com/amanya/packer@v0.12.1-0.20161117214323-902ac5ab2eb6/builder/cloudstack/ssh.go (about)

     1  package cloudstack
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  
     7  	"github.com/mitchellh/multistep"
     8  	packerssh "github.com/mitchellh/packer/communicator/ssh"
     9  	"github.com/xanzy/go-cloudstack/cloudstack"
    10  	"golang.org/x/crypto/ssh"
    11  )
    12  
    13  func commHost(state multistep.StateBag) (string, error) {
    14  	client := state.Get("client").(*cloudstack.CloudStackClient)
    15  	config := state.Get("config").(*Config)
    16  
    17  	if config.hostAddress == "" {
    18  		ipAddr, _, err := client.Address.GetPublicIpAddressByID(config.PublicIPAddress)
    19  		if err != nil {
    20  			return "", fmt.Errorf("Failed to retrieve IP address: %s", err)
    21  		}
    22  
    23  		config.hostAddress = ipAddr.Ipaddress
    24  	}
    25  
    26  	return config.hostAddress, nil
    27  }
    28  
    29  func sshConfig(state multistep.StateBag) (*ssh.ClientConfig, error) {
    30  	config := state.Get("config").(*Config)
    31  
    32  	clientConfig := &ssh.ClientConfig{
    33  		User: config.Comm.SSHUsername,
    34  		Auth: []ssh.AuthMethod{
    35  			ssh.Password(config.Comm.SSHPassword),
    36  			ssh.KeyboardInteractive(
    37  				packerssh.PasswordKeyboardInteractive(config.Comm.SSHPassword)),
    38  		},
    39  	}
    40  
    41  	if config.Comm.SSHPrivateKey != "" {
    42  		privateKey, err := ioutil.ReadFile(config.Comm.SSHPrivateKey)
    43  		if err != nil {
    44  			return nil, fmt.Errorf("Error loading configured private key file: %s", err)
    45  		}
    46  
    47  		signer, err := ssh.ParsePrivateKey([]byte(privateKey))
    48  		if err != nil {
    49  			return nil, fmt.Errorf("Error setting up SSH config: %s", err)
    50  		}
    51  
    52  		clientConfig.Auth = []ssh.AuthMethod{ssh.PublicKeys(signer)}
    53  	}
    54  
    55  	return clientConfig, nil
    56  }