Emmanuel BENOîT
78af496fe9
This PR refactors most of the internals to make them easier to test (and also because the names didn't make sense). It adds unit tests for all internal components. Reviewed-on: #2 Co-authored-by: Emmanuel BENOÎT <tseeker@nocternity.net> Co-committed-by: Emmanuel BENOÎT <tseeker@nocternity.net>
107 lines
2.9 KiB
Go
107 lines
2.9 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"
|
|
)
|
|
|
|
// 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
|
|
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 = 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, 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)
|
|
}
|