Blob


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