/
tools.go
110 lines (96 loc) · 2.76 KB
/
tools.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Copyright © 2018 NAME HERE <EMAIL ADDRESS>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
import (
"fmt"
"github.com/cheynewallace/tabby"
"github.com/kyokomi/emoji"
"github.com/naveego/bosun/pkg/bosun"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"sort"
)
var toolsCmd = addCommand(rootCmd, &cobra.Command{
Use: "tools",
Aliases: []string{"tool"},
Short: "Commands for listing and installing tools.",
})
var toolsListCmd = addCommand(toolsCmd, &cobra.Command{
Use: "list",
Short: "Lists known tools",
Run: func(cmd *cobra.Command, args []string) {
b := MustGetBosun()
tools := b.GetTools()
byFromPath := map[string]bosun.ToolDefs{}
for _, tool := range tools {
byFromPath[tool.FromPath] = append(byFromPath[tool.FromPath], tool)
}
for fromPath, tools := range byFromPath {
sort.Sort(tools)
fmt.Printf("Defined in %s:\n", fromPath)
t := tabby.New()
t.AddHeader("Name", "Installed", "Location", "Description")
for _, tool := range tools {
var installInfo string
var location string
executable, installErr := tool.GetExecutable()
if installErr != nil {
if tool.Installer != nil {
if _, err := tool.GetInstaller(); err == nil {
installInfo = emoji.Sprint(":cloud:")
location = "(installable)"
} else {
installInfo = emoji.Sprintf(":x:")
}
}
} else {
installInfo = emoji.Sprintf(":heavy_check_mark:")
location = executable
}
t.AddLine(tool.Name, installInfo, location, tool.Description)
}
t.Print()
fmt.Println()
}
},
})
var toolsInstallCmd = addCommand(toolsCmd, &cobra.Command{
Use: "install {tool}",
Short: "Installs a tool.",
SilenceUsage: true,
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
b := MustGetBosun()
tools := b.GetTools()
var tool *bosun.ToolDef
var ok bool
name := args[0]
for _, tool = range tools {
if tool.Name == name {
ok = true
break
}
}
if !ok {
return errors.Errorf("no tool found with name %q", name)
}
ctx := b.NewContext()
installer, err := tool.GetInstaller()
if err != nil {
return errors.Errorf("could not get installer for %q: %s", name, err)
}
err = installer.Execute(ctx)
return err
},
})