func()

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
}