-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathcoreup.go
More file actions
121 lines (100 loc) · 2.69 KB
/
coreup.go
File metadata and controls
121 lines (100 loc) · 2.69 KB
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
package main
import (
"flag"
"fmt"
"os"
"os/user"
"text/tabwriter"
"github.com/polvi/coreup/drivers"
)
const (
cliName = "coreup"
cliDescription = `Core UP!!.`
)
type Command struct {
Name string // Name of the Command and the string to use to invoke it
Summary string // One-sentence summary of what the Command does
Usage string // Usage options/arguments
Description string // Detailed description of command
Flags flag.FlagSet // Set of flags associated with this command
Run func(args []string) int // Run a command with the given arguments, return exit status
}
var (
out *tabwriter.Writer
commands []*Command
globalFlagset *flag.FlagSet = flag.NewFlagSet(cliName, flag.ExitOnError)
client drivers.Client
globalFlags = struct {
project string
cachePath string
provider string
region string
}{}
)
func init() {
out = new(tabwriter.Writer)
out.Init(os.Stdout, 0, 8, 1, '\t', 0)
usr, _ := user.Current()
globalFlagset.StringVar(&globalFlags.project,
"project",
"coreup-"+usr.Username,
"name for the group of servers in the same project",
)
globalFlagset.StringVar(&globalFlags.cachePath,
"cred-cache",
usr.HomeDir+"/.coreup/cred-cache.json",
"location to store credential tokens",
)
globalFlagset.StringVar(&globalFlags.provider, "provider", "do",
"cloud or provider to launch instance in")
globalFlagset.StringVar(&globalFlags.region, "region", "",
"region of the cloud to run these commands in")
commands = []*Command{
cmdHelp,
cmdList,
cmdRun,
cmdTerminate,
}
}
func getAllFlags() (flags []*flag.Flag) {
return getFlags(globalFlagset)
}
func getFlags(flagset *flag.FlagSet) (flags []*flag.Flag) {
flags = make([]*flag.Flag, 0)
flagset.VisitAll(func(f *flag.Flag) {
flags = append(flags, f)
})
return
}
func main() {
var err error
globalFlagset.Parse(os.Args[1:])
var args = globalFlagset.Args()
// no command specified - trigger help
if len(args) < 1 {
args = append(args, "help")
}
var cmd *Command
// determine which Command should be run
for _, c := range commands {
if c.Name == args[0] {
cmd = c
if err := c.Flags.Parse(args[1:]); err != nil {
fmt.Println(err.Error())
os.Exit(2)
}
break
}
}
if cmd == nil {
fmt.Printf("%v: unknown subcommand: %q\n", cliName, args[0])
fmt.Printf("Run '%v help' for usage.\n", cliName)
os.Exit(2)
}
client, err = drivers.FromName(globalFlags.provider, globalFlags.project, globalFlags.region, globalFlags.cachePath)
if err != nil {
fmt.Println("Unable to create client:", err)
os.Exit(1)
}
os.Exit(cmd.Run(cmd.Flags.Args()))
}