in plugin/step/install/windows/msi/msi_windows.go [127:176]
func (s *Step) installChef() error {
msi, err := s.findMSI()
if err != nil {
return err
}
// create a logfile for MSIEXEC
logfile, err := temp.File("", "")
if err != nil {
return err
}
_ = logfile.Close()
if err := shellOut(s, "msiexec", []string{"/qn", "/i", filepath.Join(s.downloadPath, msi), "/L*V", logfile.Name()}); err != nil {
// preserve exit error
xerr := err
expectedExitCode := false
if exit, ok := xerr.(*exec.ExitError); ok {
for _, c := range s.ExitCode {
if exit.ExitCode() == c {
expectedExitCode = true
break
}
}
if !expectedExitCode {
s.logger.Errorf("MSIEXEC exited with code %d", exit.ExitCode())
}
}
if !expectedExitCode {
// pull logs
log, err := ioutil.ReadFile(logfile.Name())
if err != nil {
return err
}
// msiexec writes logs in UTF16-LE which outputs extra spaces. Convert it
// to UTF8 for more readable output.
decoder := unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder()
utf8Log, err := decoder.Bytes(log)
if err != nil {
s.logger.Errorf("UNPRETTY MSIEXEC logs: %s", string(log))
} else {
s.logger.Errorf("MSIEXEC logs: %s", string(utf8Log))
}
return xerr
}
}
return nil
}