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 }