Blame


1 76669f9b 2022-01-11 o package icinga
2 76669f9b 2022-01-11 o
3 76669f9b 2022-01-11 o import (
4 76669f9b 2022-01-11 o "encoding/json"
5 76669f9b 2022-01-11 o "errors"
6 76669f9b 2022-01-11 o "fmt"
7 76669f9b 2022-01-11 o "io"
8 76669f9b 2022-01-11 o "strings"
9 76669f9b 2022-01-11 o )
10 76669f9b 2022-01-11 o
11 76669f9b 2022-01-11 o type apiResponse struct {
12 76669f9b 2022-01-11 o Results []struct {
13 1646fdeb 2022-01-18 o Name string
14 1646fdeb 2022-01-18 o Type string
15 1646fdeb 2022-01-18 o Errors []string
16 1646fdeb 2022-01-18 o Permissions []string
17 1646fdeb 2022-01-18 o Attrs json.RawMessage
18 76669f9b 2022-01-11 o }
19 76669f9b 2022-01-11 o Status string
20 76669f9b 2022-01-11 o }
21 76669f9b 2022-01-11 o
22 76669f9b 2022-01-11 o type response struct {
23 76669f9b 2022-01-11 o Results []object
24 76669f9b 2022-01-11 o Error error
25 76669f9b 2022-01-11 o }
26 76669f9b 2022-01-11 o
27 49e200e1 2022-02-03 o func parseResponse(r io.Reader) (*response, error) {
28 76669f9b 2022-01-11 o var apiresp apiResponse
29 76669f9b 2022-01-11 o if err := json.NewDecoder(r).Decode(&apiresp); err != nil {
30 76669f9b 2022-01-11 o return nil, err
31 76669f9b 2022-01-11 o }
32 76669f9b 2022-01-11 o // Confusingly the top-level status field in an API response contains
33 76669f9b 2022-01-11 o // an error message. Successful statuses are actually held in the
34 76669f9b 2022-01-11 o // status field in Results!
35 76669f9b 2022-01-11 o if apiresp.Status != "" {
36 76669f9b 2022-01-11 o return &response{Error: errors.New(apiresp.Status)}, nil
37 76669f9b 2022-01-11 o }
38 76669f9b 2022-01-11 o resp := &response{}
39 76669f9b 2022-01-11 o for _, r := range apiresp.Results {
40 76669f9b 2022-01-11 o if len(r.Errors) > 0 {
41 76669f9b 2022-01-11 o resp.Error = errors.New(strings.Join(r.Errors, ", "))
42 76669f9b 2022-01-11 o // got an error so nothing left in the API response
43 76669f9b 2022-01-11 o break
44 76669f9b 2022-01-11 o }
45 76669f9b 2022-01-11 o if r.Type == "" {
46 76669f9b 2022-01-11 o continue //
47 76669f9b 2022-01-11 o }
48 76669f9b 2022-01-11 o switch r.Type {
49 76669f9b 2022-01-11 o case "Host":
50 76669f9b 2022-01-11 o var h Host
51 46ca0f68 2022-02-01 o h.Name = r.Name
52 76669f9b 2022-01-11 o if err := json.Unmarshal(r.Attrs, &h); err != nil {
53 76669f9b 2022-01-11 o return nil, err
54 76669f9b 2022-01-11 o }
55 76669f9b 2022-01-11 o resp.Results = append(resp.Results, h)
56 76669f9b 2022-01-11 o case "Service":
57 76669f9b 2022-01-11 o var s Service
58 46ca0f68 2022-02-01 o s.Name = r.Name
59 76669f9b 2022-01-11 o if err := json.Unmarshal(r.Attrs, &s); err != nil {
60 76669f9b 2022-01-11 o return nil, err
61 76669f9b 2022-01-11 o }
62 76669f9b 2022-01-11 o resp.Results = append(resp.Results, s)
63 76669f9b 2022-01-11 o case "User":
64 76669f9b 2022-01-11 o var u User
65 46ca0f68 2022-02-01 o u.Name = r.Name
66 76669f9b 2022-01-11 o if err := json.Unmarshal(r.Attrs, &u); err != nil {
67 76669f9b 2022-01-11 o return nil, err
68 76669f9b 2022-01-11 o }
69 76669f9b 2022-01-11 o resp.Results = append(resp.Results, u)
70 e0c24850 2022-01-14 o case "HostGroup":
71 e0c24850 2022-01-14 o var h HostGroup
72 46ca0f68 2022-02-01 o h.Name = r.Name
73 e0c24850 2022-01-14 o if err := json.Unmarshal(r.Attrs, &h); err != nil {
74 e0c24850 2022-01-14 o return nil, err
75 e0c24850 2022-01-14 o }
76 e0c24850 2022-01-14 o resp.Results = append(resp.Results, h)
77 76669f9b 2022-01-11 o default:
78 76669f9b 2022-01-11 o return nil, fmt.Errorf("unsupported unmarshal of type %s", r.Type)
79 76669f9b 2022-01-11 o }
80 76669f9b 2022-01-11 o }
81 76669f9b 2022-01-11 o return resp, nil
82 76669f9b 2022-01-11 o }
83 76669f9b 2022-01-11 o
84 76669f9b 2022-01-11 o func objectFromLookup(resp *response) (object, error) {
85 76669f9b 2022-01-11 o if len(resp.Results) == 0 {
86 76669f9b 2022-01-11 o return nil, errors.New("empty results")
87 76669f9b 2022-01-11 o } else if len(resp.Results) > 1 {
88 76669f9b 2022-01-11 o return nil, errors.New("too many results")
89 76669f9b 2022-01-11 o }
90 76669f9b 2022-01-11 o return resp.Results[0], nil
91 76669f9b 2022-01-11 o }