Skip to content

Commit

Permalink
Merge pull request #236 from Tommi2Day/fix/issue233
Browse files Browse the repository at this point in the history
Fix panic if ParseRangeCheck returns nil
  • Loading branch information
atc0005 authored Jan 18, 2024
2 parents 7a6e921 + b8a299b commit 38f7549
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 0 deletions.
3 changes: 3 additions & 0 deletions nagios.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ var (
// metric is not in a supported format.
ErrInvalidPerformanceDataFormat = errors.New("invalid performance data format")

// ErrInvalidRangeThreshold indicates that a given range threshold is not in a supported format.
ErrInvalidRangeThreshold = errors.New("invalid range threshold")

// TODO: Should we use field-specific errors or is the more general
// ErrInvalidPerformanceDataFormat "good enough" ? Wrapped versions of
// that error will likely already indicate which field is a problem, but
Expand Down
11 changes: 11 additions & 0 deletions range.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
package nagios

import (
"fmt"
"regexp"
"strconv"
"strings"
Expand Down Expand Up @@ -149,6 +150,11 @@ func (p *Plugin) EvaluateThreshold(perfData ...PerformanceData) error {
if perfData[i].Crit != "" {

CriticalThresholdObject := ParseRangeString(perfData[i].Crit)
if CriticalThresholdObject == nil {
err := fmt.Errorf("failed to parse critical range string %s: %w ", perfData[i].Crit, ErrInvalidRangeThreshold)
p.ExitStatusCode = StateUNKNOWNExitCode
return err
}

if CriticalThresholdObject.CheckRange(perfData[i].Value) {
p.ExitStatusCode = StateCRITICALExitCode
Expand All @@ -158,6 +164,11 @@ func (p *Plugin) EvaluateThreshold(perfData ...PerformanceData) error {

if perfData[i].Warn != "" {
warningThresholdObject := ParseRangeString(perfData[i].Warn)
if warningThresholdObject == nil {
err := fmt.Errorf("failed to parse warning range string %s: %w ", perfData[i].Warn, ErrInvalidRangeThreshold)
p.ExitStatusCode = StateUNKNOWNExitCode
return err
}

if warningThresholdObject.CheckRange(perfData[i].Value) {
p.ExitStatusCode = StateWARNINGExitCode
Expand Down
38 changes: 38 additions & 0 deletions range_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,25 @@ func TestParseRange(t *testing.T) {
assert.Equal(t, StateCRITICALExitCode, plugin.ExitStatusCode)
})

t.Run("Plugin should return exit code Unknown when critical range is invalid", func(t *testing.T) {
var plugin = Plugin{
ExitStatusCode: StateOKExitCode,
}
plugin.ServiceOutput = pluginServiceOutput

perfdata := PerformanceData{
Label: "perfdata label",
Value: "41.0",
UnitOfMeasurement: "C",
Warn: "5:30",
Crit: "0:<=20", // invalid range as critical lower than warning
}
assert.NoError(t, plugin.AddPerfData(false, perfdata))
assert.Error(t, plugin.EvaluateThreshold(perfdata))

assert.Equal(t, StateUNKNOWNExitCode, plugin.ExitStatusCode)
})

t.Run("Plugin should return exit code CRITICAL when value is within warning range", func(t *testing.T) {
var plugin = Plugin{
ExitStatusCode: StateOKExitCode,
Expand All @@ -206,4 +225,23 @@ func TestParseRange(t *testing.T) {

assert.Equal(t, StateCRITICALExitCode, plugin.ExitStatusCode)
})

t.Run("Plugin should return exit code UNKNOWN and error when warning range is invalid", func(t *testing.T) {
var plugin = Plugin{
ExitStatusCode: StateOKExitCode,
}
plugin.ServiceOutput = pluginServiceOutput

perfdata := PerformanceData{
Label: "perfdata label",
Value: "-1.0",
UnitOfMeasurement: "C",
Warn: "x20", // invalid range value
Crit: "",
}
assert.NoError(t, plugin.AddPerfData(false, perfdata))
assert.Error(t, plugin.EvaluateThreshold(perfdata))

assert.Equal(t, StateUNKNOWNExitCode, plugin.ExitStatusCode)
})
}

0 comments on commit 38f7549

Please sign in to comment.