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 }
func KBFSServiceStatus(g *libkb.GlobalContext, bundleVersion string) keybase1.ServiceStatus { serviceLabel := libkb.DefaultServiceLabel(libkb.KBFSServiceID, libkb.DefaultRunMode) kbfsService := launchd.NewService(serviceLabel) kbfsLaunchdStatus, err := kbfsService.Status() if err != nil { return errorStatus(err) } if kbfsLaunchdStatus == nil { return keybase1.ServiceStatus{InstallStatus: keybase1.InstallStatus_NOT_INSTALLED} } var kbfsInfo *libkb.ServiceInfo if kbfsLaunchdStatus.Pid() != "" { runtimeDir := g.Env.GetRuntimeDir() kbfsInfo, err = libkb.WaitForServiceInfoFile(path.Join(runtimeDir, "kbfs.info"), kbfsLaunchdStatus.Pid(), 5, 500*time.Millisecond, "launchd status for kbfs") if err != nil { return errorStatus(err) } } // nil means not running or file wasn't found if kbfsInfo == nil { kbfsInfo = &libkb.ServiceInfo{} } version := kbfsInfo.Version st := keybase1.ServiceStatus{ Version: version, Label: kbfsLaunchdStatus.Label(), Pid: kbfsLaunchdStatus.Pid(), LastExitStatus: kbfsLaunchdStatus.LastExitStatus(), BundleVersion: bundleVersion, } installStatus, installAction, se := installStatus(version, bundleVersion, st.LastExitStatus) st.InstallStatus = installStatus st.InstallAction = installAction st.Error = se return st }
func KeybaseServiceStatus(g *libkb.GlobalContext, bundleVersion string) keybase1.ServiceStatus { serviceLabel := libkb.DefaultServiceLabel(libkb.KeybaseServiceID, libkb.DefaultRunMode) kbService := launchd.NewService(serviceLabel) kbLaunchdStatus, err := kbService.Status() if err != nil { return errorStatus(err) } if kbLaunchdStatus == nil { return keybase1.ServiceStatus{InstallStatus: keybase1.InstallStatus_NOT_INSTALLED} } var config keybase1.Config if kbLaunchdStatus.Pid() != "" { runtimeDir := g.Env.GetRuntimeDir() _, err := libkb.WaitForServiceInfoFile(path.Join(runtimeDir, "keybased.info"), kbLaunchdStatus.Pid(), 5, 500*time.Millisecond, "launchd status for service") if err != nil { return errorStatus(err) } configClient, err := GetConfigClient(g) if err != nil { return errorStatus(err) } config, err = configClient.GetConfig(context.TODO(), 0) if err != nil { return errorStatus(err) } if config.Label != kbLaunchdStatus.Label() { return errorStatus(fmt.Errorf("Service label mismatch: %s != %s", config.Label, kbLaunchdStatus.Label())) } } version := config.Version buildVersion := libkb.VersionString() st := keybase1.ServiceStatus{ Version: config.Version, Label: kbLaunchdStatus.Label(), Pid: kbLaunchdStatus.Pid(), LastExitStatus: kbLaunchdStatus.LastExitStatus(), BundleVersion: bundleVersion, } // Something must be wrong if this build doesn't match the package version. if bundleVersion != buildVersion { st.InstallStatus = keybase1.InstallStatus_ERROR st.InstallAction = keybase1.InstallAction_NONE st.Error = &keybase1.ServiceStatusError{Message: fmt.Sprintf("Version mismatch: %s != %s", bundleVersion, buildVersion)} return st } installStatus, installAction, se := installStatus(version, bundleVersion, st.LastExitStatus) st.InstallStatus = installStatus st.InstallAction = installAction st.Error = se return st }