diff --git a/cmd/wasmcloud/handler_logs.go b/cmd/wasmcloud/handler_logs.go new file mode 100644 index 0000000..25547be --- /dev/null +++ b/cmd/wasmcloud/handler_logs.go @@ -0,0 +1,73 @@ +package main + +import ( + "context" + "encoding/json" + "flag" + "fmt" + "io" + "log" + "net/http" + "os" + + "github.com/google/subcommands" + "within.website/x/writer" +) + +type handlerLogsCmd struct{} + +func (handlerLogsCmd) SetFlags(fs *flag.FlagSet) {} +func (handlerLogsCmd) Name() string { return "logs" } +func (handlerLogsCmd) Synopsis() string { return "shows logs for a handler" } +func (handlerLogsCmd) Usage() string { + return `wasmcloud logs + +$ wasmcloud logs four-of-aether-60037 + +Returns all of the logs for a handler. +` +} + +func (handlerLogsCmd) Execute(ctx context.Context, fs *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { + if fs.NArg() != 1 { + fmt.Println("usage: wasmcloud create [options] ") + return subcommands.ExitUsageError + } + + hname := fs.Arg(0) + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, *apiServer+"/api/handler/logs?name="+hname, nil) + if err != nil { + log.Fatal(err) + } + withAPI(req) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + log.Fatal(err) + } + + if resp.StatusCode != http.StatusOK { + io.Copy(os.Stdout, resp.Body) + return subcommands.ExitFailure + } + + type resultLine struct { + ExecID string `json:"exec_id"` + Comment string `json:"comment"` + Logs map[string]string `json:"logs"` + } + var result []resultLine + + err = json.NewDecoder(resp.Body).Decode(&result) + if err != nil { + log.Fatal(err) + } + + for _, line := range result { + wr := writer.LineSplitting(writer.PrefixWriter(line.ExecID[:5]+" | ", os.Stdout)) + fmt.Fprintln(wr, line.Logs["logs.txt"]) + } + + return subcommands.ExitSuccess +} diff --git a/cmd/wasmcloud/main.go b/cmd/wasmcloud/main.go index 881b954..63226ec 100644 --- a/cmd/wasmcloud/main.go +++ b/cmd/wasmcloud/main.go @@ -21,6 +21,7 @@ func main() { subcommands.Register(&loginCmd{}, "api") subcommands.Register(&whoamiCmd{}, "api") subcommands.Register(&handlerCreateCmd{}, "handlers") + subcommands.Register(handlerLogsCmd{}, "handlers") subcommands.Register(namegenCmd{}, "utils") subcommands.Register(&runCmd{}, "utils") subcommands.ImportantFlag("api-server") diff --git a/cmd/wasmcloudd/handler.go b/cmd/wasmcloudd/handler.go index 09165d4..4e481c6 100644 --- a/cmd/wasmcloudd/handler.go +++ b/cmd/wasmcloudd/handler.go @@ -185,6 +185,11 @@ func invokeHandler(w http.ResponseWriter, r *http.Request, u *User) { } go func() { + f := ln.F{ + "name": name, + "run_id": execID, + } + ln.Log(ctx, ln.Action("invoke-handler"), f) msg, err := nc.Request(internal.TopicName, encData, 5*time.Minute) if err != nil { ln.Error(ctx, err) @@ -211,5 +216,7 @@ func invokeHandler(w http.ResponseWriter, r *http.Request, u *User) { ln.Error(ctx, err) return } + + ln.Log(ctx, ln.Action("saving-logs"), f) }() } diff --git a/cmd/wasmcloudd/main.go b/cmd/wasmcloudd/main.go index da61734..87603a9 100644 --- a/cmd/wasmcloudd/main.go +++ b/cmd/wasmcloudd/main.go @@ -10,6 +10,7 @@ import ( "github.com/gorilla/mux" "github.com/jinzhu/gorm" nats "github.com/nats-io/nats.go" + "within.website/ln/ex" ) var ( @@ -66,5 +67,5 @@ func main() { rtr.PathPrefix("/static/").Handler(http.FileServer(http.Dir("."))) log.Printf("listening on http://wasmcloud.kahless.cetacean.club:%s", *port) - http.ListenAndServe(":"+*port, rtr) + http.ListenAndServe(":"+*port, ex.HTTPLog(rtr)) } diff --git a/go.mod b/go.mod index 143ca0c..3dc2de7 100644 --- a/go.mod +++ b/go.mod @@ -23,5 +23,5 @@ require ( golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 within.website/ln v0.7.0 within.website/olin v0.1.1 - within.website/x v1.2.0 + within.website/x v1.2.1 ) diff --git a/go.sum b/go.sum index b611d18..08d8c6c 100644 --- a/go.sum +++ b/go.sum @@ -366,6 +366,7 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -448,3 +449,5 @@ within.website/olin v0.1.1 h1:y5kYkBMLcyZjt31d0bRiKhqVR4MEF3RTDk9uIjrvrds= within.website/olin v0.1.1/go.mod h1:x+83GWNkYGcu7B9d+4CNk3+5KtaXrVzCJo0kq9tezXI= within.website/x v1.2.0 h1:ZR/H2en2569p9og4Kx4hrDW2qyDtpVZ9upXOlCh/YGY= within.website/x v1.2.0/go.mod h1:f6yg4hO/pprWxgRNHxKZU0Z/aKCsZq+WLg3iR8n1V6U= +within.website/x v1.2.1 h1:prNr9fWf/O7irD2hS/1na7GW/jiWdbuLnWNy1ZMkf+8= +within.website/x v1.2.1/go.mod h1:f6yg4hO/pprWxgRNHxKZU0Z/aKCsZq+WLg3iR8n1V6U=