Emmanuel BENOîT
5432360f0e
Writing the plugin's output string and exiting the program will no longer take place in the plugin status itself. It will only be done in the main program.
106 lines
2.8 KiB
Go
106 lines
2.8 KiB
Go
// Package plugin implements a helper that can be used to implement a Nagios,
|
|
// Centreon, Icinga... service monitoring plugin.
|
|
package plugin // import nocternity.net/gomonop/pkg/perfdata
|
|
|
|
import (
|
|
"container/list"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"nocternity.net/gomonop/pkg/perfdata"
|
|
)
|
|
|
|
// Plugin represents the monitoring plugin's state, including its name,
|
|
// return status and message, additional lines of text, and performance
|
|
// data to be encoded in the output.
|
|
type Plugin 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) *Plugin {
|
|
p := new(Plugin)
|
|
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 *Plugin) SetState(status Status, message string) {
|
|
p.status = status
|
|
p.message = message
|
|
}
|
|
|
|
// AddLine adds the specified string to the extra output text buffer.
|
|
func (p *Plugin) 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 *Plugin) AddLinef(format string, data ...interface{}) {
|
|
p.AddLine(fmt.Sprintf(format, data...))
|
|
}
|
|
|
|
// AddLines add the specified `lines` to the output text.
|
|
func (p *Plugin) 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 *Plugin) 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 *Plugin) 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 *Plugin) ExitCode() int {
|
|
return int(p.status)
|
|
}
|