diff --git a/provisioner/windows-restart/provisioner.go b/provisioner/windows-restart/provisioner.go index 9b77c097e..e3cb1d119 100644 --- a/provisioner/windows-restart/provisioner.go +++ b/provisioner/windows-restart/provisioner.go @@ -17,7 +17,7 @@ import ( ) var DefaultRestartCommand = "shutdown /r /f /t 0 /c \"packer restart\"" -var DefaultRestartCheckCommand = winrm.Powershell(`if (Test-Path variable:global:ProgressPreference){$ProgressPreference='SilentlyContinue'}; echo "${env:COMPUTERNAME} restarted."`) +var DefaultRestartCheckCommand = winrm.Powershell(`echo "${env:COMPUTERNAME} restarted."`) var retryableSleep = 5 * time.Second var TryCheckReboot = "shutdown.exe -f -r -t 60" var AbortReboot = "shutdown.exe -a" @@ -174,28 +174,40 @@ WaitLoop: } var waitForCommunicator = func(p *Provisioner) error { + runCustomRestartCheck := true for { - cmd := &packer.RemoteCmd{Command: p.config.RestartCheckCommand} - var buf, buf2 bytes.Buffer - cmd.Stdout = &buf - cmd.Stdout = io.MultiWriter(cmd.Stdout, &buf2) select { case <-p.cancel: log.Println("Communicator wait canceled, exiting loop") return fmt.Errorf("Communicator wait canceled") case <-time.After(retryableSleep): } + if runCustomRestartCheck == true { + if p.config.RestartCheckCommand == DefaultRestartCheckCommand { + runCustomRestartCheck = false + } + // this is the user configurable command + cmdRestartCheck := &packer.RemoteCmd{Command: p.config.RestartCheckCommand} + log.Printf("Checking that communicator is connected with: '%s'", + cmdRestartCheck.Command) + // run user-configured restart check + err := cmdRestartCheck.StartWithUi(p.comm, p.ui) - log.Printf("Checking that communicator is connected with: '%s'", cmd.Command) - - err := cmd.StartWithUi(p.comm, p.ui) - - if err != nil { - log.Printf("Communication connection err: %s", err) - continue + if err != nil { + log.Printf("Communication connection err: %s", err) + continue + } + log.Printf("Connected to machine") + runCustomRestartCheck = false } + // this is the non-user-configurable check that powershell + // modules have loaded + cmdModuleLoad := &packer.RemoteCmd{Command: DefaultRestartCheckCommand} + var buf, buf2 bytes.Buffer + cmdModuleLoad.Stdout = &buf + cmdModuleLoad.Stdout = io.MultiWriter(cmdModuleLoad.Stdout, &buf2) - log.Printf("Connected to machine") + cmdModuleLoad.StartWithUi(p.comm, p.ui) stdoutToRead := buf2.String() if !strings.Contains(stdoutToRead, "restarted.") { log.Printf("echo didn't succeed; retrying...")