From ce36c069a7a9d1f04e9d9795c13bdfd97f5684db Mon Sep 17 00:00:00 2001 From: noe Date: Wed, 26 Jun 2024 17:28:42 -0400 Subject: [PATCH] fix fronter, deployment --- fedi.go | 10 +++++----- flake.nix | 17 +++++++++++++++-- hook_handler.go | 32 ++++++++++++-------------------- module.nix | 1 + pluralkit.go | 29 ++++++++++++++++++++++++++++- prometheus.go | 36 ++++++++++++++++++++++-------------- result | 1 + 7 files changed, 84 insertions(+), 42 deletions(-) create mode 100644 module.nix create mode 120000 result diff --git a/fedi.go b/fedi.go index 6ec8018..effc661 100644 --- a/fedi.go +++ b/fedi.go @@ -33,7 +33,7 @@ func NewIceshrimpAPI(baseURL string, token string, fieldName string) IceshrimpAP } func (i IceshrimpAPI) UpdateFrontField(newValue string) { - log.Println("UpdateFrontField") + // log.Println("UpdateFrontField") headers := http.Header{} headers.Add("authorization", fmt.Sprintf("Bearer %s", i.Token)) @@ -71,7 +71,7 @@ func (i IceshrimpAPI) UpdateFrontField(newValue string) { return } - log.Println(fields) + // log.Println(fields) for idx, field := range fields.Fields { if field.Name == i.FieldName { @@ -93,9 +93,9 @@ func (i IceshrimpAPI) UpdateFrontField(newValue string) { return } - log.Println(buf.String()) + // log.Println(buf.String()) - resp, err = i.Client.Do(&http.Request{ + _, err = i.Client.Do(&http.Request{ URL: url, Method: "POST", Header: headers, @@ -105,5 +105,5 @@ func (i IceshrimpAPI) UpdateFrontField(newValue string) { log.Println("[IceshrimpAPI] update call failed", err) } - json.NewDecoder(os.Stderr).Decode(resp.Body) + // json.NewDecoder(os.Stderr).Decode(resp.Body) } diff --git a/flake.nix b/flake.nix index b0b6c25..0f51b6d 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "saerro"; + description = "plapkit"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; @@ -8,8 +8,21 @@ outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } { systems = [ "x86_64-linux" "aarch64-linux" ]; - perSystem = { config, self', pkgs, lib, system, ... }: { + perSystem = { config, self', pkgs, lib, system, ... }: rec { devShells.default = import ./shell.nix { inherit pkgs; }; + + packages.default = pkgs.buildGoModule { + name = "plapkit"; + src = ./.; + vendorHash = "sha256-YY7Hj7lSq7vEoMEIu/zmweWzd7p7KF+4YCUX2SJ7kwI="; + }; + + packages.container = pkgs.dockerTools.buildImage { + name = "plapkit"; + config = { + Cmd = [ "${packages.default}" ]; + }; + }; }; }; } \ No newline at end of file diff --git a/hook_handler.go b/hook_handler.go index f400a76..9fa7502 100644 --- a/hook_handler.go +++ b/hook_handler.go @@ -59,35 +59,27 @@ func postGetHookToken(rw http.ResponseWriter, req *http.Request) { go handler(payload) } -const SwitchOut = "00000000-0000-0000-0000-000000000000" - func handleHookCreateSwitch(h HookPayload) { - members, ok := h.Data["members"].([]interface{}) - if !ok { - log.Println("[handleHookCreateSwitch] ERR rejected, missing members", h.Data) + sw, err := pkApi.GetSwitch(h.SystemID, h.ID) + if err != nil { + log.Println("[handleHookCreateSwitch] switch fetch failed:", err) return } - log.Println("[handleHookCreateSwitch] got switch", members, h) + log.Println("[handleHookCreateSwitch] got switch", sw.Members) + log.Println("[handleHookCreateSwitch] system id", h.SystemID, " -- switch id", h.ID) - // switch out, stop - front := SwitchOut - if len(members) != 0 { - front, ok = members[0].(string) - if !ok { - log.Println("[handleHookCreateSwitch] ERR rejected, first member wasn't a string", members) - return - } + front := &PluralKitMember{ + UUID: "00000000-0000-0000-0000-000000000000", + Name: "???", } - member, err := pkApi.GetMember(front) - if err != nil { - log.Printf("[handleHookCreateSwitch] pk member fetch failed, skipping named requirements") - } else { - go dsiApi.UpdateFrontField(member.Name) + if len(sw.Members) != 0 { + front = &sw.Members[0] } - go promCountSwitches(h, members) + go dsiApi.UpdateFrontField(front.Name) + go promCountSwitches(h, sw.Members) // TODO: discord nickname updates } diff --git a/module.nix b/module.nix new file mode 100644 index 0000000..463085b --- /dev/null +++ b/module.nix @@ -0,0 +1 @@ +{ ... }: {} \ No newline at end of file diff --git a/pluralkit.go b/pluralkit.go index 4b93361..0a45248 100644 --- a/pluralkit.go +++ b/pluralkit.go @@ -13,6 +13,10 @@ var ( pkApi = NewPluralKit() ) +type PluralKitSwitch struct { + Members []PluralKitMember +} + type PluralKitMember struct { UUID string `json:"uuid"` Name string `json:"name"` @@ -44,7 +48,7 @@ func (pk *PluralKit) GetMember(id string) (*PluralKitMember, error) { } if resp.StatusCode != 200 { - return nil, fmt.Errorf("pluralkit did not find member %ss", id) + return nil, fmt.Errorf("pluralkit did not find member %s", id) } var member PluralKitMember @@ -57,3 +61,26 @@ func (pk *PluralKit) GetMember(id string) (*PluralKitMember, error) { return &member, nil } + +func (pk *PluralKit) GetSwitch(systemID string, switchID string) (*PluralKitSwitch, error) { + resp, err := pk.Client.Get(fmt.Sprintf("%s/systems/%s/switches/%s", pk.BaseURL, systemID, switchID)) + if err != nil { + return nil, fmt.Errorf("fetching pluralkit system %s switch %s failed: %w", systemID, switchID, err) + } + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("pluralkit did not find system %s switch %s", systemID, switchID) + } + + var sw PluralKitSwitch + err = json.NewDecoder(resp.Body).Decode(&sw) + if err != nil { + return nil, fmt.Errorf("malformed json: %w", err) + } + + for _, member := range sw.Members { + pk.Cache.Add(member.UUID, &member) + } + + return &sw, nil +} diff --git a/prometheus.go b/prometheus.go index b897101..cbf6bd3 100644 --- a/prometheus.go +++ b/prometheus.go @@ -8,7 +8,11 @@ import ( ) var ( - switchCounter *prometheus.CounterVec = promauto.NewCounterVec(prometheus.CounterOpts{ + // known high signals, we will set these to zero after. + // key is uuid:role + knownHighSwitches = map[string]prometheus.Labels{} // tima was here + + switchGauge *prometheus.GaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{ Namespace: "plapkit", Name: "switches", }, []string{"system", "member", "member_display", "role"}) @@ -19,26 +23,30 @@ var ( }, []string{"system", "member", "member_display"}) ) -func promCountSwitches(h HookPayload, members []interface{}) { - for idx, id := range members { +func clearHighSwitches() { + for _, labels := range knownHighSwitches { + switchGauge.With(labels).Set(0) + } +} + +func promCountSwitches(h HookPayload, members []PluralKitMember) { + clearHighSwitches() + + for idx, member := range members { role := "cofront" if idx == 0 { role = "front" } - member := &PluralKitMember{ - Name: "switched out", + labels := prometheus.Labels{ + "system": h.SystemID, + "member": member.UUID, + "member_display": member.Name, + "role": role, } - member2, err := pkApi.GetMember(id.(string)) - if err != nil { - member.Name = "%%lookup failed%%" - log.Println("[promCountSwitches] WARN lookup failed,", err) - } else { - member = member2 - } - - switchCounter.WithLabelValues(h.SystemID, id.(string), member.Name, role).Inc() + switchGauge.With(labels).Set(1) + knownHighSwitches[member.UUID+":"+role] = labels } } diff --git a/result b/result new file mode 120000 index 0000000..abc93be --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/cnnxb0z1g23wmaaigskrbdxfa566n97h-docker-image-plapkit.tar.gz \ No newline at end of file