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 "bytes"
5 76669f9b 2022-01-11 o "encoding/json"
6 76669f9b 2022-01-11 o "errors"
7 76669f9b 2022-01-11 o "fmt"
8 76669f9b 2022-01-11 o "net/http"
9 76669f9b 2022-01-11 o "strings"
10 76669f9b 2022-01-11 o )
11 76669f9b 2022-01-11 o
12 76669f9b 2022-01-11 o type object interface {
13 76669f9b 2022-01-11 o name() string
14 76669f9b 2022-01-11 o attrs() map[string]interface{}
15 76669f9b 2022-01-11 o path() string
16 76669f9b 2022-01-11 o }
17 76669f9b 2022-01-11 o
18 76669f9b 2022-01-11 o func (c *Client) lookupObject(objpath string) (object, error) {
19 76669f9b 2022-01-11 o resp, err := c.get(objpath)
20 76669f9b 2022-01-11 o if err != nil {
21 76669f9b 2022-01-11 o return nil, err
22 76669f9b 2022-01-11 o }
23 76669f9b 2022-01-11 o defer resp.Body.Close()
24 76669f9b 2022-01-11 o if resp.StatusCode == http.StatusNotFound {
25 76669f9b 2022-01-11 o return nil, ErrNotExist
26 76669f9b 2022-01-11 o }
27 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
28 76669f9b 2022-01-11 o if err != nil {
29 76669f9b 2022-01-11 o return nil, fmt.Errorf("parse response: %v", err)
30 76669f9b 2022-01-11 o } else if iresp.Error != nil {
31 76669f9b 2022-01-11 o return nil, iresp.Error
32 76669f9b 2022-01-11 o } else if resp.StatusCode != http.StatusOK {
33 76669f9b 2022-01-11 o return nil, errors.New(resp.Status)
34 76669f9b 2022-01-11 o }
35 76669f9b 2022-01-11 o return objectFromLookup(iresp)
36 76669f9b 2022-01-11 o }
37 76669f9b 2022-01-11 o
38 76669f9b 2022-01-11 o func (c *Client) allObjects(objpath string) ([]object, error) {
39 76669f9b 2022-01-11 o resp, err := c.get(objpath)
40 76669f9b 2022-01-11 o if err != nil {
41 76669f9b 2022-01-11 o return nil, err
42 76669f9b 2022-01-11 o }
43 76669f9b 2022-01-11 o defer resp.Body.Close()
44 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
45 76669f9b 2022-01-11 o if err != nil {
46 76669f9b 2022-01-11 o return nil, err
47 76669f9b 2022-01-11 o } else if iresp.Error != nil {
48 76669f9b 2022-01-11 o return nil, iresp.Error
49 76669f9b 2022-01-11 o } else if resp.StatusCode != http.StatusOK {
50 76669f9b 2022-01-11 o return nil, errors.New(resp.Status)
51 76669f9b 2022-01-11 o }
52 76669f9b 2022-01-11 o return iresp.Results, nil
53 76669f9b 2022-01-11 o }
54 76669f9b 2022-01-11 o
55 76669f9b 2022-01-11 o func (c *Client) filterObjects(objpath, expr string) ([]object, error) {
56 76669f9b 2022-01-11 o resp, err := c.getFilter(objpath, expr)
57 76669f9b 2022-01-11 o if err != nil {
58 76669f9b 2022-01-11 o return nil, err
59 76669f9b 2022-01-11 o }
60 76669f9b 2022-01-11 o defer resp.Body.Close()
61 76669f9b 2022-01-11 o if resp.StatusCode == http.StatusNotFound {
62 76669f9b 2022-01-11 o return nil, ErrNoMatch
63 76669f9b 2022-01-11 o }
64 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
65 76669f9b 2022-01-11 o if err != nil {
66 76669f9b 2022-01-11 o return nil, err
67 76669f9b 2022-01-11 o } else if iresp.Error != nil {
68 76669f9b 2022-01-11 o return nil, iresp.Error
69 76669f9b 2022-01-11 o } else if resp.StatusCode != http.StatusOK {
70 76669f9b 2022-01-11 o return nil, errors.New(resp.Status)
71 76669f9b 2022-01-11 o }
72 76669f9b 2022-01-11 o return iresp.Results, nil
73 76669f9b 2022-01-11 o }
74 76669f9b 2022-01-11 o
75 76669f9b 2022-01-11 o func (c *Client) createObject(obj object) error {
76 76669f9b 2022-01-11 o buf := &bytes.Buffer{}
77 76669f9b 2022-01-11 o switch v := obj.(type) {
78 76669f9b 2022-01-11 o case Host:
79 76669f9b 2022-01-11 o if err := json.NewEncoder(buf).Encode(v); err != nil {
80 76669f9b 2022-01-11 o return err
81 76669f9b 2022-01-11 o }
82 76669f9b 2022-01-11 o case Service:
83 76669f9b 2022-01-11 o if err := json.NewEncoder(buf).Encode(v); err != nil {
84 76669f9b 2022-01-11 o return err
85 76669f9b 2022-01-11 o }
86 76669f9b 2022-01-11 o case User:
87 76669f9b 2022-01-11 o if err := json.NewEncoder(buf).Encode(v); err != nil {
88 76669f9b 2022-01-11 o return err
89 76669f9b 2022-01-11 o }
90 76669f9b 2022-01-11 o default:
91 76669f9b 2022-01-11 o return fmt.Errorf("create type %T unsupported", v)
92 76669f9b 2022-01-11 o }
93 76669f9b 2022-01-11 o resp, err := c.put(obj.path(), buf)
94 76669f9b 2022-01-11 o if err != nil {
95 76669f9b 2022-01-11 o return err
96 76669f9b 2022-01-11 o }
97 76669f9b 2022-01-11 o if resp.StatusCode == http.StatusOK {
98 76669f9b 2022-01-11 o return nil
99 76669f9b 2022-01-11 o }
100 76669f9b 2022-01-11 o defer resp.Body.Close()
101 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
102 76669f9b 2022-01-11 o if err != nil {
103 76669f9b 2022-01-11 o return fmt.Errorf("parse response: %v", err)
104 76669f9b 2022-01-11 o }
105 76669f9b 2022-01-11 o if strings.Contains(iresp.Error.Error(), "already exists") {
106 76669f9b 2022-01-11 o return ErrExist
107 76669f9b 2022-01-11 o }
108 76669f9b 2022-01-11 o return iresp.Error
109 76669f9b 2022-01-11 o }
110 76669f9b 2022-01-11 o
111 76669f9b 2022-01-11 o func (c *Client) deleteObject(objpath string) error {
112 76669f9b 2022-01-11 o resp, err := c.delete(objpath)
113 76669f9b 2022-01-11 o if err != nil {
114 76669f9b 2022-01-11 o return err
115 76669f9b 2022-01-11 o }
116 76669f9b 2022-01-11 o defer resp.Body.Close()
117 76669f9b 2022-01-11 o if resp.StatusCode == http.StatusOK {
118 76669f9b 2022-01-11 o return nil
119 76669f9b 2022-01-11 o } else if resp.StatusCode == http.StatusNotFound {
120 76669f9b 2022-01-11 o return ErrNotExist
121 76669f9b 2022-01-11 o }
122 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
123 76669f9b 2022-01-11 o if err != nil {
124 76669f9b 2022-01-11 o return fmt.Errorf("parse response: %v", err)
125 76669f9b 2022-01-11 o }
126 76669f9b 2022-01-11 o return iresp.Error
127 76669f9b 2022-01-11 o }