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