// KeybaseFuseStatus returns Fuse status func KeybaseFuseStatus(bundleVersion string, log Log) keybase1.FuseStatus { st := keybase1.FuseStatus{ BundleVersion: bundleVersion, InstallStatus: keybase1.InstallStatus_UNKNOWN, InstallAction: keybase1.InstallAction_UNKNOWN, } var kextInfo *kext.Info // Check kbfuse 3.x path := "/Library/Filesystems/kbfuse.fs" if _, err := os.Stat(path); err == nil { st.Path = path kextID := "com.github.kbfuse.filesystems.kbfuse" info, err := kext.LoadInfo(kextID) if err != nil { st.InstallStatus = keybase1.InstallStatus_ERROR st.InstallAction = keybase1.InstallAction_REINSTALL st.Status = keybase1.Status{Code: libkb.SCGeneric, Name: "INSTALL_ERROR", Desc: err.Error()} return st } if info == nil { // This means the kext isn't loaded. If kext isn't loaded then kbfs will // load it when it start up by calling load_kbfuse (in the kext bundle). // TODO: Go ahead and load the kext ahead of time? st.InstallStatus = keybase1.InstallStatus_INSTALLED st.InstallAction = keybase1.InstallAction_NONE st.Status = keybase1.StatusOK(fmt.Sprintf("Fuse installed (%s) but kext was not loaded (%s)", st.Path, kextID)) return st } // Installed st.KextID = kextID kextInfo = info } // If neither is found, we have no install if st.KextID == "" || kextInfo == nil { st.InstallStatus = keybase1.InstallStatus_NOT_INSTALLED st.InstallAction = keybase1.InstallAction_INSTALL return st } // Try to get mount info, it's non-critical if we fail though. mountInfos, err := mountInfo("kbfuse") if err != nil { log.Errorf("Error trying to read mount info: %s", err) } st.MountInfos = mountInfos st.Version = kextInfo.Version st.KextStarted = kextInfo.Started installStatus, installAction, status := ResolveInstallStatus(st.Version, st.BundleVersion, "", log) st.InstallStatus = installStatus st.InstallAction = installAction st.Status = status return st }
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 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 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("")} }