Skip to content

Commit

Permalink
helper/ssh: add random number to script [GH-1545]
Browse files Browse the repository at this point in the history
  • Loading branch information
mitchellh committed Apr 18, 2015
1 parent 897e0f1 commit 9a4ac76
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
11 changes: 10 additions & 1 deletion helper/ssh/provisioner.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ import (
"fmt"
"io/ioutil"
"log"
"math/rand"
"net"
"os"
"strconv"
"strings"
"time"

"github.com/hashicorp/terraform/terraform"
Expand All @@ -25,7 +28,7 @@ const (

// DefaultScriptPath is used as the path to copy the file to
// 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 = 5 * time.Minute
Expand All @@ -46,6 +49,12 @@ type SSHConfig struct {
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
func VerifySSH(s *terraform.InstanceState) error {
connType := s.Ephemeral.ConnInfo["type"]
Expand Down
30 changes: 30 additions & 0 deletions helper/ssh/provisioner_test.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,41 @@
package ssh

import (
"regexp"
"testing"

"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) {
r := &terraform.InstanceState{
Ephemeral: terraform.EphemeralState{
Expand Down

0 comments on commit 9a4ac76

Please sign in to comment.