refactor(pkg): refactor Plugin to make it easier to test

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.
This commit is contained in:
Emmanuel BENOîT 2024-07-19 23:46:33 +02:00
parent b3aa7dfcad
commit 5432360f0e
Signed by: Emmanuel BENOîT
SSH key fingerprint: SHA256:l7PFUUF5TCDsvYeQC9OnTNz08dFY7Fvf4Hv3neIqYpg
5 changed files with 30 additions and 19 deletions

View file

@ -215,9 +215,9 @@ func NewProgram() program.Program {
return program
}
// Terminate the monitoring check program.
func (program *checkProgram) Done() {
program.plugin.Done()
// Return the program's output value.
func (program *checkProgram) Output() *plugin.Plugin {
return program.plugin
}
// Check the values that were specified from the command line. Returns true

View file

@ -85,13 +85,9 @@ func NewProgram() program.Program {
return program
}
// Terminate the monitoring check program.
func (program *checkProgram) Done() {
if r := recover(); r != nil {
program.plugin.SetState(plugin.StatusUnknown, "Internal error")
program.plugin.AddLinef("Error info: %v", r)
}
program.plugin.Done()
// Return the program's output value.
func (program *checkProgram) Output() *plugin.Plugin {
return program.plugin
}
// Check the values that were specified from the command line. Returns true if the arguments made sense.

13
main.go
View file

@ -7,6 +7,7 @@ import (
"nocternity.net/gomonop/cmd/sslcert"
"nocternity.net/gomonop/cmd/zoneserial"
"nocternity.net/gomonop/pkg/plugin"
"nocternity.net/gomonop/pkg/program"
"nocternity.net/gomonop/pkg/version"
)
@ -55,7 +56,17 @@ func getProgram() program.Program {
func main() {
program := getProgram()
defer program.Done()
output := program.Output()
defer func() {
if r := recover(); r != nil {
output.SetState(plugin.StatusUnknown, "Internal error")
output.AddLinef("Error info: %v", r)
}
fmt.Println(output.String())
os.Exit(output.ExitCode())
}()
if program.CheckArguments() {
program.RunCheck()
}

View file

@ -5,7 +5,6 @@ package plugin // import nocternity.net/gomonop/pkg/perfdata
import (
"container/list"
"fmt"
"os"
"strings"
"nocternity.net/gomonop/pkg/perfdata"
@ -70,10 +69,9 @@ func (p *Plugin) AddPerfData(pd *perfdata.PerfData) {
p.perfData[pd.Label] = pd
}
// Done generates the plugin's text output from its name, status, text data
// and performance data, before exiting with the code corresponding to the
// status.
func (p *Plugin) Done() {
// 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(" ")
@ -99,6 +97,10 @@ func (p *Plugin) Done() {
strBuilder.WriteString(em.Value.(string))
}
}
fmt.Println(strBuilder.String())
os.Exit(int(p.status))
return strBuilder.String()
}
// ExitCode returns the plugin's exit code.
func (p *Plugin) ExitCode() int {
return int(p.status)
}

View file

@ -1,9 +1,11 @@
package program // import nocternity.net/gomonop/pkg/program
import "nocternity.net/gomonop/pkg/plugin"
type Program interface {
Output() *plugin.Plugin
CheckArguments() bool
RunCheck()
Done()
}
type Builder func() Program