Browse Source

Adding ctl subcommand to print status

Blallo 5 years ago
parent
commit
9427fe91b1
3 changed files with 59 additions and 4 deletions
  1. 38 0
      cmd/circologctl/main.go
  2. 1 0
      cmd/circologd/http_ctl.go
  3. 20 4
      hub.go

+ 38 - 0
cmd/circologctl/main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"context"
+	"encoding/json"
 	"flag"
 	"fmt"
 	"io"
@@ -10,6 +11,8 @@ import (
 	"net/http"
 	"os"
 	"time"
+
+	"git.lattuga.net/boyska/circolog"
 )
 
 var globalOpts struct {
@@ -29,6 +32,7 @@ func init() {
 		// TODO: implement set and get of config at runtime
 		//"set":     setCmd,
 		//"get":     getCmd,
+		"status":  statusCmd,
 		"pause":   pauseCmd,
 		"reload":  reloadCmd,
 		"restart": restartCmd,
@@ -40,6 +44,40 @@ func init() {
 
 //func getCmd(ctlSock string, args []string) error {}
 
+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
+	}
+	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.Printf("%s\n", prettyJSON)
+	case "plain":
+		fmt.Printf("Buffer Length: %d\n", respJSON["status"].Len)
+		fmt.Printf("Server Status: %s\n", respJSON["status"].Status())
+	}
+	return nil
+}
+
 func pauseCmd(args []string) error {
 	var dontChangeAgain time.Duration
 	flagset := flag.NewFlagSet(args[0], flag.ExitOnError)

+ 1 - 0
cmd/circologd/http_ctl.go

@@ -96,6 +96,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",
 		}

+ 20 - 4
hub.go

@@ -42,10 +42,25 @@ 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 {
+	Len       int  `json:"length"`
+	IsRunning bool `json:"running"`
+}
+
+// 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
@@ -138,10 +153,11 @@ 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,
-				}}
+				var resp = StatusResponse{
+					Len:       h.circbuf.Len(),
+					IsRunning: active,
+				}
+				cmd.Response <- CommandResponse{Value: resp}
 			}
 		}
 	}