helper/ssh: add random number to script [GH-1545]
This commit is contained in:
parent
897e0f1e45
commit
de8666a5fa
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
|
@ -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{
|
||||||
|
|
Loading…
Reference in New Issue