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") 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 }
func main() { flag.StringVar(&hostname, "hostname", "localhost", "winrm host") flag.StringVar(&user, "username", "vagrant", "winrm admin username") flag.StringVar(&pass, "password", "vagrant", "winrm admin password") flag.StringVar(&timeout, "timeout", "PT36000S", "winrm timeout") flag.IntVar(&port, "port", 5985, "winrm port") flag.BoolVar(&elevated, "elevated", false, "run as elevated user?") flag.BoolVar(&debug, "debug", false, "output debugging info") flag.Parse() cmdB, _ := ioutil.ReadAll(os.Stdin) cmd = string(cmdB) if !debug { log.SetOutput(ioutil.Discard) } log.Printf("Command to run: %s", cmd) log.Printf("user to run: %s", user) log.Printf("pass to run: %s", pass) log.Printf("host to run: %s", hostname) log.Printf("port to run: %s", port) client, err := winrm.NewClientWithParameters(&winrm.Endpoint{Host: hostname, Port: port, HTTPS: false, Insecure: true, CACert: nil}, user, pass, winrm.NewParameters(timeout, "en-US", 153600)) if !elevated { _, err = client.RunWithInput(winrm.Powershell(cmd), os.Stdout, os.Stderr, os.Stdin) } else { err = StartElevated() } if err != nil { fmt.Println(err) os.Exit(1) } os.Exit(0) }
import ( "fmt" "log" "sync" "time" "github.com/masterzen/winrm/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