func serviceStatusFromLaunchd(g *libkb.GlobalContext, ls launchd.Service, infoPath string) (status keybase1.ServiceStatus, err error) { status = keybase1.ServiceStatus{ Label: ls.Label(), } launchdStatus, err := ls.LoadStatus() 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(g, infoPath, status.Label, status.Pid, 40, 500*time.Millisecond, "service status") 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 }
func serviceStatusFromLaunchd(ls launchd.Service, infoPath string) (keybase1.ServiceStatus, bool) { status := keybase1.ServiceStatus{ Label: ls.Label(), } st, err := ls.LoadStatus() if err != nil { status.Status = errorStatus("LAUNCHD_ERROR", err.Error()) return status, true } if st == nil { status.InstallStatus = keybase1.InstallStatus_NOT_INSTALLED status.InstallAction = keybase1.InstallAction_INSTALL status.Status = keybase1.Status{Name: "OK"} return status, true } status.Label = st.Label() status.Pid = st.Pid() status.LastExitStatus = st.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.Pid, 20, 200*time.Millisecond, "service status") if err != nil { status.InstallStatus = keybase1.InstallStatus_ERROR status.InstallAction = keybase1.InstallAction_REINSTALL status.Status = errorStatus("LAUNCHD_ERROR", err.Error()) return status, true } } if serviceInfo != nil { status.Version = serviceInfo.Version } } if status.Pid == "" { status.InstallStatus = keybase1.InstallStatus_ERROR status.InstallAction = keybase1.InstallAction_REINSTALL status.Status = errorStatus("LAUNCHD_ERROR", fmt.Sprintf("%s is not running", st.Label())) return status, true } return status, false }