Blame


1 191337d0 2022-01-18 o package icinga
2 191337d0 2022-01-18 o
3 191337d0 2022-01-18 o import (
4 191337d0 2022-01-18 o "bytes"
5 191337d0 2022-01-18 o "encoding/json"
6 191337d0 2022-01-18 o "fmt"
7 191337d0 2022-01-18 o "net/http"
8 191337d0 2022-01-18 o "strings"
9 191337d0 2022-01-18 o )
10 191337d0 2022-01-18 o
11 191337d0 2022-01-18 o type checker interface {
12 191337d0 2022-01-18 o object
13 191337d0 2022-01-18 o Check(*Client) error
14 191337d0 2022-01-18 o }
15 191337d0 2022-01-18 o
16 191337d0 2022-01-18 o type StateType int
17 191337d0 2022-01-18 o
18 191337d0 2022-01-18 o const (
19 191337d0 2022-01-18 o StateSoft StateType = 0 + iota
20 191337d0 2022-01-18 o StateHard
21 191337d0 2022-01-18 o )
22 191337d0 2022-01-18 o
23 191337d0 2022-01-18 o func (st StateType) String() string {
24 191337d0 2022-01-18 o switch st {
25 191337d0 2022-01-18 o case StateSoft:
26 191337d0 2022-01-18 o return "StateSoft"
27 191337d0 2022-01-18 o case StateHard:
28 191337d0 2022-01-18 o return "StateHard"
29 191337d0 2022-01-18 o }
30 191337d0 2022-01-18 o return "unsupported state type"
31 191337d0 2022-01-18 o }
32 191337d0 2022-01-18 o
33 191337d0 2022-01-18 o func (s Service) Check(c *Client) error {
34 191337d0 2022-01-18 o return c.check(s)
35 191337d0 2022-01-18 o }
36 191337d0 2022-01-18 o
37 191337d0 2022-01-18 o func (h Host) Check(c *Client) error {
38 191337d0 2022-01-18 o return c.check(h)
39 191337d0 2022-01-18 o }
40 191337d0 2022-01-18 o
41 191337d0 2022-01-18 o func splitServiceName(name string) []string {
42 191337d0 2022-01-18 o return strings.SplitN(name, "!", 2)
43 191337d0 2022-01-18 o }
44 191337d0 2022-01-18 o
45 191337d0 2022-01-18 o func (c *Client) check(ch checker) error {
46 191337d0 2022-01-18 o var filter struct {
47 191337d0 2022-01-18 o Type string `json:"type"`
48 191337d0 2022-01-18 o Expr string `json:"filter"`
49 191337d0 2022-01-18 o }
50 191337d0 2022-01-18 o switch v := ch.(type) {
51 191337d0 2022-01-18 o case Host:
52 191337d0 2022-01-18 o filter.Type = "Host"
53 191337d0 2022-01-18 o filter.Expr = fmt.Sprintf("host.name == %q", v.Name)
54 191337d0 2022-01-18 o case Service:
55 191337d0 2022-01-18 o filter.Type = "Service"
56 191337d0 2022-01-18 o a := splitServiceName(v.Name)
57 191337d0 2022-01-18 o if len(a) != 2 {
58 191337d0 2022-01-18 o return fmt.Errorf("check %s: invalid service name", v.Name)
59 191337d0 2022-01-18 o }
60 191337d0 2022-01-18 o host := a[0]
61 191337d0 2022-01-18 o service := a[1]
62 191337d0 2022-01-18 o filter.Expr = fmt.Sprintf("host.name == %q && service.name == %q", host, service)
63 191337d0 2022-01-18 o default:
64 191337d0 2022-01-18 o return fmt.Errorf("cannot check %T", v)
65 191337d0 2022-01-18 o }
66 191337d0 2022-01-18 o
67 191337d0 2022-01-18 o buf := &bytes.Buffer{}
68 191337d0 2022-01-18 o if err := json.NewEncoder(buf).Encode(filter); err != nil {
69 191337d0 2022-01-18 o return err
70 191337d0 2022-01-18 o }
71 191337d0 2022-01-18 o resp, err := c.post("/actions/reschedule-check", buf)
72 191337d0 2022-01-18 o if err != nil {
73 191337d0 2022-01-18 o return fmt.Errorf("check %s: %w", ch.name(), err)
74 191337d0 2022-01-18 o }
75 191337d0 2022-01-18 o switch resp.StatusCode {
76 191337d0 2022-01-18 o case http.StatusOK:
77 191337d0 2022-01-18 o return nil
78 191337d0 2022-01-18 o case http.StatusNotFound:
79 191337d0 2022-01-18 o return fmt.Errorf("check %s: %w", ch.name(), ErrNotExist)
80 191337d0 2022-01-18 o default:
81 191337d0 2022-01-18 o return fmt.Errorf("check %s: %s", ch.name(), resp.Status)
82 191337d0 2022-01-18 o }
83 191337d0 2022-01-18 o }