packer-cn/builder/vagrant/step_ssh_config.go

75 lines
2.0 KiB
Go
Raw Normal View History

2019-01-11 17:06:15 -05:00
package vagrant
import (
"context"
"log"
2019-01-11 17:06:15 -05:00
"strconv"
"strings"
2019-01-11 17:06:15 -05:00
"github.com/hashicorp/packer/helper/multistep"
)
// Vagrant already sets up ssh on the guests; our job is to find out what
// it did. We can do that with the ssh-config command. Example output:
// $ vagrant ssh-config
// Host default
// HostName 172.16.41.194
// User vagrant
// Port 22
// UserKnownHostsFile /dev/null
// StrictHostKeyChecking no
// PasswordAuthentication no
// IdentityFile /Users/mmarsh/Projects/vagrant-boxes/ubuntu/.vagrant/machines/default/vmware_fusion/private_key
// IdentitiesOnly yes
// LogLevel FATAL
type StepSSHConfig struct {
GlobalID string
}
2019-01-11 17:06:15 -05:00
func (s *StepSSHConfig) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
2019-01-11 17:06:15 -05:00
driver := state.Get("driver").(VagrantDriver)
config := state.Get("config").(*Config)
box := "source"
if s.GlobalID != "" {
box = s.GlobalID
}
sshConfig, err := driver.SSHConfig(box)
2019-01-11 17:06:15 -05:00
if err != nil {
state.Put("error", err)
return multistep.ActionHalt
}
config.Comm.SSHHost = sshConfig.Hostname
port, err := strconv.Atoi(sshConfig.Port)
if err != nil {
state.Put("error", err)
return multistep.ActionHalt
}
config.Comm.SSHPort = port
if config.Comm.SSHUsername != "" {
// If user has set the username within the communicator, use the
// auth provided there.
return multistep.ActionContinue
}
log.Printf("identity file is %s", sshConfig.IdentityFile)
log.Printf("Removing quotes from identity file")
if strings.HasPrefix(sshConfig.IdentityFile, "\"") {
sshConfig.IdentityFile = sshConfig.IdentityFile[1:]
if strings.HasSuffix(sshConfig.IdentityFile, "\"") {
sshConfig.IdentityFile = sshConfig.IdentityFile[:len(sshConfig.IdentityFile)-1]
}
log.Printf("identity file is now %s", sshConfig.IdentityFile)
}
config.Comm.SSHPrivateKeyFile = sshConfig.IdentityFile
config.Comm.SSHUsername = sshConfig.User
2019-01-11 17:06:15 -05:00
return multistep.ActionContinue
}
func (s *StepSSHConfig) Cleanup(state multistep.StateBag) {
}