+24
cmd/bsky-modactions/main.go
+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
+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
+
}