diff --git a/packer/ui.go b/packer/ui.go index 2a0f5e275..e42e08139 100644 --- a/packer/ui.go +++ b/packer/ui.go @@ -343,7 +343,7 @@ func (u *MachineReadableUi) ProgressBar() ProgressBar { return new(NoopProgressBar) } -// TimestampedUi is a UI that wraps another UI implementation and prefixes +// TimestampedUi is a UI that wraps another UI implementation and // prefixes each message with an RFC3339 timestamp type TimestampedUi struct { Ui Ui @@ -376,3 +376,48 @@ func (u *TimestampedUi) ProgressBar() ProgressBar { return u.Ui.ProgressBar() } func (u *TimestampedUi) timestampLine(string string) string { return fmt.Sprintf("%v: %v", time.Now().Format(time.RFC3339), string) } + +// Safe is a UI that wraps another UI implementation and +// provides concurrency-safe access +type SafeUi struct { + Sem chan int + Ui Ui +} + +var _ Ui = new(SafeUi) + +func (u *SafeUi) Ask(s string) (string, error) { + u.Sem <- 1 + ret, err := u.Ui.Ask(s) + <-u.Sem + + return ret, err +} + +func (u *SafeUi) Say(s string) { + u.Sem <- 1 + u.Ui.Say(s) + <-u.Sem +} + +func (u *SafeUi) Message(s string) { + u.Sem <- 1 + u.Ui.Message(s) + <-u.Sem +} + +func (u *SafeUi) Error(s string) { + u.Sem <- 1 + u.Ui.Error(s) + <-u.Sem +} + +func (u *SafeUi) Machine(t string, args ...string) { + u.Sem <- 1 + u.Ui.Machine(t, args...) + <-u.Sem +} + +func (u *SafeUi) ProgressBar() ProgressBar { + return new(NoopProgressBar) +} diff --git a/provisioner/ansible/provisioner.go b/provisioner/ansible/provisioner.go index 7ea29f584..e836eb894 100644 --- a/provisioner/ansible/provisioner.go +++ b/provisioner/ansible/provisioner.go @@ -286,7 +286,10 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { return err } - ui = newUi(ui) + ui = &packer.SafeUi{ + Sem: make(chan int, 1), + Ui: ui, + } p.adapter = adapter.NewAdapter(p.done, localListener, config, p.config.SFTPCmd, ui, comm) defer func() { @@ -557,49 +560,3 @@ func getWinRMPassword(buildName string) string { packer.LogSecretFilter.Set(winRMPass) return winRMPass } - -// Ui provides concurrency-safe access to packer.Ui. -type Ui struct { - sem chan int - ui packer.Ui -} - -func newUi(ui packer.Ui) packer.Ui { - return &Ui{sem: make(chan int, 1), ui: ui} -} - -func (ui *Ui) Ask(s string) (string, error) { - ui.sem <- 1 - ret, err := ui.ui.Ask(s) - <-ui.sem - - return ret, err -} - -func (ui *Ui) Say(s string) { - ui.sem <- 1 - ui.ui.Say(s) - <-ui.sem -} - -func (ui *Ui) Message(s string) { - ui.sem <- 1 - ui.ui.Message(s) - <-ui.sem -} - -func (ui *Ui) Error(s string) { - ui.sem <- 1 - ui.ui.Error(s) - <-ui.sem -} - -func (ui *Ui) Machine(t string, args ...string) { - ui.sem <- 1 - ui.ui.Machine(t, args...) - <-ui.sem -} - -func (ui *Ui) ProgressBar() packer.ProgressBar { - return new(packer.NoopProgressBar) -} diff --git a/provisioner/inspec/provisioner.go b/provisioner/inspec/provisioner.go index 7647b4286..fab92ee49 100644 --- a/provisioner/inspec/provisioner.go +++ b/provisioner/inspec/provisioner.go @@ -279,7 +279,10 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { return err } - ui = newUi(ui) + ui = &packer.SafeUi{ + Sem: make(chan int, 1), + Ui: ui, + } p.adapter = adapter.NewAdapter(p.done, localListener, config, "", ui, comm) defer func() { @@ -519,49 +522,3 @@ func newSigner(privKeyFile string) (*signer, error) { return signer, nil } - -// Ui provides concurrency-safe access to packer.Ui. -type Ui struct { - sem chan int - ui packer.Ui -} - -func newUi(ui packer.Ui) packer.Ui { - return &Ui{sem: make(chan int, 1), ui: ui} -} - -func (ui *Ui) Ask(s string) (string, error) { - ui.sem <- 1 - ret, err := ui.ui.Ask(s) - <-ui.sem - - return ret, err -} - -func (ui *Ui) Say(s string) { - ui.sem <- 1 - ui.ui.Say(s) - <-ui.sem -} - -func (ui *Ui) Message(s string) { - ui.sem <- 1 - ui.ui.Message(s) - <-ui.sem -} - -func (ui *Ui) Error(s string) { - ui.sem <- 1 - ui.ui.Error(s) - <-ui.sem -} - -func (ui *Ui) Machine(t string, args ...string) { - ui.sem <- 1 - ui.ui.Machine(t, args...) - <-ui.sem -} - -func (ui *Ui) ProgressBar() packer.ProgressBar { - return new(packer.NoopProgressBar) -}