summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--doc/developer-guidelines.sgml41
-rw-r--r--perlmods/install_order10
-rw-r--r--plugins/check_disk.c21
-rw-r--r--plugins/check_snmp.c94
-rw-r--r--plugins/t/check_snmp.t293
-rw-r--r--plugins/t/check_tcp.t2
-rwxr-xr-xtest.pl.in2
-rwxr-xr-xtools/build_perl_modules1
9 files changed, 275 insertions, 191 deletions
diff --git a/NEWS b/NEWS
index 1668dc4e..0261e491 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,7 @@ This file documents the major additions and syntax changes between releases.
9 Added -4/-6 options to check_dig (Ville Mattila) 9 Added -4/-6 options to check_dig (Ville Mattila)
10 New check_oracle --connect option to perform real login 10 New check_oracle --connect option to perform real login
11 New check_nagios -t option to override the default timeout 11 New check_nagios -t option to override the default timeout
12 New check_disk -f/--freespace-ignore-reserved option to ignore space reserved for root
12 New check_disk -N/--include-type option to limit the filesystem types to check 13 New check_disk -N/--include-type option to limit the filesystem types to check
13 Allow for building the plugins in parallel 14 Allow for building the plugins in parallel
14 Add --without-{dbi,ldap,radius} options to ./configure 15 Add --without-{dbi,ldap,radius} options to ./configure
@@ -29,6 +30,7 @@ This file documents the major additions and syntax changes between releases.
29 New check_mysql -f option to specify a client options file 30 New check_mysql -f option to specify a client options file
30 New check_mysql -g option to specify a client options group 31 New check_mysql -g option to specify a client options group
31 New check_snmp --offset option to allow for adding/substracting an offset value to sensor data 32 New check_snmp --offset option to allow for adding/substracting an offset value to sensor data
33 Let check_snmp support an arbitrary number of OIDs
32 Let check_ide_smart support NetBSD 34 Let check_ide_smart support NetBSD
33 35
34 FIXES 36 FIXES
diff --git a/doc/developer-guidelines.sgml b/doc/developer-guidelines.sgml
index e7754f4e..eb5b0391 100644
--- a/doc/developer-guidelines.sgml
+++ b/doc/developer-guidelines.sgml
@@ -11,7 +11,7 @@
11 </author> 11 </author>
12 </authorgroup> 12 </authorgroup>
13 13
14 <pubdate>2009</pubdate> 14 <pubdate>2013</pubdate>
15 <title>Nagios plug-in development guidelines</title> 15 <title>Nagios plug-in development guidelines</title>
16 16
17 <revhistory> 17 <revhistory>
@@ -22,7 +22,7 @@
22 </revhistory> 22 </revhistory>
23 23
24 <copyright> 24 <copyright>
25 <year>2000 - 2009</year> 25 <year>2000 - 2013</year>
26 <holder>Nagios Plugins Development Team</holder> 26 <holder>Nagios Plugins Development Team</holder>
27 </copyright> 27 </copyright>
28 28
@@ -34,7 +34,7 @@
34 the plug-in developers and encourage the standarization of the 34 the plug-in developers and encourage the standarization of the
35 different kind of plug-ins: C, shell, perl, python, etc.</para> 35 different kind of plug-ins: C, shell, perl, python, etc.</para>
36 36
37 <para>Nagios Plug-in Development Guidelines Copyright (C) 2000-2009 37 <para>Nagios Plug-in Development Guidelines Copyright (C) 2000-2013
38 (Nagios Plugins Team)</para> 38 (Nagios Plugins Team)</para>
39 39
40 <para>Permission is granted to make and distribute verbatim 40 <para>Permission is granted to make and distribute verbatim
@@ -83,10 +83,18 @@
83 STDOUT and not print to STDERR.</para> 83 STDOUT and not print to STDERR.</para>
84 84
85 <section><title>Print only one line of text</title> 85 <section><title>Print only one line of text</title>
86 <para>Nagios will only grab the first line of text from STDOUT 86 <para>Starting with version 3, Nagios will process plugins' multiline
87 when it notifies contacts about potential problems. If you print 87 output, which should be formatted as:</para>
88 multiple lines, you're out of luck (though this will be a feature of 88 <literallayout>
89 Nagios 3). Remember, keep your output short and to the point.</para> 89 SERVICE STATUS: First line of output | First part of performance data
90 Any number of subsequent lines of output, but note that buffers
91 may have a limited size | Second part of performance data, which
92 may have continuation lines, too
93 </literallayout>
94 <para>Note, however, that the default configs still do not include
95 the output's continuation lines into the notifications sent when
96 Nagios notifies contacts about potential problems.
97 Thus, keep your output short and to the point.</para>
90 98
91 <para>Output should be in the format:</para> 99 <para>Output should be in the format:</para>
92 <literallayout> 100 <literallayout>
@@ -269,10 +277,6 @@
269 <entry>@10:20</entry> 277 <entry>@10:20</entry>
270 <entry>&ge; 10 and &le; 20, (inside the range of {10 .. 20})</entry> 278 <entry>&ge; 10 and &le; 20, (inside the range of {10 .. 20})</entry>
271 </row> 279 </row>
272 <row>
273 <entry>10</entry>
274 <entry>&lt; 0 or &gt; 10, (outside the range of {0 .. 10})</entry>
275 </row>
276 </tbody> 280 </tbody>
277 </tgroup> 281 </tgroup>
278 </table> 282 </table>
@@ -319,10 +323,14 @@
319 </section> 323 </section>
320 324
321 <section><title>Performance data</title> 325 <section><title>Performance data</title>
322 <para>Performance data is defined by Nagios as "everything after the | of the plugin output" - 326 <para>Nagios 3 and newer will concatenate the parts following a "|" in a) the first
323 please refer to Nagios documentation for information on capturing this data to logfiles. 327 line output by the plugin, and b) in the second to last line, into a string it
324 However, it is the responsibility of the plugin writer to ensure the 328 passes to whatever performance data processing it has configured. (Note that it
325 performance data is in a "Nagios plugins" format. 329 currently does not insert additional whitespace between both, so the plugin needs
330 to provide some to prevent the last pair of a) and the first of b) getting run
331 together.) Please refer to the Nagios documentation for information on how to
332 configure such processing. However, it is the responsibility of the plugin writer
333 to ensure the performance data is in a "Nagios plugins" format.
326 This is the expected format:</para> 334 This is the expected format:</para>
327 335
328 <literallayout> 336 <literallayout>
@@ -351,7 +359,8 @@
351 <listitem><para>min and max are not required if UOM=%</para> 359 <listitem><para>min and max are not required if UOM=%</para>
352 </listitem> 360 </listitem>
353 <listitem><para>value, min and max in class [-0-9.]. Must all be the 361 <listitem><para>value, min and max in class [-0-9.]. Must all be the
354 same UOM</para> 362 same UOM. value may be a literal "U" instead, this would indicate that the
363 actual value couldn't be determined</para>
355 </listitem> 364 </listitem>
356 <listitem><para>warn and crit are in the range format (see 365 <listitem><para>warn and crit are in the range format (see
357 <xref linkend="thresholdformat">). Must be the same UOM</para> 366 <xref linkend="thresholdformat">). Must be the same UOM</para>
diff --git a/perlmods/install_order b/perlmods/install_order
index 7f07348e..c44c8723 100644
--- a/perlmods/install_order
+++ b/perlmods/install_order
@@ -2,13 +2,13 @@
2default: 2default:
3Test-Simple 3Test-Simple
4Perl-OSType 4Perl-OSType
5parent
6version
7Try-Tiny
8Module-Metadata
9Module-Runtime
10Module-Implementation 5Module-Implementation
6Module-Metadata
7version
11Module-Build 8Module-Build
9Module-Runtime
10parent
11Try-Tiny
12Params-Validate 12Params-Validate
13Math-Calc-Units 13Math-Calc-Units
14Class-Accessor 14Class-Accessor
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index 4ea03935..47dc0adc 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -138,6 +138,7 @@ int verbose = 0;
138int erronly = FALSE; 138int erronly = FALSE;
139int display_mntp = FALSE; 139int display_mntp = FALSE;
140int exact_match = FALSE; 140int exact_match = FALSE;
141int freespace_ignore_reserved = FALSE;
141char *warn_freespace_units = NULL; 142char *warn_freespace_units = NULL;
142char *crit_freespace_units = NULL; 143char *crit_freespace_units = NULL;
143char *warn_freespace_percent = NULL; 144char *warn_freespace_percent = NULL;
@@ -431,6 +432,7 @@ process_arguments (int argc, char **argv)
431 {"eregi-partition", required_argument, 0, 'R'}, 432 {"eregi-partition", required_argument, 0, 'R'},
432 {"ereg-path", required_argument, 0, 'r'}, 433 {"ereg-path", required_argument, 0, 'r'},
433 {"ereg-partition", required_argument, 0, 'r'}, 434 {"ereg-partition", required_argument, 0, 'r'},
435 {"freespace-ignore-reserved", no_argument, 0, 'f'},
434 {"ignore-ereg-path", required_argument, 0, 'i'}, 436 {"ignore-ereg-path", required_argument, 0, 'i'},
435 {"ignore-ereg-partition", required_argument, 0, 'i'}, 437 {"ignore-ereg-partition", required_argument, 0, 'i'},
436 {"ignore-eregi-path", required_argument, 0, 'I'}, 438 {"ignore-eregi-path", required_argument, 0, 'I'},
@@ -459,7 +461,7 @@ process_arguments (int argc, char **argv)
459 strcpy (argv[c], "-t"); 461 strcpy (argv[c], "-t");
460 462
461 while (1) { 463 while (1) {
462 c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:N:mklLg:R:r:i:I:MEA", longopts, &option); 464 c = getopt_long (argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLg:R:r:i:I:MEA", longopts, &option);
463 465
464 if (c == -1 || c == EOF) 466 if (c == -1 || c == EOF)
465 break; 467 break;
@@ -616,6 +618,9 @@ process_arguments (int argc, char **argv)
616 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n")); 618 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n"));
617 exact_match = TRUE; 619 exact_match = TRUE;
618 break; 620 break;
621 case 'f':
622 freespace_ignore_reserved = TRUE;
623 break;
619 case 'g': 624 case 'g':
620 if (path_selected) 625 if (path_selected)
621 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before selecting paths\n")); 626 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before selecting paths\n"));
@@ -881,6 +886,8 @@ print_help (void)
881 printf (" %s\n", _("For paths or partitions specified with -p, only check for exact paths")); 886 printf (" %s\n", _("For paths or partitions specified with -p, only check for exact paths"));
882 printf (" %s\n", "-e, --errors-only"); 887 printf (" %s\n", "-e, --errors-only");
883 printf (" %s\n", _("Display only devices/mountpoints with errors")); 888 printf (" %s\n", _("Display only devices/mountpoints with errors"));
889 printf (" %s\n", "-f, --freespace-ignore-reserved");
890 printf (" %s\n", _("Don't account root-reserved blocks into freespace in perfdata"));
884 printf (" %s\n", "-g, --group=NAME"); 891 printf (" %s\n", "-g, --group=NAME");
885 printf (" %s\n", _("Group paths. Thresholds apply to (free-)space of all partitions together")); 892 printf (" %s\n", _("Group paths. Thresholds apply to (free-)space of all partitions together"));
886 printf (" %s\n", "-k, --kilobytes"); 893 printf (" %s\n", "-k, --kilobytes");
@@ -933,7 +940,7 @@ print_usage (void)
933{ 940{
934 printf ("%s\n", _("Usage:")); 941 printf ("%s\n", _("Usage:"));
935 printf (" %s -w limit -c limit [-W limit] [-K limit] {-p path | -x device}\n", progname); 942 printf (" %s -w limit -c limit [-W limit] [-K limit] {-p path | -x device}\n", progname);
936 printf ("[-C] [-E] [-e] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n"); 943 printf ("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n");
937 printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n"); 944 printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n");
938} 945}
939 946
@@ -1006,13 +1013,19 @@ get_stats (struct parameter_list *p, struct fs_usage *fsp) {
1006 1013
1007void 1014void
1008get_path_stats (struct parameter_list *p, struct fs_usage *fsp) { 1015get_path_stats (struct parameter_list *p, struct fs_usage *fsp) {
1009 p->total = fsp->fsu_blocks;
1010 /* 2007-12-08 - Workaround for Gnulib reporting insanely high available 1016 /* 2007-12-08 - Workaround for Gnulib reporting insanely high available
1011 * space on BSD (the actual value should be negative but fsp->fsu_bavail 1017 * space on BSD (the actual value should be negative but fsp->fsu_bavail
1012 * is unsigned) */ 1018 * is unsigned) */
1013 p->available = fsp->fsu_bavail > fsp->fsu_bfree ? 0 : fsp->fsu_bavail; 1019 p->available = fsp->fsu_bavail > fsp->fsu_bfree ? 0 : fsp->fsu_bavail;
1014 p->available_to_root = fsp->fsu_bfree; 1020 p->available_to_root = fsp->fsu_bfree;
1015 p->used = p->total - p->available_to_root; 1021 p->used = fsp->fsu_blocks - fsp->fsu_bfree;
1022 if (freespace_ignore_reserved) {
1023 /* option activated : we substract the root-reserved space from the total */
1024 p->total = fsp->fsu_blocks - p->available_to_root + p->available;
1025 } else {
1026 /* default behaviour : take all the blocks into account */
1027 p->total = fsp->fsu_blocks;
1028 }
1016 1029
1017 p->dused_units = p->used*fsp->fsu_blocksize/mult; 1030 p->dused_units = p->used*fsp->fsu_blocksize/mult;
1018 p->dfree_units = p->available*fsp->fsu_blocksize/mult; 1031 p->dfree_units = p->available*fsp->fsu_blocksize/mult;
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 7c3bc4b9..bae38300 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -57,7 +57,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
57#define WARN_STRING 16 57#define WARN_STRING 16
58#define WARN_REGEX 32 58#define WARN_REGEX 32
59 59
60#define MAX_OIDS 8 60#define OID_COUNT_STEP 8
61 61
62/* Longopts only arguments */ 62/* Longopts only arguments */
63#define L_CALCULATE_RATE CHAR_MAX+1 63#define L_CALCULATE_RATE CHAR_MAX+1
@@ -112,6 +112,7 @@ char *privproto = NULL;
112char *authpasswd = NULL; 112char *authpasswd = NULL;
113char *privpasswd = NULL; 113char *privpasswd = NULL;
114char **oids = NULL; 114char **oids = NULL;
115size_t oids_size = NULL;
115char *label; 116char *label;
116char *units; 117char *units;
117char *port; 118char *port;
@@ -121,19 +122,22 @@ int invert_search=0;
121char **labels = NULL; 122char **labels = NULL;
122char **unitv = NULL; 123char **unitv = NULL;
123size_t nlabels = 0; 124size_t nlabels = 0;
124size_t labels_size = 8; 125size_t labels_size = OID_COUNT_STEP;
125size_t nunits = 0; 126size_t nunits = 0;
126size_t unitv_size = 8; 127size_t unitv_size = OID_COUNT_STEP;
127int numoids = 0; 128int numoids = 0;
128int numauthpriv = 0; 129int numauthpriv = 0;
129int verbose = 0; 130int verbose = 0;
130int usesnmpgetnext = FALSE; 131int usesnmpgetnext = FALSE;
131char *warning_thresholds = NULL; 132char *warning_thresholds = NULL;
132char *critical_thresholds = NULL; 133char *critical_thresholds = NULL;
133thresholds *thlds[MAX_OIDS]; 134thresholds **thlds;
134double response_value[MAX_OIDS]; 135size_t thlds_size = OID_COUNT_STEP;
136double *response_value;
137size_t response_size = OID_COUNT_STEP;
135int retries = 0; 138int retries = 0;
136int eval_method[MAX_OIDS]; 139int *eval_method;
140size_t eval_size = OID_COUNT_STEP;
137char *delimiter; 141char *delimiter;
138char *output_delim; 142char *output_delim;
139char *miblist = NULL; 143char *miblist = NULL;
@@ -142,7 +146,8 @@ int calculate_rate = 0;
142double offset = 0.0; 146double offset = 0.0;
143int rate_multiplier = 1; 147int rate_multiplier = 1;
144state_data *previous_state; 148state_data *previous_state;
145double previous_value[MAX_OIDS]; 149double *previous_value;
150size_t previous_size = OID_COUNT_STEP;
146int perf_labels = 1; 151int perf_labels = 1;
147 152
148 153
@@ -150,16 +155,18 @@ static char *fix_snmp_range(char *th)
150{ 155{
151 double left, right; 156 double left, right;
152 char *colon, *ret; 157 char *colon, *ret;
153 if (!(colon = strchr(th, ':'))) 158
159 if ((colon = strchr(th, ':')) == NULL || *(colon + 1) == '\0')
154 return th; 160 return th;
155 *colon = 0;
156 161
157 left = strtod(th, NULL); 162 left = strtod(th, NULL);
158 right = strtod(colon + 1, NULL); 163 right = strtod(colon + 1, NULL);
159 if (right >= left) { 164 if (right >= left)
160 return th; 165 return th;
161 } 166
162 ret = malloc(strlen(th) + strlen(colon + 1) + 2); 167 if ((ret = malloc(strlen(th) + 2)) == NULL)
168 die(STATE_UNKNOWN, _("Cannot malloc"));
169 *colon = '\0';
163 sprintf(ret, "@%s:%s", colon + 1, th); 170 sprintf(ret, "@%s:%s", colon + 1, th);
164 free(th); 171 free(th);
165 return ret; 172 return ret;
@@ -204,8 +211,11 @@ main (int argc, char **argv)
204 211
205 labels = malloc (labels_size * sizeof(*labels)); 212 labels = malloc (labels_size * sizeof(*labels));
206 unitv = malloc (unitv_size * sizeof(*unitv)); 213 unitv = malloc (unitv_size * sizeof(*unitv));
207 for (i = 0; i < MAX_OIDS; i++) 214 thlds = malloc (thlds_size * sizeof(*thlds));
208 eval_method[i] = CHECK_UNDEF; 215 response_value = malloc (response_size * sizeof(*response_value));
216 previous_value = malloc (previous_size * sizeof(*previous_value));
217 eval_method = calloc (eval_size, sizeof(*eval_method));
218 oids = calloc(oids_size, sizeof (char *));
209 219
210 label = strdup ("SNMP"); 220 label = strdup ("SNMP");
211 units = strdup (""); 221 units = strdup ("");
@@ -223,13 +233,14 @@ main (int argc, char **argv)
223 233
224 np_set_args(argc, argv); 234 np_set_args(argc, argv);
225 235
236 time(&current_time);
237
226 if (process_arguments (argc, argv) == ERROR) 238 if (process_arguments (argc, argv) == ERROR)
227 usage4 (_("Could not parse arguments")); 239 usage4 (_("Could not parse arguments"));
228 240
229 if(calculate_rate) { 241 if(calculate_rate) {
230 if (!strcmp(label, "SNMP")) 242 if (!strcmp(label, "SNMP"))
231 label = strdup("SNMP RATE"); 243 label = strdup("SNMP RATE");
232 time(&current_time);
233 i=0; 244 i=0;
234 previous_state = np_state_read(); 245 previous_state = np_state_read();
235 if(previous_state!=NULL) { 246 if(previous_state!=NULL) {
@@ -238,6 +249,10 @@ main (int argc, char **argv)
238 while((ap = strsep(&previous_string, ":")) != NULL) { 249 while((ap = strsep(&previous_string, ":")) != NULL) {
239 if(verbose>2) 250 if(verbose>2)
240 printf("State for %d=%s\n", i, ap); 251 printf("State for %d=%s\n", i, ap);
252 while (i >= previous_size) {
253 previous_size += OID_COUNT_STEP;
254 previous_value = realloc(previous_value, previous_size * sizeof(*previous_value));
255 }
241 previous_value[i++]=strtod(ap,NULL); 256 previous_value[i++]=strtod(ap,NULL);
242 } 257 }
243 } 258 }
@@ -253,6 +268,11 @@ main (int argc, char **argv)
253 w = w ? fix_snmp_range(w) : NULL; 268 w = w ? fix_snmp_range(w) : NULL;
254 c = c ? fix_snmp_range(c) : NULL; 269 c = c ? fix_snmp_range(c) : NULL;
255 270
271 while (i >= thlds_size) {
272 thlds_size += OID_COUNT_STEP;
273 thlds = realloc(thlds, thlds_size * sizeof(*thlds));
274 }
275
256 /* Skip empty thresholds, while avoiding segfault */ 276 /* Skip empty thresholds, while avoiding segfault */
257 set_thresholds(&thlds[i], 277 set_thresholds(&thlds[i],
258 w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL, 278 w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL,
@@ -432,6 +452,10 @@ main (int argc, char **argv)
432 ptr = strpbrk (show, "0123456789"); 452 ptr = strpbrk (show, "0123456789");
433 if (ptr == NULL) 453 if (ptr == NULL)
434 die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show); 454 die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show);
455 while (i >= response_size) {
456 response_size += OID_COUNT_STEP;
457 response_value = realloc(response_value, response_size * sizeof(*response_value));
458 }
435 response_value[i] = strtod (ptr, NULL) + offset; 459 response_value[i] = strtod (ptr, NULL) + offset;
436 460
437 if(calculate_rate) { 461 if(calculate_rate) {
@@ -459,7 +483,7 @@ main (int argc, char **argv)
459 } 483 }
460 484
461 /* Process this block for string matching */ 485 /* Process this block for string matching */
462 else if (eval_method[i] & CRIT_STRING) { 486 else if (eval_size > i && eval_method[i] & CRIT_STRING) {
463 if (strcmp (show, string_value)) 487 if (strcmp (show, string_value))
464 iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK; 488 iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK;
465 else 489 else
@@ -467,7 +491,7 @@ main (int argc, char **argv)
467 } 491 }
468 492
469 /* Process this block for regex matching */ 493 /* Process this block for regex matching */
470 else if (eval_method[i] & CRIT_REGEX) { 494 else if (eval_size > i && eval_method[i] & CRIT_REGEX) {
471 excode = regexec (&preg, response, 10, pmatch, eflags); 495 excode = regexec (&preg, response, 10, pmatch, eflags);
472 if (excode == 0) { 496 if (excode == 0) {
473 iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL; 497 iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL;
@@ -485,9 +509,9 @@ main (int argc, char **argv)
485 /* Process this block for existence-nonexistence checks */ 509 /* Process this block for existence-nonexistence checks */
486 /* TV: Should this be outside of this else block? */ 510 /* TV: Should this be outside of this else block? */
487 else { 511 else {
488 if (eval_method[i] & CRIT_PRESENT) 512 if (eval_size > i && eval_method[i] & CRIT_PRESENT)
489 iresult = STATE_CRITICAL; 513 iresult = STATE_CRITICAL;
490 else if (eval_method[i] & WARN_PRESENT) 514 else if (eval_size > i && eval_method[i] & WARN_PRESENT)
491 iresult = STATE_WARNING; 515 iresult = STATE_WARNING;
492 else if (response && iresult == STATE_DEPENDENT) 516 else if (response && iresult == STATE_DEPENDENT)
493 iresult = STATE_OK; 517 iresult = STATE_OK;
@@ -727,23 +751,36 @@ process_arguments (int argc, char **argv)
727 */ 751 */
728 needmibs = TRUE; 752 needmibs = TRUE;
729 } 753 }
730 if (!oids) oids = calloc(MAX_OIDS, sizeof (char *)); 754 for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", "), j++) {
731 for (ptr = strtok(optarg, ", "); ptr != NULL && j < MAX_OIDS; ptr = strtok(NULL, ", "), j++) { 755 while (j >= oids_size) {
756 oids_size += OID_COUNT_STEP;
757 oids = realloc(oids, oids_size * sizeof (*oids));
758 }
732 oids[j] = strdup(ptr); 759 oids[j] = strdup(ptr);
733 } 760 }
734 numoids = j; 761 numoids = j;
735 if (c == 'E' || c == 'e') { 762 if (c == 'E' || c == 'e') {
736 jj++; 763 jj++;
737 ii++; 764 ii++;
765 while (j+1 >= eval_size) {
766 eval_size += OID_COUNT_STEP;
767 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method));
768 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
769 }
770 if (c == 'E')
771 eval_method[j+1] |= WARN_PRESENT;
772 else if (c == 'e')
773 eval_method[j+1] |= CRIT_PRESENT;
738 } 774 }
739 if (c == 'E')
740 eval_method[j+1] |= WARN_PRESENT;
741 else if (c == 'e')
742 eval_method[j+1] |= CRIT_PRESENT;
743 break; 775 break;
744 case 's': /* string or substring */ 776 case 's': /* string or substring */
745 strncpy (string_value, optarg, sizeof (string_value) - 1); 777 strncpy (string_value, optarg, sizeof (string_value) - 1);
746 string_value[sizeof (string_value) - 1] = 0; 778 string_value[sizeof (string_value) - 1] = 0;
779 while (jj >= eval_size) {
780 eval_size += OID_COUNT_STEP;
781 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method));
782 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
783 }
747 eval_method[jj++] = CRIT_STRING; 784 eval_method[jj++] = CRIT_STRING;
748 ii++; 785 ii++;
749 break; 786 break;
@@ -759,6 +796,11 @@ process_arguments (int argc, char **argv)
759 printf (_("Could Not Compile Regular Expression")); 796 printf (_("Could Not Compile Regular Expression"));
760 return ERROR; 797 return ERROR;
761 } 798 }
799 while (jj >= eval_size) {
800 eval_size += OID_COUNT_STEP;
801 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method));
802 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
803 }
762 eval_method[jj++] = CRIT_REGEX; 804 eval_method[jj++] = CRIT_REGEX;
763 ii++; 805 ii++;
764 break; 806 break;
@@ -1125,7 +1167,7 @@ print_help (void)
1125 printf ("\n"); 1167 printf ("\n");
1126 printf ("%s\n", _("Notes:")); 1168 printf ("%s\n", _("Notes:"));
1127 printf (" %s\n", _("- Multiple OIDs (and labels) may be indicated by a comma or space-delimited ")); 1169 printf (" %s\n", _("- Multiple OIDs (and labels) may be indicated by a comma or space-delimited "));
1128 printf (" %s %i %s\n", _("list (lists with internal spaces must be quoted). Maximum:"), MAX_OIDS, _("OIDs.")); 1170 printf (" %s\n", _("list (lists with internal spaces must be quoted)."));
1129 1171
1130 printf(" -%s", UT_THRESHOLDS_NOTES); 1172 printf(" -%s", UT_THRESHOLDS_NOTES);
1131 1173
diff --git a/plugins/t/check_snmp.t b/plugins/t/check_snmp.t
index 04bf500b..6de5f299 100644
--- a/plugins/t/check_snmp.t
+++ b/plugins/t/check_snmp.t
@@ -8,145 +8,164 @@ use strict;
8use Test::More; 8use Test::More;
9use NPTest; 9use NPTest;
10 10
11my $tests = 8+42+2+2; 11BEGIN {
12plan tests => $tests; 12 plan skip_all => 'check_snmp is not compiled' unless -x "./check_snmp";
13 plan tests => 60;
14}
15
13my $res; 16my $res;
14 17
18my $host_snmp = getTestParameter( "host_snmp", "NP_HOST_SNMP", "localhost",
19 "A host providing an SNMP Service");
20
21my $snmp_community = getTestParameter( "snmp_community", "NP_SNMP_COMMUNITY", "public",
22 "The SNMP Community string for SNMP Testing (assumes snmp v1)" );
23
24my $host_nonresponsive = getTestParameter( "host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1",
25 "The hostname of system not responsive to network requests" );
26
27my $hostname_invalid = getTestParameter( "hostname_invalid", "NP_HOSTNAME_INVALID", "nosuchhost",
28 "An invalid (not known to DNS) hostname" );
29
30$res = NPTest->testCmd( "./check_snmp -t 1" );
31is( $res->return_code, 3, "No host name" );
32is( $res->output, "No host specified" );
33
34$res = NPTest->testCmd( "./check_snmp -H fakehostname" );
35is( $res->return_code, 3, "No OIDs specified" );
36is( $res->output, "No OIDs specified" );
37
38$res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3 --seclevel=rubbish" );
39is( $res->return_code, 3, "Invalid seclevel" );
40like( $res->output, "/check_snmp: Invalid seclevel - rubbish/" );
41
42$res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3c" );
43is( $res->return_code, 3, "Invalid protocol" );
44like( $res->output, "/check_snmp: Invalid SNMP version - 3c/" );
45
46SKIP: {
47 skip "no snmp host defined", 38 if ( ! $host_snmp );
48
49 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:");
50 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" );
51 like($res->output, '/^SNMP OK - (\d+)/', "String contains SNMP OK");
52 $res->output =~ /^SNMP OK - (\d+)/;
53 my $value = $1;
54 cmp_ok( $value, ">", 0, "Got a time value" );
55 like($res->perf_output, "/sysUpTime.*$1/", "Got perfdata with value '$1' in it");
56
57
58 # some more threshold tests
59 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1");
60 cmp_ok( $res->return_code, '==', 2, "Threshold test -c 1" );
61
62 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1:");
63 cmp_ok( $res->return_code, '==', 0, "Threshold test -c 1:" );
64
65 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c ~:1");
66 cmp_ok( $res->return_code, '==', 2, "Threshold test -c ~:1" );
67
68 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1:10");
69 cmp_ok( $res->return_code, '==', 2, "Threshold test -c 1:10" );
70
71 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c \@1:10");
72 cmp_ok( $res->return_code, '==', 0, "Threshold test -c \@1:10" );
73
74 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 10:1");
75 cmp_ok( $res->return_code, '==', 0, "Threshold test -c 10:1" );
76
77
78 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o .1.3.6.1.2.1.1.3.0 -w 1: -c 1:");
79 cmp_ok( $res->return_code, '==', 0, "Test with numeric OID (no mibs loaded)" );
80 like($res->output, '/^SNMP OK - \d+/', "String contains SNMP OK");
81
82 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0");
83 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" );
84 unlike($res->perf_output, '/sysDescr/', "Perfdata doesn't contain string values");
85
86 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0,system.sysDescr.0");
87 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, comma-separated" );
88 like($res->output, '/^SNMP OK - /', "String contains SNMP OK");
89
90 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0 -o system.sysDescr.0");
91 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, repeated option" );
92 like($res->output, '/^SNMP OK - /', "String contains SNMP OK");
93
94 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 1:1 -c 1:1");
95 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrSWRunIndex.1" );
96 like($res->output, '/^SNMP OK - 1\s.*$/', "String fits SNMP OK and output format");
97
98 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 0 -c 1:");
99 cmp_ok( $res->return_code, '==', 1, "Exit WARNING when querying hrSWRunIndex.1 and warn-th doesn't apply " );
100 like($res->output, '/^SNMP WARNING - \*1\*\s.*$/', "String matches SNMP WARNING and output format");
101
102 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0");
103 cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" );
104 like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and output format");
105
106 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2");
107 cmp_ok( $res->return_code, '==', 0, "Checking two OIDs at once" );
108 like($res->output, "/^SNMP OK - 2 1/", "Got two values back" );
109 like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
110 like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );
111
112 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2,1:2 -c 2:2,2:2");
113 cmp_ok( $res->return_code, '==', 2, "Checking critical threshold is passed if any one value crosses" );
114 like($res->output, "/^SNMP CRITICAL - 2 *1*/", "Got two values back" );
115 like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
116 like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );
117
118 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w 1:,1: -c 1:,1:");
119 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrMemorySize and hrSystemProcesses");
120 like($res->output, '/^SNMP OK - \d+ \d+/', "String contains hrMemorySize and hrSystemProcesses");
121
122 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w \@:0 -c \@0");
123 cmp_ok( $res->return_code, '==', 0, "Exit OK with inside-range thresholds");
124 like($res->output, '/^SNMP OK - 1\s.*$/', "String matches SNMP OK and output format");
125
126 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3");
127 $res->output =~ m/^SNMP OK - (\d+\.\d{2})\s.*$/;
128 my $lower = $1 - 0.05;
129 my $higher = $1 + 0.05;
130 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3 -w $lower -c $higher");
131 cmp_ok( $res->return_code, '==', 1, "Exit WARNING with fractionnal arguments");
132
133 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0,host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w ,:0 -c ,:2");
134 cmp_ok( $res->return_code, '==', 1, "Exit WARNING on 2nd threshold");
135 like($res->output, '/^SNMP WARNING - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s+\*1\*\s.*$/', "First OID returned as string, 2nd checked for thresholds");
136
137 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w '' -c ''");
138 cmp_ok( $res->return_code, '==', 0, "Empty thresholds doesn't crash");
139
140 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,,1 -c ,,2");
141 cmp_ok( $res->return_code, '==', 0, "Skipping first two thresholds on 2 OID check");
142 like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping first two thresholds, result printed rather than parsed");
143
144 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,, -c ,,");
145 cmp_ok( $res->return_code, '==', 0, "Skipping all thresholds");
146 like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping all thresholds, result printed rather than parsed");
147
148 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1000000000000: -u '1/100 sec'");
149 cmp_ok( $res->return_code, '==', 2, "Timetick used as a threshold");
150 like($res->output, '/^SNMP CRITICAL - \*\d+\* 1\/100 sec.*$/', "Timetick used as a threshold, parsed as numeric");
151
152 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0");
153 cmp_ok( $res->return_code, '==', 0, "Timetick used as a string");
154 like($res->output, '/^SNMP OK - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s.*$/', "Timetick used as a string, result printed rather than parsed");
155}
156
157# These checks need a complete command line. An invalid community is used so
158# the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway
15SKIP: { 159SKIP: {
16 skip "check_snmp is not compiled", $tests if ( ! -x "./check_snmp" ); 160 skip "no non responsive host defined", 2 if ( ! $host_nonresponsive );
17 161 $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
18 my $host_snmp = getTestParameter( "host_snmp", "NP_HOST_SNMP", "localhost", 162 cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" );
19 "A host providing an SNMP Service"); 163 like($res->output, '/External command error: Timeout: No Response from /', "String matches timeout problem");
20 164}
21 my $snmp_community = getTestParameter( "snmp_community", "NP_SNMP_COMMUNITY", "public",
22 "The SNMP Community string for SNMP Testing (assumes snmp v1)" );
23
24 my $host_nonresponsive = getTestParameter( "host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1",
25 "The hostname of system not responsive to network requests" );
26
27 my $hostname_invalid = getTestParameter( "hostname_invalid", "NP_HOSTNAME_INVALID", "nosuchhost",
28 "An invalid (not known to DNS) hostname" );
29
30 $res = NPTest->testCmd( "./check_snmp -t 1" );
31 is( $res->return_code, 3, "No host name" );
32 is( $res->output, "No host specified" );
33
34 $res = NPTest->testCmd( "./check_snmp -H fakehostname" );
35 is( $res->return_code, 3, "No OIDs specified" );
36 is( $res->output, "No OIDs specified" );
37
38 $res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3 --seclevel=rubbish" );
39 is( $res->return_code, 3, "Invalid seclevel" );
40 like( $res->output, "/check_snmp: Invalid seclevel - rubbish/" );
41
42 $res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3c" );
43 is( $res->return_code, 3, "Invalid protocol" );
44 like( $res->output, "/check_snmp: Invalid SNMP version - 3c/" );
45
46 SKIP: {
47 skip "no snmp host defined", 38 if ( ! $host_snmp );
48
49 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:");
50 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" );
51 like($res->output, '/^SNMP OK - (\d+)/', "String contains SNMP OK");
52 $res->output =~ /^SNMP OK - (\d+)/;
53 my $value = $1;
54 cmp_ok( $value, ">", 0, "Got a time value" );
55 like($res->perf_output, "/sysUpTime.*$1/", "Got perfdata with value '$1' in it");
56
57 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o .1.3.6.1.2.1.1.3.0 -w 1: -c 1:");
58 cmp_ok( $res->return_code, '==', 0, "Test with numeric OID (no mibs loaded)" );
59 like($res->output, '/^SNMP OK - \d+/', "String contains SNMP OK");
60
61 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0");
62 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" );
63 unlike($res->perf_output, '/sysDescr/', "Perfdata doesn't contain string values");
64
65 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0,system.sysDescr.0");
66 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, comma-separated" );
67 like($res->output, '/^SNMP OK - /', "String contains SNMP OK");
68
69 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0 -o system.sysDescr.0");
70 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, repeated option" );
71 like($res->output, '/^SNMP OK - /', "String contains SNMP OK");
72
73 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 1:1 -c 1:1");
74 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrSWRunIndex.1" );
75 like($res->output, '/^SNMP OK - 1\s.*$/', "String fits SNMP OK and output format");
76
77 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 0 -c 1:");
78 cmp_ok( $res->return_code, '==', 1, "Exit WARNING when querying hrSWRunIndex.1 and warn-th doesn't apply " );
79 like($res->output, '/^SNMP WARNING - \*1\*\s.*$/', "String matches SNMP WARNING and output format");
80
81 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0");
82 cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" );
83 like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and output format");
84
85 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2");
86 cmp_ok( $res->return_code, '==', 0, "Checking two OIDs at once" );
87 like($res->output, "/^SNMP OK - 2 1/", "Got two values back" );
88 like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
89 like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );
90
91 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2,1:2 -c 2:2,2:2");
92 cmp_ok( $res->return_code, '==', 2, "Checking critical threshold is passed if any one value crosses" );
93 like($res->output, "/^SNMP CRITICAL - 2 *1*/", "Got two values back" );
94 like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
95 like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );
96
97 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w 1:,1: -c 1:,1:");
98 cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrMemorySize and hrSystemProcesses");
99 like($res->output, '/^SNMP OK - \d+ \d+/', "String contains hrMemorySize and hrSystemProcesses");
100
101 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w \@:0 -c \@0");
102 cmp_ok( $res->return_code, '==', 0, "Exit OK with inside-range thresholds");
103 like($res->output, '/^SNMP OK - 1\s.*$/', "String matches SNMP OK and output format");
104
105 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3");
106 $res->output =~ m/^SNMP OK - (\d+\.\d{2})\s.*$/;
107 my $lower = $1 - 0.05;
108 my $higher = $1 + 0.05;
109 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3 -w $lower -c $higher");
110 cmp_ok( $res->return_code, '==', 1, "Exit WARNING with fractionnal arguments");
111
112 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0,host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w ,:0 -c ,:2");
113 cmp_ok( $res->return_code, '==', 1, "Exit WARNING on 2nd threshold");
114 like($res->output, '/^SNMP WARNING - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s+\*1\*\s.*$/', "First OID returned as string, 2nd checked for thresholds");
115
116 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w '' -c ''");
117 cmp_ok( $res->return_code, '==', 0, "Empty thresholds doesn't crash");
118
119 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,,1 -c ,,2");
120 cmp_ok( $res->return_code, '==', 0, "Skipping first two thresholds on 2 OID check");
121 like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping first two thresholds, result printed rather than parsed");
122
123 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,, -c ,,");
124 cmp_ok( $res->return_code, '==', 0, "Skipping all thresholds");
125 like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping all thresholds, result printed rather than parsed");
126
127 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1000000000000: -u '1/100 sec'");
128 cmp_ok( $res->return_code, '==', 2, "Timetick used as a threshold");
129 like($res->output, '/^SNMP CRITICAL - \*\d+\* 1\/100 sec.*$/', "Timetick used as a threshold, parsed as numeric");
130
131 $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0");
132 cmp_ok( $res->return_code, '==', 0, "Timetick used as a string");
133 like($res->output, '/^SNMP OK - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s.*$/', "Timetick used as a string, result printed rather than parsed");
134 }
135
136 # These checks need a complete command line. An invalid community is used so
137 # the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway
138 SKIP: {
139 skip "no non responsive host defined", 2 if ( ! $host_nonresponsive );
140 $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
141 cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" );
142 like($res->output, '/External command error: Timeout: No Response from /', "String matches timeout problem");
143 }
144
145 SKIP: {
146 skip "no non invalid host defined", 2 if ( ! $hostname_invalid );
147 $res = NPTest->testCmd( "./check_snmp -H $hostname_invalid -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
148 cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" );
149 like($res->output, '/External command error: .*(nosuchhost|Name or service not known|Unknown host)/', "String matches invalid host");
150 }
151 165
166SKIP: {
167 skip "no non invalid host defined", 2 if ( ! $hostname_invalid );
168 $res = NPTest->testCmd( "./check_snmp -H $hostname_invalid -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
169 cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" );
170 like($res->output, '/External command error: .*(nosuchhost|Name or service not known|Unknown host)/', "String matches invalid host");
152} 171}
diff --git a/plugins/t/check_tcp.t b/plugins/t/check_tcp.t
index d6808bf2..c100cadd 100644
--- a/plugins/t/check_tcp.t
+++ b/plugins/t/check_tcp.t
@@ -32,7 +32,7 @@ $t += checkCmd( "./check_tcp $host_tcp_http -p 81 -wt 0 -ct 0 -to 1", 2
32$t += checkCmd( "./check_tcp $host_nonresponsive -p 80 -wt 0 -ct 0 -to 1", 2 ); 32$t += checkCmd( "./check_tcp $host_nonresponsive -p 80 -wt 0 -ct 0 -to 1", 2 );
33$t += checkCmd( "./check_tcp $hostname_invalid -p 80 -wt 0 -ct 0 -to 1", 2 ); 33$t += checkCmd( "./check_tcp $hostname_invalid -p 80 -wt 0 -ct 0 -to 1", 2 );
34$t += checkCmd( "./check_tcp -S -D 1 -H www.verisign.com -p 443", 0 ); 34$t += checkCmd( "./check_tcp -S -D 1 -H www.verisign.com -p 443", 0 );
35$t += checkCmd( "./check_tcp -S -D 9000,1 -H www.verisign.com -p 443", 0 ); 35$t += checkCmd( "./check_tcp -S -D 9000,1 -H www.verisign.com -p 443", 1 );
36$t += checkCmd( "./check_tcp -S -D 9000 -H www.verisign.com -p 443", 1 ); 36$t += checkCmd( "./check_tcp -S -D 9000 -H www.verisign.com -p 443", 1 );
37$t += checkCmd( "./check_tcp -S -D 9000,8999 -H www.verisign.com -p 443", 2 ); 37$t += checkCmd( "./check_tcp -S -D 9000,8999 -H www.verisign.com -p 443", 2 );
38$t += checkCmd( "./check_tcp -6 -p 80 www.heise.de", 0 ); 38$t += checkCmd( "./check_tcp -6 -p 80 www.heise.de", 0 );
diff --git a/test.pl.in b/test.pl.in
index 3834d3c3..85ac19da 100755
--- a/test.pl.in
+++ b/test.pl.in
@@ -44,6 +44,4 @@ if ( ! scalar( @tests ) )
44 44
45use Test::Harness; 45use Test::Harness;
46 46
47$Test::Harness::verbose=1;
48
49runtests( @tests ); 47runtests( @tests );
diff --git a/tools/build_perl_modules b/tools/build_perl_modules
index 9b0c3c20..5a57a471 100755
--- a/tools/build_perl_modules
+++ b/tools/build_perl_modules
@@ -188,6 +188,7 @@ foreach my $tarball (@tarballs) {
188 188
189 # Don't compile if already done - this is because of invocating this 189 # Don't compile if already done - this is because of invocating this
190 # script at different stages 190 # script at different stages
191 print "******************** $tarball\n";
191 if ( $built_modules{$dir} || !-f "$dir/Makefile" && !-f "$dir/Build" ) { 192 if ( $built_modules{$dir} || !-f "$dir/Makefile" && !-f "$dir/Build" ) {
192 $built_modules{$dir}++; 193 $built_modules{$dir}++;
193 my @missing; 194 my @missing;