Browse Source

Merge branch 'statusctl' of blallo/circolog into master

boyska 5 years ago
parent
commit
bf9667a8a8
3 changed files with 75 additions and 17 deletions
  1. 52 12
      cmd/circologctl/main.go
  2. 1 0
      cmd/circologd/http_ctl.go
  3. 22 5
      hub.go

+ 52 - 12
cmd/circologctl/main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"context"
+	"encoding/json"
 	"flag"
 	"fmt"
 	"io"
@@ -11,6 +12,8 @@ import (
 	"os"
 	"strings"
 	"time"
+
+	"git.lattuga.net/boyska/circolog"
 )
 
 var globalOpts struct {
@@ -30,6 +33,7 @@ func init() {
 		// TODO: implement set and get of config at runtime
 		//"set":     setCmd,
 		//"get":     getCmd,
+		"status":  statusCmd,
 		"pause":   pauseCmd,
 		"filter":  filterCmd,
 		"reload":  reloadCmd,
@@ -42,24 +46,41 @@ func init() {
 
 //func getCmd(ctlSock string, args []string) error {}
 
-func filterCmd(args []string) error {
-	filter := strings.Join(args[1:], " ")
-	postBody := make(map[string][]string)
-	postBody["where"] = []string{filter}
-	if globalOpts.debug {
-		fmt.Println("[DEBUG] postBody:", postBody)
+func statusCmd(args []string) error {
+	flagset := flag.NewFlagSet(args[0], flag.ExitOnError)
+	outFormat := flagset.String("format", "plain", "Which format to use as output for this command (json, pretty, plain)")
+	flagset.Parse(args[1:])
+	resp, err := ctl.Get("http://unix/status")
+	if err != nil {
+		return err
 	}
-	resp, err := ctl.PostForm("http://unix/filter", postBody)
-	if resp.StatusCode != 200 || globalOpts.verbose {
-		defer resp.Body.Close()
-		bodyBytes, err := ioutil.ReadAll(resp.Body)
+	defer resp.Body.Close()
+	respBytes, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return err
+	}
+	respJSON := make(map[string]circolog.StatusResponse)
+	err = json.Unmarshal(respBytes, &respJSON)
+	if err != nil {
+		return err
+	}
+	switch *outFormat {
+	case "json":
+		fmt.Printf("%s", string(respBytes))
+	case "pretty":
+		prettyJSON, err := json.MarshalIndent(respJSON, "", "  ")
 		if err != nil {
 			return err
 		}
-		fmt.Println(string(bodyBytes))
+		fmt.Printf("%s\n", prettyJSON)
+	case "plain":
+		fmt.Printf("Buffer Size:   %d\n", respJSON["status"].Size)
+		fmt.Printf("Server Status: %s\n", respJSON["status"].Status())
+		fmt.Printf("Filter String: %s\n", respJSON["status"].Filter)
 	}
-	return err
+	return nil
 }
+
 func pauseCmd(args []string) error {
 	var dontChangeAgain time.Duration
 	flagset := flag.NewFlagSet(args[0], flag.ExitOnError)
@@ -84,6 +105,25 @@ func pauseCmd(args []string) error {
 	return err
 }
 
+func filterCmd(args []string) error {
+	filter := strings.Join(args[1:], " ")
+	postBody := make(map[string][]string)
+	postBody["where"] = []string{filter}
+	if globalOpts.debug {
+		fmt.Println("[DEBUG] postBody:", postBody)
+	}
+	resp, err := ctl.PostForm("http://unix/filter", postBody)
+	if resp.StatusCode != 200 || globalOpts.verbose {
+		defer resp.Body.Close()
+		bodyBytes, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+			return err
+		}
+		fmt.Println(string(bodyBytes))
+	}
+	return err
+}
+
 func reloadCmd(args []string) error {
 	return nil
 }

+ 1 - 0
cmd/circologd/http_ctl.go

@@ -117,6 +117,7 @@ func printHelp(verbose bool) http.HandlerFunc {
 		var pathsWithDocs = map[string]string{
 			"/pause/toggle": "Toggle the server from pause state (not listening)",
 			"/logs/clear":   "Wipe the buffer from all the messages",
+			"/status":       "Get info on the status of the server",
 			"/help":         "This help",
 			"/echo":         "Answers to heartbeat",
 		}

+ 22 - 5
hub.go

@@ -44,10 +44,26 @@ type HubFullCommand struct {
 	Parameters map[string]interface{}
 	Response   chan CommandResponse
 }
+
 type CommandResponse struct {
 	Value interface{}
 }
 
+// StatusResponse is an implementation of a CommandResponse
+type StatusResponse struct {
+	Size      int    `json:"size"`
+	IsRunning bool   `json:"running"`
+	Filter    string `json:"filter"`
+}
+
+// Status return "paused/unpaused" based on isRunning value
+func (r StatusResponse) Status() string {
+	if r.IsRunning {
+		return "unpaused"
+	}
+	return "paused"
+}
+
 type Hub struct {
 	Register    chan Client
 	Unregister  chan Client
@@ -141,11 +157,12 @@ func (h *Hub) Run() {
 				fmt.Println("paused")
 				cmd.Response <- CommandResponse{Value: active}
 			case CommandStatus:
-				cmd.Response <- CommandResponse{Value: map[string]interface{}{
-					"size":   h.circbuf.Len(),
-					"paused": !active,
-					"filter": filter.String(),
-				}}
+				var resp = StatusResponse{
+					Size:      h.circbuf.Len(),
+					IsRunning: active,
+					Filter:    filter.String(),
+				}
+				cmd.Response <- CommandResponse{Value: resp}
 			case CommandNewFilter:
 				if err := filter.Set(cmd.Parameters["where"].(string)); err != nil {
 					cmd.Response <- CommandResponse{Value: map[string]interface{}{