diff --git a/cmd/circologctl/main.go b/cmd/circologctl/main.go index ea87c38..4f2ff51 100644 --- a/cmd/circologctl/main.go +++ b/cmd/circologctl/main.go @@ -1,10 +1,16 @@ package main import ( + "context" "flag" "fmt" "io" + "io/ioutil" + "net" + "net/http" "os" + "strconv" + "strings" ) var globalOpts struct { @@ -12,6 +18,8 @@ var globalOpts struct { verbose bool } +var ctl http.Client + type commandFunc func([]string) error var cmdMap map[string]commandFunc @@ -32,8 +40,66 @@ func init() { //func getCmd(ctlSock string, args []string) error {} +func parsePauseOpts(postponeTime string) (string, error) { + var waitTime int64 + var err error + L := len(postponeTime) + switch unit := postponeTime[L-1]; string(unit) { + case "s": + waitTime, err = strconv.ParseInt(postponeTime[:L-2], 10, 16) + if err != nil { + return "", err + } + case "m": + waitTime, err = strconv.ParseInt(postponeTime[:L-2], 10, 16) + if err != nil { + return "", err + } + waitTime = waitTime * 60 + case "h": + waitTime, err = strconv.ParseInt(postponeTime[:L-2], 10, 16) + if err != nil { + return "", err + } + waitTime = waitTime * 60 * 60 + case "d": + waitTime, err = strconv.ParseInt(postponeTime[:L-2], 10, 16) + if err != nil { + return "", err + } + waitTime = waitTime * 60 * 60 * 24 + case "w": + waitTime, err = strconv.ParseInt(postponeTime[:L-2], 10, 16) + if err != nil { + return "", err + } + waitTime = waitTime * 60 * 60 * 24 * 7 + } + return string(waitTime), nil +} + func pauseCmd(args []string) error { - return nil + var postBody string + var err error + flagset := flag.NewFlagSet(args[0], flag.ExitOnError) + postponeTime := flagset.String("postpone", "", "How long to wait before untoggling the state") + flagset.Parse(args[1:]) + if *postponeTime != "" { + postBody, err = parsePauseOpts(*postponeTime) + if err != nil { + return err + } + } + resp, err := ctl.Post("http://unix/pause/toggle", "application/octet-stream", strings.NewReader(postBody)) + if globalOpts.verbose { + defer resp.Body.Close() + bodyBytes, err2 := ioutil.ReadAll(resp.Body) + if err2 != nil { + return err2 + } + fmt.Println(string(bodyBytes)) + } + return err } func reloadCmd(args []string) error { @@ -66,6 +132,14 @@ func parseAndRun(args []string) { usage(os.Stderr) os.Exit(2) } + // from here: https://gist.github.com/teknoraver/5ffacb8757330715bcbcc90e6d46ac74 + ctl = http.Client{ + Transport: &http.Transport{ + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", globalOpts.ctlSock) + }, + }, + } err := cmdToRun(args) if err != nil { fmt.Fprintf(os.Stderr, "Error:\n%s\n", err) @@ -79,9 +153,6 @@ func main() { 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)