diff options
| author | Sebastian Harl <sh@teamix.net> | 2011-04-08 10:18:48 +0200 |
|---|---|---|
| committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2012-11-14 20:45:44 +0100 |
| commit | 2bac48c02742dba92fc09d60fc211f60f10e9223 (patch) | |
| tree | fee4e56cf35cd5b15987111c303169314237596c /plugins | |
| parent | 217a6a7643867ad949c25b5e8ca2d1839ec28133 (diff) | |
| download | monitoring-plugins-2bac48c02742dba92fc09d60fc211f60f10e9223.tar.gz | |
check_procs: Use the range/threshold support functions from libnagiosplug.
This adds support for @<range> and makes stuff a bit simpler by removing code
duplications.
Note: Previously, the compatibility code for 'check_procs <warn> <max>'
accepted something like 'check_procs -w 10:-1 -c 10:-1 20 50' as well
(treating it as if '-w 10:20 -c 10:50' was specified). This is no longer the
case ... additional arguments are only used as warn/crit thresholds in case
-w/-c is not specified at all.
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/check_procs.c | 106 |
1 files changed, 17 insertions, 89 deletions
diff --git a/plugins/check_procs.c b/plugins/check_procs.c index 2f2dcc58..23fdc27a 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c | |||
| @@ -45,15 +45,13 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
| 45 | 45 | ||
| 46 | int process_arguments (int, char **); | 46 | int process_arguments (int, char **); |
| 47 | int validate_arguments (void); | 47 | int validate_arguments (void); |
| 48 | int check_thresholds (int); | ||
| 49 | int convert_to_seconds (char *); | 48 | int convert_to_seconds (char *); |
| 50 | void print_help (void); | 49 | void print_help (void); |
| 51 | void print_usage (void); | 50 | void print_usage (void); |
| 52 | 51 | ||
| 53 | int wmax = -1; | 52 | char *warning_range = NULL; |
| 54 | int cmax = -1; | 53 | char *critical_range = NULL; |
| 55 | int wmin = -1; | 54 | thresholds *procs_thresholds = NULL; |
| 56 | int cmin = -1; | ||
| 57 | 55 | ||
| 58 | int options = 0; /* bitmask of filter criteria to test against */ | 56 | int options = 0; /* bitmask of filter criteria to test against */ |
| 59 | #define ALL 1 | 57 | #define ALL 1 |
| @@ -238,14 +236,14 @@ main (int argc, char **argv) | |||
| 238 | } | 236 | } |
| 239 | 237 | ||
| 240 | if (metric == METRIC_VSZ) | 238 | if (metric == METRIC_VSZ) |
| 241 | i = check_thresholds (procvsz); | 239 | i = get_status ((double)procvsz, procs_thresholds); |
| 242 | else if (metric == METRIC_RSS) | 240 | else if (metric == METRIC_RSS) |
| 243 | i = check_thresholds (procrss); | 241 | i = get_status ((double)procrss, procs_thresholds); |
| 244 | /* TODO? float thresholds for --metric=CPU */ | 242 | /* TODO? float thresholds for --metric=CPU */ |
| 245 | else if (metric == METRIC_CPU) | 243 | else if (metric == METRIC_CPU) |
| 246 | i = check_thresholds ((int)procpcpu); | 244 | i = get_status (procpcpu, procs_thresholds); |
| 247 | else if (metric == METRIC_ELAPSED) | 245 | else if (metric == METRIC_ELAPSED) |
| 248 | i = check_thresholds (procseconds); | 246 | i = get_status ((double)procseconds, procs_thresholds); |
| 249 | 247 | ||
| 250 | if (metric != METRIC_PROCS) { | 248 | if (metric != METRIC_PROCS) { |
| 251 | if (i == STATE_WARNING) { | 249 | if (i == STATE_WARNING) { |
| @@ -276,7 +274,7 @@ main (int argc, char **argv) | |||
| 276 | 274 | ||
| 277 | /* Needed if procs found, but none match filter */ | 275 | /* Needed if procs found, but none match filter */ |
| 278 | if ( metric == METRIC_PROCS ) { | 276 | if ( metric == METRIC_PROCS ) { |
| 279 | result = max_state (result, check_thresholds (procs) ); | 277 | result = max_state (result, get_status ((double)procs, procs_thresholds) ); |
| 280 | } | 278 | } |
| 281 | 279 | ||
| 282 | if ( result == STATE_OK ) { | 280 | if ( result == STATE_OK ) { |
| @@ -368,28 +366,10 @@ process_arguments (int argc, char **argv) | |||
| 368 | timeout_interval = atoi (optarg); | 366 | timeout_interval = atoi (optarg); |
| 369 | break; | 367 | break; |
| 370 | case 'c': /* critical threshold */ | 368 | case 'c': /* critical threshold */ |
| 371 | if (is_integer (optarg)) | 369 | critical_range = optarg; |
| 372 | cmax = atoi (optarg); | ||
| 373 | else if (sscanf (optarg, ":%d", &cmax) == 1) | ||
| 374 | break; | ||
| 375 | else if (sscanf (optarg, "%d:%d", &cmin, &cmax) == 2) | ||
| 376 | break; | ||
| 377 | else if (sscanf (optarg, "%d:", &cmin) == 1) | ||
| 378 | break; | ||
| 379 | else | ||
| 380 | usage4 (_("Critical Process Count must be an integer!")); | ||
| 381 | break; | 370 | break; |
| 382 | case 'w': /* warning threshold */ | 371 | case 'w': /* warning threshold */ |
| 383 | if (is_integer (optarg)) | 372 | warning_range = optarg; |
| 384 | wmax = atoi (optarg); | ||
| 385 | else if (sscanf (optarg, ":%d", &wmax) == 1) | ||
| 386 | break; | ||
| 387 | else if (sscanf (optarg, "%d:%d", &wmin, &wmax) == 2) | ||
| 388 | break; | ||
| 389 | else if (sscanf (optarg, "%d:", &wmin) == 1) | ||
| 390 | break; | ||
| 391 | else | ||
| 392 | usage4 (_("Warning Process Count must be an integer!")); | ||
| 393 | break; | 373 | break; |
| 394 | case 'p': /* process id */ | 374 | case 'p': /* process id */ |
| 395 | if (sscanf (optarg, "%d%[^0-9]", &ppid, tmp) == 1) { | 375 | if (sscanf (optarg, "%d%[^0-9]", &ppid, tmp) == 1) { |
| @@ -518,16 +498,19 @@ process_arguments (int argc, char **argv) | |||
| 518 | } | 498 | } |
| 519 | 499 | ||
| 520 | c = optind; | 500 | c = optind; |
| 521 | if (wmax == -1 && argv[c]) | 501 | if ((! warning_range) && argv[c]) |
| 522 | wmax = atoi (argv[c++]); | 502 | warning_range = argv[c++]; |
| 523 | if (cmax == -1 && argv[c]) | 503 | if ((! critical_range) && argv[c]) |
| 524 | cmax = atoi (argv[c++]); | 504 | critical_range = argv[c++]; |
| 525 | if (statopts == NULL && argv[c]) { | 505 | if (statopts == NULL && argv[c]) { |
| 526 | xasprintf (&statopts, "%s", argv[c++]); | 506 | xasprintf (&statopts, "%s", argv[c++]); |
| 527 | xasprintf (&fmt, _("%s%sSTATE = %s"), (fmt ? fmt : ""), (options ? ", " : ""), statopts); | 507 | xasprintf (&fmt, _("%s%sSTATE = %s"), (fmt ? fmt : ""), (options ? ", " : ""), statopts); |
| 528 | options |= STAT; | 508 | options |= STAT; |
| 529 | } | 509 | } |
| 530 | 510 | ||
| 511 | /* this will abort in case of invalid ranges */ | ||
| 512 | set_thresholds (&procs_thresholds, warning_range, critical_range); | ||
| 513 | |||
| 531 | return validate_arguments (); | 514 | return validate_arguments (); |
| 532 | } | 515 | } |
| 533 | 516 | ||
| @@ -536,27 +519,6 @@ process_arguments (int argc, char **argv) | |||
| 536 | int | 519 | int |
| 537 | validate_arguments () | 520 | validate_arguments () |
| 538 | { | 521 | { |
| 539 | |||
| 540 | if (wmax >= 0 && wmin == -1) | ||
| 541 | wmin = 0; | ||
| 542 | if (cmax >= 0 && cmin == -1) | ||
| 543 | cmin = 0; | ||
| 544 | if (wmax >= wmin && cmax >= cmin) { /* standard ranges */ | ||
| 545 | if (wmax > cmax && cmax != -1) { | ||
| 546 | printf (_("wmax (%d) cannot be greater than cmax (%d)\n"), wmax, cmax); | ||
| 547 | return ERROR; | ||
| 548 | } | ||
| 549 | if (cmin > wmin && wmin != -1) { | ||
| 550 | printf (_("wmin (%d) cannot be less than cmin (%d)\n"), wmin, cmin); | ||
| 551 | return ERROR; | ||
| 552 | } | ||
| 553 | } | ||
| 554 | |||
| 555 | /* if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) { */ | ||
| 556 | /* printf ("At least one threshold must be set\n"); */ | ||
| 557 | /* return ERROR; */ | ||
| 558 | /* } */ | ||
| 559 | |||
| 560 | if (options == 0) | 522 | if (options == 0) |
| 561 | options = ALL; | 523 | options = ALL; |
| 562 | 524 | ||
| @@ -579,40 +541,6 @@ validate_arguments () | |||
| 579 | } | 541 | } |
| 580 | 542 | ||
| 581 | 543 | ||
| 582 | |||
| 583 | /* Check thresholds against value */ | ||
| 584 | int | ||
| 585 | check_thresholds (int value) | ||
| 586 | { | ||
| 587 | if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) { | ||
| 588 | return OK; | ||
| 589 | } | ||
| 590 | else if (cmax >= 0 && cmin >= 0 && cmax < cmin) { | ||
| 591 | if (value > cmax && value < cmin) | ||
| 592 | return STATE_CRITICAL; | ||
| 593 | } | ||
| 594 | else if (cmax >= 0 && value > cmax) { | ||
| 595 | return STATE_CRITICAL; | ||
| 596 | } | ||
| 597 | else if (cmin >= 0 && value < cmin) { | ||
| 598 | return STATE_CRITICAL; | ||
| 599 | } | ||
| 600 | |||
| 601 | if (wmax >= 0 && wmin >= 0 && wmax < wmin) { | ||
| 602 | if (value > wmax && value < wmin) { | ||
| 603 | return STATE_WARNING; | ||
| 604 | } | ||
| 605 | } | ||
| 606 | else if (wmax >= 0 && value > wmax) { | ||
| 607 | return STATE_WARNING; | ||
| 608 | } | ||
| 609 | else if (wmin >= 0 && value < wmin) { | ||
| 610 | return STATE_WARNING; | ||
| 611 | } | ||
| 612 | return STATE_OK; | ||
| 613 | } | ||
| 614 | |||
| 615 | |||
| 616 | /* convert the elapsed time to seconds */ | 544 | /* convert the elapsed time to seconds */ |
| 617 | int | 545 | int |
| 618 | convert_to_seconds(char *etime) { | 546 | convert_to_seconds(char *etime) { |
