Browse Source

[ctl] pause subcommand partially implemented

Blallo 5 years ago
parent
commit
9ef425d827
1 changed files with 75 additions and 4 deletions
  1. 75 4
      cmd/circologctl/main.go

+ 75 - 4
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)