diff --git a/cmd/circologctl/main.go b/cmd/circologctl/main.go index 2433a5f..e94cbf1 100644 --- a/cmd/circologctl/main.go +++ b/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 } diff --git a/cmd/circologd/http_ctl.go b/cmd/circologd/http_ctl.go index fcfe111..2910a8a 100644 --- a/cmd/circologd/http_ctl.go +++ b/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", } diff --git a/hub.go b/hub.go index 15d9da7..7f01ec8 100644 --- a/hub.go +++ b/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{}{