func()

in plugin/step/install/darwin/pkg/pkg.go [88:132]


func (s *Step) Execute() error {
	// If this is a DMG, go down the rabbit hole. Mount it and
	// then set downloadPath to its mount point.
	if s.IsDMG {
		s.logger.WriteEvent(go2chef.NewEvent("INSTALL_PKG_DMG_MOUNT", s.Name(), "mounting DMG"))
		dmg, err := s.findDMG()
		if err != nil {
			return err
		}
		if err := s.mountDMG(filepath.Join(s.downloadPath, dmg)); err != nil {
			return err
		}

		// unmount and emit events
		defer func() {
			if err := s.unmountDMG(); err != nil {
				s.logger.WriteEvent(go2chef.NewEvent("INSTALL_PKG_DMG_UNMOUNT_FAILED", s.Name(), "unmounting DMG failed!"))

			}
			s.logger.WriteEvent(go2chef.NewEvent("INSTALL_PKG_DMG_UNMOUNT", s.Name(), "unmounting DMG"))
		}()
	}

	pkg, err := s.findPKG()
	if err != nil {
		return err
	}

	instCtx, cancel := context.WithTimeout(context.Background(), time.Duration(s.InstallerTimeoutSeconds)*time.Second)
	defer cancel()

	cmd := exec.CommandContext(instCtx, "installer", "-verbose", "-pkg", filepath.Join(s.downloadPath, pkg), "-target", "/")
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		// preserve exit error
		xerr := err
		if exit, ok := xerr.(*exec.ExitError); ok {
			s.logger.Errorf("pkg installer exited with code %d", exit.ExitCode())
		}
		return xerr
	}
	return nil
}