summaryrefslogtreecommitdiff
path: root/internal/federated.go
blob: 5e98ebb913b1b9c2679a3435c3e37fb2646efa16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package internal

import (
	"context"
	"fmt"
	"io"
	"log"
	"net/http"
	"time"
)

// Query all federated endpoints and merge states
func mergeFederated(ctx context.Context, state state, conf config) state {
	critical := func(cs checkResult, err error) {
		cs.output = err.Error()
		cs.status = nagiosCritical
		state.update(cs)
	}

	for _, endpoint := range conf.Federated {
		log.Println("Querying federated endpoint", endpoint)
		cs := checkResult{
			name:  fmt.Sprintf("Federated endpoint %s", endpoint),
			epoch: time.Now().Unix(),
			federatedFrom: func() string {
				// Extract the hostname from the endpoint
				u, err := http.NewRequest("GET", endpoint, nil)
				if err != nil {
					return endpoint
				}
				return u.URL.Hostname()
			}(),
		}

		req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil)
		if err != nil {
			critical(cs, err)
			continue
		}

		resp, err := http.DefaultClient.Do(req)
		if err != nil {
			critical(cs, err)
			continue
		}

		bytes, err := io.ReadAll(resp.Body)
		resp.Body.Close()
		if err != nil {
			critical(cs, err)
			continue
		}

		if err := state.mergeFromBytes(bytes); err != nil {
			critical(cs, err)
			continue
		}

		cs.output = fmt.Sprintf("OK: Federated endpoint returned %d bytes", len(bytes))
		cs.status = nagiosOk
		state.update(cs)
	}

	log.Println(state)
	return state
}