diff options
author | Ton Voon <tonvoon@macbook.local> | 2009-03-14 01:17:50 +0000 |
---|---|---|
committer | Ton Voon <tonvoon@macbook.local> | 2009-03-14 01:17:50 +0000 |
commit | 36e58ae0c3ad7a9d3660722b35d3ed9c97687dd2 (patch) | |
tree | 86bf7e19a500bc7d10c5bcaa6d976ffd476d0229 | |
parent | 674841e279cc1bdbcb5c84c9b26377b156aee76b (diff) | |
download | monitoring-plugins-36e58ae0c3ad7a9d3660722b35d3ed9c97687dd2.tar.gz |
Fixed passing of quotes in OID for check_snmp (#1985230 - Jan Wagner, patch by John Barbuto)
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | THANKS.in | 1 | ||||
-rw-r--r-- | plugins/Makefile.am | 4 | ||||
-rw-r--r-- | plugins/check_snmp.c | 295 | ||||
-rw-r--r-- | plugins/t/check_snmp.t | 49 |
5 files changed, 184 insertions, 166 deletions
@@ -22,6 +22,7 @@ This file documents the major additions and syntax changes between releases. | |||
22 | Fixed check_http behaviour: all check are now performed as long as a valid response is returned (sf.net #1460312) | 22 | Fixed check_http behaviour: all check are now performed as long as a valid response is returned (sf.net #1460312) |
23 | check_http --onredirect=sticky follows using the same IP address (sf.net #2550208) | 23 | check_http --onredirect=sticky follows using the same IP address (sf.net #2550208) |
24 | Fixed coredump from check_nt when invalid drive is specified (#2179754 - Olli Hauer) | 24 | Fixed coredump from check_nt when invalid drive is specified (#2179754 - Olli Hauer) |
25 | Fixed passing of quotes in OID for check_snmp (#1985230 - Jan Wagner, patch by John Barbuto) | ||
25 | 26 | ||
26 | 1.4.13 25th Sept 2008 | 27 | 1.4.13 25th Sept 2008 |
27 | Fix Debian bug #460097: check_http --max-age broken (Hilko Bengen) | 28 | Fix Debian bug #460097: check_http --max-age broken (Hilko Bengen) |
@@ -247,3 +247,4 @@ Erik Welch | |||
247 | Nik Soggia | 247 | Nik Soggia |
248 | Olli Hauer | 248 | Olli Hauer |
249 | Richard Edward Horner | 249 | Richard Edward Horner |
250 | John Barbuto | ||
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index f5272e17..4e1f2101 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am | |||
@@ -93,7 +93,7 @@ check_ping_LDADD = $(NETLIBS) popen.o | |||
93 | check_procs_LDADD = $(BASEOBJS) | 93 | check_procs_LDADD = $(BASEOBJS) |
94 | check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS) | 94 | check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS) |
95 | check_real_LDADD = $(NETLIBS) | 95 | check_real_LDADD = $(NETLIBS) |
96 | check_snmp_LDADD = $(BASEOBJS) popen.o | 96 | check_snmp_LDADD = $(BASEOBJS) |
97 | check_smtp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) | 97 | check_smtp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) |
98 | check_ssh_LDADD = $(NETLIBS) | 98 | check_ssh_LDADD = $(NETLIBS) |
99 | check_swap_LDADD = $(MATHLIBS) $(BASEOBJS) popen.o | 99 | check_swap_LDADD = $(MATHLIBS) $(BASEOBJS) popen.o |
@@ -135,7 +135,7 @@ check_ping_DEPENDENCIES = check_ping.c $(NETOBJS) popen.o $(DEPLIBS) | |||
135 | check_procs_DEPENDENCIES = check_procs.c $(BASEOBJS) popen.o $(DEPLIBS) | 135 | check_procs_DEPENDENCIES = check_procs.c $(BASEOBJS) popen.o $(DEPLIBS) |
136 | check_radius_DEPENDENCIES = check_radius.c $(NETOBJS) $(DEPLIBS) | 136 | check_radius_DEPENDENCIES = check_radius.c $(NETOBJS) $(DEPLIBS) |
137 | check_real_DEPENDENCIES = check_real.c $(NETOBJS) $(DEPLIBS) | 137 | check_real_DEPENDENCIES = check_real.c $(NETOBJS) $(DEPLIBS) |
138 | check_snmp_DEPENDENCIES = check_snmp.c $(BASEOBJS) popen.o $(DEPLIBS) | 138 | check_snmp_DEPENDENCIES = check_snmp.c $(BASEOBJS) $(DEPLIBS) |
139 | check_smtp_DEPENDENCIES = check_smtp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS) | 139 | check_smtp_DEPENDENCIES = check_smtp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS) |
140 | check_ssh_DEPENDENCIES = check_ssh.c $(NETOBJS) $(DEPLIBS) | 140 | check_ssh_DEPENDENCIES = check_ssh.c $(NETOBJS) $(DEPLIBS) |
141 | check_swap_DEPENDENCIES = check_swap.c $(BASEOBJS) popen.o $(DEPLIBS) | 141 | check_swap_DEPENDENCIES = check_swap.c $(BASEOBJS) popen.o $(DEPLIBS) |
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c index a8e08fa1..1b1eb2e8 100644 --- a/plugins/check_snmp.c +++ b/plugins/check_snmp.c | |||
@@ -34,7 +34,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
34 | 34 | ||
35 | #include "common.h" | 35 | #include "common.h" |
36 | #include "utils.h" | 36 | #include "utils.h" |
37 | #include "popen.h" | 37 | #include "utils_cmd.h" |
38 | 38 | ||
39 | #define DEFAULT_COMMUNITY "public" | 39 | #define DEFAULT_COMMUNITY "public" |
40 | #define DEFAULT_PORT "161" | 40 | #define DEFAULT_PORT "161" |
@@ -91,14 +91,14 @@ regex_t preg; | |||
91 | regmatch_t pmatch[10]; | 91 | regmatch_t pmatch[10]; |
92 | char timestamp[10] = ""; | 92 | char timestamp[10] = ""; |
93 | char errbuf[MAX_INPUT_BUFFER] = ""; | 93 | char errbuf[MAX_INPUT_BUFFER] = ""; |
94 | char perfstr[MAX_INPUT_BUFFER] = ""; | 94 | char perfstr[MAX_INPUT_BUFFER] = "| "; |
95 | int cflags = REG_EXTENDED | REG_NOSUB | REG_NEWLINE; | 95 | int cflags = REG_EXTENDED | REG_NOSUB | REG_NEWLINE; |
96 | int eflags = 0; | 96 | int eflags = 0; |
97 | int errcode, excode; | 97 | int errcode, excode; |
98 | 98 | ||
99 | char *server_address = NULL; | 99 | char *server_address = NULL; |
100 | char *community = NULL; | 100 | char *community = NULL; |
101 | char *authpriv = NULL; | 101 | char **authpriv = NULL; |
102 | char *proto = NULL; | 102 | char *proto = NULL; |
103 | char *seclevel = NULL; | 103 | char *seclevel = NULL; |
104 | char *secname = NULL; | 104 | char *secname = NULL; |
@@ -106,10 +106,11 @@ char *authproto = NULL; | |||
106 | char *privproto = NULL; | 106 | char *privproto = NULL; |
107 | char *authpasswd = NULL; | 107 | char *authpasswd = NULL; |
108 | char *privpasswd = NULL; | 108 | char *privpasswd = NULL; |
109 | char *oid; | 109 | char **oids = NULL; |
110 | char *label; | 110 | char *label; |
111 | char *units; | 111 | char *units; |
112 | char *port; | 112 | char *port; |
113 | char *snmpcmd; | ||
113 | char string_value[MAX_INPUT_BUFFER] = ""; | 114 | char string_value[MAX_INPUT_BUFFER] = ""; |
114 | char **labels = NULL; | 115 | char **labels = NULL; |
115 | char **unitv = NULL; | 116 | char **unitv = NULL; |
@@ -117,6 +118,8 @@ size_t nlabels = 0; | |||
117 | size_t labels_size = 8; | 118 | size_t labels_size = 8; |
118 | size_t nunits = 0; | 119 | size_t nunits = 0; |
119 | size_t unitv_size = 8; | 120 | size_t unitv_size = 8; |
121 | int numoids = 0; | ||
122 | int numauthpriv = 0; | ||
120 | int verbose = FALSE; | 123 | int verbose = FALSE; |
121 | int usesnmpgetnext = FALSE; | 124 | int usesnmpgetnext = FALSE; |
122 | unsigned long long lower_warn_lim[MAX_OIDS]; | 125 | unsigned long long lower_warn_lim[MAX_OIDS]; |
@@ -139,18 +142,16 @@ main (int argc, char **argv) | |||
139 | { | 142 | { |
140 | int i = 0; | 143 | int i = 0; |
141 | int iresult = STATE_UNKNOWN; | 144 | int iresult = STATE_UNKNOWN; |
142 | int found = 0; | 145 | int result = STATE_UNKNOWN; |
143 | int result = STATE_DEPENDENT; | 146 | char **command_line = NULL; |
144 | char input_buffer[MAX_INPUT_BUFFER]; | ||
145 | char *command_line = NULL; | ||
146 | char *cl_hidden_auth = NULL; | 147 | char *cl_hidden_auth = NULL; |
148 | char *oidname = NULL; | ||
147 | char *response = NULL; | 149 | char *response = NULL; |
148 | char *outbuff; | 150 | char *outbuff; |
149 | char *output; | ||
150 | char *ptr = NULL; | 151 | char *ptr = NULL; |
151 | char *p2 = NULL; | ||
152 | char *show = NULL; | 152 | char *show = NULL; |
153 | char type[8] = ""; | 153 | char type[8] = ""; |
154 | output chld_out, chld_err; | ||
154 | 155 | ||
155 | setlocale (LC_ALL, ""); | 156 | setlocale (LC_ALL, ""); |
156 | bindtextdomain (PACKAGE, LOCALEDIR); | 157 | bindtextdomain (PACKAGE, LOCALEDIR); |
@@ -162,12 +163,10 @@ main (int argc, char **argv) | |||
162 | eval_method[i] = CHECK_UNDEF; | 163 | eval_method[i] = CHECK_UNDEF; |
163 | i = 0; | 164 | i = 0; |
164 | 165 | ||
165 | oid = strdup (""); | ||
166 | label = strdup ("SNMP"); | 166 | label = strdup ("SNMP"); |
167 | units = strdup (""); | 167 | units = strdup (""); |
168 | port = strdup (DEFAULT_PORT); | 168 | port = strdup (DEFAULT_PORT); |
169 | outbuff = strdup (""); | 169 | outbuff = strdup (""); |
170 | output = strdup (""); | ||
171 | delimiter = strdup (" = "); | 170 | delimiter = strdup (" = "); |
172 | output_delim = strdup (DEFAULT_OUTPUT_DELIMITER); | 171 | output_delim = strdup (DEFAULT_OUTPUT_DELIMITER); |
173 | /* miblist = strdup (DEFAULT_MIBLIST); */ | 172 | /* miblist = strdup (DEFAULT_MIBLIST); */ |
@@ -180,91 +179,73 @@ main (int argc, char **argv) | |||
180 | if (process_arguments (argc, argv) == ERROR) | 179 | if (process_arguments (argc, argv) == ERROR) |
181 | usage4 (_("Could not parse arguments")); | 180 | usage4 (_("Could not parse arguments")); |
182 | 181 | ||
183 | /* create the command line to execute */ | 182 | /* Create the command array to execute */ |
184 | if(usesnmpgetnext == TRUE) { | 183 | if(usesnmpgetnext == TRUE) { |
185 | asprintf(&command_line, "%s -t %d -r %d -m %s -v %s %s %s:%s %s", | 184 | snmpcmd = strdup (PATH_TO_SNMPGETNEXT); |
186 | PATH_TO_SNMPGETNEXT, timeout_interval, retries, miblist, proto, | ||
187 | authpriv, server_address, port, oid); | ||
188 | asprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s %s", | ||
189 | PATH_TO_SNMPGETNEXT, timeout_interval, retries, miblist, proto, | ||
190 | "[authpriv]", server_address, port, oid); | ||
191 | }else{ | 185 | }else{ |
192 | 186 | snmpcmd = strdup (PATH_TO_SNMPGET); | |
193 | asprintf (&command_line, "%s -t %d -r %d -m %s -v %s %s %s:%s %s", | 187 | } |
194 | PATH_TO_SNMPGET, timeout_interval, retries, miblist, proto, | 188 | |
195 | authpriv, server_address, port, oid); | 189 | /* 9 arguments to pass before authpriv options + 1 for host and numoids. Add one for terminating NULL */ |
196 | asprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s %s", | 190 | command_line = calloc (9 + numauthpriv + 1 + numoids + 1, sizeof (char *)); |
197 | PATH_TO_SNMPGET, timeout_interval, retries, miblist, proto, | 191 | command_line[0] = snmpcmd; |
198 | "[authpriv]", server_address, port, oid); | 192 | command_line[1] = strdup ("-t"); |
193 | asprintf (&command_line[2], "%d", timeout_interval); | ||
194 | command_line[3] = strdup ("-r"); | ||
195 | asprintf (&command_line[4], "%d", retries); | ||
196 | command_line[5] = strdup ("-m"); | ||
197 | command_line[6] = strdup (miblist); | ||
198 | command_line[7] = "-v"; | ||
199 | command_line[8] = strdup (proto); | ||
200 | |||
201 | for (i = 0; i < numauthpriv; i++) { | ||
202 | command_line[9 + i] = authpriv[i]; | ||
199 | } | 203 | } |
200 | 204 | ||
201 | if (verbose) | 205 | asprintf (&command_line[9 + numauthpriv], "%s:%s", server_address, port); |
202 | printf ("%s\n", command_line); | ||
203 | |||
204 | 206 | ||
205 | /* run the command */ | 207 | /* This is just for display purposes, so it can remain a string */ |
206 | child_process = spopen (command_line); | 208 | asprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s", |
207 | if (child_process == NULL) { | 209 | snmpcmd, timeout_interval, retries, miblist, proto, "[authpriv]", |
208 | printf (_("Could not open pipe: %s\n"), cl_hidden_auth); | 210 | server_address, port); |
209 | exit (STATE_UNKNOWN); | ||
210 | } | ||
211 | 211 | ||
212 | #if 0 /* Removed May 29, 2007 */ | 212 | for (i = 0; i < numoids; i++) { |
213 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); | 213 | command_line[9 + numauthpriv + 1 + i] = oids[i]; |
214 | if (child_stderr == NULL) { | 214 | asprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]); |
215 | printf (_("Could not open stderr for %s\n"), cl_hidden_auth); | ||
216 | } | 215 | } |
217 | #endif | ||
218 | 216 | ||
219 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) | 217 | command_line[9 + numauthpriv + 1 + numoids] = NULL; |
220 | asprintf (&output, "%s%s", output, input_buffer); | ||
221 | 218 | ||
222 | if (verbose) | 219 | if (verbose) |
223 | printf ("%s\n", output); | 220 | printf ("%s\n", cl_hidden_auth); |
224 | 221 | ||
225 | ptr = output; | 222 | /* Run the command */ |
223 | result = cmd_run_array (command_line, &chld_out, &chld_err, 0); | ||
226 | 224 | ||
227 | strncat(perfstr, "| ", sizeof(perfstr)-strlen(perfstr)-1); | 225 | if (chld_err.lines > 0) { |
228 | while (ptr) { | 226 | printf (_("External command error: %s\n"), chld_err.line[0]); |
229 | char *foo, *ptr2; | 227 | for (i = 1; i < chld_err.lines; i++) { |
230 | unsigned int copylen; | 228 | printf ("%s\n", chld_err.line[i]); |
231 | 229 | } | |
232 | foo = strstr (ptr, delimiter); | 230 | exit (STATE_UNKNOWN); |
233 | copylen = foo-ptr; | 231 | } |
234 | if (copylen > sizeof(perfstr)-strlen(perfstr)-1) | ||
235 | copylen = sizeof(perfstr)-strlen(perfstr)-1; | ||
236 | ptr2 = ptr; | ||
237 | ptr = foo; | ||
238 | |||
239 | if (ptr == NULL) | ||
240 | break; | ||
241 | |||
242 | ptr += strlen (delimiter); | ||
243 | ptr += strspn (ptr, " "); | ||
244 | 232 | ||
245 | found++; | 233 | /* Return UNKNOWN or worse if no output is returned */ |
234 | if (chld_out.lines == 0) | ||
235 | die (max_state_alt (result, STATE_UNKNOWN), _("%s problem - No data received from host\nCMD: %s\n"), | ||
236 | label, | ||
237 | cl_hidden_auth); | ||
246 | 238 | ||
247 | if (ptr[0] == '"') { | 239 | if (verbose) { |
248 | ptr++; | 240 | for (i = 0; i < chld_out.lines; i++) { |
249 | response = strpcpy (response, ptr, "\""); | 241 | printf ("%s\n", chld_out.line[i]); |
250 | ptr = strpbrk (ptr, "\""); | ||
251 | ptr += strspn (ptr, "\"\n"); | ||
252 | } | ||
253 | else { | ||
254 | response = strpcpy (response, ptr, "\n"); | ||
255 | ptr = strpbrk (ptr, "\n"); | ||
256 | ptr += strspn (ptr, "\n"); | ||
257 | while | ||
258 | (strstr (ptr, delimiter) && | ||
259 | strstr (ptr, "\n") && strstr (ptr, "\n") < strstr (ptr, delimiter)) { | ||
260 | response = strpcat (response, ptr, "\n"); | ||
261 | ptr = strpbrk (ptr, "\n"); | ||
262 | } | ||
263 | if (ptr && strstr (ptr, delimiter) == NULL) { | ||
264 | asprintf (&response, "%s%s", response, ptr); | ||
265 | ptr = NULL; | ||
266 | } | ||
267 | } | 242 | } |
243 | } | ||
244 | |||
245 | for (i = 0; i < chld_out.lines; i++) { | ||
246 | ptr = chld_out.line[i]; | ||
247 | oidname = strpcpy (oidname, ptr, delimiter); | ||
248 | response = strstr (ptr, delimiter); | ||
268 | 249 | ||
269 | /* We strip out the datatype indicator for PHBs */ | 250 | /* We strip out the datatype indicator for PHBs */ |
270 | 251 | ||
@@ -289,7 +270,6 @@ main (int argc, char **argv) | |||
289 | show = strstr (response, "STRING: ") + 8; | 270 | show = strstr (response, "STRING: ") + 8; |
290 | else | 271 | else |
291 | show = response; | 272 | show = response; |
292 | p2 = show; | ||
293 | 273 | ||
294 | iresult = STATE_DEPENDENT; | 274 | iresult = STATE_DEPENDENT; |
295 | 275 | ||
@@ -306,10 +286,10 @@ main (int argc, char **argv) | |||
306 | eval_method[i] & WARN_LE || | 286 | eval_method[i] & WARN_LE || |
307 | eval_method[i] & WARN_EQ || | 287 | eval_method[i] & WARN_EQ || |
308 | eval_method[i] & WARN_NE) { | 288 | eval_method[i] & WARN_NE) { |
309 | p2 = strpbrk (p2, "0123456789"); | 289 | ptr = strpbrk (show, "0123456789"); |
310 | if (p2 == NULL) | 290 | if (ptr == NULL) |
311 | die (STATE_UNKNOWN,_("No valid data returned")); | 291 | die (STATE_UNKNOWN,_("No valid data returned")); |
312 | response_value[i] = strtoul (p2, NULL, 10); | 292 | response_value[i] = strtoul (ptr, NULL, 10); |
313 | iresult = check_num (i); | 293 | iresult = check_num (i); |
314 | asprintf (&show, "%llu", response_value[i]); | 294 | asprintf (&show, "%llu", response_value[i]); |
315 | } | 295 | } |
@@ -364,10 +344,8 @@ main (int argc, char **argv) | |||
364 | if (nunits > (size_t)0 && (size_t)i < nunits && unitv[i] != NULL) | 344 | if (nunits > (size_t)0 && (size_t)i < nunits && unitv[i] != NULL) |
365 | asprintf (&outbuff, "%s %s", outbuff, unitv[i]); | 345 | asprintf (&outbuff, "%s %s", outbuff, unitv[i]); |
366 | 346 | ||
367 | i++; | ||
368 | |||
369 | if (is_numeric(show)) { | 347 | if (is_numeric(show)) { |
370 | strncat(perfstr, ptr2, copylen); | 348 | strncat(perfstr, oidname, sizeof(perfstr)-strlen(perfstr)-1); |
371 | strncat(perfstr, "=", sizeof(perfstr)-strlen(perfstr)-1); | 349 | strncat(perfstr, "=", sizeof(perfstr)-strlen(perfstr)-1); |
372 | strncat(perfstr, show, sizeof(perfstr)-strlen(perfstr)-1); | 350 | strncat(perfstr, show, sizeof(perfstr)-strlen(perfstr)-1); |
373 | 351 | ||
@@ -375,29 +353,6 @@ main (int argc, char **argv) | |||
375 | strncat(perfstr, type, sizeof(perfstr)-strlen(perfstr)-1); | 353 | strncat(perfstr, type, sizeof(perfstr)-strlen(perfstr)-1); |
376 | strncat(perfstr, " ", sizeof(perfstr)-strlen(perfstr)-1); | 354 | strncat(perfstr, " ", sizeof(perfstr)-strlen(perfstr)-1); |
377 | } | 355 | } |
378 | |||
379 | } /* end while (ptr) */ | ||
380 | |||
381 | if (found == 0) | ||
382 | die (STATE_UNKNOWN, | ||
383 | _("%s problem - No data received from host\nCMD: %s\n"), | ||
384 | label, | ||
385 | cl_hidden_auth); | ||
386 | |||
387 | #if 0 /* Removed May 29, 2007 */ | ||
388 | /* WARNING if output found on stderr */ | ||
389 | if (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) | ||
390 | result = max_state (result, STATE_WARNING); | ||
391 | |||
392 | /* close stderr */ | ||
393 | (void) fclose (child_stderr); | ||
394 | #endif | ||
395 | |||
396 | /* close the pipe */ | ||
397 | if (spclose (child_process)) { | ||
398 | if (result == STATE_OK) | ||
399 | result = STATE_UNKNOWN; | ||
400 | asprintf (&outbuff, "%s (%s)", outbuff, _("snmpget returned an error status")); | ||
401 | } | 356 | } |
402 | 357 | ||
403 | /* if (nunits == 1 || i == 1) */ | 358 | /* if (nunits == 1 || i == 1) */ |
@@ -563,12 +518,12 @@ process_arguments (int argc, char **argv) | |||
563 | */ | 518 | */ |
564 | needmibs = TRUE; | 519 | needmibs = TRUE; |
565 | } | 520 | } |
566 | 521 | oids = calloc(MAX_OIDS, sizeof (char *)); | |
567 | for (ptr = optarg; (ptr = index (ptr, ',')); ptr++) | 522 | for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", ")) { |
568 | ptr[0] = ' '; /* relpace comma with space */ | 523 | oids[j] = strdup(ptr); |
569 | for (ptr = optarg; (ptr = index (ptr, ' ')); ptr++) | 524 | j++; |
570 | j++; /* count OIDs */ | 525 | } |
571 | asprintf (&oid, "%s %s", (oid?oid:""), optarg); | 526 | numoids = j; |
572 | if (c == 'E' || c == 'e') { | 527 | if (c == 'E' || c == 'e') { |
573 | jj++; | 528 | jj++; |
574 | ii++; | 529 | ii++; |
@@ -675,8 +630,6 @@ process_arguments (int argc, char **argv) | |||
675 | if (community == NULL) | 630 | if (community == NULL) |
676 | community = strdup (DEFAULT_COMMUNITY); | 631 | community = strdup (DEFAULT_COMMUNITY); |
677 | 632 | ||
678 | |||
679 | |||
680 | return validate_arguments (); | 633 | return validate_arguments (); |
681 | } | 634 | } |
682 | 635 | ||
@@ -713,47 +666,79 @@ validate_arguments () | |||
713 | } | 666 | } |
714 | } | 667 | } |
715 | 668 | ||
669 | /* Check server_address is given */ | ||
670 | if (server_address == NULL) | ||
671 | die(STATE_UNKNOWN, _("No host specified\n")); | ||
716 | 672 | ||
717 | /* Need better checks to verify seclevel and authproto choices */ | 673 | /* Check oid is given */ |
718 | 674 | if (numoids == 0) | |
719 | if (seclevel == NULL) | 675 | die(STATE_UNKNOWN, _("No OIDs specified\n")); |
720 | asprintf (&seclevel, "noAuthNoPriv"); | ||
721 | |||
722 | |||
723 | if (authproto == NULL ) | ||
724 | asprintf(&authproto, DEFAULT_AUTH_PROTOCOL); | ||
725 | |||
726 | if (privproto == NULL ) | ||
727 | asprintf(&privproto, DEFAULT_PRIV_PROTOCOL); | ||
728 | 676 | ||
729 | if (proto == NULL || (strcmp(proto,DEFAULT_PROTOCOL) == 0) ) { /* default protocol version */ | 677 | if (proto == NULL) |
730 | asprintf(&proto, DEFAULT_PROTOCOL); | 678 | asprintf(&proto, DEFAULT_PROTOCOL); |
731 | asprintf(&authpriv, "%s%s", "-c ", community); | 679 | |
732 | } | 680 | if ((strcmp(proto,"1") == 0) || (strcmp(proto, "2c")==0)) { /* snmpv1 or snmpv2c */ |
733 | else if ( strcmp (proto, "2c") == 0 ) { /* snmpv2c args */ | 681 | numauthpriv = 2; |
734 | asprintf(&authpriv, "%s%s", "-c ", community); | 682 | authpriv = calloc (numauthpriv, sizeof (char *)); |
683 | authpriv[0] = strdup ("-c"); | ||
684 | authpriv[1] = strdup (community); | ||
735 | } | 685 | } |
736 | else if ( strcmp (proto, "3") == 0 ) { /* snmpv3 args */ | 686 | else if ( strcmp (proto, "3") == 0 ) { /* snmpv3 args */ |
737 | asprintf(&proto, "%s", "3"); | 687 | if (seclevel == NULL) |
738 | 688 | asprintf(&seclevel, "noAuthNoPriv"); | |
739 | if ( (strcmp(seclevel, "noAuthNoPriv") == 0) || seclevel == NULL ) { | 689 | |
740 | asprintf(&authpriv, "%s", "-l noAuthNoPriv" ); | 690 | if (strcmp(seclevel, "noAuthNoPriv") == 0) { |
741 | } | 691 | numauthpriv = 2; |
742 | else if ( strcmp(seclevel, "authNoPriv") == 0 ) { | 692 | authpriv = calloc (numauthpriv, sizeof (char *)); |
743 | if ( secname == NULL || authpasswd == NULL) { | 693 | authpriv[0] = strdup ("-l"); |
744 | printf (_("Missing secname (%s) or authpassword (%s) ! \n"),secname, authpasswd ); | 694 | authpriv[1] = strdup ("noAuthNoPriv"); |
745 | print_usage (); | 695 | } else { |
746 | exit (STATE_UNKNOWN); | 696 | if (! ( (strcmp(seclevel, "authNoPriv")==0) || (strcmp(seclevel, "authPriv")==0) ) ) { |
697 | usage2 (_("Invalid seclevel"), seclevel); | ||
747 | } | 698 | } |
748 | asprintf(&authpriv, "-l authNoPriv -a %s -u %s -A %s ", authproto, secname, authpasswd); | 699 | |
749 | } | 700 | if (authproto == NULL ) |
750 | else if ( strcmp(seclevel, "authPriv") == 0 ) { | 701 | asprintf(&authproto, DEFAULT_AUTH_PROTOCOL); |
751 | if ( secname == NULL || authpasswd == NULL || privpasswd == NULL ) { | 702 | |
752 | printf (_("Missing secname (%s), authpassword (%s), or privpasswd (%s)! \n"),secname, authpasswd,privpasswd ); | 703 | if (secname == NULL) |
753 | print_usage (); | 704 | die(STATE_UNKNOWN, _("Required parameter: %s\n"), "secname"); |
754 | exit (STATE_UNKNOWN); | 705 | |
706 | if (authpasswd == NULL) | ||
707 | die(STATE_UNKNOWN, _("Required parameter: %s\n"), "authpasswd"); | ||
708 | |||
709 | if ( strcmp(seclevel, "authNoPriv") == 0 ) { | ||
710 | numauthpriv = 8; | ||
711 | authpriv = calloc (numauthpriv, sizeof (char *)); | ||
712 | authpriv[0] = strdup ("-l"); | ||
713 | authpriv[1] = strdup ("authNoPriv"); | ||
714 | authpriv[2] = strdup ("-a"); | ||
715 | authpriv[3] = strdup (authproto); | ||
716 | authpriv[4] = strdup ("-u"); | ||
717 | authpriv[5] = strdup (secname); | ||
718 | authpriv[6] = strdup ("-A"); | ||
719 | authpriv[7] = strdup (authpasswd); | ||
720 | } else if ( strcmp(seclevel, "authPriv") == 0 ) { | ||
721 | if (privproto == NULL ) | ||
722 | asprintf(&privproto, DEFAULT_PRIV_PROTOCOL); | ||
723 | |||
724 | if (privpasswd == NULL) | ||
725 | die(STATE_UNKNOWN, _("Required parameter: %s\n"), "privpasswd"); | ||
726 | |||
727 | numauthpriv = 12; | ||
728 | authpriv = calloc (numauthpriv, sizeof (char *)); | ||
729 | authpriv[0] = strdup ("-l"); | ||
730 | authpriv[1] = strdup ("authPriv"); | ||
731 | authpriv[2] = strdup ("-a"); | ||
732 | authpriv[3] = strdup (authproto); | ||
733 | authpriv[4] = strdup ("-u"); | ||
734 | authpriv[5] = strdup (secname); | ||
735 | authpriv[6] = strdup ("-A"); | ||
736 | authpriv[7] = strdup (authpasswd); | ||
737 | authpriv[8] = strdup ("-x"); | ||
738 | authpriv[9] = strdup (privproto); | ||
739 | authpriv[10] = strdup ("-X"); | ||
740 | authpriv[11] = strdup (privpasswd); | ||
755 | } | 741 | } |
756 | asprintf(&authpriv, "-l authPriv -a %s -u %s -A %s -x %s -X %s ", authproto, secname, authpasswd, privproto, privpasswd); | ||
757 | } | 742 | } |
758 | 743 | ||
759 | } | 744 | } |
diff --git a/plugins/t/check_snmp.t b/plugins/t/check_snmp.t index 369314ec..4820aace 100644 --- a/plugins/t/check_snmp.t +++ b/plugins/t/check_snmp.t | |||
@@ -8,9 +8,8 @@ use strict; | |||
8 | use Test::More; | 8 | use Test::More; |
9 | use NPTest; | 9 | use NPTest; |
10 | 10 | ||
11 | use vars qw($tests); | 11 | my $tests = 32; |
12 | BEGIN {$tests = 14; plan tests => $tests} | 12 | plan tests => $tests; |
13 | |||
14 | my $res; | 13 | my $res; |
15 | 14 | ||
16 | SKIP: { | 15 | SKIP: { |
@@ -20,7 +19,7 @@ SKIP: { | |||
20 | "A host providing an SNMP Service"); | 19 | "A host providing an SNMP Service"); |
21 | 20 | ||
22 | my $snmp_community = getTestParameter( "snmp_community", "NP_SNMP_COMMUNITY", "public", | 21 | my $snmp_community = getTestParameter( "snmp_community", "NP_SNMP_COMMUNITY", "public", |
23 | "The SNMP Community string for SNMP Testing" ); | 22 | "The SNMP Community string for SNMP Testing (assumes snmp v1)" ); |
24 | 23 | ||
25 | my $host_nonresponsive = getTestParameter( "host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1", | 24 | my $host_nonresponsive = getTestParameter( "host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1", |
26 | "The hostname of system not responsive to network requests" ); | 25 | "The hostname of system not responsive to network requests" ); |
@@ -28,12 +27,32 @@ SKIP: { | |||
28 | my $hostname_invalid = getTestParameter( "hostname_invalid", "NP_HOSTNAME_INVALID", "nosuchhost", | 27 | my $hostname_invalid = getTestParameter( "hostname_invalid", "NP_HOSTNAME_INVALID", "nosuchhost", |
29 | "An invalid (not known to DNS) hostname" ); | 28 | "An invalid (not known to DNS) hostname" ); |
30 | 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 | |||
31 | SKIP: { | 46 | SKIP: { |
32 | skip "no snmp host defined", 10 if ( ! $host_snmp ); | 47 | skip "no snmp host defined", 20 if ( ! $host_snmp ); |
33 | 48 | ||
34 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); | 49 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); |
35 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" ); | 50 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" ); |
36 | like($res->output, '/^SNMP OK - \d+/', "String contains SNMP OK"); | 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"); | ||
37 | 56 | ||
38 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0"); | 57 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0"); |
39 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" ); | 58 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" ); |
@@ -49,21 +68,33 @@ SKIP: { | |||
49 | 68 | ||
50 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0"); | 69 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0"); |
51 | cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" ); | 70 | cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" ); |
52 | like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and ouput format"); | 71 | like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and output format"); |
72 | |||
73 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2"); | ||
74 | cmp_ok( $res->return_code, '==', 0, "Checking two OIDs at once" ); | ||
75 | like($res->output, "/^SNMP OK - 2 1/", "Got two values back" ); | ||
76 | like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" ); | ||
77 | like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" ); | ||
78 | |||
79 | $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"); | ||
80 | cmp_ok( $res->return_code, '==', 2, "Checking critical threshold is passed if any one value crosses" ); | ||
81 | like($res->output, "/^SNMP CRITICAL - 2 *1*/", "Got two values back" ); | ||
82 | like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" ); | ||
83 | like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" ); | ||
53 | } | 84 | } |
54 | 85 | ||
55 | SKIP: { | 86 | SKIP: { |
56 | skip "no non responsive host defined", 2 if ( ! $host_nonresponsive ); | 87 | skip "no non responsive host defined", 2 if ( ! $host_nonresponsive ); |
57 | $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); | 88 | $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); |
58 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); | 89 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); |
59 | like($res->output, '/SNMP problem - /', "String matches SNMP Problem"); | 90 | like($res->output, '/External command error: Timeout: No Response from /', "String matches timeout problem"); |
60 | } | 91 | } |
61 | 92 | ||
62 | SKIP: { | 93 | SKIP: { |
63 | skip "no non invalid host defined", 2 if ( ! $hostname_invalid ); | 94 | skip "no non invalid host defined", 2 if ( ! $hostname_invalid ); |
64 | $res = NPTest->testCmd( "./check_snmp -H $hostname_invalid -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); | 95 | $res = NPTest->testCmd( "./check_snmp -H $hostname_invalid -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); |
65 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); | 96 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); |
66 | like($res->output, '/SNMP problem - /', "String matches SNMP Problem"); | 97 | like($res->output, '/External command error: .*nosuchhost/', "String matches invalid host"); |
67 | } | 98 | } |
68 | 99 | ||
69 | } | 100 | } |