diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/check_snmp.c | 82 | ||||
| -rw-r--r-- | plugins/common.h | 6 |
2 files changed, 64 insertions, 24 deletions
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c index d2f2f8b5..9ca845d7 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; | |||
| 112 | char *authpasswd = NULL; | 112 | char *authpasswd = NULL; |
| 113 | char *privpasswd = NULL; | 113 | char *privpasswd = NULL; |
| 114 | char **oids = NULL; | 114 | char **oids = NULL; |
| 115 | size_t oids_size = NULL; | ||
| 115 | char *label; | 116 | char *label; |
| 116 | char *units; | 117 | char *units; |
| 117 | char *port; | 118 | char *port; |
| @@ -121,19 +122,22 @@ int invert_search=0; | |||
| 121 | char **labels = NULL; | 122 | char **labels = NULL; |
| 122 | char **unitv = NULL; | 123 | char **unitv = NULL; |
| 123 | size_t nlabels = 0; | 124 | size_t nlabels = 0; |
| 124 | size_t labels_size = 8; | 125 | size_t labels_size = OID_COUNT_STEP; |
| 125 | size_t nunits = 0; | 126 | size_t nunits = 0; |
| 126 | size_t unitv_size = 8; | 127 | size_t unitv_size = OID_COUNT_STEP; |
| 127 | int numoids = 0; | 128 | int numoids = 0; |
| 128 | int numauthpriv = 0; | 129 | int numauthpriv = 0; |
| 129 | int verbose = 0; | 130 | int verbose = 0; |
| 130 | int usesnmpgetnext = FALSE; | 131 | int usesnmpgetnext = FALSE; |
| 131 | char *warning_thresholds = NULL; | 132 | char *warning_thresholds = NULL; |
| 132 | char *critical_thresholds = NULL; | 133 | char *critical_thresholds = NULL; |
| 133 | thresholds *thlds[MAX_OIDS]; | 134 | thresholds **thlds; |
| 134 | double response_value[MAX_OIDS]; | 135 | size_t thlds_size = OID_COUNT_STEP; |
| 136 | double *response_value; | ||
| 137 | size_t response_size = OID_COUNT_STEP; | ||
| 135 | int retries = 0; | 138 | int retries = 0; |
| 136 | int eval_method[MAX_OIDS]; | 139 | int *eval_method; |
| 140 | size_t eval_size = OID_COUNT_STEP; | ||
| 137 | char *delimiter; | 141 | char *delimiter; |
| 138 | char *output_delim; | 142 | char *output_delim; |
| 139 | char *miblist = NULL; | 143 | char *miblist = NULL; |
| @@ -142,7 +146,8 @@ int calculate_rate = 0; | |||
| 142 | double offset = 0.0; | 146 | double offset = 0.0; |
| 143 | int rate_multiplier = 1; | 147 | int rate_multiplier = 1; |
| 144 | state_data *previous_state; | 148 | state_data *previous_state; |
| 145 | double previous_value[MAX_OIDS]; | 149 | double *previous_value; |
| 150 | size_t previous_size = OID_COUNT_STEP; | ||
| 146 | int perf_labels = 1; | 151 | int perf_labels = 1; |
| 147 | 152 | ||
| 148 | 153 | ||
| @@ -206,8 +211,11 @@ main (int argc, char **argv) | |||
| 206 | 211 | ||
| 207 | labels = malloc (labels_size * sizeof(*labels)); | 212 | labels = malloc (labels_size * sizeof(*labels)); |
| 208 | unitv = malloc (unitv_size * sizeof(*unitv)); | 213 | unitv = malloc (unitv_size * sizeof(*unitv)); |
| 209 | for (i = 0; i < MAX_OIDS; i++) | 214 | thlds = malloc (thlds_size * sizeof(*thlds)); |
| 210 | 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 *)); | ||
| 211 | 219 | ||
| 212 | label = strdup ("SNMP"); | 220 | label = strdup ("SNMP"); |
| 213 | units = strdup (""); | 221 | units = strdup (""); |
| @@ -225,13 +233,14 @@ main (int argc, char **argv) | |||
| 225 | 233 | ||
| 226 | np_set_args(argc, argv); | 234 | np_set_args(argc, argv); |
| 227 | 235 | ||
| 236 | time(¤t_time); | ||
| 237 | |||
| 228 | if (process_arguments (argc, argv) == ERROR) | 238 | if (process_arguments (argc, argv) == ERROR) |
| 229 | usage4 (_("Could not parse arguments")); | 239 | usage4 (_("Could not parse arguments")); |
| 230 | 240 | ||
| 231 | if(calculate_rate) { | 241 | if(calculate_rate) { |
| 232 | if (!strcmp(label, "SNMP")) | 242 | if (!strcmp(label, "SNMP")) |
| 233 | label = strdup("SNMP RATE"); | 243 | label = strdup("SNMP RATE"); |
| 234 | time(¤t_time); | ||
| 235 | i=0; | 244 | i=0; |
| 236 | previous_state = np_state_read(); | 245 | previous_state = np_state_read(); |
| 237 | if(previous_state!=NULL) { | 246 | if(previous_state!=NULL) { |
| @@ -240,6 +249,10 @@ main (int argc, char **argv) | |||
| 240 | while((ap = strsep(&previous_string, ":")) != NULL) { | 249 | while((ap = strsep(&previous_string, ":")) != NULL) { |
| 241 | if(verbose>2) | 250 | if(verbose>2) |
| 242 | 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 | } | ||
| 243 | previous_value[i++]=strtod(ap,NULL); | 256 | previous_value[i++]=strtod(ap,NULL); |
| 244 | } | 257 | } |
| 245 | } | 258 | } |
| @@ -255,6 +268,11 @@ main (int argc, char **argv) | |||
| 255 | w = w ? fix_snmp_range(w) : NULL; | 268 | w = w ? fix_snmp_range(w) : NULL; |
| 256 | c = c ? fix_snmp_range(c) : NULL; | 269 | c = c ? fix_snmp_range(c) : NULL; |
| 257 | 270 | ||
| 271 | while (i >= thlds_size) { | ||
| 272 | thlds_size += OID_COUNT_STEP; | ||
| 273 | thlds = realloc(thlds, thlds_size * sizeof(*thlds)); | ||
| 274 | } | ||
| 275 | |||
| 258 | /* Skip empty thresholds, while avoiding segfault */ | 276 | /* Skip empty thresholds, while avoiding segfault */ |
| 259 | set_thresholds(&thlds[i], | 277 | set_thresholds(&thlds[i], |
| 260 | w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL, | 278 | w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL, |
| @@ -434,6 +452,10 @@ main (int argc, char **argv) | |||
| 434 | ptr = strpbrk (show, "0123456789"); | 452 | ptr = strpbrk (show, "0123456789"); |
| 435 | if (ptr == NULL) | 453 | if (ptr == NULL) |
| 436 | 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 | } | ||
| 437 | response_value[i] = strtod (ptr, NULL) + offset; | 459 | response_value[i] = strtod (ptr, NULL) + offset; |
| 438 | 460 | ||
| 439 | if(calculate_rate) { | 461 | if(calculate_rate) { |
| @@ -461,7 +483,7 @@ main (int argc, char **argv) | |||
| 461 | } | 483 | } |
| 462 | 484 | ||
| 463 | /* Process this block for string matching */ | 485 | /* Process this block for string matching */ |
| 464 | else if (eval_method[i] & CRIT_STRING) { | 486 | else if (eval_size > i && eval_method[i] & CRIT_STRING) { |
| 465 | if (strcmp (show, string_value)) | 487 | if (strcmp (show, string_value)) |
| 466 | iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK; | 488 | iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK; |
| 467 | else | 489 | else |
| @@ -469,7 +491,7 @@ main (int argc, char **argv) | |||
| 469 | } | 491 | } |
| 470 | 492 | ||
| 471 | /* Process this block for regex matching */ | 493 | /* Process this block for regex matching */ |
| 472 | else if (eval_method[i] & CRIT_REGEX) { | 494 | else if (eval_size > i && eval_method[i] & CRIT_REGEX) { |
| 473 | excode = regexec (&preg, response, 10, pmatch, eflags); | 495 | excode = regexec (&preg, response, 10, pmatch, eflags); |
| 474 | if (excode == 0) { | 496 | if (excode == 0) { |
| 475 | iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL; | 497 | iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL; |
| @@ -487,9 +509,9 @@ main (int argc, char **argv) | |||
| 487 | /* Process this block for existence-nonexistence checks */ | 509 | /* Process this block for existence-nonexistence checks */ |
| 488 | /* TV: Should this be outside of this else block? */ | 510 | /* TV: Should this be outside of this else block? */ |
| 489 | else { | 511 | else { |
| 490 | if (eval_method[i] & CRIT_PRESENT) | 512 | if (eval_size > i && eval_method[i] & CRIT_PRESENT) |
| 491 | iresult = STATE_CRITICAL; | 513 | iresult = STATE_CRITICAL; |
| 492 | else if (eval_method[i] & WARN_PRESENT) | 514 | else if (eval_size > i && eval_method[i] & WARN_PRESENT) |
| 493 | iresult = STATE_WARNING; | 515 | iresult = STATE_WARNING; |
| 494 | else if (response && iresult == STATE_DEPENDENT) | 516 | else if (response && iresult == STATE_DEPENDENT) |
| 495 | iresult = STATE_OK; | 517 | iresult = STATE_OK; |
| @@ -729,23 +751,36 @@ process_arguments (int argc, char **argv) | |||
| 729 | */ | 751 | */ |
| 730 | needmibs = TRUE; | 752 | needmibs = TRUE; |
| 731 | } | 753 | } |
| 732 | if (!oids) oids = calloc(MAX_OIDS, sizeof (char *)); | 754 | for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", "), j++) { |
| 733 | 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 | } | ||
| 734 | oids[j] = strdup(ptr); | 759 | oids[j] = strdup(ptr); |
| 735 | } | 760 | } |
| 736 | numoids = j; | 761 | numoids = j; |
| 737 | if (c == 'E' || c == 'e') { | 762 | if (c == 'E' || c == 'e') { |
| 738 | jj++; | 763 | jj++; |
| 739 | 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; | ||
| 740 | } | 774 | } |
| 741 | if (c == 'E') | ||
| 742 | eval_method[j+1] |= WARN_PRESENT; | ||
| 743 | else if (c == 'e') | ||
| 744 | eval_method[j+1] |= CRIT_PRESENT; | ||
| 745 | break; | 775 | break; |
| 746 | case 's': /* string or substring */ | 776 | case 's': /* string or substring */ |
| 747 | strncpy (string_value, optarg, sizeof (string_value) - 1); | 777 | strncpy (string_value, optarg, sizeof (string_value) - 1); |
| 748 | 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 | } | ||
| 749 | eval_method[jj++] = CRIT_STRING; | 784 | eval_method[jj++] = CRIT_STRING; |
| 750 | ii++; | 785 | ii++; |
| 751 | break; | 786 | break; |
| @@ -761,6 +796,11 @@ process_arguments (int argc, char **argv) | |||
| 761 | printf (_("Could Not Compile Regular Expression")); | 796 | printf (_("Could Not Compile Regular Expression")); |
| 762 | return ERROR; | 797 | return ERROR; |
| 763 | } | 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 | } | ||
| 764 | eval_method[jj++] = CRIT_REGEX; | 804 | eval_method[jj++] = CRIT_REGEX; |
| 765 | ii++; | 805 | ii++; |
| 766 | break; | 806 | break; |
| @@ -1127,7 +1167,7 @@ print_help (void) | |||
| 1127 | printf ("\n"); | 1167 | printf ("\n"); |
| 1128 | printf ("%s\n", _("Notes:")); | 1168 | printf ("%s\n", _("Notes:")); |
| 1129 | 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 ")); |
| 1130 | printf (" %s %i %s\n", _("list (lists with internal spaces must be quoted). Maximum:"), MAX_OIDS, _("OIDs.")); | 1170 | printf (" %s %i %s\n", _("list (lists with internal spaces must be quoted).")); |
| 1131 | 1171 | ||
| 1132 | printf(" -%s", UT_THRESHOLDS_NOTES); | 1172 | printf(" -%s", UT_THRESHOLDS_NOTES); |
| 1133 | 1173 | ||
diff --git a/plugins/common.h b/plugins/common.h index f1358380..b49ad945 100644 --- a/plugins/common.h +++ b/plugins/common.h | |||
| @@ -208,9 +208,9 @@ enum { | |||
| 208 | # define bindtextdomain(Domainname, Dirname) /* empty */ | 208 | # define bindtextdomain(Domainname, Dirname) /* empty */ |
| 209 | #endif | 209 | #endif |
| 210 | 210 | ||
| 211 | /* For non-GNU compilers to ignore __attribute__ */ | 211 | /* For non-GNU/non-clang compilers to ignore __attribute__ */ |
| 212 | #ifndef __GNUC__ | 212 | #if !defined(__GNUC__) && !defined(__CLANG__) |
| 213 | # define __attribute__(x) /* do nothing */ | 213 | # define __attribute__(noreturn) /* do nothing */ |
| 214 | #endif | 214 | #endif |
| 215 | 215 | ||
| 216 | #endif /* _COMMON_H_ */ | 216 | #endif /* _COMMON_H_ */ |
