From aa65b648673e6e75235aa246eae7ea83808109f8 Mon Sep 17 00:00:00 2001 From: Christopher Ramey Date: Sun, 7 Mar 2021 18:40:45 -0900 Subject: [PATCH] added client calls for running servers --- api/command.go | 8 ++++++++ client/client.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ main.go | 29 +++++++++++++++++++++++++++++ server/http.go | 13 +++++++++---- 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 client/client.go diff --git a/api/command.go b/api/command.go index eede2fd..6fa445d 100644 --- a/api/command.go +++ b/api/command.go @@ -15,6 +15,14 @@ type Command struct { Signature []byte `json:"sig,omitempty"` } +func NewCommand(cm string) *Command { + return &Command{ + Expires: time.Now().Add(time.Second * 5), + Command: cm, + Scheme: "hmac-sha256", + } +} + func ParseCommand(jsn []byte) (*Command, error) { cmd := &Command{} err := json.Unmarshal(jsn, cmd) diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..c10f3c6 --- /dev/null +++ b/client/client.go @@ -0,0 +1,44 @@ +package client + +import ( + "git.binarythought.com/cdramey/alrm/api" + "git.binarythought.com/cdramey/alrm/config" + "net/http" + "net/url" +) + +func Shutdown(cfg *config.Config) error { + return doCommand(cfg, "shutdown") +} + +func Restart(cfg *config.Config) error { + return doCommand(cfg, "restart") +} + +func doCommand(cfg *config.Config, cm string) error { + aurl, err := url.Parse("http://" + cfg.Listen + "/api") + if err != nil { + return err + } + + cmd := api.NewCommand(cm) + err = cmd.Sign(cfg.APIKey) + if err != nil { + return err + } + cjson, err := cmd.JSON() + if err != nil { + return err + } + + params := url.Values{} + params.Add("cmd", string(cjson)) + + resp, err := http.PostForm(aurl.String(), params) + if err != nil { + return err + } + defer resp.Body.Close() + + return nil +} diff --git a/main.go b/main.go index a078896..7e556c7 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "fmt" "git.binarythought.com/cdramey/alrm/config" "git.binarythought.com/cdramey/alrm/server" + "git.binarythought.com/cdramey/alrm/client" "os" "strings" ) @@ -130,6 +131,32 @@ func main() { } } + case "shutdown": + cfg, err := config.ReadConfig(*cfgpath, 0) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(1) + } + + err = client.Shutdown(cfg) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(1) + } + + case "restart": + cfg, err := config.ReadConfig(*cfgpath, 0) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(1) + } + + err = client.Restart(cfg) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(1) + } + case "help", "": printUsage() @@ -149,4 +176,6 @@ func printUsage() { fmt.Printf(" run a check manually: %s [args] check \n", os.Args[0]) fmt.Printf(" test an alarm: %s [args] alarm \n", os.Args[0]) fmt.Printf(" start server (forground): %s [args] server\n", os.Args[0]) + fmt.Printf(" shutdown server: %s [args] shutdown\n", os.Args[0]) + fmt.Printf(" restart server: %s [args] restart\n", os.Args[0]) } diff --git a/server/http.go b/server/http.go index b6b462b..db63def 100644 --- a/server/http.go +++ b/server/http.go @@ -2,22 +2,27 @@ package server import ( "fmt" - "net/http" "git.binarythought.com/cdramey/alrm/api" + "net/http" ) func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/api": - g := r.URL.Query() - c := g.Get("cmd") + if err := r.ParseForm(); err != nil { + http.Error(w, fmt.Sprintf("form parse error: %s", err.Error()), + http.StatusBadRequest) + return + } + + c := r.FormValue("cmd") if c == "" { http.Error(w, "no command given", http.StatusBadRequest) return } cmd, err := api.ParseCommand([]byte(c)) if err != nil { - http.Error(w, fmt.Sprintf("error parsing command: %s", err.Error()), + http.Error(w, fmt.Sprintf("command parse error: %s", err.Error()), http.StatusBadRequest) return }