Emmanuel BENOîT
c46c9d76d9
This PR adds the `check_output_matches` plugin, which can be used to count regexp or substring matches from either text files or command outputs and determine the final status based on the amount of matches that were found. Reviewed-on: #5 Co-authored-by: Emmanuel BENOÎT <tseeker@nocternity.net> Co-committed-by: Emmanuel BENOÎT <tseeker@nocternity.net>
108 lines
3 KiB
Go
108 lines
3 KiB
Go
// Package results implements a helper that can be used to store the results of
|
|
// a Nagios, Centreon, Icinga... service monitoring plugin, and convert them to
|
|
// text which can be sent to the monitoring server.
|
|
package results // import nocternity.net/gomonop/pkg/results
|
|
|
|
import (
|
|
"container/list"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"nocternity.net/gomonop/pkg/perfdata"
|
|
"nocternity.net/gomonop/pkg/status"
|
|
)
|
|
|
|
// Results represents the monitoring plugin's results, including its name,
|
|
// return status and message, additional lines of text, and performance
|
|
// data to be encoded in the output.
|
|
type Results struct {
|
|
name string
|
|
status status.Status
|
|
message string
|
|
extraText *list.List
|
|
perfData map[string]*perfdata.PerfData
|
|
}
|
|
|
|
// New creates the plugin with `name` as its name and an unknown status.
|
|
func New(name string) *Results {
|
|
p := new(Results)
|
|
p.name = name
|
|
p.status = status.StatusUnknown
|
|
p.message = "no status set"
|
|
p.perfData = make(map[string]*perfdata.PerfData)
|
|
return p
|
|
}
|
|
|
|
// SetState sets the plugin's output code to `status` and its message to
|
|
// the specified `message`.
|
|
func (p *Results) SetState(status status.Status, message string) {
|
|
p.status = status
|
|
p.message = message
|
|
}
|
|
|
|
// AddLine adds the specified string to the extra output text buffer.
|
|
func (p *Results) AddLine(line string) {
|
|
if p.extraText == nil {
|
|
p.extraText = list.New()
|
|
}
|
|
p.extraText.PushBack(line)
|
|
}
|
|
|
|
// AddLinef formats the input and adds it to the text buffer.
|
|
func (p *Results) AddLinef(format string, data ...interface{}) {
|
|
p.AddLine(fmt.Sprintf(format, data...))
|
|
}
|
|
|
|
// AddLines add the specified `lines` to the output text.
|
|
func (p *Results) AddLines(lines []string) {
|
|
for _, line := range lines {
|
|
p.AddLine(line)
|
|
}
|
|
}
|
|
|
|
// AddPerfData adds performance data described by the "pd" argument to the
|
|
// output's performance data. If two performance data records are added for
|
|
// the same label, the program panics.
|
|
func (p *Results) AddPerfData(pd *perfdata.PerfData) {
|
|
_, exists := p.perfData[pd.Label]
|
|
if exists {
|
|
panic("duplicate performance data " + pd.Label)
|
|
}
|
|
p.perfData[pd.Label] = pd
|
|
}
|
|
|
|
// String generates the plugin's text output from its name, status, text data
|
|
// and performance data.
|
|
func (p *Results) String() string {
|
|
var strBuilder strings.Builder
|
|
strBuilder.WriteString(p.name)
|
|
strBuilder.WriteString(" ")
|
|
strBuilder.WriteString(p.status.String())
|
|
strBuilder.WriteString(": ")
|
|
strBuilder.WriteString(p.message)
|
|
if len(p.perfData) > 0 {
|
|
strBuilder.WriteString(" | ")
|
|
needSep := false
|
|
for _, data := range p.perfData {
|
|
if needSep {
|
|
strBuilder.WriteString(", ")
|
|
} else {
|
|
needSep = true
|
|
}
|
|
strBuilder.WriteString(data.String())
|
|
}
|
|
}
|
|
if p.extraText != nil {
|
|
for em := p.extraText.Front(); em != nil; em = em.Next() {
|
|
strBuilder.WriteString("\n")
|
|
//nolint:forcetypeassert // we want to panic if this isn't a string
|
|
strBuilder.WriteString(em.Value.(string))
|
|
}
|
|
}
|
|
return strBuilder.String()
|
|
}
|
|
|
|
// ExitCode returns the plugin's exit code.
|
|
func (p *Results) ExitCode() int {
|
|
return int(p.status)
|
|
}
|