summaryrefslogtreecommitdiffstats
path: root/plugins/check_snmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/check_snmp.c')
-rw-r--r--plugins/check_snmp.c79
1 files changed, 59 insertions, 20 deletions
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 7c5d0ec5..28354b0d 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
@@ -111,6 +111,7 @@ char *privproto = NULL;
111char *authpasswd = NULL; 111char *authpasswd = NULL;
112char *privpasswd = NULL; 112char *privpasswd = NULL;
113char **oids = NULL; 113char **oids = NULL;
114size_t oids_size = NULL;
114char *label; 115char *label;
115char *units; 116char *units;
116char *port; 117char *port;
@@ -120,19 +121,22 @@ int invert_search=0;
120char **labels = NULL; 121char **labels = NULL;
121char **unitv = NULL; 122char **unitv = NULL;
122size_t nlabels = 0; 123size_t nlabels = 0;
123size_t labels_size = 8; 124size_t labels_size = OID_COUNT_STEP;
124size_t nunits = 0; 125size_t nunits = 0;
125size_t unitv_size = 8; 126size_t unitv_size = OID_COUNT_STEP;
126int numoids = 0; 127int numoids = 0;
127int numauthpriv = 0; 128int numauthpriv = 0;
128int verbose = 0; 129int verbose = 0;
129int usesnmpgetnext = FALSE; 130int usesnmpgetnext = FALSE;
130char *warning_thresholds = NULL; 131char *warning_thresholds = NULL;
131char *critical_thresholds = NULL; 132char *critical_thresholds = NULL;
132thresholds *thlds[MAX_OIDS]; 133thresholds **thlds;
133double response_value[MAX_OIDS]; 134size_t thlds_size = OID_COUNT_STEP;
135double *response_value;
136size_t response_size = OID_COUNT_STEP;
134int retries = 0; 137int retries = 0;
135int eval_method[MAX_OIDS]; 138int *eval_method;
139size_t eval_size = OID_COUNT_STEP;
136char *delimiter; 140char *delimiter;
137char *output_delim; 141char *output_delim;
138char *miblist = NULL; 142char *miblist = NULL;
@@ -140,7 +144,8 @@ int needmibs = FALSE;
140int calculate_rate = 0; 144int calculate_rate = 0;
141int rate_multiplier = 1; 145int rate_multiplier = 1;
142state_data *previous_state; 146state_data *previous_state;
143double previous_value[MAX_OIDS]; 147double *previous_value;
148size_t previous_size = OID_COUNT_STEP;
144int perf_labels = 1; 149int perf_labels = 1;
145 150
146 151
@@ -202,8 +207,11 @@ main (int argc, char **argv)
202 207
203 labels = malloc (labels_size * sizeof(*labels)); 208 labels = malloc (labels_size * sizeof(*labels));
204 unitv = malloc (unitv_size * sizeof(*unitv)); 209 unitv = malloc (unitv_size * sizeof(*unitv));
205 for (i = 0; i < MAX_OIDS; i++) 210 thlds = malloc (thlds_size * sizeof(*thlds));
206 eval_method[i] = CHECK_UNDEF; 211 response_value = malloc (response_size * sizeof(*response_value));
212 previous_value = malloc (previous_size * sizeof(*previous_value));
213 eval_method = calloc (eval_size, sizeof(*eval_method));
214 oids = calloc(oids_size, sizeof (char *));
207 215
208 label = strdup ("SNMP"); 216 label = strdup ("SNMP");
209 units = strdup (""); 217 units = strdup ("");
@@ -236,6 +244,10 @@ main (int argc, char **argv)
236 while((ap = strsep(&previous_string, ":")) != NULL) { 244 while((ap = strsep(&previous_string, ":")) != NULL) {
237 if(verbose>2) 245 if(verbose>2)
238 printf("State for %d=%s\n", i, ap); 246 printf("State for %d=%s\n", i, ap);
247 while (i >= previous_size) {
248 previous_size += OID_COUNT_STEP;
249 previous_value = realloc(previous_value, previous_size * sizeof(*previous_value));
250 }
239 previous_value[i++]=strtod(ap,NULL); 251 previous_value[i++]=strtod(ap,NULL);
240 } 252 }
241 } 253 }
@@ -251,6 +263,11 @@ main (int argc, char **argv)
251 w = w ? fix_snmp_range(w) : NULL; 263 w = w ? fix_snmp_range(w) : NULL;
252 c = c ? fix_snmp_range(c) : NULL; 264 c = c ? fix_snmp_range(c) : NULL;
253 265
266 while (i >= thlds_size) {
267 thlds_size += OID_COUNT_STEP;
268 thlds = realloc(thlds, thlds_size * sizeof(*thlds));
269 }
270
254 /* Skip empty thresholds, while avoiding segfault */ 271 /* Skip empty thresholds, while avoiding segfault */
255 set_thresholds(&thlds[i], 272 set_thresholds(&thlds[i],
256 w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL, 273 w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL,
@@ -429,6 +446,10 @@ main (int argc, char **argv)
429 ptr = strpbrk (show, "0123456789"); 446 ptr = strpbrk (show, "0123456789");
430 if (ptr == NULL) 447 if (ptr == NULL)
431 die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show); 448 die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show);
449 while (i >= response_size) {
450 response_size += OID_COUNT_STEP;
451 response_value = realloc(response_value, response_size * sizeof(*response_value));
452 }
432 response_value[i] = strtod (ptr, NULL); 453 response_value[i] = strtod (ptr, NULL);
433 454
434 if(calculate_rate) { 455 if(calculate_rate) {
@@ -456,7 +477,7 @@ main (int argc, char **argv)
456 } 477 }
457 478
458 /* Process this block for string matching */ 479 /* Process this block for string matching */
459 else if (eval_method[i] & CRIT_STRING) { 480 else if (eval_size > i && eval_method[i] & CRIT_STRING) {
460 if (strcmp (show, string_value)) 481 if (strcmp (show, string_value))
461 iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK; 482 iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK;
462 else 483 else
@@ -464,7 +485,7 @@ main (int argc, char **argv)
464 } 485 }
465 486
466 /* Process this block for regex matching */ 487 /* Process this block for regex matching */
467 else if (eval_method[i] & CRIT_REGEX) { 488 else if (eval_size > i && eval_method[i] & CRIT_REGEX) {
468 excode = regexec (&preg, response, 10, pmatch, eflags); 489 excode = regexec (&preg, response, 10, pmatch, eflags);
469 if (excode == 0) { 490 if (excode == 0) {
470 iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL; 491 iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL;
@@ -482,9 +503,9 @@ main (int argc, char **argv)
482 /* Process this block for existence-nonexistence checks */ 503 /* Process this block for existence-nonexistence checks */
483 /* TV: Should this be outside of this else block? */ 504 /* TV: Should this be outside of this else block? */
484 else { 505 else {
485 if (eval_method[i] & CRIT_PRESENT) 506 if (eval_size > i && eval_method[i] & CRIT_PRESENT)
486 iresult = STATE_CRITICAL; 507 iresult = STATE_CRITICAL;
487 else if (eval_method[i] & WARN_PRESENT) 508 else if (eval_size > i && eval_method[i] & WARN_PRESENT)
488 iresult = STATE_WARNING; 509 iresult = STATE_WARNING;
489 else if (response && iresult == STATE_DEPENDENT) 510 else if (response && iresult == STATE_DEPENDENT)
490 iresult = STATE_OK; 511 iresult = STATE_OK;
@@ -723,23 +744,36 @@ process_arguments (int argc, char **argv)
723 */ 744 */
724 needmibs = TRUE; 745 needmibs = TRUE;
725 } 746 }
726 if (!oids) oids = calloc(MAX_OIDS, sizeof (char *)); 747 for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", "), j++) {
727 for (ptr = strtok(optarg, ", "); ptr != NULL && j < MAX_OIDS; ptr = strtok(NULL, ", "), j++) { 748 while (j >= oids_size) {
749 oids_size += OID_COUNT_STEP;
750 oids = realloc(oids, oids_size * sizeof (*oids));
751 }
728 oids[j] = strdup(ptr); 752 oids[j] = strdup(ptr);
729 } 753 }
730 numoids = j; 754 numoids = j;
731 if (c == 'E' || c == 'e') { 755 if (c == 'E' || c == 'e') {
732 jj++; 756 jj++;
733 ii++; 757 ii++;
758 while (j+1 >= eval_size) {
759 eval_size += OID_COUNT_STEP;
760 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method));
761 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
762 }
763 if (c == 'E')
764 eval_method[j+1] |= WARN_PRESENT;
765 else if (c == 'e')
766 eval_method[j+1] |= CRIT_PRESENT;
734 } 767 }
735 if (c == 'E')
736 eval_method[j+1] |= WARN_PRESENT;
737 else if (c == 'e')
738 eval_method[j+1] |= CRIT_PRESENT;
739 break; 768 break;
740 case 's': /* string or substring */ 769 case 's': /* string or substring */
741 strncpy (string_value, optarg, sizeof (string_value) - 1); 770 strncpy (string_value, optarg, sizeof (string_value) - 1);
742 string_value[sizeof (string_value) - 1] = 0; 771 string_value[sizeof (string_value) - 1] = 0;
772 while (jj >= eval_size) {
773 eval_size += OID_COUNT_STEP;
774 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method));
775 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
776 }
743 eval_method[jj++] = CRIT_STRING; 777 eval_method[jj++] = CRIT_STRING;
744 ii++; 778 ii++;
745 break; 779 break;
@@ -755,6 +789,11 @@ process_arguments (int argc, char **argv)
755 printf (_("Could Not Compile Regular Expression")); 789 printf (_("Could Not Compile Regular Expression"));
756 return ERROR; 790 return ERROR;
757 } 791 }
792 while (jj >= eval_size) {
793 eval_size += OID_COUNT_STEP;
794 eval_method = realloc(eval_method, eval_size * sizeof(*eval_method));
795 memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8);
796 }
758 eval_method[jj++] = CRIT_REGEX; 797 eval_method[jj++] = CRIT_REGEX;
759 ii++; 798 ii++;
760 break; 799 break;
@@ -1116,7 +1155,7 @@ print_help (void)
1116 printf ("\n"); 1155 printf ("\n");
1117 printf ("%s\n", _("Notes:")); 1156 printf ("%s\n", _("Notes:"));
1118 printf (" %s\n", _("- Multiple OIDs (and labels) may be indicated by a comma or space-delimited ")); 1157 printf (" %s\n", _("- Multiple OIDs (and labels) may be indicated by a comma or space-delimited "));
1119 printf (" %s %i %s\n", _("list (lists with internal spaces must be quoted). Maximum:"), MAX_OIDS, _("OIDs.")); 1158 printf (" %s %i %s\n", _("list (lists with internal spaces must be quoted)."));
1120 1159
1121 printf(" -%s", UT_THRESHOLDS_NOTES); 1160 printf(" -%s", UT_THRESHOLDS_NOTES);
1122 1161