Blame


1 6e415953 2022-01-06 o package icinga
2 6e415953 2022-01-06 o
3 50558780 2022-01-06 o import (
4 50558780 2022-01-06 o "encoding/json"
5 50558780 2022-01-06 o "fmt"
6 50558780 2022-01-06 o )
7 50558780 2022-01-06 o
8 50558780 2022-01-06 o // Host represents a Host object.
9 6e415953 2022-01-06 o type Host struct {
10 76669f9b 2022-01-11 o Name string `json:"name"`
11 76669f9b 2022-01-11 o Address string `json:"address"`
12 76669f9b 2022-01-11 o Address6 string `json:"address6"`
13 76669f9b 2022-01-11 o Groups []string `json:"groups"`
14 76669f9b 2022-01-11 o State HostState `json:"state"`
15 76669f9b 2022-01-11 o CheckCommand string `json:"check_command"`
16 76669f9b 2022-01-11 o DisplayName string `json:"display_name"`
17 6e415953 2022-01-06 o }
18 6e415953 2022-01-06 o
19 76669f9b 2022-01-11 o type HostState int
20 76669f9b 2022-01-11 o
21 76669f9b 2022-01-11 o const (
22 76669f9b 2022-01-11 o HostUp HostState = 0 + iota
23 76669f9b 2022-01-11 o HostDown
24 76669f9b 2022-01-11 o HostUnreachable
25 76669f9b 2022-01-11 o )
26 76669f9b 2022-01-11 o
27 76669f9b 2022-01-11 o func (s HostState) String() string {
28 76669f9b 2022-01-11 o switch s {
29 76669f9b 2022-01-11 o case HostUp:
30 76669f9b 2022-01-11 o return "HostUp"
31 76669f9b 2022-01-11 o case HostDown:
32 76669f9b 2022-01-11 o return "HostDown"
33 76669f9b 2022-01-11 o case HostUnreachable:
34 76669f9b 2022-01-11 o return "HostUnreachable"
35 76669f9b 2022-01-11 o }
36 76669f9b 2022-01-11 o return "unhandled host state"
37 50558780 2022-01-06 o }
38 50558780 2022-01-06 o
39 76669f9b 2022-01-11 o func (h Host) name() string {
40 76669f9b 2022-01-11 o return h.Name
41 50558780 2022-01-06 o }
42 50558780 2022-01-06 o
43 76669f9b 2022-01-11 o func (h Host) path() string {
44 76669f9b 2022-01-11 o return "/objects/hosts/" + h.Name
45 76669f9b 2022-01-11 o }
46 6e415953 2022-01-06 o
47 76669f9b 2022-01-11 o func (h Host) attrs() map[string]interface{} {
48 76669f9b 2022-01-11 o m := make(map[string]interface{})
49 76669f9b 2022-01-11 o m["display_name"] = h.DisplayName
50 76669f9b 2022-01-11 o return m
51 76669f9b 2022-01-11 o }
52 76669f9b 2022-01-11 o
53 50558780 2022-01-06 o func (h Host) MarshalJSON() ([]byte, error) {
54 50558780 2022-01-06 o type Attrs struct {
55 50558780 2022-01-06 o Address string `json:"address"`
56 50558780 2022-01-06 o CheckCommand string `json:"check_command"`
57 50558780 2022-01-06 o DisplayName string `json:"display_name"`
58 50558780 2022-01-06 o }
59 50558780 2022-01-06 o type host struct {
60 50558780 2022-01-06 o Attrs Attrs `json:"attrs"`
61 50558780 2022-01-06 o }
62 50558780 2022-01-06 o jhost := &host{
63 50558780 2022-01-06 o Attrs: Attrs{
64 50558780 2022-01-06 o Address: h.Address,
65 50558780 2022-01-06 o CheckCommand: h.CheckCommand,
66 50558780 2022-01-06 o DisplayName: h.DisplayName,
67 50558780 2022-01-06 o },
68 50558780 2022-01-06 o }
69 50558780 2022-01-06 o return json.Marshal(jhost)
70 50558780 2022-01-06 o }
71 50558780 2022-01-06 o
72 50558780 2022-01-06 o // Hosts returns all Hosts in the Icinga2 configuration.
73 6e415953 2022-01-06 o func (c *Client) Hosts() ([]Host, error) {
74 76669f9b 2022-01-11 o objects, err := c.allObjects("/objects/hosts")
75 6e415953 2022-01-06 o if err != nil {
76 76669f9b 2022-01-11 o return nil, fmt.Errorf("get all hosts: %w", err)
77 6e415953 2022-01-06 o }
78 76669f9b 2022-01-11 o var hosts []Host
79 76669f9b 2022-01-11 o for _, o := range objects {
80 76669f9b 2022-01-11 o v, ok := o.(Host)
81 76669f9b 2022-01-11 o if !ok {
82 76669f9b 2022-01-11 o return nil, fmt.Errorf("get all hosts: %T in response", v)
83 76669f9b 2022-01-11 o }
84 76669f9b 2022-01-11 o hosts = append(hosts, v)
85 50558780 2022-01-06 o }
86 76669f9b 2022-01-11 o return hosts, nil
87 76669f9b 2022-01-11 o }
88 76669f9b 2022-01-11 o
89 76669f9b 2022-01-11 o // FilterHosts returns any matching hosts after applying the filter
90 76669f9b 2022-01-11 o // expression expr. If no hosts match, an empty slice and an error wrapping
91 76669f9b 2022-01-11 o // ErrNoMatch is returned.
92 76669f9b 2022-01-11 o func (c *Client) FilterHosts(expr string) ([]Host, error) {
93 76669f9b 2022-01-11 o objects, err := c.filterObjects("/objects/hosts", expr)
94 76669f9b 2022-01-11 o if err != nil {
95 76669f9b 2022-01-11 o return nil, fmt.Errorf("filter hosts %q: %w", expr, err)
96 50558780 2022-01-06 o }
97 50558780 2022-01-06 o var hosts []Host
98 76669f9b 2022-01-11 o for _, o := range objects {
99 76669f9b 2022-01-11 o v, ok := o.(Host)
100 76669f9b 2022-01-11 o if !ok {
101 76669f9b 2022-01-11 o return nil, fmt.Errorf("filter hosts %q: %T in response", expr, v)
102 76669f9b 2022-01-11 o }
103 76669f9b 2022-01-11 o hosts = append(hosts, v)
104 50558780 2022-01-06 o }
105 50558780 2022-01-06 o return hosts, nil
106 6e415953 2022-01-06 o }
107 6e415953 2022-01-06 o
108 76669f9b 2022-01-11 o // LookupHost returns the Host identified by name. If no Host is found,
109 76669f9b 2022-01-11 o // error wraps ErrNotExist.
110 6e415953 2022-01-06 o func (c *Client) LookupHost(name string) (Host, error) {
111 76669f9b 2022-01-11 o obj, err := c.lookupObject("/objects/hosts/" + name)
112 6e415953 2022-01-06 o if err != nil {
113 76669f9b 2022-01-11 o return Host{}, fmt.Errorf("lookup %s: %w", name, err)
114 6e415953 2022-01-06 o }
115 76669f9b 2022-01-11 o v, ok := obj.(Host)
116 76669f9b 2022-01-11 o if !ok {
117 76669f9b 2022-01-11 o return Host{}, fmt.Errorf("lookup %s: result type %T is not host", name, obj)
118 6e415953 2022-01-06 o }
119 76669f9b 2022-01-11 o return v, nil
120 6e415953 2022-01-06 o }
121 6e415953 2022-01-06 o
122 50558780 2022-01-06 o // CreateHost creates the Host host.
123 50558780 2022-01-06 o // The Name and CheckCommand fields of host must be non-zero.
124 50558780 2022-01-06 o func (c *Client) CreateHost(host Host) error {
125 76669f9b 2022-01-11 o if err := c.createObject(host); err != nil {
126 50558780 2022-01-06 o return fmt.Errorf("create host %s: %w", host.Name, err)
127 50558780 2022-01-06 o }
128 50558780 2022-01-06 o return nil
129 50558780 2022-01-06 o }
130 50558780 2022-01-06 o
131 50558780 2022-01-06 o // DeleteHost deletes the Host identified by name.
132 76669f9b 2022-01-11 o // If no Host is found, error wraps ErrNotExist.
133 6e415953 2022-01-06 o func (c *Client) DeleteHost(name string) error {
134 76669f9b 2022-01-11 o if err := c.deleteObject("/objects/hosts/" + name); err != nil {
135 6e415953 2022-01-06 o return fmt.Errorf("delete host %s: %w", name, err)
136 6e415953 2022-01-06 o }
137 6e415953 2022-01-06 o return nil
138 6e415953 2022-01-06 o }