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 KBFSServiceStatus(g *libkb.GlobalContext, label string) (status keybase1.ServiceStatus) { if label == "" { label = DefaultKBFSLabel(g.Env.GetRunMode()) } kbfsService := launchd.NewService(label) status, err := serviceStatusFromLaunchd(g, kbfsService, path.Join(g.Env.GetRuntimeDir(), "kbfs.info")) if err != nil { return } bundleVersion, err := KBFSBundleVersion(g, "") if err != nil { status.Status = keybase1.StatusFromCode(keybase1.StatusCode_SCServiceStatusError, err.Error()) return } status.BundleVersion = bundleVersion if status.InstallStatus == keybase1.InstallStatus_NOT_INSTALLED { return } installStatus, installAction, kbStatus := ResolveInstallStatus(status.Version, status.BundleVersion, status.LastExitStatus) status.InstallStatus = installStatus status.InstallAction = installAction status.Status = kbStatus return }
func AutoInstallWithStatus(g *libkb.GlobalContext, binPath string, force bool) keybase1.InstallResult { _, res, err := autoInstall(g, binPath, force) if err != nil { return keybase1.InstallResult{Status: keybase1.StatusFromCode(keybase1.StatusCode_SCInstallError, err.Error())} } return NewInstallResult(res) }
func ResolveInstallStatus(version string, bundleVersion string, lastExitStatus string) (installStatus keybase1.InstallStatus, installAction keybase1.InstallAction, status keybase1.Status) { installStatus = keybase1.InstallStatus_UNKNOWN installAction = keybase1.InstallAction_UNKNOWN if version != "" && bundleVersion != "" { sv, err := semver.Make(version) if err != nil { installStatus = keybase1.InstallStatus_ERROR installAction = keybase1.InstallAction_REINSTALL status = keybase1.StatusFromCode(keybase1.StatusCode_SCInvalidVersionError, err.Error()) return } bsv, err := semver.Make(bundleVersion) // Invalid bundle bersion if err != nil { installStatus = keybase1.InstallStatus_ERROR installAction = keybase1.InstallAction_NONE status = keybase1.StatusFromCode(keybase1.StatusCode_SCInvalidVersionError, err.Error()) return } if bsv.GT(sv) { installStatus = keybase1.InstallStatus_INSTALLED installAction = keybase1.InstallAction_UPGRADE } else if bsv.EQ(sv) { installStatus = keybase1.InstallStatus_INSTALLED installAction = keybase1.InstallAction_NONE } else if bsv.LT(sv) { installStatus = keybase1.InstallStatus_ERROR installAction = keybase1.InstallAction_NONE status = keybase1.StatusFromCode(keybase1.StatusCode_SCOldVersionError, fmt.Sprintf("Bundle version (%s) is less than installed version (%s)", bundleVersion, version)) return } } else if version != "" && bundleVersion == "" { installStatus = keybase1.InstallStatus_INSTALLED } else if version == "" && bundleVersion != "" { installStatus = keybase1.InstallStatus_NOT_INSTALLED installAction = keybase1.InstallAction_INSTALL } // If we have an unknown install status, then let's try to re-install. if bundleVersion != "" && installStatus == keybase1.InstallStatus_UNKNOWN && (version != "" || lastExitStatus != "") { installAction = keybase1.InstallAction_REINSTALL installStatus = keybase1.InstallStatus_INSTALLED } status = keybase1.StatusOK("") return }
func statusFromResults(componentResults []keybase1.ComponentResult) keybase1.Status { var errorMessages []string for _, cs := range componentResults { if cs.Status.Code != 0 { errorMessages = append(errorMessages, fmt.Sprintf("%s (%s)", cs.Status.Desc, cs.Name)) } } if len(errorMessages) > 0 { return keybase1.StatusFromCode(keybase1.StatusCode_SCInstallError, strings.Join(errorMessages, ". ")) } return keybase1.StatusOK("") }
func (v *CmdInstall) runInstall() keybase1.InstallResult { err := install.CheckIfValidLocation() if err != nil { v.G().Log.Errorf("%s", err) return keybase1.InstallResult{Status: err.Status(), Fatal: true} } if v.installer == "auto" { return install.AutoInstallWithStatus(v.G(), v.binPath, v.force, v.G().Log) } else if v.installer == "" { return install.Install(v.G(), v.binPath, v.components, v.force, v.G().Log) } return keybase1.InstallResult{Status: keybase1.StatusFromCode(keybase1.StatusCode_SCInstallError, fmt.Sprintf("Invalid installer: %s", v.installer))} }
func componentResult(name string, err error) keybase1.ComponentResult { if err != nil { return keybase1.ComponentResult{Name: string(name), Status: keybase1.StatusFromCode(keybase1.StatusCode_SCInstallError, err.Error())} } return keybase1.ComponentResult{Name: string(name), Status: keybase1.StatusOK("")} }