this repo has no description

bsky-modactions: add config/value handlers

Changed files
+79
cmd
bsky-modactions
+24
cmd/bsky-modactions/main.go
··· 8 8 "net/http" 9 9 "os" 10 10 "os/signal" 11 + "time" 11 12 12 13 comatproto "github.com/bluesky-social/indigo/api/atproto" 13 14 "github.com/fxamacker/cbor/v2" ··· 102 103 } 103 104 }() 104 105 106 + mux := http.NewServeMux() 107 + mux.HandleFunc("/config", configHandler) 108 + mux.HandleFunc("/", valueHandler) 109 + 110 + srv := &http.Server{ 111 + Addr: "127.0.0.1:4456", 112 + Handler: mux, 113 + } 114 + 115 + go func() { 116 + if err := srv.ListenAndServe(); err != nil { 117 + slog.Error("error starting HTTP server", "err", err) 118 + return 119 + } 120 + }() 121 + 105 122 <-ctx.Done() 106 123 stop() 107 124 slog.Info("shutting down") 125 + 126 + endctx, cancel := context.WithTimeout(context.TODO(), time.Minute) 127 + defer cancel() 128 + 129 + if err := srv.Shutdown(endctx); err != nil { 130 + slog.Error("error shutting down server", "err", err) 131 + } 108 132 109 133 return nil 110 134 }
+55
cmd/bsky-modactions/munin.go
··· 1 + package main 2 + 3 + import ( 4 + "context" 5 + "fmt" 6 + "net/http" 7 + "regexp" 8 + 9 + "github.com/redis/go-redis/v9" 10 + ) 11 + 12 + // https://guide.munin-monitoring.org/en/latest/reference/plugin.html#notes-on-field-names 13 + var sanitize = regexp.MustCompile("[^a-zA-Z0-9_]") 14 + 15 + var rdb = redis.NewClient(&redis.Options{ 16 + Addr: "localhost:6379", 17 + Password: "", 18 + DB: 0, 19 + }) 20 + 21 + const AddedStop = 7 22 + 23 + func configHandler(w http.ResponseWriter, r *http.Request) { 24 + labels, err := rdb.ZRevRange(context.TODO(), LabelsAdded, 0, AddedStop).Result() 25 + if err != nil { 26 + w.WriteHeader(http.StatusInternalServerError) 27 + return 28 + } 29 + 30 + fmt.Fprint(w, "graph_title bluesky labels added\n") 31 + fmt.Fprint(w, "graph_category bluesky\n") 32 + fmt.Fprint(w, "graph_vlabel labels / ${graph_period}\n") 33 + fmt.Fprint(w, "graph_width 600\n") 34 + fmt.Fprint(w, "graph_height 300\n") 35 + 36 + for _, label := range labels { 37 + slug := sanitize.ReplaceAll([]byte(label), []byte("_")) 38 + fmt.Fprintf(w, "%s.label %s\n", slug, label) 39 + fmt.Fprintf(w, "%s.type DERIVE\n", slug) 40 + } 41 + } 42 + 43 + func valueHandler(w http.ResponseWriter, r *http.Request) { 44 + labels, err := rdb.ZRevRangeWithScores(context.TODO(), LabelsAdded, 0, AddedStop).Result() 45 + if err != nil { 46 + w.WriteHeader(http.StatusInternalServerError) 47 + return 48 + } 49 + 50 + for _, label := range labels { 51 + key := label.Member.(string) 52 + slug := sanitize.ReplaceAll([]byte(key), []byte("_")) 53 + fmt.Fprintf(w, "%s.value %0.f\n", slug, label.Score) 54 + } 55 + }