icinga

Icinga2 API client in Go
git clone https://git.olowe.co/icinga
Log | Files | Refs | README | LICENSE

service.go (2626B)


      1 package icinga
      2 
      3 import (
      4 	"encoding/json"
      5 	"strings"
      6 	"time"
      7 )
      8 
      9 func (s Service) name() string {
     10 	return s.Name
     11 }
     12 
     13 func (s Service) path() string {
     14 	return "/objects/services/" + s.Name
     15 }
     16 
     17 // Service represents a Service object.
     18 type Service struct {
     19 	Name            string       `json:"-"`
     20 	Groups          []string     `json:"groups,omitempty"`
     21 	State           ServiceState `json:"state,omitempty"`
     22 	StateType       StateType    `json:"state_type,omitempty"`
     23 	CheckCommand    string       `json:"check_command"`
     24 	DisplayName     string       `json:"display_name,omitempty"`
     25 	LastCheck       time.Time    `json:",omitempty"`
     26 	LastCheckResult CheckResult  `json:"last_check_result,omitempty"`
     27 	Acknowledgement bool         `json:",omitempty"`
     28 	Notes           string       `json:"notes,omitempty"`
     29 	NotesURL        string       `json:"notes_url,omitempty"`
     30 }
     31 
     32 type CheckResult struct {
     33 	CheckSource string `json:"check_source"`
     34 	Command     interface{}
     35 	Output      string
     36 }
     37 
     38 type ServiceState int
     39 
     40 const (
     41 	ServiceOK ServiceState = 0 + iota
     42 	ServiceWarning
     43 	ServiceCritical
     44 	ServiceUnknown
     45 )
     46 
     47 func (state ServiceState) String() string {
     48 	switch state {
     49 	case ServiceOK:
     50 		return "OK"
     51 	case ServiceWarning:
     52 		return "Warning"
     53 	case ServiceCritical:
     54 		return "Critical"
     55 	}
     56 	return "Unknown"
     57 }
     58 
     59 // UnmarshalJSON unmarshals service attributes into more meaningful Service field types.
     60 func (s *Service) UnmarshalJSON(data []byte) error {
     61 	type alias Service
     62 	aux := &struct {
     63 		Acknowledgement interface{} `json:"acknowledgement"`
     64 		State           interface{} `json:"state"`
     65 		StateType       interface{} `json:"state_type"`
     66 		LastCheck       float64     `json:"last_check"`
     67 		*alias
     68 	}{
     69 		alias: (*alias)(s),
     70 	}
     71 	if err := json.Unmarshal(data, &aux); err != nil {
     72 		return err
     73 	}
     74 	switch v := aux.Acknowledgement.(type) {
     75 	case int:
     76 		if v != 0 {
     77 			s.Acknowledgement = true
     78 		}
     79 	case float64:
     80 		if int(v) != 0 {
     81 			s.Acknowledgement = true
     82 		}
     83 	}
     84 	switch v := aux.State.(type) {
     85 	case int:
     86 		s.State = ServiceState(v)
     87 	case float64:
     88 		s.State = ServiceState(v)
     89 	}
     90 	switch v := aux.StateType.(type) {
     91 	case int:
     92 		s.StateType = StateType(v)
     93 	case float64:
     94 		s.StateType = StateType(v)
     95 	}
     96 	s.LastCheck = time.Unix(int64(aux.LastCheck), 0)
     97 	return nil
     98 }
     99 
    100 func (s Service) Host() string {
    101 	return strings.SplitN(s.Name, "!", 2)[0]
    102 }
    103 
    104 func (cr CheckResult) RawCommand() string {
    105 	switch v := cr.Command.(type) {
    106 	case string:
    107 		return v
    108 	case []interface{}:
    109 		var cmd []string
    110 		for i := range v {
    111 			if arg, ok := v[i].(string); ok {
    112 				cmd = append(cmd, arg)
    113 			}
    114 		}
    115 		return strings.Join(cmd, " ")
    116 	}
    117 	return "no command"
    118 }