package main import ( "flag" "fmt" "io" "os" ) var globalOpts struct { ctlSock string verbose bool } type commandFunc func([]string) error var cmdMap map[string]commandFunc func init() { cmdMap = map[string]commandFunc{ // TODO: implement set and get of config at runtime //"set": setCmd, //"get": getCmd, "pause": pauseCmd, "reload": reloadCmd, "restart": restartCmd, "help": helpCmd, } } //func setCmd(ctlSock string, args []string) error {} //func getCmd(ctlSock string, args []string) error {} func pauseCmd(args []string) error { return nil } func reloadCmd(args []string) error { return nil } func restartCmd(args []string) error { return nil } func helpCmd(args []string) error { usage(os.Stdout) os.Exit(0) return nil } func usage(w io.Writer) { fmt.Fprintf(w, "USAGE: %s [globalOpts] [SUBCOMMAND] [opts]\n", os.Args[0]) fmt.Fprintf(w, "\nSUBCOMMANDS:\n\n") for command := range cmdMap { fmt.Fprintf(w, "\t%s\n", command) } } func parseAndRun(args []string) { cmdName := args[0] cmdToRun, ok := cmdMap[cmdName] if !ok { fmt.Fprintf(os.Stderr, "Unknown subcommand: %s\n", cmdName) usage(os.Stderr) os.Exit(2) } err := cmdToRun(args) if err != nil { fmt.Fprintf(os.Stderr, "Error:\n%s\n", err) os.Exit(1) } } func main() { flag.StringVar(&globalOpts.ctlSock, "ctl-socket", "/tmp/circologd-ctl.sock", "Path to a unix domain socket for the control server; leave empty to disable") flag.BoolVar(&globalOpts.verbose, "verbose", false, "Print more output") flag.Parse() args := flag.Args() if globalOpts.verbose { fmt.Fprintf(os.Stdout, "Args: %v", args) } if len(args) == 0 { usage(os.Stderr) os.Exit(-1) } parseAndRun(args) }