func appendContent(shell *winrm.Shell, filePath, content string) error { cmd, err := shell.Execute(fmt.Sprintf("echo %s >> \"%s\"", content, filePath)) 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("upload operation returned code=%d", cmd.ExitCode())) } return nil }
func runCommand(shell *winrm.Shell, cmd *winrm.Command, rc *packer.RemoteCmd) { defer shell.Close() var wg sync.WaitGroup copyFunc := func(w io.Writer, r io.Reader) { defer wg.Done() io.Copy(w, r) } if rc.Stdout != nil && cmd.Stdout != nil { wg.Add(1) go copyFunc(rc.Stdout, cmd.Stdout) } else { log.Printf("[WARN] Failed to read stdout for command '%s'", rc.Command) } if rc.Stderr != nil && cmd.Stderr != nil { wg.Add(1) go copyFunc(rc.Stderr, cmd.Stderr) } else { log.Printf("[WARN] Failed to read stderr for command '%s'", rc.Command) } cmd.Wait() wg.Wait() code := cmd.ExitCode() log.Printf("[INFO] command '%s' exited with code: %d", rc.Command, code) rc.SetExited(code) }