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 path() string
15 76669f9b 2022-01-11 o }
16 76669f9b 2022-01-11 o
17 26fb88e9 2022-01-12 o //go:generate ./crud.sh -o crud.go
18 26fb88e9 2022-01-12 o
19 76669f9b 2022-01-11 o func (c *Client) lookupObject(objpath string) (object, error) {
20 82fc97ff 2022-01-12 o resp, err := c.get(objpath, "")
21 76669f9b 2022-01-11 o if err != nil {
22 76669f9b 2022-01-11 o return nil, err
23 76669f9b 2022-01-11 o }
24 76669f9b 2022-01-11 o defer resp.Body.Close()
25 76669f9b 2022-01-11 o if resp.StatusCode == http.StatusNotFound {
26 76669f9b 2022-01-11 o return nil, ErrNotExist
27 76669f9b 2022-01-11 o }
28 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
29 76669f9b 2022-01-11 o if err != nil {
30 76669f9b 2022-01-11 o return nil, fmt.Errorf("parse response: %v", err)
31 76669f9b 2022-01-11 o } else if iresp.Error != nil {
32 76669f9b 2022-01-11 o return nil, iresp.Error
33 76669f9b 2022-01-11 o } else if resp.StatusCode != http.StatusOK {
34 76669f9b 2022-01-11 o return nil, errors.New(resp.Status)
35 76669f9b 2022-01-11 o }
36 76669f9b 2022-01-11 o return objectFromLookup(iresp)
37 76669f9b 2022-01-11 o }
38 76669f9b 2022-01-11 o
39 76669f9b 2022-01-11 o func (c *Client) filterObjects(objpath, expr string) ([]object, error) {
40 6d1ce85e 2022-01-12 o resp, err := c.get(objpath, expr)
41 76669f9b 2022-01-11 o if err != nil {
42 76669f9b 2022-01-11 o return nil, err
43 76669f9b 2022-01-11 o }
44 76669f9b 2022-01-11 o defer resp.Body.Close()
45 64e18a8d 2022-01-21 o iresp, err := parseResponse(resp.Body)
46 64e18a8d 2022-01-21 o if err != nil {
47 64e18a8d 2022-01-21 o return nil, fmt.Errorf("parse response: %v", err)
48 64e18a8d 2022-01-21 o } else if iresp.Error != nil {
49 64e18a8d 2022-01-21 o return nil, iresp.Error
50 64e18a8d 2022-01-21 o } else if resp.StatusCode != http.StatusOK {
51 64e18a8d 2022-01-21 o return nil, errors.New(resp.Status)
52 64e18a8d 2022-01-21 o } else if len(iresp.Results) == 0 {
53 6d1ce85e 2022-01-12 o return nil, ErrNoMatch
54 6d1ce85e 2022-01-12 o }
55 76669f9b 2022-01-11 o return iresp.Results, nil
56 76669f9b 2022-01-11 o }
57 76669f9b 2022-01-11 o
58 76669f9b 2022-01-11 o func (c *Client) createObject(obj object) error {
59 76669f9b 2022-01-11 o buf := &bytes.Buffer{}
60 76669f9b 2022-01-11 o switch v := obj.(type) {
61 e0c24850 2022-01-14 o case Host, Service, User, HostGroup:
62 76669f9b 2022-01-11 o if err := json.NewEncoder(buf).Encode(v); err != nil {
63 76669f9b 2022-01-11 o return err
64 76669f9b 2022-01-11 o }
65 76669f9b 2022-01-11 o default:
66 76669f9b 2022-01-11 o return fmt.Errorf("create type %T unsupported", v)
67 76669f9b 2022-01-11 o }
68 76669f9b 2022-01-11 o resp, err := c.put(obj.path(), buf)
69 76669f9b 2022-01-11 o if err != nil {
70 76669f9b 2022-01-11 o return err
71 76669f9b 2022-01-11 o }
72 76669f9b 2022-01-11 o if resp.StatusCode == http.StatusOK {
73 76669f9b 2022-01-11 o return nil
74 76669f9b 2022-01-11 o }
75 76669f9b 2022-01-11 o defer resp.Body.Close()
76 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
77 76669f9b 2022-01-11 o if err != nil {
78 76669f9b 2022-01-11 o return fmt.Errorf("parse response: %v", err)
79 76669f9b 2022-01-11 o }
80 76669f9b 2022-01-11 o if strings.Contains(iresp.Error.Error(), "already exists") {
81 76669f9b 2022-01-11 o return ErrExist
82 76669f9b 2022-01-11 o }
83 76669f9b 2022-01-11 o return iresp.Error
84 76669f9b 2022-01-11 o }
85 76669f9b 2022-01-11 o
86 02a1a100 2022-01-18 o func (c *Client) deleteObject(objpath string, cascade bool) error {
87 02a1a100 2022-01-18 o resp, err := c.delete(objpath, cascade)
88 76669f9b 2022-01-11 o if err != nil {
89 76669f9b 2022-01-11 o return err
90 76669f9b 2022-01-11 o }
91 76669f9b 2022-01-11 o defer resp.Body.Close()
92 76669f9b 2022-01-11 o if resp.StatusCode == http.StatusOK {
93 76669f9b 2022-01-11 o return nil
94 76669f9b 2022-01-11 o } else if resp.StatusCode == http.StatusNotFound {
95 76669f9b 2022-01-11 o return ErrNotExist
96 76669f9b 2022-01-11 o }
97 76669f9b 2022-01-11 o iresp, err := parseResponse(resp.Body)
98 76669f9b 2022-01-11 o if err != nil {
99 76669f9b 2022-01-11 o return fmt.Errorf("parse response: %v", err)
100 76669f9b 2022-01-11 o }
101 76669f9b 2022-01-11 o return iresp.Error
102 76669f9b 2022-01-11 o }