diff --git a/builder/azure/arm/builder.go b/builder/azure/arm/builder.go index 2a06f1b84..0a087c6fd 100644 --- a/builder/azure/arm/builder.go +++ b/builder/azure/arm/builder.go @@ -231,10 +231,6 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack NewStepValidateTemplate(azureClient, ui, b.config, GetVirtualMachineDeployment), NewStepDeployTemplate(azureClient, ui, b.config, deploymentName, GetVirtualMachineDeployment), NewStepGetIPAddress(azureClient, ui, endpointConnectType), - &StepSaveWinRMPassword{ - Password: b.config.tmpAdminPassword, - BuildName: b.config.PackerBuildName, - }, &communicator.StepConnectWinRM{ Config: &b.config.Comm, Host: func(stateBag multistep.StateBag) (string, error) { diff --git a/builder/azure/arm/step_save_winrm_password.go b/builder/azure/arm/step_save_winrm_password.go deleted file mode 100644 index 648a867c6..000000000 --- a/builder/azure/arm/step_save_winrm_password.go +++ /dev/null @@ -1,22 +0,0 @@ -package arm - -import ( - "context" - - "github.com/hashicorp/packer/helper/multistep" - "github.com/hashicorp/packer/packer" -) - -type StepSaveWinRMPassword struct { - Password string - BuildName string -} - -func (s *StepSaveWinRMPassword) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { - // store so that we can access this later during provisioning - state.Put("winrm_password", s.Password) - packer.LogSecretFilter.Set(s.Password) - return multistep.ActionContinue -} - -func (s *StepSaveWinRMPassword) Cleanup(multistep.StateBag) {} diff --git a/builder/openstack/step_get_password.go b/builder/openstack/step_get_password.go index c97bc4944..fd9bfa156 100644 --- a/builder/openstack/step_get_password.go +++ b/builder/openstack/step_get_password.go @@ -8,7 +8,6 @@ import ( "time" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" - commonhelper "github.com/hashicorp/packer/helper/common" "github.com/hashicorp/packer/helper/communicator" "github.com/hashicorp/packer/helper/multistep" "github.com/hashicorp/packer/packer" @@ -78,12 +77,9 @@ func (s *StepGetPassword) Run(ctx context.Context, state multistep.StateBag) mul "Password (since debug is enabled) \"%s\"", s.Comm.WinRMPassword)) } - commonhelper.SetSharedState("winrm_password", s.Comm.WinRMPassword, s.BuildName) packer.LogSecretFilter.Set(s.Comm.WinRMPassword) return multistep.ActionContinue } -func (s *StepGetPassword) Cleanup(multistep.StateBag) { - commonhelper.RemoveSharedStateFile("winrm_password", s.BuildName) -} +func (s *StepGetPassword) Cleanup(multistep.StateBag) {} diff --git a/builder/osc/common/step_get_password.go b/builder/osc/common/step_get_password.go index 63ebbb288..9971379d5 100644 --- a/builder/osc/common/step_get_password.go +++ b/builder/osc/common/step_get_password.go @@ -11,7 +11,6 @@ import ( "log" "time" - commonhelper "github.com/hashicorp/packer/helper/common" "github.com/hashicorp/packer/helper/communicator" "github.com/hashicorp/packer/helper/multistep" "github.com/hashicorp/packer/packer" @@ -95,19 +94,12 @@ WaitLoop: "Password (since debug is enabled): %s", s.Comm.WinRMPassword)) } // store so that we can access this later during provisioning - - err = commonhelper.SetSharedState("winrm_password", s.Comm.WinRMPassword, s.BuildName) - if err != nil { - log.Printf("[WARN] commonhelper.SetSharedState returned error: %s", err) - } packer.LogSecretFilter.Set(s.Comm.WinRMPassword) return multistep.ActionContinue } -func (s *StepGetPassword) Cleanup(multistep.StateBag) { - commonhelper.RemoveSharedStateFile("winrm_password", s.BuildName) -} +func (s *StepGetPassword) Cleanup(multistep.StateBag) {} func (s *StepGetPassword) waitForPassword(state multistep.StateBag, cancel <-chan struct{}) (string, error) { oapiconn := state.Get("oapi").(*oapi.Client) diff --git a/common/shell-local/run.go b/common/shell-local/run.go index 8fb58adf2..9f7170394 100644 --- a/common/shell-local/run.go +++ b/common/shell-local/run.go @@ -11,23 +11,11 @@ import ( "strings" "github.com/hashicorp/packer/common" - commonhelper "github.com/hashicorp/packer/helper/common" "github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/packer/tmp" "github.com/hashicorp/packer/template/interpolate" ) -type ExecuteCommandTemplate struct { - Vars string - Script string - Command string - WinRMPassword string -} - -type EnvVarsTemplate struct { - WinRMPassword string -} - func Run(ctx context.Context, ui packer.Ui, config *Config, generatedData map[string]interface{}) (bool, error) { if generatedData != nil { config.generatedData = generatedData @@ -219,9 +207,3 @@ func createFlattenedEnvVars(config *Config) (string, error) { } return flattened, nil } - -func getWinRMPassword(buildName string) string { - winRMPass, _ := commonhelper.RetrieveSharedState("winrm_password", buildName) - packer.LogSecretFilter.Set(winRMPass) - return winRMPass -} diff --git a/provisioner/ansible/provisioner.go b/provisioner/ansible/provisioner.go index 8adf04175..bdcf578c3 100644 --- a/provisioner/ansible/provisioner.go +++ b/provisioner/ansible/provisioner.go @@ -30,7 +30,6 @@ import ( "github.com/hashicorp/packer/common" "github.com/hashicorp/packer/common/adapter" - commonhelper "github.com/hashicorp/packer/helper/common" "github.com/hashicorp/packer/helper/config" "github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/packer/tmp" @@ -75,20 +74,14 @@ type Provisioner struct { done chan struct{} ansibleVersion string ansibleMajVersion uint -} - -type PassthroughTemplate struct { - WinRMPassword string + generatedData map[string]interface{} } func (p *Provisioner) Prepare(raws ...interface{}) error { p.done = make(chan struct{}) - // Create passthrough for winrm password so we can fill it in once we know - // it - p.config.ctx.Data = &PassthroughTemplate{ - WinRMPassword: `{{.WinRMPassword}}`, - } + // Create passthrough for build-generated data + p.config.ctx.Data = common.PlaceholderData() err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, @@ -214,12 +207,11 @@ func (p *Provisioner) getVersion() error { return nil } -func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, _ map[string]interface{}) error { +func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, generatedData map[string]interface{}) error { ui.Say("Provisioning with Ansible...") - // Interpolate env vars to check for .WinRMPassword - p.config.ctx.Data = &PassthroughTemplate{ - WinRMPassword: getWinRMPassword(p.config.PackerBuildName), - } + // Interpolate env vars to check for generated values like password and port + p.generatedData = generatedData + p.config.ctx.Data = generatedData for i, envVar := range p.config.AnsibleEnvVars { envVar, err := interpolate.Render(envVar, &p.config.ctx) if err != nil { @@ -227,7 +219,7 @@ func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.C } p.config.AnsibleEnvVars[i] = envVar } - // Interpolate extra vars to check for .WinRMPassword + // Interpolate extra vars to check for generated values like password and port for i, arg := range p.config.ExtraArguments { arg, err := interpolate.Render(arg, &p.config.ctx) if err != nil { @@ -502,9 +494,10 @@ func (p *Provisioner) executeAnsible(ui packer.Ui, comm packer.Communicator, pri // remove winrm password from command, if it's been added flattenedCmd := strings.Join(cmd.Args, " ") sanitized := flattenedCmd - if len(getWinRMPassword(p.config.PackerBuildName)) > 0 { + winRMPass, ok := p.generatedData["WinRMPassword"] + if ok { sanitized = strings.Replace(sanitized, - getWinRMPassword(p.config.PackerBuildName), "*****", -1) + winRMPass.(string), "*****", -1) } ui.Say(fmt.Sprintf("Executing Ansible: %s", sanitized)) @@ -633,9 +626,3 @@ func newSigner(privKeyFile string) (*signer, error) { return signer, nil } - -func getWinRMPassword(buildName string) string { - winRMPass, _ := commonhelper.RetrieveSharedState("winrm_password", buildName) - packer.LogSecretFilter.Set(winRMPass) - return winRMPass -} diff --git a/provisioner/chef-client/provisioner.go b/provisioner/chef-client/provisioner.go index 208c1744e..399a3c847 100644 --- a/provisioner/chef-client/provisioner.go +++ b/provisioner/chef-client/provisioner.go @@ -17,7 +17,6 @@ import ( "github.com/hashicorp/packer/common" "github.com/hashicorp/packer/common/uuid" - commonhelper "github.com/hashicorp/packer/helper/common" "github.com/hashicorp/packer/helper/config" "github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/provisioner" @@ -86,6 +85,7 @@ type Provisioner struct { communicator packer.Communicator guestOSTypeConfig guestOSTypeConfig guestCommands *provisioner.GuestCommands + generatedData map[string]interface{} } type ConfigTemplate struct { @@ -103,10 +103,6 @@ type ConfigTemplate struct { ValidationKeyPath string } -type EnvVarsTemplate struct { - WinRMPassword string -} - type ExecuteTemplate struct { ConfigPath string JsonPath string @@ -124,12 +120,8 @@ type KnifeTemplate struct { } func (p *Provisioner) Prepare(raws ...interface{}) error { - // Create passthrough for winrm password so we can fill it in once we know - // it - p.config.ctx.Data = &EnvVarsTemplate{ - WinRMPassword: `{{.WinRMPassword}}`, - } - + // Create passthrough for build-generated data + p.config.ctx.Data = common.PlaceholderData() err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, @@ -244,8 +236,8 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { return nil } -func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, _ map[string]interface{}) error { - +func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, generatedData map[string]interface{}) error { + p.generatedData = generatedData p.communicator = comm nodeName := p.config.NodeName @@ -713,12 +705,6 @@ func (p *Provisioner) processJsonUserVars() (map[string]interface{}, error) { return result, nil } -func getWinRMPassword(buildName string) string { - winRMPass, _ := commonhelper.RetrieveSharedState("winrm_password", buildName) - packer.LogSecretFilter.Set(winRMPass) - return winRMPass -} - func (p *Provisioner) Communicator() packer.Communicator { return p.communicator } @@ -729,9 +715,7 @@ func (p *Provisioner) ElevatedUser() string { func (p *Provisioner) ElevatedPassword() string { // Replace ElevatedPassword for winrm users who used this feature - p.config.ctx.Data = &EnvVarsTemplate{ - WinRMPassword: getWinRMPassword(p.config.PackerBuildName), - } + p.config.ctx.Data = p.generatedData elevatedPassword, _ := interpolate.Render(p.config.ElevatedPassword, &p.config.ctx) diff --git a/provisioner/powershell/provisioner.go b/provisioner/powershell/provisioner.go index 2d86d5a8b..c0d567627 100644 --- a/provisioner/powershell/provisioner.go +++ b/provisioner/powershell/provisioner.go @@ -89,8 +89,7 @@ func (p *Provisioner) defaultExecuteCommand() string { } func (p *Provisioner) Prepare(raws ...interface{}) error { - // Create passthrough for build-generated data so we can fill it in once we know - // it + // Create passthrough for build-generated data p.config.ctx.Data = common.PlaceholderData() err := config.Decode(&p.config, &config.DecodeOpts{ @@ -223,18 +222,7 @@ func extractScript(p *Provisioner) (string, error) { func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, generatedData map[string]interface{}) error { ui.Say(fmt.Sprintf("Provisioning with Powershell...")) p.communicator = comm - p.generatedData = make(map[string]interface{}) - - if generatedData != nil { - log.Printf("Gen data isn't nil.") - p.generatedData = generatedData - if winRMPass, ok := p.generatedData["WinRMPassword"]; ok { - log.Printf("Found winrm pass") - packer.LogSecretFilter.Set(winRMPass.(string)) - } - } else { - log.Printf("generatedData passed to Provision method is nil!") - } + p.generatedData = generatedData scripts := make([]string, len(p.config.Scripts)) copy(scripts, p.config.Scripts) diff --git a/provisioner/puppet-masterless/provisioner.go b/provisioner/puppet-masterless/provisioner.go index a570c69b9..7a6a968ed 100644 --- a/provisioner/puppet-masterless/provisioner.go +++ b/provisioner/puppet-masterless/provisioner.go @@ -13,7 +13,6 @@ import ( "strings" "github.com/hashicorp/packer/common" - commonhelper "github.com/hashicorp/packer/helper/common" "github.com/hashicorp/packer/helper/config" "github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/provisioner" @@ -130,6 +129,7 @@ type Provisioner struct { communicator packer.Communicator guestOSTypeConfig guestOSTypeConfig guestCommands *provisioner.GuestCommands + generatedData map[string]interface{} } type ExecuteTemplate struct { @@ -146,17 +146,9 @@ type ExecuteTemplate struct { WorkingDir string } -type EnvVarsTemplate struct { - WinRMPassword string -} - func (p *Provisioner) Prepare(raws ...interface{}) error { - // Create passthrough for winrm password so we can fill it in once we know - // it - p.config.ctx.Data = &EnvVarsTemplate{ - WinRMPassword: `{{.WinRMPassword}}`, - } - + // Create passthrough for build-generated data + p.config.ctx.Data = common.PlaceholderData() err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, InterpolateContext: &p.config.ctx, @@ -259,9 +251,10 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { return nil } -func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, _ map[string]interface{}) error { +func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, generatedData map[string]interface{}) error { ui.Say("Provisioning with Puppet...") p.communicator = comm + p.generatedData = generatedData ui.Message("Creating Puppet staging directory...") if err := p.createDir(ui, comm, p.config.StagingDir); err != nil { return fmt.Errorf("Error creating staging directory: %s", err) @@ -484,12 +477,6 @@ func (p *Provisioner) uploadDirectory(ui packer.Ui, comm packer.Communicator, ds return comm.UploadDir(dst, src, nil) } -func getWinRMPassword(buildName string) string { - winRMPass, _ := commonhelper.RetrieveSharedState("winrm_password", buildName) - packer.LogSecretFilter.Set(winRMPass) - return winRMPass -} - func (p *Provisioner) Communicator() packer.Communicator { return p.communicator } @@ -500,9 +487,7 @@ func (p *Provisioner) ElevatedUser() string { func (p *Provisioner) ElevatedPassword() string { // Replace ElevatedPassword for winrm users who used this feature - p.config.ctx.Data = &EnvVarsTemplate{ - WinRMPassword: getWinRMPassword(p.config.PackerBuildName), - } + p.config.ctx.Data = p.generatedData elevatedPassword, _ := interpolate.Render(p.config.ElevatedPassword, &p.config.ctx) diff --git a/provisioner/puppet-server/provisioner.go b/provisioner/puppet-server/provisioner.go index a82f6098e..fd30d46d4 100644 --- a/provisioner/puppet-server/provisioner.go +++ b/provisioner/puppet-server/provisioner.go @@ -12,7 +12,6 @@ import ( "strings" "github.com/hashicorp/packer/common" - commonhelper "github.com/hashicorp/packer/helper/common" "github.com/hashicorp/packer/helper/config" "github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/provisioner" @@ -125,6 +124,7 @@ type Provisioner struct { communicator packer.Communicator guestOSTypeConfig guestOSTypeConfig guestCommands *provisioner.GuestCommands + generatedData map[string]interface{} } type ExecuteTemplate struct { @@ -140,16 +140,9 @@ type ExecuteTemplate struct { WorkingDir string } -type EnvVarsTemplate struct { - WinRMPassword string -} - func (p *Provisioner) Prepare(raws ...interface{}) error { - // Create passthrough for winrm password so we can fill it in once we know - // it - p.config.ctx.Data = &EnvVarsTemplate{ - WinRMPassword: `{{.WinRMPassword}}`, - } + // Create passthrough for build-generated data + p.config.ctx.Data = common.PlaceholderData() err := config.Decode(&p.config, &config.DecodeOpts{ Interpolate: true, @@ -229,9 +222,10 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { return nil } -func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, _ map[string]interface{}) error { +func (p *Provisioner) Provision(ctx context.Context, ui packer.Ui, comm packer.Communicator, generatedData map[string]interface{}) error { ui.Say("Provisioning with Puppet...") p.communicator = comm + p.generatedData = generatedData ui.Message("Creating Puppet staging directory...") if err := p.createDir(ui, comm, p.config.StagingDir); err != nil { return fmt.Errorf("Error creating staging directory: %s", err) @@ -373,12 +367,6 @@ func (p *Provisioner) uploadDirectory(ui packer.Ui, comm packer.Communicator, ds return comm.UploadDir(dst, src, nil) } -func getWinRMPassword(buildName string) string { - winRMPass, _ := commonhelper.RetrieveSharedState("winrm_password", buildName) - packer.LogSecretFilter.Set(winRMPass) - return winRMPass -} - func (p *Provisioner) Communicator() packer.Communicator { return p.communicator } @@ -389,9 +377,7 @@ func (p *Provisioner) ElevatedUser() string { func (p *Provisioner) ElevatedPassword() string { // Replace ElevatedPassword for winrm users who used this feature - p.config.ctx.Data = &EnvVarsTemplate{ - WinRMPassword: getWinRMPassword(p.config.PackerBuildName), - } + p.config.ctx.Data = p.generatedData elevatedPassword, _ := interpolate.Render(p.config.ElevatedPassword, &p.config.ctx)