-
Notifications
You must be signed in to change notification settings - Fork 8
/
main.go
138 lines (118 loc) · 3.13 KB
/
main.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"fmt"
"os"
"strings"
"github.com/Sirupsen/logrus"
"github.com/codegangsta/cli"
)
// version will be the hash that the binary was built from
// and will be populated by the Makefile
var version = ""
// gitCommit will be the hash that the binary was built from
// and will be populated by the Makefile
var gitCommit = ""
const (
// name holds the name of this program
name = "redis-trib"
usage = `Redis Cluster command line utility.
For check, fix, reshard, del-node, set-timeout you can specify the host and port
of any working node in the cluster.`
)
// runtimeFlags is the list of supported global command-line flags
var runtimeFlags = []cli.Flag{
cli.BoolFlag{
Name: "debug",
Usage: "enable debug output for logging",
},
cli.BoolFlag{
Name: "verbose",
Usage: "verbose global flag for output.",
},
cli.StringFlag{
Name: "log",
Value: "",
Usage: "set the log file path where internal debug information is written",
},
cli.StringFlag{
Name: "log-format",
Value: "text",
Usage: "set the format used by logs ('text' (default), or 'json')",
},
}
// runtimeBeforeSubcommands is the function to run before command-line
// parsing occurs.
var runtimeBeforeSubcommands = beforeSubcommands
// runtimeCommandNotFound is the function to handle an invalid sub-command.
var runtimeCommandNotFound = commandNotFound
// runtimeCommands is all sub-command
var runtimeCommands = []cli.Command{
addNodeCommand,
callCommand,
checkCommand,
createCommand,
delNodeCommand,
fixCommand,
importCommand,
infoCommand,
rebalanceCommand,
reshardCommand,
setTimeoutCommand,
}
func beforeSubcommands(context *cli.Context) error {
if context.GlobalBool("debug") {
logrus.SetLevel(logrus.DebugLevel)
}
if context.GlobalBool("verbose") {
os.Setenv("ENV_MODE_VERBOSE", "true")
}
if path := context.GlobalString("log"); path != "" {
f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND|os.O_SYNC, 0666)
if err != nil {
return err
}
logrus.SetOutput(f)
}
switch context.GlobalString("log-format") {
case "text":
// retain logrus's default.
case "json":
logrus.SetFormatter(new(logrus.JSONFormatter))
default:
logrus.Fatalf("unknown log-format %q", context.GlobalString("log-format"))
}
return nil
}
// function called when an invalid command is specified which causes the
// runtime to error.
func commandNotFound(c *cli.Context, command string) {
err := fmt.Errorf("invalid command %q", command)
fatal(err)
}
// makeVersionString returns a multi-line string describing the runtime version.
func makeVersionString() string {
v := []string{
version,
}
if gitCommit != "" {
v = append(v, fmt.Sprintf("commit: %s", gitCommit))
}
return strings.Join(v, "\n")
}
func main() {
app := cli.NewApp()
app.Name = name
app.Writer = os.Stdout
app.Usage = usage
app.Version = makeVersionString()
app.Flags = runtimeFlags
app.Author = "soarpenguin"
app.Email = "[email protected]"
app.EnableBashCompletion = true
app.CommandNotFound = runtimeCommandNotFound
app.Before = runtimeBeforeSubcommands
app.Commands = runtimeCommands
if err := app.Run(os.Args); err != nil {
fatal(err)
}
}