helper/ssh: add random number to script [GH-1545]

This commit is contained in:
Mitchell Hashimoto 2015-04-18 16:07:11 -07:00
parent 897e0f1e45
commit de8666a5fa
3 changed files with 45 additions and 4 deletions

View File

@ -213,11 +213,13 @@ func (p *ResourceProvisioner) runScripts(
go p.copyOutput(o, errR, errDoneCh) go p.copyOutput(o, errR, errDoneCh)
err := retryFunc(conf.TimeoutVal, func() error { err := retryFunc(conf.TimeoutVal, func() error {
if err := comm.Upload(conf.ScriptPath, script); err != nil { remotePath := conf.RemotePath()
if err := comm.Upload(remotePath, script); err != nil {
return fmt.Errorf("Failed to upload script: %v", err) return fmt.Errorf("Failed to upload script: %v", err)
} }
cmd = &helper.RemoteCmd{ cmd = &helper.RemoteCmd{
Command: fmt.Sprintf("chmod 0777 %s", conf.ScriptPath), Command: fmt.Sprintf("chmod 0777 %s", remotePath),
} }
if err := comm.Start(cmd); err != nil { if err := comm.Start(cmd); err != nil {
return fmt.Errorf( return fmt.Errorf(
@ -227,7 +229,7 @@ func (p *ResourceProvisioner) runScripts(
cmd.Wait() cmd.Wait()
cmd = &helper.RemoteCmd{ cmd = &helper.RemoteCmd{
Command: conf.ScriptPath, Command: remotePath,
Stdout: outW, Stdout: outW,
Stderr: errW, Stderr: errW,
} }

View File

@ -5,8 +5,11 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"math/rand"
"net" "net"
"os" "os"
"strconv"
"strings"
"time" "time"
"github.com/hashicorp/terraform/terraform" "github.com/hashicorp/terraform/terraform"
@ -25,7 +28,7 @@ const (
// DefaultScriptPath is used as the path to copy the file to // DefaultScriptPath is used as the path to copy the file to
// for remote execution if not provided otherwise. // for remote execution if not provided otherwise.
DefaultScriptPath = "/tmp/script.sh" DefaultScriptPath = "/tmp/script_%RAND%.sh"
// DefaultTimeout is used if there is no timeout given // DefaultTimeout is used if there is no timeout given
DefaultTimeout = 5 * time.Minute DefaultTimeout = 5 * time.Minute
@ -46,6 +49,12 @@ type SSHConfig struct {
TimeoutVal time.Duration `mapstructure:"-"` TimeoutVal time.Duration `mapstructure:"-"`
} }
func (c *SSHConfig) RemotePath() string {
return strings.Replace(
c.ScriptPath, "%RAND%",
strconv.FormatInt(int64(rand.Int31()), 10), -1)
}
// VerifySSH is used to verify the ConnInfo is usable by remote-exec // VerifySSH is used to verify the ConnInfo is usable by remote-exec
func VerifySSH(s *terraform.InstanceState) error { func VerifySSH(s *terraform.InstanceState) error {
connType := s.Ephemeral.ConnInfo["type"] connType := s.Ephemeral.ConnInfo["type"]

View File

@ -1,11 +1,41 @@
package ssh package ssh
import ( import (
"regexp"
"testing" "testing"
"github.com/hashicorp/terraform/terraform" "github.com/hashicorp/terraform/terraform"
) )
func TestSSHConfig_RemotePath(t *testing.T) {
cases := []struct {
Input string
Pattern string
}{
{
"/tmp/script.sh",
`^/tmp/script\.sh$`,
},
{
"/tmp/script_%RAND%.sh",
`^/tmp/script_(\d+)\.sh$`,
},
}
for _, tc := range cases {
config := &SSHConfig{ScriptPath: tc.Input}
output := config.RemotePath()
match, err := regexp.Match(tc.Pattern, []byte(output))
if err != nil {
t.Fatalf("bad: %s\n\nerr: %s", tc.Input, err)
}
if !match {
t.Fatalf("bad: %s\n\n%s", tc.Input, output)
}
}
}
func TestResourceProvider_verifySSH(t *testing.T) { func TestResourceProvider_verifySSH(t *testing.T) {
r := &terraform.InstanceState{ r := &terraform.InstanceState{
Ephemeral: terraform.EphemeralState{ Ephemeral: terraform.EphemeralState{