diff options
Diffstat (limited to 'plugins/check_snmp.c')
-rw-r--r-- | plugins/check_snmp.c | 79 |
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; | |||
111 | char *authpasswd = NULL; | 111 | char *authpasswd = NULL; |
112 | char *privpasswd = NULL; | 112 | char *privpasswd = NULL; |
113 | char **oids = NULL; | 113 | char **oids = NULL; |
114 | size_t oids_size = NULL; | ||
114 | char *label; | 115 | char *label; |
115 | char *units; | 116 | char *units; |
116 | char *port; | 117 | char *port; |
@@ -120,19 +121,22 @@ int invert_search=0; | |||
120 | char **labels = NULL; | 121 | char **labels = NULL; |
121 | char **unitv = NULL; | 122 | char **unitv = NULL; |
122 | size_t nlabels = 0; | 123 | size_t nlabels = 0; |
123 | size_t labels_size = 8; | 124 | size_t labels_size = OID_COUNT_STEP; |
124 | size_t nunits = 0; | 125 | size_t nunits = 0; |
125 | size_t unitv_size = 8; | 126 | size_t unitv_size = OID_COUNT_STEP; |
126 | int numoids = 0; | 127 | int numoids = 0; |
127 | int numauthpriv = 0; | 128 | int numauthpriv = 0; |
128 | int verbose = 0; | 129 | int verbose = 0; |
129 | int usesnmpgetnext = FALSE; | 130 | int usesnmpgetnext = FALSE; |
130 | char *warning_thresholds = NULL; | 131 | char *warning_thresholds = NULL; |
131 | char *critical_thresholds = NULL; | 132 | char *critical_thresholds = NULL; |
132 | thresholds *thlds[MAX_OIDS]; | 133 | thresholds **thlds; |
133 | double response_value[MAX_OIDS]; | 134 | size_t thlds_size = OID_COUNT_STEP; |
135 | double *response_value; | ||
136 | size_t response_size = OID_COUNT_STEP; | ||
134 | int retries = 0; | 137 | int retries = 0; |
135 | int eval_method[MAX_OIDS]; | 138 | int *eval_method; |
139 | size_t eval_size = OID_COUNT_STEP; | ||
136 | char *delimiter; | 140 | char *delimiter; |
137 | char *output_delim; | 141 | char *output_delim; |
138 | char *miblist = NULL; | 142 | char *miblist = NULL; |
@@ -140,7 +144,8 @@ int needmibs = FALSE; | |||
140 | int calculate_rate = 0; | 144 | int calculate_rate = 0; |
141 | int rate_multiplier = 1; | 145 | int rate_multiplier = 1; |
142 | state_data *previous_state; | 146 | state_data *previous_state; |
143 | double previous_value[MAX_OIDS]; | 147 | double *previous_value; |
148 | size_t previous_size = OID_COUNT_STEP; | ||
144 | int perf_labels = 1; | 149 | int 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 | ||