func restoreContent(client *winrm.Client, fromPath, toPath string) error { shell, err := client.CreateShell() if err != nil { return err } defer shell.Close() script := fmt.Sprintf(` $tmp_file_path = [System.IO.Path]::GetFullPath("%s") $dest_file_path = [System.IO.Path]::GetFullPath("%s".Trim("'")) if (Test-Path $dest_file_path) { rm $dest_file_path } else { $dest_dir = ([System.IO.Path]::GetDirectoryName($dest_file_path)) New-Item -ItemType directory -Force -ErrorAction SilentlyContinue -Path $dest_dir | Out-Null } if (Test-Path $tmp_file_path) { $base64_lines = Get-Content $tmp_file_path $base64_string = [string]::join("",$base64_lines) $bytes = [System.Convert]::FromBase64String($base64_string) [System.IO.File]::WriteAllBytes($dest_file_path, $bytes) } else { echo $null > $dest_file_path } `, fromPath, toPath) cmd, err := shell.Execute(winrm.Powershell(script)) if err != nil { return err } defer cmd.Close() var wg sync.WaitGroup copyFunc := func(w io.Writer, r io.Reader) { defer wg.Done() io.Copy(w, r) } wg.Add(2) go copyFunc(os.Stdout, cmd.Stdout) go copyFunc(os.Stderr, cmd.Stderr) cmd.Wait() wg.Wait() if cmd.ExitCode() != 0 { return errors.New(fmt.Sprintf("restore operation returned code=%d", cmd.ExitCode())) } return nil }
import ( "fmt" "log" "sync" "time" "github.com/masterzen/winrm" "github.com/mitchellh/packer/common" "github.com/mitchellh/packer/helper/config" "github.com/mitchellh/packer/packer" "github.com/mitchellh/packer/template/interpolate" ) var DefaultRestartCommand = "shutdown /r /f /t 0 /c \"packer restart\"" 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" type Config struct { common.PackerConfig `mapstructure:",squash"` // The command used to restart the guest machine RestartCommand string `mapstructure:"restart_command"` // The command used to check if the guest machine has restarted // The output of this command will be displayed to the user RestartCheckCommand string `mapstructure:"restart_check_command"` // The timeout for waiting for the machine to restart