Blob


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