diff --git a/provisioner/shell/provisioner.go b/provisioner/shell/provisioner.go index cd447f1d8..2a309f0fe 100644 --- a/provisioner/shell/provisioner.go +++ b/provisioner/shell/provisioner.go @@ -3,6 +3,7 @@ package shell import ( + "bufio" "bytes" "fmt" "errors" @@ -10,6 +11,7 @@ import ( "github.com/mitchellh/mapstructure" "github.com/mitchellh/packer/packer" "io" + "io/ioutil" "log" "os" "strings" @@ -51,7 +53,7 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { } if p.config.ExecuteCommand == "" { - p.config.ExecuteCommand = "chmod +x {{.Path}} && {{.Path}}" + p.config.ExecuteCommand = "sh {{.Path}}" } if p.config.Inline != nil && len(p.config.Inline) == 0 { @@ -84,16 +86,48 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { } func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) { - ui.Say(fmt.Sprintf("Provisioning with shell script: %s", p.config.Path)) + path := p.config.Path + + // If we have an inline script, then turn that into a temporary + // shell script and use that. + if p.config.Inline != nil { + tf, err := ioutil.TempFile("", "packer-shell") + if err != nil { + ui.Error(fmt.Sprintf("Error preparing shell script: %s", err)) + return + } + defer os.Remove(tf.Name()) + + // Set the path to the temporary file + path = tf.Name() + + // Write our contents to it + writer := bufio.NewWriter(tf) + for _, command := range p.config.Inline { + if _, err := writer.WriteString(command+"\n"); err != nil { + ui.Error(fmt.Sprintf("Error preparing shell script: %s", err)) + return + } + } + + if err := writer.Flush(); err != nil { + ui.Error(fmt.Sprintf("Error preparing shell script: %s", err)) + return + } + + tf.Close() + } + + ui.Say(fmt.Sprintf("Provisioning with shell script: %s", path)) - log.Printf("Opening %s for reading", p.config.Path) - f, err := os.Open(p.config.Path) + log.Printf("Opening %s for reading", path) + f, err := os.Open(path) if err != nil { ui.Error(fmt.Sprintf("Error opening shell script: %s", err)) return } - log.Printf("Uploading %s => %s", p.config.Path, p.config.RemotePath) + log.Printf("Uploading %s => %s", path, p.config.RemotePath) err = comm.Upload(p.config.RemotePath, f) if err != nil { ui.Error(fmt.Sprintf("Error uploading shell script: %s", err))