aboutsummaryrefslogtreecommitdiff
path: root/plugins/check_snmp.c
diff options
context:
space:
mode:
authorGravatar Andreas Ericsson <ae@op5.se> 2012-11-02 14:44:16 +0100
committerGravatar Thomas Guyot-Sionnest <dermoth@aei.ca> 2012-11-02 22:25:37 -0400
commitbd782990566eec91b8312cfc2765a7e2bd9e67da (patch)
tree2ca274e38322b1a86e237b830a485bf9d96ca457 /plugins/check_snmp.c
parent831bb312a9c8a76f1e24d144952ed7c757a2d09c (diff)
downloadmonitoring-plugins-bd782990566eec91b8312cfc2765a7e2bd9e67da.tar.gz
Make check_snmp backwards compatible in how it parses thresholds
Once upon a time, check_snmp used to accept inverse ranges in the format of '2:1' to mean "alert if value is inside this range". Since commit 7cb3ae09334796f3b54e4e6438e38c2cc679b360, ranges such as those have instead triggered the error "Range format incorrect" and resulted in an UNKNOWN warning state. This patch attempts to fix the situation so that the old-style ranges continues to mean exactly what the once did and people with lots of snmp checks can avoid a bazillion false positives from their environments. Signed-off-by: Andreas Ericsson <ae@op5.se>
Diffstat (limited to 'plugins/check_snmp.c')
-rw-r--r--plugins/check_snmp.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 2d9861bc..0ddfb942 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -144,6 +144,25 @@ double previous_value[MAX_OIDS];
int perf_labels = 1;
+static char *fix_snmp_range(char *th)
+{
+ double left, right;
+ char *colon, *ret;
+ if (!(colon = strchr(th, ':')))
+ return th;
+ *colon = 0;
+
+ left = strtod(th, NULL);
+ right = strtod(colon + 1, NULL);
+ if (right >= left) {
+ return th;
+ }
+ ret = malloc(strlen(th) + strlen(colon + 1) + 2);
+ sprintf(ret, "@%s:%s", colon + 1, th);
+ free(th);
+ return ret;
+}
+
int
main (int argc, char **argv)
{
@@ -228,6 +247,10 @@ main (int argc, char **argv)
for (i=0; i<numoids; i++) {
char *w = th_warn ? strndup(th_warn, strcspn(th_warn, ",")) : NULL;
char *c = th_crit ? strndup(th_crit, strcspn(th_crit, ",")) : NULL;
+ /* translate "2:1" to "@1:2" for backwards compatibility */
+ w = w ? fix_snmp_range(w) : NULL;
+ c = c ? fix_snmp_range(c) : NULL;
+
/* Skip empty thresholds, while avoiding segfault */
set_thresholds(&thlds[i],
w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL,