func serviceStatusFromLaunchd(ls launchd.Service, infoPath string, wait time.Duration, log Log) (status keybase1.ServiceStatus, err error) { status = keybase1.ServiceStatus{ Label: ls.Label(), } launchdStatus, err := ls.WaitForStatus(wait, 500*time.Millisecond) if err != nil { status.InstallStatus = keybase1.InstallStatus_ERROR status.InstallAction = keybase1.InstallAction_NONE status.Status = keybase1.StatusFromCode(keybase1.StatusCode_SCServiceStatusError, err.Error()) return } if launchdStatus == nil { status.InstallStatus = keybase1.InstallStatus_NOT_INSTALLED status.InstallAction = keybase1.InstallAction_INSTALL status.Status = keybase1.Status{Name: "OK"} return } status.Label = launchdStatus.Label() status.Pid = launchdStatus.Pid() status.LastExitStatus = launchdStatus.LastExitStatus() // Check service info file (if present) and if the service is running (has a PID) var serviceInfo *libkb.ServiceInfo if infoPath != "" { if status.Pid != "" { serviceInfo, err = libkb.WaitForServiceInfoFile(infoPath, status.Label, status.Pid, 40, 500*time.Millisecond, log) if err != nil { status.InstallStatus = keybase1.InstallStatus_ERROR status.InstallAction = keybase1.InstallAction_REINSTALL status.Status = keybase1.StatusFromCode(keybase1.StatusCode_SCServiceStatusError, err.Error()) return } } if serviceInfo != nil { status.Version = serviceInfo.Version } } if status.Pid == "" { status.InstallStatus = keybase1.InstallStatus_ERROR status.InstallAction = keybase1.InstallAction_REINSTALL err = fmt.Errorf("%s is not running", status.Label) status.Status = keybase1.StatusFromCode(keybase1.StatusCode_SCServiceStatusError, err.Error()) return } status.Status = keybase1.Status{Name: "OK"} return }
func WaitForService(g *libkb.GlobalContext, launchService launchd.Service, serviceInfoPath string) error { launchdStatus, err := launchService.WaitForStatus(defaultLaunchdWait, 500*time.Millisecond) if err != nil { return err } if launchdStatus == nil { return fmt.Errorf("%s was not found", launchService.Label()) } if launchdStatus.IsErrored() { return fmt.Errorf("%s is not running (exit status %s)", launchdStatus.Label(), launchdStatus.LastExitStatus()) } _, err = libkb.WaitForServiceInfoFile(serviceInfoPath, launchdStatus.Label(), launchdStatus.Pid(), 25, 400*time.Millisecond, g.Log) return err }