1// Copyright 2015 Keybase, Inc. All rights reserved. Use of 2// this source code is governed by the included BSD license. 3 4package libkb 5 6import ( 7 "fmt" 8 "os/exec" 9 "runtime" 10) 11 12func PlatformSpecificUpgradeInstructionsString() (string, error) { 13 switch runtime.GOOS { 14 case "linux": 15 return linuxUpgradeInstructionsString() 16 default: 17 return "", nil 18 } 19} 20 21func PlatformSpecificUpgradeInstructions(g *GlobalContext, upgradeURI string) { 22 switch runtime.GOOS { 23 case "linux": 24 linuxUpgradeInstructions(g) 25 case "darwin": 26 darwinUpgradeInstructions(g, upgradeURI) 27 case "windows": 28 windowsUpgradeInstructions(g, upgradeURI) 29 } 30} 31 32func linuxUpgradeInstructions(g *GlobalContext) { 33 upgradeInstructions, err := linuxUpgradeInstructionsString() 34 if err == nil { 35 printUpgradeCommand(g, upgradeInstructions) 36 } 37} 38 39func linuxUpgradeInstructionsString() (string, error) { 40 hasPackageManager := func(name string) bool { 41 // Not all package managers are in /usr/bin. (openSUSE for example puts 42 // Yast in /usr/sbin.) Better to just do the full check now than to get 43 // confused later. 44 _, err := exec.LookPath(name) 45 return err == nil 46 } 47 48 packageName := "keybase" 49 50 var start string 51 if hasPackageManager("apt-get") { 52 start = "sudo apt-get update; sudo apt-get install " + packageName 53 } else if hasPackageManager("dnf") { 54 start = "sudo dnf upgrade " + packageName 55 } else if hasPackageManager("yum") { 56 start = "sudo yum upgrade " + packageName 57 } else if hasPackageManager("pacman") { 58 if len(PrereleaseBuild) > 0 { 59 start = "pacaur -S keybase-bin" 60 } else { 61 start = "sudo pacman -Syu" 62 } 63 } else { 64 return "", fmt.Errorf("Unhandled Linux upgrade instruction.") 65 } 66 67 complete := start + " && run_keybase" 68 return complete, nil 69} 70 71func darwinUpgradeInstructions(g *GlobalContext, upgradeURI string) { 72 packageName := "keybase" 73 if DefaultRunMode == DevelRunMode { 74 packageName = "keybase/beta/kbdev" 75 } else if DefaultRunMode == StagingRunMode { 76 packageName = "keybase/beta/kbstage" 77 } 78 79 if IsBrewBuild { 80 printUpgradeCommand(g, "brew update && brew upgrade "+packageName) 81 } else { 82 g.Log.Warning(" Please download a new version from " + upgradeURI) 83 } 84 // TODO: non-brew update instructions 85} 86 87func windowsUpgradeInstructions(g *GlobalContext, upgradeURI string) { 88 89 g.Log.Warning("To upgrade, download the latest Keybase installer from " + upgradeURI) 90} 91func printUpgradeCommand(g *GlobalContext, command string) { 92 g.Log.Warning("To upgrade, run the following command:") 93 g.Log.Warning(" " + command) 94} 95