From 500d83b673ca29f2189c9ab9c1470ddb1d13a9ef Mon Sep 17 00:00:00 2001 From: Alexander Golovko Date: Mon, 9 Feb 2015 04:25:27 +0300 Subject: [PATCH] add download support to file provisioner --- provisioner/file/provisioner.go | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/provisioner/file/provisioner.go b/provisioner/file/provisioner.go index ce359a407..9bc2a646c 100644 --- a/provisioner/file/provisioner.go +++ b/provisioner/file/provisioner.go @@ -20,6 +20,9 @@ type Config struct { // The remote path where the local file will be uploaded to. Destination string + // Direction + Direction string + ctx interpolate.Context } @@ -38,12 +41,28 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { return err } + if p.config.Direction == "" { + p.config.Direction = "upload" + } + var errs *packer.MultiError if _, err := os.Stat(p.config.Source); err != nil { errs = packer.MultiErrorAppend(errs, fmt.Errorf("Bad source '%s': %s", p.config.Source, err)) } + if p.config.Direction != "download" && p.config.Direction != "upload" { + errs = packer.MultiErrorAppend(errs, + errors.New("Direction must be one of: download, upload.")) + } + + if p.config.Direction == "upload" { + if _, err := os.Stat(p.config.Source); err != nil { + errs = packer.MultiErrorAppend(errs, + fmt.Errorf("Bad source '%s': %s", p.config.Source, err)) + } + } + if p.config.Destination == "" { errs = packer.MultiErrorAppend(errs, errors.New("Destination must be specified.")) @@ -57,6 +76,30 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { } func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { + if p.config.Direction == "download" { + return p.ProvisionDownload(ui, comm) + } else { + return p.ProvisionUpload(ui, comm) + } +} + +func (p *Provisioner) ProvisionDownload(ui packer.Ui, comm packer.Communicator) error { + ui.Say(fmt.Sprintf("Downloading %s => %s", p.config.Source, p.config.Destination)) + + f, err := os.OpenFile(p.config.Destination, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer f.Close() + + err = comm.Download(p.config.Source, f) + if err != nil { + ui.Error(fmt.Sprintf("Download failed: %s", err)) + } + return err +} + +func (p *Provisioner) ProvisionUpload(ui packer.Ui, comm packer.Communicator) error { ui.Say(fmt.Sprintf("Uploading %s => %s", p.config.Source, p.config.Destination)) info, err := os.Stat(p.config.Source) if err != nil {