71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
package vagrant
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"strconv"
|
|
|
|
"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
|
|
}
|
|
|
|
func (s *StepSSHConfig) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
|
|
driver := state.Get("driver").(VagrantDriver)
|
|
config := state.Get("config").(*Config)
|
|
|
|
box := "source"
|
|
if s.GlobalID != "" {
|
|
box = s.GlobalID
|
|
}
|
|
sshConfig, err := driver.SSHConfig(box)
|
|
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")
|
|
unquoted, err := strconv.Unquote(sshConfig.IdentityFile)
|
|
if err == nil {
|
|
sshConfig.IdentityFile = unquoted
|
|
}
|
|
config.Comm.SSHPrivateKeyFile = sshConfig.IdentityFile
|
|
config.Comm.SSHUsername = sshConfig.User
|
|
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
func (s *StepSSHConfig) Cleanup(state multistep.StateBag) {
|
|
}
|