From e99bd7b1db918c21fb8c9ed7c314d882594c74c2 Mon Sep 17 00:00:00 2001 From: Jan Wagner Date: Fri, 20 Jan 2023 11:41:24 +0000 Subject: [PATCH] Adding d/p/27_check_snmp_add_multiplier --- debian/patches/27_check_snmp_add_multiplier | 372 ++++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 373 insertions(+) create mode 100644 debian/patches/27_check_snmp_add_multiplier diff --git a/debian/patches/27_check_snmp_add_multiplier b/debian/patches/27_check_snmp_add_multiplier new file mode 100644 index 0000000..375feb7 --- /dev/null +++ b/debian/patches/27_check_snmp_add_multiplier @@ -0,0 +1,372 @@ +From 403cbe5d8bd073277f188bdb729ad3333855ab39 Mon Sep 17 00:00:00 2001 +From: Wolfgang Nieder +Date: Sat, 7 Jul 2018 09:12:44 +0200 +Subject: [PATCH 1/3] add 'multiplier' to modify current value + +--- + plugins/check_snmp.c | 84 +++++++++++++++++++++++++++----------- + plugins/tests/check_snmp.t | 12 ++++-- + 2 files changed, 70 insertions(+), 26 deletions(-) + +diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c +index 2601ccd89..d407609f5 100644 +--- a/plugins/check_snmp.c ++++ b/plugins/check_snmp.c +@@ -1,31 +1,31 @@ + /***************************************************************************** +-* ++* + * Monitoring check_snmp plugin +-* ++* + * License: GPL + * Copyright (c) 1999-2007 Monitoring Plugins Development Team +-* ++* + * Description: +-* ++* + * This file contains the check_snmp plugin +-* ++* + * Check status of remote machines and obtain system information via SNMP +-* +-* ++* ++* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. +-* ++* + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. +-* ++* + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +-* +-* ++* ++* + *****************************************************************************/ + + const char *progname = "check_snmp"; +@@ -90,6 +90,7 @@ char *thisarg (char *str); + char *nextarg (char *str); + void print_usage (void); + void print_help (void); ++char *multiply (char *str); + + #include "regex.h" + char regex_expect[MAX_INPUT_BUFFER] = ""; +@@ -154,6 +155,8 @@ double *previous_value; + size_t previous_size = OID_COUNT_STEP; + int perf_labels = 1; + char* ip_version = ""; ++double multiplier = 1.0; ++char *fmtstr = ""; + + static char *fix_snmp_range(char *th) + { +@@ -316,7 +319,7 @@ main (int argc, char **argv) + for (i = 0; i < numcontext; i++) { + command_line[10 + i] = contextargs[i]; + } +- ++ + for (i = 0; i < numauthpriv; i++) { + command_line[10 + numcontext + i] = authpriv[i]; + } +@@ -330,7 +333,7 @@ main (int argc, char **argv) + + for (i = 0; i < numoids; i++) { + command_line[10 + numcontext + numauthpriv + 1 + i] = oids[i]; +- xasprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]); ++ xasprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]); + } + + command_line[10 + numcontext + numauthpriv + 1 + numoids] = NULL; +@@ -398,15 +401,15 @@ main (int argc, char **argv) + is_counter=0; + /* We strip out the datatype indicator for PHBs */ + if (strstr (response, "Gauge: ")) { +- show = strstr (response, "Gauge: ") + 7; +- } ++ show = multiply (strstr (response, "Gauge: ") + 7); ++ } + else if (strstr (response, "Gauge32: ")) { +- show = strstr (response, "Gauge32: ") + 9; +- } ++ show = multiply (strstr (response, "Gauge32: ") + 9); ++ } + else if (strstr (response, "Counter32: ")) { + show = strstr (response, "Counter32: ") + 11; + is_counter=1; +- if(!calculate_rate) ++ if(!calculate_rate) + strcpy(type, "c"); + } + else if (strstr (response, "Counter64: ")) { +@@ -416,7 +419,10 @@ main (int argc, char **argv) + strcpy(type, "c"); + } + else if (strstr (response, "INTEGER: ")) { +- show = strstr (response, "INTEGER: ") + 9; ++ show = multiply (strstr (response, "INTEGER: ") + 9); ++ if (fmtstr != "") { ++ conv = fmtstr; ++ } + } + else if (strstr (response, "OID: ")) { + show = strstr (response, "OID: ") + 5; +@@ -616,7 +622,7 @@ main (int argc, char **argv) + state_string=malloc(string_length); + if(state_string==NULL) + die(STATE_UNKNOWN, _("Cannot malloc")); +- ++ + current_length=0; + for(i=0; i 2) + printf("State string=%s\n",state_string); +- ++ + /* This is not strictly the same as time now, but any subtle variations will cancel out */ + np_state_write_string(current_time, state_string ); + if(previous_state==NULL) { +@@ -698,6 +704,8 @@ process_arguments (int argc, char **argv) + {"perf-oids", no_argument, 0, 'O'}, + {"ipv4", no_argument, 0, '4'}, + {"ipv6", no_argument, 0, '6'}, ++ {"multiplier", required_argument, 0, 'M'}, ++ {"fmtstr", required_argument, 0, 'f'}, + {0, 0, 0, 0} + }; + +@@ -715,7 +723,7 @@ process_arguments (int argc, char **argv) + } + + while (1) { +- c = getopt_long (argc, argv, "nhvVO46t:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:N:L:U:a:x:A:X:z:", ++ c = getopt_long (argc, argv, "nhvVO46t:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:N:L:U:a:x:A:X:M:f:z:", + longopts, &option); + + if (c == -1 || c == EOF) +@@ -953,6 +961,16 @@ process_arguments (int argc, char **argv) + if(verbose>2) + printf("IPv6 detected! Will pass \"udp6:\" to snmpget.\n"); + break; ++ case 'M': ++ if ( strspn( optarg, "0123456789.," ) == strlen( optarg ) ) { ++ multiplier=strtod(optarg,NULL); ++ } ++ break; ++ case 'f': ++ if (multiplier != 1.0) { ++ fmtstr=optarg; ++ } ++ break; + } + } + +@@ -1022,7 +1040,7 @@ validate_arguments () + contextargs[0] = strdup ("-n"); + contextargs[1] = strdup (context); + } +- ++ + if (seclevel == NULL) + xasprintf(&seclevel, "noAuthNoPriv"); + +@@ -1143,6 +1161,21 @@ nextarg (char *str) + + + ++/* multiply result (values 0 < n < 1 work as divider) */ ++char * ++multiply (char *str) ++{ ++ double val = strtod (str, NULL); ++ val *= multiplier; ++ if (val == (int)val) { ++ sprintf(str, "%.0f", val); ++ } else { ++ sprintf(str, "%f", val); ++ } ++ return str; ++} ++ ++ + void + print_help (void) + { +@@ -1235,6 +1268,10 @@ print_help (void) + printf (" %s\n", _("Units label(s) for output data (e.g., 'sec.').")); + printf (" %s\n", "-D, --output-delimiter=STRING"); + printf (" %s\n", _("Separates output on multiple OID requests")); ++ printf (" %s\n", "-M, --multiplier=FLOAT"); ++ printf (" %s\n", _("Multiplies current value, 0 < n < 1 works as divider, defaults to 1")); ++ printf (" %s\n", "-f, --fmtstr=STRING"); ++ printf (" %s\n", _("C-style format string for float values (see option -M)")); + + printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); + printf (" %s\n", _("NOTE the final timeout value is calculated using this formula: timeout_interval * retries + 5")); +@@ -1287,4 +1324,5 @@ print_usage (void) + printf ("[-l label] [-u units] [-p port-number] [-d delimiter] [-D output-delimiter]\n"); + printf ("[-m miblist] [-P snmp version] [-N context] [-L seclevel] [-U secname]\n"); + printf ("[-a authproto] [-A authpasswd] [-x privproto] [-X privpasswd] [-4|6]\n"); ++ printf ("[-M multiplier [-f format]]\n"); + } +diff --git a/plugins/tests/check_snmp.t b/plugins/tests/check_snmp.t +index 0a77fa8ad..e9cc02135 100755 +--- a/plugins/tests/check_snmp.t ++++ b/plugins/tests/check_snmp.t +@@ -9,7 +9,7 @@ use NPTest; + use FindBin qw($Bin); + use POSIX qw/strftime/; + +-my $tests = 73; ++my $tests = 75; + # Check that all dependent modules are available + eval { + require NetSNMP::OID; +@@ -57,9 +57,9 @@ if ($pid) { + exec("snmpd -c tests/conf/snmpd.conf -C -f -r udp:$port_snmp"); + } + +-END { ++END { + foreach my $pid (@pids) { +- if ($pid) { print "Killing $pid\n"; kill "INT", $pid } ++ if ($pid) { print "Killing $pid\n"; kill "INT", $pid } + } + }; + +@@ -268,3 +268,9 @@ like($res->output, '/SNMP WARNING - \d+ \*-4\* | iso.3.6.1.4.1.8072.3.2.67.10=\d + $res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.10,.1.3.6.1.4.1.8072.3.2.67.17 -w 1,2 -c 1" ); + is($res->return_code, 2, "Multiple OIDs with some thresholds" ); + like($res->output, '/SNMP CRITICAL - \*\d+\* \*-4\* | iso.3.6.1.4.1.8072.3.2.67.10=\d+c;1;2 iso.3.6.1.4.1.8072.3.2.67.17=-4;;/', "Multiple OIDs with thresholds output" ); ++ ++$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.2.1.25.2.2.0 -M .125 "); ++is($res->return_code, 0, "Multiply OK" ); ++ ++$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.2.1.25.2.2.0 --multiplier=.0009765625 -f '%.3f' "); ++is($res->return_code, 0, "Multiply format OK" ); + +From fdde61e978c4251b67ce4db42e4f5797c087cbec Mon Sep 17 00:00:00 2001 +From: Robert Bohne +Date: Fri, 11 Nov 2022 11:10:44 +0100 +Subject: [PATCH 2/3] Improve tests for check_snmp & multiply option + +--- + plugins/tests/check_snmp.t | 20 +++++++++++++++----- + plugins/tests/check_snmp_agent.pl | 8 ++++---- + 2 files changed, 19 insertions(+), 9 deletions(-) + +diff --git a/plugins/tests/check_snmp.t b/plugins/tests/check_snmp.t +index e9cc02135..bb5b8db66 100755 +--- a/plugins/tests/check_snmp.t ++++ b/plugins/tests/check_snmp.t +@@ -9,7 +9,7 @@ use NPTest; + use FindBin qw($Bin); + use POSIX qw/strftime/; + +-my $tests = 75; ++my $tests = 81; + # Check that all dependent modules are available + eval { + require NetSNMP::OID; +@@ -269,8 +269,18 @@ $res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1 + is($res->return_code, 2, "Multiple OIDs with some thresholds" ); + like($res->output, '/SNMP CRITICAL - \*\d+\* \*-4\* | iso.3.6.1.4.1.8072.3.2.67.10=\d+c;1;2 iso.3.6.1.4.1.8072.3.2.67.17=-4;;/', "Multiple OIDs with thresholds output" ); + +-$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.2.1.25.2.2.0 -M .125 "); +-is($res->return_code, 0, "Multiply OK" ); ++$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.19"); ++is($res->return_code, 0, "Test plain .1.3.6.1.4.1.8072.3.2.67.6 RC" ); ++is($res->output,'SNMP OK - 42 | iso.3.6.1.4.1.8072.3.2.67.19=42 ', "Test plain value of .1.3.6.1.4.1.8072.3.2.67.1" ); + +-$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.2.1.25.2.2.0 --multiplier=.0009765625 -f '%.3f' "); +-is($res->return_code, 0, "Multiply format OK" ); ++$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.19 -M .1"); ++is($res->return_code, 0, "Test multiply RC" ); ++is($res->output,'SNMP OK - 4.200000 | iso.3.6.1.4.1.8072.3.2.67.19=4.200000 ' , "Test multiply .1 output" ); ++ ++$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.19 --multiplier=.1 -f '%.2f' "); ++is($res->return_code, 0, "Test multiply RC + format" ); ++is($res->output, 'SNMP OK - 4.200000 | iso.3.6.1.4.1.8072.3.2.67.19=4.200000 ', "Test multiply .1 output + format" ); ++ ++$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.19 --multiplier=.1 -f '%.2f' -w 1"); ++is($res->return_code, 1, "Test multiply RC + format + thresholds" ); ++is($res->output, 'SNMP WARNING - *4.20* | iso.3.6.1.4.1.8072.3.2.67.19=4.20;1 ', "Test multiply .1 output + format + thresholds" ); +diff --git a/plugins/tests/check_snmp_agent.pl b/plugins/tests/check_snmp_agent.pl +index 0e41d575d..38912e98b 100644 +--- a/plugins/tests/check_snmp_agent.pl ++++ b/plugins/tests/check_snmp_agent.pl +@@ -32,11 +32,11 @@ + because we\'re not done yet!'; + + # Next are arrays of indexes (Type, initial value and increments) +-# 0..16 <---- please update comment when adding/removing fields +-my @fields = (ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_UNSIGNED, ASN_UNSIGNED, ASN_COUNTER, ASN_COUNTER64, ASN_UNSIGNED, ASN_COUNTER, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_INTEGER, ASN_OCTET_STR, ASN_OCTET_STR ); +-my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)), 64000, "stringtests", "3.5", "87.4startswithnumberbutshouldbestring", '555"I said"', 'CUSTOM CHECK OK: foo is 12345', -2, '-4', '-6.6' ); ++# 0..19 <---- please update comment when adding/removing fields ++my @fields = (ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_UNSIGNED, ASN_UNSIGNED, ASN_COUNTER, ASN_COUNTER64, ASN_UNSIGNED, ASN_COUNTER, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_INTEGER, ASN_OCTET_STR, ASN_OCTET_STR, ASN_INTEGER ); ++my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)), 64000, "stringtests", "3.5", "87.4startswithnumberbutshouldbestring", '555"I said"', 'CUSTOM CHECK OK: foo is 12345', -2, '-4', '-6.6', 42 ); + # undef increments are randomized +-my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef, 666, undef, undef, undef, undef, undef, -1, undef, undef ); ++my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef, 666, undef, undef, undef, undef, undef, -1, undef, undef, 0 ); + + # Number of elements in our OID + my $oidelts; + +From 84dddab6fe6315bbe4ad5197b9a4b56ebc89e007 Mon Sep 17 00:00:00 2001 +From: Sven Nierlein +Date: Thu, 22 Dec 2022 12:02:52 +0100 +Subject: [PATCH 3/3] check_snmp: always apply format when applying multiplier + +--- + plugins/check_snmp.c | 6 +++++- + plugins/tests/check_snmp.t | 2 +- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c +index d407609f5..56bad8800 100644 +--- a/plugins/check_snmp.c ++++ b/plugins/check_snmp.c +@@ -1167,10 +1167,14 @@ multiply (char *str) + { + double val = strtod (str, NULL); + val *= multiplier; ++ char *conv = "%f"; ++ if (fmtstr != "") { ++ conv = fmtstr; ++ } + if (val == (int)val) { + sprintf(str, "%.0f", val); + } else { +- sprintf(str, "%f", val); ++ sprintf(str, conv, val); + } + return str; + } +diff --git a/plugins/tests/check_snmp.t b/plugins/tests/check_snmp.t +index bb5b8db66..bc03ec604 100755 +--- a/plugins/tests/check_snmp.t ++++ b/plugins/tests/check_snmp.t +@@ -279,7 +279,7 @@ is($res->output,'SNMP OK - 4.200000 | iso.3.6.1.4.1.8072.3.2.67.19=4.200000 ' , + + $res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.19 --multiplier=.1 -f '%.2f' "); + is($res->return_code, 0, "Test multiply RC + format" ); +-is($res->output, 'SNMP OK - 4.200000 | iso.3.6.1.4.1.8072.3.2.67.19=4.200000 ', "Test multiply .1 output + format" ); ++is($res->output, 'SNMP OK - 4.20 | iso.3.6.1.4.1.8072.3.2.67.19=4.20 ', "Test multiply .1 output + format" ); + + $res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.19 --multiplier=.1 -f '%.2f' -w 1"); + is($res->return_code, 1, "Test multiply RC + format + thresholds" ); diff --git a/debian/patches/series b/debian/patches/series index 74c4218..ff1beff 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -15,3 +15,4 @@ 24_check_apt_usage 25_spell_fixes 26_check_mailq_fix_nullmailer_regex +27_check_snmp_add_multiplier