From 76a82216368b42935fffb0ead6756df93987b3bb Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 3 Sep 2014 20:23:39 -0700 Subject: [PATCH] builder/*: extract key path to ssh.Signer --- builder/parallels/common/ssh.go | 28 ++++------------------- builder/parallels/common/ssh_config.go | 6 +++-- builder/qemu/builder.go | 10 +++++---- builder/qemu/ssh.go | 28 ++++------------------- builder/virtualbox/common/ssh.go | 28 ++++------------------- builder/virtualbox/common/ssh_config.go | 6 +++-- builder/vmware/common/ssh.go | 25 +++------------------ builder/vmware/common/ssh_config.go | 3 ++- common/ssh/key.go | 30 +++++++++++++++++++++++++ 9 files changed, 61 insertions(+), 103 deletions(-) create mode 100644 common/ssh/key.go diff --git a/builder/parallels/common/ssh.go b/builder/parallels/common/ssh.go index 04aed86a2..e914583c1 100644 --- a/builder/parallels/common/ssh.go +++ b/builder/parallels/common/ssh.go @@ -1,12 +1,12 @@ package common import ( - "code.google.com/p/go.crypto/ssh" "fmt" + + "code.google.com/p/go.crypto/ssh" "github.com/mitchellh/multistep" + commonssh "github.com/mitchellh/packer/common/ssh" packerssh "github.com/mitchellh/packer/communicator/ssh" - "io/ioutil" - "os" ) func SSHAddress(state multistep.StateBag) (string, error) { @@ -35,7 +35,7 @@ func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig } if config.SSHKeyPath != "" { - signer, err := sshKeyToSigner(config.SSHKeyPath) + signer, err := commonssh.FileSigner(config.SSHKeyPath) if err != nil { return nil, err } @@ -49,23 +49,3 @@ func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig }, nil } } - -func sshKeyToSigner(path string) (ssh.Signer, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - - keyBytes, err := ioutil.ReadAll(f) - if err != nil { - return nil, err - } - - signer, err := ssh.ParsePrivateKey(keyBytes) - if err != nil { - return nil, fmt.Errorf("Error setting up SSH config: %s", err) - } - - return signer, nil -} diff --git a/builder/parallels/common/ssh_config.go b/builder/parallels/common/ssh_config.go index f28fb3029..d89daa103 100644 --- a/builder/parallels/common/ssh_config.go +++ b/builder/parallels/common/ssh_config.go @@ -3,9 +3,11 @@ package common import ( "errors" "fmt" - "github.com/mitchellh/packer/packer" "os" "time" + + commonssh "github.com/mitchellh/packer/common/ssh" + "github.com/mitchellh/packer/packer" ) type SSHConfig struct { @@ -46,7 +48,7 @@ func (c *SSHConfig) Prepare(t *packer.ConfigTemplate) []error { if c.SSHKeyPath != "" { if _, err := os.Stat(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) - } else if _, err := sshKeyToSigner(c.SSHKeyPath); err != nil { + } else if _, err := commonssh.FileSigner(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } } diff --git a/builder/qemu/builder.go b/builder/qemu/builder.go index 957f21fe2..971613dd8 100644 --- a/builder/qemu/builder.go +++ b/builder/qemu/builder.go @@ -3,15 +3,17 @@ package qemu import ( "errors" "fmt" - "github.com/mitchellh/multistep" - "github.com/mitchellh/packer/common" - "github.com/mitchellh/packer/packer" "log" "os" "os/exec" "path/filepath" "strings" "time" + + "github.com/mitchellh/multistep" + "github.com/mitchellh/packer/common" + commonssh "github.com/mitchellh/packer/common/ssh" + "github.com/mitchellh/packer/packer" ) const BuilderId = "transcend.qemu" @@ -352,7 +354,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { if _, err := os.Stat(b.config.SSHKeyPath); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) - } else if _, err := sshKeyToSigner(b.config.SSHKeyPath); err != nil { + } else if _, err := commonssh.FileSigner(b.config.SSHKeyPath); err != nil { errs = packer.MultiErrorAppend( errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } diff --git a/builder/qemu/ssh.go b/builder/qemu/ssh.go index d22f611bc..de7858166 100644 --- a/builder/qemu/ssh.go +++ b/builder/qemu/ssh.go @@ -1,12 +1,12 @@ package qemu import ( - gossh "code.google.com/p/go.crypto/ssh" "fmt" + + gossh "code.google.com/p/go.crypto/ssh" "github.com/mitchellh/multistep" + commonssh "github.com/mitchellh/packer/common/ssh" "github.com/mitchellh/packer/communicator/ssh" - "io/ioutil" - "os" ) func sshAddress(state multistep.StateBag) (string, error) { @@ -24,7 +24,7 @@ func sshConfig(state multistep.StateBag) (*gossh.ClientConfig, error) { } if config.SSHKeyPath != "" { - signer, err := sshKeyToSigner(config.SSHKeyPath) + signer, err := commonssh.FileSigner(config.SSHKeyPath) if err != nil { return nil, err } @@ -37,23 +37,3 @@ func sshConfig(state multistep.StateBag) (*gossh.ClientConfig, error) { Auth: auth, }, nil } - -func sshKeyToSigner(path string) (gossh.Signer, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - - keyBytes, err := ioutil.ReadAll(f) - if err != nil { - return nil, err - } - - signer, err := gossh.ParsePrivateKey(keyBytes) - if err != nil { - return nil, fmt.Errorf("Error setting up SSH config: %s", err) - } - - return signer, nil -} diff --git a/builder/virtualbox/common/ssh.go b/builder/virtualbox/common/ssh.go index 41188bf45..0cfc05d2c 100644 --- a/builder/virtualbox/common/ssh.go +++ b/builder/virtualbox/common/ssh.go @@ -1,12 +1,12 @@ package common import ( - gossh "code.google.com/p/go.crypto/ssh" "fmt" + + gossh "code.google.com/p/go.crypto/ssh" "github.com/mitchellh/multistep" + commonssh "github.com/mitchellh/packer/common/ssh" "github.com/mitchellh/packer/communicator/ssh" - "io/ioutil" - "os" ) func SSHAddress(state multistep.StateBag) (string, error) { @@ -23,7 +23,7 @@ func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*gossh.ClientConf } if config.SSHKeyPath != "" { - signer, err := sshKeyToSigner(config.SSHKeyPath) + signer, err := commonssh.FileSigner(config.SSHKeyPath) if err != nil { return nil, err } @@ -37,23 +37,3 @@ func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*gossh.ClientConf }, nil } } - -func sshKeyToSigner(path string) (gossh.Signer, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - - keyBytes, err := ioutil.ReadAll(f) - if err != nil { - return nil, err - } - - signer, err := gossh.ParsePrivateKey(keyBytes) - if err != nil { - return nil, fmt.Errorf("Error setting up SSH config: %s", err) - } - - return signer, nil -} diff --git a/builder/virtualbox/common/ssh_config.go b/builder/virtualbox/common/ssh_config.go index 00c6167c6..908fbb7d8 100644 --- a/builder/virtualbox/common/ssh_config.go +++ b/builder/virtualbox/common/ssh_config.go @@ -3,9 +3,11 @@ package common import ( "errors" "fmt" - "github.com/mitchellh/packer/packer" "os" "time" + + commonssh "github.com/mitchellh/packer/common/ssh" + "github.com/mitchellh/packer/packer" ) type SSHConfig struct { @@ -56,7 +58,7 @@ func (c *SSHConfig) Prepare(t *packer.ConfigTemplate) []error { if c.SSHKeyPath != "" { if _, err := os.Stat(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) - } else if _, err := sshKeyToSigner(c.SSHKeyPath); err != nil { + } else if _, err := commonssh.FileSigner(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } } diff --git a/builder/vmware/common/ssh.go b/builder/vmware/common/ssh.go index a931dd734..5d2ca40e2 100644 --- a/builder/vmware/common/ssh.go +++ b/builder/vmware/common/ssh.go @@ -1,14 +1,15 @@ package common import ( - gossh "code.google.com/p/go.crypto/ssh" "errors" "fmt" "io/ioutil" "log" "os" + gossh "code.google.com/p/go.crypto/ssh" "github.com/mitchellh/multistep" + commonssh "github.com/mitchellh/packer/common/ssh" "github.com/mitchellh/packer/communicator/ssh" ) @@ -74,7 +75,7 @@ func SSHConfigFunc(config *SSHConfig) func(multistep.StateBag) (*gossh.ClientCon } if config.SSHKeyPath != "" { - signer, err := sshKeyToSigner(config.SSHKeyPath) + signer, err := commonssh.FileSigner(config.SSHKeyPath) if err != nil { return nil, err } @@ -88,23 +89,3 @@ func SSHConfigFunc(config *SSHConfig) func(multistep.StateBag) (*gossh.ClientCon }, nil } } - -func sshKeyToSigner(path string) (gossh.Signer, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - - keyBytes, err := ioutil.ReadAll(f) - if err != nil { - return nil, err - } - - signer, err := gossh.ParsePrivateKey(keyBytes) - if err != nil { - return nil, fmt.Errorf("Error setting up SSH config: %s", err) - } - - return signer, nil -} diff --git a/builder/vmware/common/ssh_config.go b/builder/vmware/common/ssh_config.go index f92b28931..75d0a4b75 100644 --- a/builder/vmware/common/ssh_config.go +++ b/builder/vmware/common/ssh_config.go @@ -7,6 +7,7 @@ import ( "os" "time" + commonssh "github.com/mitchellh/packer/common/ssh" "github.com/mitchellh/packer/packer" ) @@ -51,7 +52,7 @@ func (c *SSHConfig) Prepare(t *packer.ConfigTemplate) []error { if c.SSHKeyPath != "" { if _, err := os.Stat(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) - } else if _, err := sshKeyToSigner(c.SSHKeyPath); err != nil { + } else if _, err := commonssh.FileSigner(c.SSHKeyPath); err != nil { errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err)) } } diff --git a/common/ssh/key.go b/common/ssh/key.go new file mode 100644 index 000000000..b26981f3d --- /dev/null +++ b/common/ssh/key.go @@ -0,0 +1,30 @@ +package ssh + +import ( + "fmt" + "io/ioutil" + "os" + + "code.google.com/p/go.crypto/ssh" +) + +// FileSigner returns an ssh.Signer for a key file. +func FileSigner(path string) (ssh.Signer, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + keyBytes, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + + signer, err := ssh.ParsePrivateKey(keyBytes) + if err != nil { + return nil, fmt.Errorf("Error setting up SSH config: %s", err) + } + + return signer, nil +}