diff options
| author | Karl DeBisschop <kdebisschop@users.sourceforge.net> | 2003-08-07 12:36:45 +0000 |
|---|---|---|
| committer | Karl DeBisschop <kdebisschop@users.sourceforge.net> | 2003-08-07 12:36:45 +0000 |
| commit | 575e82a500d1b097b70883a8e50f4b92451d8270 (patch) | |
| tree | bfe988caa42f23c90553a58df228d66bacc33b8b /plugins | |
| parent | f71130aedcbc3fcb1345d58a1cb615497a1af096 (diff) | |
| download | monitoring-plugins-575e82a500d1b097b70883a8e50f4b92451d8270.tar.gz | |
markup for translation
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@659 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/check_procs.c | 366 |
1 files changed, 191 insertions, 175 deletions
diff --git a/plugins/check_procs.c b/plugins/check_procs.c index ccf0891d..1b641c55 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c | |||
| @@ -1,114 +1,36 @@ | |||
| 1 | /****************************************************************************** | 1 | /****************************************************************************** |
| 2 | * | ||
| 3 | * CHECK_PROCS.C | ||
| 4 | * | ||
| 5 | * Program: Process plugin for Nagios | ||
| 6 | * License: GPL | ||
| 7 | * Copyright (c) 1999 Ethan Galstad (nagios@nagios.org) | ||
| 8 | * | ||
| 9 | * $Id$ | ||
| 10 | * | ||
| 11 | * Description: | ||
| 12 | * | ||
| 13 | * This plugin checks the number of currently running processes and | ||
| 14 | * generates WARNING or CRITICAL states if the process count is outside | ||
| 15 | * the specified threshold ranges. The process count can be filtered by | ||
| 16 | * process owner, parent process PID, current state (e.g., 'Z'), or may | ||
| 17 | * be the total number of running processes | ||
| 18 | * | ||
| 19 | * License Information: | ||
| 20 | * | ||
| 21 | * This program is free software; you can redistribute it and/or modify | ||
| 22 | * it under the terms of the GNU General Public License as published by | ||
| 23 | * the Free Software Foundation; either version 2 of the License, or | ||
| 24 | * (at your option) any later version. | ||
| 25 | * | ||
| 26 | * This program is distributed in the hope that it will be useful, but | ||
| 27 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 28 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 29 | * General Public License for more details. | ||
| 30 | * | ||
| 31 | * You should have received a copy of the GNU General Public License | ||
| 32 | * along with this program; if not, write to the Free Software | ||
| 33 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 34 | * | ||
| 35 | ******************************************************************************/ | ||
| 36 | 2 | ||
| 37 | const char *progname = "check_procs"; | 3 | This program is free software; you can redistribute it and/or modify |
| 38 | #define REVISION "$Revision$" | 4 | it under the terms of the GNU General Public License as published by |
| 39 | #define COPYRIGHT "1999-2002" | 5 | the Free Software Foundation; either version 2 of the License, or |
| 40 | #define AUTHOR "Ethan Galstad" | 6 | (at your option) any later version. |
| 41 | #define EMAIL "nagios@nagios.org" | ||
| 42 | #define SUMMARY "\ | ||
| 43 | Checks all processes and generates WARNING or CRITICAL states if the specified\n\ | ||
| 44 | metric is outside the required threshold ranges. The metric defaults to number\n\ | ||
| 45 | of processes. Search filters can be applied to limit the processes to check.\n" | ||
| 46 | 7 | ||
| 47 | #define OPTIONS "\ | 8 | This program is distributed in the hope that it will be useful, |
| 48 | -w <range> -c <range> [-m metric]\n\ | 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 49 | [-s state] [-p ppid] [-u user] [-r rss] [-z vsz] [-P %cpu]\n\ | 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 50 | [-a argument-array] [-C command] [-v]" | 11 | GNU General Public License for more details. |
| 51 | 12 | ||
| 52 | #define LONGOPTIONS "\ | 13 | You should have received a copy of the GNU General Public License |
| 53 | Required Arguments:\n\ | 14 | along with this program; if not, write to the Free Software |
| 54 | -w, --warning=RANGE\n\ | 15 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 55 | Generate warning state if metric is outside this range\n\ | ||
| 56 | -c, --critical=RANGE\n\ | ||
| 57 | Generate critical state if metric is outside this range\n\ | ||
| 58 | Optional Arguments:\n\ | ||
| 59 | -m, --metric=TYPE\n\ | ||
| 60 | Check thresholds against metric. Valid types:\n\ | ||
| 61 | PROCS - number of processes (default)\n\ | ||
| 62 | VSZ - virtual memory size\n\ | ||
| 63 | RSS - resident set memory size\n\ | ||
| 64 | CPU - percentage cpu\n\ | ||
| 65 | -v, --verbose\n\ | ||
| 66 | Extra information. Up to 3 verbosity levels\n\ | ||
| 67 | Optional Filters:\n\ | ||
| 68 | -s, --state=STATUSFLAGS\n\ | ||
| 69 | Only scan for processes that have, in the output of `ps`, one or\n\ | ||
| 70 | more of the status flags you specify (for example R, Z, S, RS,\n\ | ||
| 71 | RSZDT, plus others based on the output of your 'ps' command).\n\ | ||
| 72 | -p, --ppid=PPID\n\ | ||
| 73 | Only scan for children of the parent process ID indicated.\n\ | ||
| 74 | -z, --vsz=VSZ\n\ | ||
| 75 | Only scan for processes with vsz higher than indicated.\n\ | ||
| 76 | -r, --rss=RSS\n\ | ||
| 77 | Only scan for processes with rss higher than indicated.\n\ | ||
| 78 | -P, --pcpu=PCPU\n\ | ||
| 79 | Only scan for processes with pcpu higher than indicated.\n\ | ||
| 80 | -u, --user=USER\n\ | ||
| 81 | Only scan for processes with user name or ID indicated.\n\ | ||
| 82 | -a, --argument-array=STRING\n\ | ||
| 83 | Only scan for processes with args that contain STRING.\n\ | ||
| 84 | -C, --command=COMMAND\n\ | ||
| 85 | Only scan for exact matches to the named COMMAND.\n\ | ||
| 86 | \n\ | ||
| 87 | RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\ | ||
| 88 | specified 'max:min', a warning status will be generated if the\n\ | ||
| 89 | count is inside the specified range\n" | ||
| 90 | 16 | ||
| 91 | #define EXAMPLES "\ | 17 | ******************************************************************************/ |
| 92 | check_procs -w 2:2 -c 2:1024 -C portsentry\n\ | 18 | |
| 93 | Warning if not two processes with command name portsentry. Critical\n\ | 19 | const char *progname = "check_procs"; |
| 94 | if < 2 or > 1024 processes\n\ | 20 | const char *revision = "$Revision$"; |
| 95 | check_procs -w 10 -a '/usr/local/bin/perl' -u root\n\ | 21 | const char *copyright = "2000-2003"; |
| 96 | Warning alert if > 10 processes with command arguments containing \n\ | 22 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
| 97 | '/usr/local/bin/perl' and owned by root\n\ | ||
| 98 | check_procs -w 50000 -c 100000 --metric=VSZ\n\ | ||
| 99 | Alert if vsz of any processes over 50K or 100K\n" | ||
| 100 | 23 | ||
| 101 | #include "config.h" | ||
| 102 | #include <pwd.h> | ||
| 103 | #include "common.h" | 24 | #include "common.h" |
| 104 | #include "popen.h" | 25 | #include "popen.h" |
| 105 | #include "utils.h" | 26 | #include "utils.h" |
| 27 | #include <pwd.h> | ||
| 106 | 28 | ||
| 107 | int process_arguments (int, char **); | 29 | int process_arguments (int, char **); |
| 108 | int validate_arguments (void); | 30 | int validate_arguments (void); |
| 109 | void print_usage (void); | ||
| 110 | void print_help (void); | ||
| 111 | int check_thresholds (int); | 31 | int check_thresholds (int); |
| 32 | void print_help (void); | ||
| 33 | void print_usage (void); | ||
| 112 | 34 | ||
| 113 | int wmax = -1; | 35 | int wmax = -1; |
| 114 | int cmax = -1; | 36 | int cmax = -1; |
| @@ -147,6 +69,11 @@ char *fmt = ""; | |||
| 147 | char *fails = ""; | 69 | char *fails = ""; |
| 148 | char tmp[MAX_INPUT_BUFFER]; | 70 | char tmp[MAX_INPUT_BUFFER]; |
| 149 | 71 | ||
| 72 | |||
| 73 | |||
| 74 | |||
| 75 | |||
| 76 | |||
| 150 | int | 77 | int |
| 151 | main (int argc, char **argv) | 78 | main (int argc, char **argv) |
| 152 | { | 79 | { |
| @@ -170,7 +97,7 @@ main (int argc, char **argv) | |||
| 170 | int cols; /* number of columns in ps output */ | 97 | int cols; /* number of columns in ps output */ |
| 171 | int warn = 0; /* number of processes in warn state */ | 98 | int warn = 0; /* number of processes in warn state */ |
| 172 | int crit = 0; /* number of processes in crit state */ | 99 | int crit = 0; /* number of processes in crit state */ |
| 173 | int i; | 100 | int i = 0; |
| 174 | 101 | ||
| 175 | int result = STATE_UNKNOWN; | 102 | int result = STATE_UNKNOWN; |
| 176 | 103 | ||
| @@ -178,26 +105,26 @@ main (int argc, char **argv) | |||
| 178 | metric = METRIC_PROCS; | 105 | metric = METRIC_PROCS; |
| 179 | 106 | ||
| 180 | if (process_arguments (argc, argv) == ERROR) | 107 | if (process_arguments (argc, argv) == ERROR) |
| 181 | usage ("Unable to parse command line\n"); | 108 | usage (_("Unable to parse command line\n")); |
| 182 | 109 | ||
| 183 | if (verbose >= 2) | 110 | if (verbose >= 2) |
| 184 | printf ("CMD: %s\n", PS_COMMAND); | 111 | printf (_("CMD: %s\n"), PS_COMMAND); |
| 185 | 112 | ||
| 186 | child_process = spopen (PS_COMMAND); | 113 | child_process = spopen (PS_COMMAND); |
| 187 | if (child_process == NULL) { | 114 | if (child_process == NULL) { |
| 188 | printf ("Could not open pipe: %s\n", PS_COMMAND); | 115 | printf (_("Could not open pipe: %s\n"), PS_COMMAND); |
| 189 | return STATE_UNKNOWN; | 116 | return STATE_UNKNOWN; |
| 190 | } | 117 | } |
| 191 | 118 | ||
| 192 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); | 119 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); |
| 193 | if (child_stderr == NULL) | 120 | if (child_stderr == NULL) |
| 194 | printf ("Could not open stderr for %s\n", PS_COMMAND); | 121 | printf (_("Could not open stderr for %s\n"), PS_COMMAND); |
| 195 | 122 | ||
| 196 | fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process); | 123 | fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process); |
| 197 | 124 | ||
| 198 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | 125 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { |
| 199 | strcpy(procprog,""); | 126 | strcpy (procprog, ""); |
| 200 | asprintf(&procargs,""); | 127 | asprintf (&procargs, "%s", ""); |
| 201 | 128 | ||
| 202 | cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST); | 129 | cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST); |
| 203 | 130 | ||
| @@ -270,28 +197,28 @@ main (int argc, char **argv) | |||
| 270 | } | 197 | } |
| 271 | /* This should not happen */ | 198 | /* This should not happen */ |
| 272 | else if (verbose) { | 199 | else if (verbose) { |
| 273 | printf("Not parseable: %s", input_buffer); | 200 | printf(_("Not parseable: %s"), input_buffer); |
| 274 | } | 201 | } |
| 275 | } | 202 | } |
| 276 | 203 | ||
| 277 | /* If we get anything on STDERR, at least set warning */ | 204 | /* If we get anything on STDERR, at least set warning */ |
| 278 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { | 205 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { |
| 279 | if (verbose) | 206 | if (verbose) |
| 280 | printf ("STDERR: %s", input_buffer); | 207 | printf (_("STDERR: %s"), input_buffer); |
| 281 | result = max_state (result, STATE_WARNING); | 208 | result = max_state (result, STATE_WARNING); |
| 282 | printf ("System call sent warnings to stderr\n"); | 209 | printf (_("System call sent warnings to stderr\n")); |
| 283 | } | 210 | } |
| 284 | 211 | ||
| 285 | (void) fclose (child_stderr); | 212 | (void) fclose (child_stderr); |
| 286 | 213 | ||
| 287 | /* close the pipe */ | 214 | /* close the pipe */ |
| 288 | if (spclose (child_process)) { | 215 | if (spclose (child_process)) { |
| 289 | printf ("System call returned nonzero status\n"); | 216 | printf (_("System call returned nonzero status\n")); |
| 290 | result = max_state (result, STATE_WARNING); | 217 | result = max_state (result, STATE_WARNING); |
| 291 | } | 218 | } |
| 292 | 219 | ||
| 293 | if (found == 0) { /* no process lines parsed so return STATE_UNKNOWN */ | 220 | if (found == 0) { /* no process lines parsed so return STATE_UNKNOWN */ |
| 294 | printf ("Unable to read output\n"); | 221 | printf (_("Unable to read output\n")); |
| 295 | return result; | 222 | return result; |
| 296 | } | 223 | } |
| 297 | 224 | ||
| @@ -304,23 +231,23 @@ main (int argc, char **argv) | |||
| 304 | } | 231 | } |
| 305 | 232 | ||
| 306 | if ( result == STATE_OK ) { | 233 | if ( result == STATE_OK ) { |
| 307 | printf ("%s OK: %d process%s", | 234 | printf (_("%s OK: %d process%s"), |
| 308 | metric_name, procs, ( procs != 1 ? "es" : "") ); | 235 | metric_name, procs, ( procs != 1 ? "es" : "") ); |
| 309 | } else if (result == STATE_WARNING) { | 236 | } else if (result == STATE_WARNING) { |
| 310 | if ( metric == METRIC_PROCS ) { | 237 | if ( metric == METRIC_PROCS ) { |
| 311 | printf ("PROCS WARNING: %d process%s", procs, | 238 | printf (_("PROCS WARNING: %d process%s"), procs, |
| 312 | ( procs != 1 ? "es" : "")); | 239 | ( procs != 1 ? "es" : "")); |
| 313 | } else { | 240 | } else { |
| 314 | printf ("%s WARNING: %d warn out of %d process%s", | 241 | printf (_("%s WARNING: %d warn out of %d process%s"), |
| 315 | metric_name, warn, procs, | 242 | metric_name, warn, procs, |
| 316 | ( procs != 1 ? "es" : "")); | 243 | ( procs != 1 ? "es" : "")); |
| 317 | } | 244 | } |
| 318 | } else if (result == STATE_CRITICAL) { | 245 | } else if (result == STATE_CRITICAL) { |
| 319 | if (metric == METRIC_PROCS) { | 246 | if (metric == METRIC_PROCS) { |
| 320 | printf ("PROCS CRITICAL: %d process%s", procs, | 247 | printf (_("PROCS CRITICAL: %d process%s"), procs, |
| 321 | ( procs != 1 ? "es" : "")); | 248 | ( procs != 1 ? "es" : "")); |
| 322 | } else { | 249 | } else { |
| 323 | printf ("%s CRITICAL: %d crit, %d warn out of %d process%s", | 250 | printf (_("%s CRITICAL: %d crit, %d warn out of %d process%s"), |
| 324 | metric_name, crit, warn, procs, | 251 | metric_name, crit, warn, procs, |
| 325 | ( procs != 1 ? "es" : "")); | 252 | ( procs != 1 ? "es" : "")); |
| 326 | } | 253 | } |
| @@ -337,38 +264,11 @@ main (int argc, char **argv) | |||
| 337 | return result; | 264 | return result; |
| 338 | } | 265 | } |
| 339 | 266 | ||
| 340 | /* Check thresholds against value */ | ||
| 341 | int | ||
| 342 | check_thresholds (int value) | ||
| 343 | { | ||
| 344 | if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) { | ||
| 345 | return OK; | ||
| 346 | } | ||
| 347 | else if (cmax >= 0 && cmin >= 0 && cmax < cmin) { | ||
| 348 | if (value > cmax && value < cmin) | ||
| 349 | return STATE_CRITICAL; | ||
| 350 | } | ||
| 351 | else if (cmax >= 0 && value > cmax) { | ||
| 352 | return STATE_CRITICAL; | ||
| 353 | } | ||
| 354 | else if (cmin >= 0 && value < cmin) { | ||
| 355 | return STATE_CRITICAL; | ||
| 356 | } | ||
| 357 | 267 | ||
| 358 | if (wmax >= 0 && wmin >= 0 && wmax < wmin) { | ||
| 359 | if (value > wmax && value < wmin) { | ||
| 360 | return STATE_WARNING; | ||
| 361 | } | ||
| 362 | } | ||
| 363 | else if (wmax >= 0 && value > wmax) { | ||
| 364 | return STATE_WARNING; | ||
| 365 | } | ||
| 366 | else if (wmin >= 0 && value < wmin) { | ||
| 367 | return STATE_WARNING; | ||
| 368 | } | ||
| 369 | return STATE_OK; | ||
| 370 | } | ||
| 371 | 268 | ||
| 269 | |||
| 270 | |||
| 271 | |||
| 372 | /* process command-line arguments */ | 272 | /* process command-line arguments */ |
| 373 | int | 273 | int |
| 374 | process_arguments (int argc, char **argv) | 274 | process_arguments (int argc, char **argv) |
| @@ -414,11 +314,11 @@ process_arguments (int argc, char **argv) | |||
| 414 | print_help (); | 314 | print_help (); |
| 415 | exit (STATE_OK); | 315 | exit (STATE_OK); |
| 416 | case 'V': /* version */ | 316 | case 'V': /* version */ |
| 417 | print_revision (progname, REVISION); | 317 | print_revision (progname, revision); |
| 418 | exit (STATE_OK); | 318 | exit (STATE_OK); |
| 419 | case 't': /* timeout period */ | 319 | case 't': /* timeout period */ |
| 420 | if (!is_integer (optarg)) { | 320 | if (!is_integer (optarg)) { |
| 421 | printf ("%s: Timeout Interval must be an integer!\n\n", | 321 | printf (_("%s: Timeout Interval must be an integer!\n\n"), |
| 422 | progname); | 322 | progname); |
| 423 | print_usage (); | 323 | print_usage (); |
| 424 | exit (STATE_UNKNOWN); | 324 | exit (STATE_UNKNOWN); |
| @@ -440,7 +340,7 @@ process_arguments (int argc, char **argv) | |||
| 440 | break; | 340 | break; |
| 441 | } | 341 | } |
| 442 | else { | 342 | else { |
| 443 | printf ("%s: Critical Process Count must be an integer!\n\n", | 343 | printf (_("%s: Critical Process Count must be an integer!\n\n"), |
| 444 | progname); | 344 | progname); |
| 445 | print_usage (); | 345 | print_usage (); |
| 446 | exit (STATE_UNKNOWN); | 346 | exit (STATE_UNKNOWN); |
| @@ -460,7 +360,7 @@ process_arguments (int argc, char **argv) | |||
| 460 | break; | 360 | break; |
| 461 | } | 361 | } |
| 462 | else { | 362 | else { |
| 463 | printf ("%s: Warning Process Count must be an integer!\n\n", | 363 | printf (_("%s: Warning Process Count must be an integer!\n\n"), |
| 464 | progname); | 364 | progname); |
| 465 | print_usage (); | 365 | print_usage (); |
| 466 | exit (STATE_UNKNOWN); | 366 | exit (STATE_UNKNOWN); |
| @@ -471,13 +371,13 @@ process_arguments (int argc, char **argv) | |||
| 471 | options |= PPID; | 371 | options |= PPID; |
| 472 | break; | 372 | break; |
| 473 | } | 373 | } |
| 474 | printf ("%s: Parent Process ID must be an integer!\n\n", | 374 | printf (_("%s: Parent Process ID must be an integer!\n\n"), |
| 475 | progname); | 375 | progname); |
| 476 | print_usage (); | 376 | print_usage (); |
| 477 | exit (STATE_UNKNOWN); | 377 | exit (STATE_UNKNOWN); |
| 478 | case 's': /* status */ | 378 | case 's': /* status */ |
| 479 | asprintf (&statopts, "%s", optarg); | 379 | asprintf (&statopts, "%s", optarg); |
| 480 | asprintf (&fmt, "%s%sSTATE = %s", fmt, (options ? ", " : ""), statopts); | 380 | asprintf (&fmt, _("%s%sSTATE = %s"), fmt, (options ? ", " : ""), statopts); |
| 481 | options |= STAT; | 381 | options |= STAT; |
| 482 | break; | 382 | break; |
| 483 | case 'u': /* user or user id */ | 383 | case 'u': /* user or user id */ |
| @@ -486,7 +386,7 @@ process_arguments (int argc, char **argv) | |||
| 486 | pw = getpwuid ((uid_t) uid); | 386 | pw = getpwuid ((uid_t) uid); |
| 487 | /* check to be sure user exists */ | 387 | /* check to be sure user exists */ |
| 488 | if (pw == NULL) { | 388 | if (pw == NULL) { |
| 489 | printf ("UID %d was not found\n", uid); | 389 | printf (_("UID %d was not found\n"), uid); |
| 490 | print_usage (); | 390 | print_usage (); |
| 491 | exit (STATE_UNKNOWN); | 391 | exit (STATE_UNKNOWN); |
| 492 | } | 392 | } |
| @@ -495,7 +395,7 @@ process_arguments (int argc, char **argv) | |||
| 495 | pw = getpwnam (optarg); | 395 | pw = getpwnam (optarg); |
| 496 | /* check to be sure user exists */ | 396 | /* check to be sure user exists */ |
| 497 | if (pw == NULL) { | 397 | if (pw == NULL) { |
| 498 | printf ("User name %s was not found\n", optarg); | 398 | printf (_("User name %s was not found\n"), optarg); |
| 499 | print_usage (); | 399 | print_usage (); |
| 500 | exit (STATE_UNKNOWN); | 400 | exit (STATE_UNKNOWN); |
| 501 | } | 401 | } |
| @@ -503,49 +403,49 @@ process_arguments (int argc, char **argv) | |||
| 503 | uid = pw->pw_uid; | 403 | uid = pw->pw_uid; |
| 504 | } | 404 | } |
| 505 | user = pw->pw_name; | 405 | user = pw->pw_name; |
| 506 | asprintf (&fmt, "%s%sUID = %d (%s)", fmt, (options ? ", " : ""), | 406 | asprintf (&fmt, _("%s%sUID = %d (%s)"), fmt, (options ? ", " : ""), |
| 507 | uid, user); | 407 | uid, user); |
| 508 | options |= USER; | 408 | options |= USER; |
| 509 | break; | 409 | break; |
| 510 | case 'C': /* command */ | 410 | case 'C': /* command */ |
| 511 | asprintf (&prog, "%s", optarg); | 411 | asprintf (&prog, "%s", optarg); |
| 512 | asprintf (&fmt, "%s%scommand name '%s'", fmt, (options ? ", " : ""), | 412 | asprintf (&fmt, _("%s%scommand name '%s'"), fmt, (options ? ", " : ""), |
| 513 | prog); | 413 | prog); |
| 514 | options |= PROG; | 414 | options |= PROG; |
| 515 | break; | 415 | break; |
| 516 | case 'a': /* args (full path name with args) */ | 416 | case 'a': /* args (full path name with args) */ |
| 517 | asprintf (&args, "%s", optarg); | 417 | asprintf (&args, "%s", optarg); |
| 518 | asprintf (&fmt, "%s%sargs '%s'", fmt, (options ? ", " : ""), args); | 418 | asprintf (&fmt, _("%s%sargs '%s'"), fmt, (options ? ", " : ""), args); |
| 519 | options |= ARGS; | 419 | options |= ARGS; |
| 520 | break; | 420 | break; |
| 521 | case 'r': /* RSS */ | 421 | case 'r': /* RSS */ |
| 522 | if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) { | 422 | if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) { |
| 523 | asprintf (&fmt, "%s%sRSS >= %d", fmt, (options ? ", " : ""), rss); | 423 | asprintf (&fmt, _("%s%sRSS >= %d"), fmt, (options ? ", " : ""), rss); |
| 524 | options |= RSS; | 424 | options |= RSS; |
| 525 | break; | 425 | break; |
| 526 | } | 426 | } |
| 527 | printf ("%s: RSS must be an integer!\n\n", | 427 | printf (_("%s: RSS must be an integer!\n\n"), |
| 528 | progname); | 428 | progname); |
| 529 | print_usage (); | 429 | print_usage (); |
| 530 | exit (STATE_UNKNOWN); | 430 | exit (STATE_UNKNOWN); |
| 531 | case 'z': /* VSZ */ | 431 | case 'z': /* VSZ */ |
| 532 | if (sscanf (optarg, "%d%[^0-9]", &vsz, tmp) == 1) { | 432 | if (sscanf (optarg, "%d%[^0-9]", &vsz, tmp) == 1) { |
| 533 | asprintf (&fmt, "%s%sVSZ >= %d", fmt, (options ? ", " : ""), vsz); | 433 | asprintf (&fmt, _("%s%sVSZ >= %d"), fmt, (options ? ", " : ""), vsz); |
| 534 | options |= VSZ; | 434 | options |= VSZ; |
| 535 | break; | 435 | break; |
| 536 | } | 436 | } |
| 537 | printf ("%s: VSZ must be an integer!\n\n", | 437 | printf (_("%s: VSZ must be an integer!\n\n"), |
| 538 | progname); | 438 | progname); |
| 539 | print_usage (); | 439 | print_usage (); |
| 540 | exit (STATE_UNKNOWN); | 440 | exit (STATE_UNKNOWN); |
| 541 | case 'P': /* PCPU */ | 441 | case 'P': /* PCPU */ |
| 542 | /* TODO: -P 1.5.5 is accepted */ | 442 | /* TODO: -P 1.5.5 is accepted */ |
| 543 | if (sscanf (optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) { | 443 | if (sscanf (optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) { |
| 544 | asprintf (&fmt, "%s%sPCPU >= %.2f", fmt, (options ? ", " : ""), pcpu); | 444 | asprintf (&fmt, _("%s%sPCPU >= %.2f"), fmt, (options ? ", " : ""), pcpu); |
| 545 | options |= PCPU; | 445 | options |= PCPU; |
| 546 | break; | 446 | break; |
| 547 | } | 447 | } |
| 548 | printf ("%s: PCPU must be a float!\n\n", | 448 | printf (_("%s: PCPU must be a float!\n\n"), |
| 549 | progname); | 449 | progname); |
| 550 | print_usage (); | 450 | print_usage (); |
| 551 | exit (STATE_UNKNOWN); | 451 | exit (STATE_UNKNOWN); |
| @@ -567,7 +467,7 @@ process_arguments (int argc, char **argv) | |||
| 567 | metric = METRIC_CPU; | 467 | metric = METRIC_CPU; |
| 568 | break; | 468 | break; |
| 569 | } | 469 | } |
| 570 | printf ("%s: metric must be one of PROCS, VSZ, RSS, CPU!\n\n", | 470 | printf (_("%s: metric must be one of PROCS, VSZ, RSS, CPU!\n\n"), |
| 571 | progname); | 471 | progname); |
| 572 | print_usage (); | 472 | print_usage (); |
| 573 | exit (STATE_UNKNOWN); | 473 | exit (STATE_UNKNOWN); |
| @@ -584,7 +484,7 @@ process_arguments (int argc, char **argv) | |||
| 584 | cmax = atoi (argv[c++]); | 484 | cmax = atoi (argv[c++]); |
| 585 | if (statopts == NULL && argv[c]) { | 485 | if (statopts == NULL && argv[c]) { |
| 586 | asprintf (&statopts, "%s", argv[c++]); | 486 | asprintf (&statopts, "%s", argv[c++]); |
| 587 | asprintf (&fmt, "%s%sSTATE = %s", fmt, (options ? ", " : ""), statopts); | 487 | asprintf (&fmt, _("%s%sSTATE = %s"), fmt, (options ? ", " : ""), statopts); |
| 588 | options |= STAT; | 488 | options |= STAT; |
| 589 | } | 489 | } |
| 590 | 490 | ||
| @@ -592,6 +492,8 @@ process_arguments (int argc, char **argv) | |||
| 592 | } | 492 | } |
| 593 | 493 | ||
| 594 | 494 | ||
| 495 | |||
| 496 | |||
| 595 | int | 497 | int |
| 596 | validate_arguments () | 498 | validate_arguments () |
| 597 | { | 499 | { |
| @@ -602,11 +504,11 @@ validate_arguments () | |||
| 602 | cmin = 0; | 504 | cmin = 0; |
| 603 | if (wmax >= wmin && cmax >= cmin) { /* standard ranges */ | 505 | if (wmax >= wmin && cmax >= cmin) { /* standard ranges */ |
| 604 | if (wmax > cmax && cmax != -1) { | 506 | if (wmax > cmax && cmax != -1) { |
| 605 | printf ("wmax (%d) cannot be greater than cmax (%d)\n", wmax, cmax); | 507 | printf (_("wmax (%d) cannot be greater than cmax (%d)\n"), wmax, cmax); |
| 606 | return ERROR; | 508 | return ERROR; |
| 607 | } | 509 | } |
| 608 | if (cmin > wmin && wmin != -1) { | 510 | if (cmin > wmin && wmin != -1) { |
| 609 | printf ("wmin (%d) cannot be less than cmin (%d)\n", wmin, cmin); | 511 | printf (_("wmin (%d) cannot be less than cmin (%d)\n"), wmin, cmin); |
| 610 | return ERROR; | 512 | return ERROR; |
| 611 | } | 513 | } |
| 612 | } | 514 | } |
| @@ -623,22 +525,136 @@ validate_arguments () | |||
| 623 | } | 525 | } |
| 624 | 526 | ||
| 625 | 527 | ||
| 528 | |||
| 529 | |||
| 530 | |||
| 531 | |||
| 532 | /* Check thresholds against value */ | ||
| 533 | int | ||
| 534 | check_thresholds (int value) | ||
| 535 | { | ||
| 536 | if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) { | ||
| 537 | return OK; | ||
| 538 | } | ||
| 539 | else if (cmax >= 0 && cmin >= 0 && cmax < cmin) { | ||
| 540 | if (value > cmax && value < cmin) | ||
| 541 | return STATE_CRITICAL; | ||
| 542 | } | ||
| 543 | else if (cmax >= 0 && value > cmax) { | ||
| 544 | return STATE_CRITICAL; | ||
| 545 | } | ||
| 546 | else if (cmin >= 0 && value < cmin) { | ||
| 547 | return STATE_CRITICAL; | ||
| 548 | } | ||
| 549 | |||
| 550 | if (wmax >= 0 && wmin >= 0 && wmax < wmin) { | ||
| 551 | if (value > wmax && value < wmin) { | ||
| 552 | return STATE_WARNING; | ||
| 553 | } | ||
| 554 | } | ||
| 555 | else if (wmax >= 0 && value > wmax) { | ||
| 556 | return STATE_WARNING; | ||
| 557 | } | ||
| 558 | else if (wmin >= 0 && value < wmin) { | ||
| 559 | return STATE_WARNING; | ||
| 560 | } | ||
| 561 | return STATE_OK; | ||
| 562 | } | ||
| 563 | |||
| 564 | |||
| 565 | |||
| 566 | |||
| 567 | |||
| 568 | |||
| 626 | void | 569 | void |
| 627 | print_help (void) | 570 | print_help (void) |
| 628 | { | 571 | { |
| 629 | print_revision (progname, REVISION); | 572 | print_revision (progname, revision); |
| 630 | printf | 573 | |
| 631 | ("Copyright (c) %s %s <%s>\n\n%s\n", | 574 | printf (_("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>")); |
| 632 | COPYRIGHT, AUTHOR, EMAIL, SUMMARY); | 575 | printf (_(COPYRIGHT), copyright, email); |
| 576 | |||
| 577 | printf(_("\ | ||
| 578 | Checks all processes and generates WARNING or CRITICAL states if the specified\n\ | ||
| 579 | metric is outside the required threshold ranges. The metric defaults to number\n\ | ||
| 580 | of processes. Search filters can be applied to limit the processes to check.\n\n")); | ||
| 581 | |||
| 633 | print_usage (); | 582 | print_usage (); |
| 634 | printf ("\nOptions:\n" LONGOPTIONS "\nExamples:\n" EXAMPLES "\n"); | 583 | |
| 584 | printf(_("\n\ | ||
| 585 | Required Arguments:\n\ | ||
| 586 | -w, --warning=RANGE\n\ | ||
| 587 | Generate warning state if metric is outside this range\n\ | ||
| 588 | -c, --critical=RANGE\n\ | ||
| 589 | Generate critical state if metric is outside this range\n")); | ||
| 590 | |||
| 591 | printf(_("\n\ | ||
| 592 | Optional Arguments:\n\ | ||
| 593 | -m, --metric=TYPE\n\ | ||
| 594 | Check thresholds against metric. Valid types:\n\ | ||
| 595 | PROCS - number of processes (default)\n\ | ||
| 596 | VSZ - virtual memory size\n\ | ||
| 597 | RSS - resident set memory size\n\ | ||
| 598 | CPU - percentage cpu\n\ | ||
| 599 | -v, --verbose\n\ | ||
| 600 | Extra information. Up to 3 verbosity levels\n")); | ||
| 601 | |||
| 602 | printf(_("\n\ | ||
| 603 | Optional Filters:\n\ | ||
| 604 | -s, --state=STATUSFLAGS\n\ | ||
| 605 | Only scan for processes that have, in the output of `ps`, one or\n\ | ||
| 606 | more of the status flags you specify (for example R, Z, S, RS,\n\ | ||
| 607 | RSZDT, plus others based on the output of your 'ps' command).\n\ | ||
| 608 | -p, --ppid=PPID\n\ | ||
| 609 | Only scan for children of the parent process ID indicated.\n\ | ||
| 610 | -z, --vsz=VSZ\n\ | ||
| 611 | Only scan for processes with vsz higher than indicated.\n\ | ||
| 612 | -r, --rss=RSS\n\ | ||
| 613 | Only scan for processes with rss higher than indicated.\n")); | ||
| 614 | |||
| 615 | printf(_("\ | ||
| 616 | -P, --pcpu=PCPU\n\ | ||
| 617 | Only scan for processes with pcpu higher than indicated.\n\ | ||
| 618 | -u, --user=USER\n\ | ||
| 619 | Only scan for processes with user name or ID indicated.\n\ | ||
| 620 | -a, --argument-array=STRING\n\ | ||
| 621 | Only scan for processes with args that contain STRING.\n\ | ||
| 622 | -C, --command=COMMAND\n\ | ||
| 623 | Only scan for exact matches to the named COMMAND.\n")); | ||
| 624 | |||
| 625 | printf(_("\n\ | ||
| 626 | RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\ | ||
| 627 | specified 'max:min', a warning status will be generated if the\n\ | ||
| 628 | count is inside the specified range\n\n")); | ||
| 629 | |||
| 630 | printf(_("\ | ||
| 631 | This plugin checks the number of currently running processes and\n\ | ||
| 632 | generates WARNING or CRITICAL states if the process count is outside\n\ | ||
| 633 | the specified threshold ranges. The process count can be filtered by\n\ | ||
| 634 | process owner, parent process PID, current state (e.g., 'Z'), or may\n\ | ||
| 635 | be the total number of running processes\n\n")); | ||
| 636 | |||
| 637 | printf(_("\ | ||
| 638 | Examples:\n\ | ||
| 639 | check_procs -w 2:2 -c 2:1024 -C portsentry\n\ | ||
| 640 | Warning if not two processes with command name portsentry. Critical\n\ | ||
| 641 | if < 2 or > 1024 processes\n\n\ | ||
| 642 | check_procs -w 10 -a '/usr/local/bin/perl' -u root\n\ | ||
| 643 | Warning alert if > 10 processes with command arguments containing \n\ | ||
| 644 | '/usr/local/bin/perl' and owned by root\n\n\ | ||
| 645 | check_procs -w 50000 -c 100000 --metric=VSZ\n\ | ||
| 646 | Alert if vsz of any processes over 50K or 100K\n\n")); | ||
| 647 | |||
| 648 | printf (_(UT_SUPPORT)); | ||
| 635 | } | 649 | } |
| 636 | 650 | ||
| 637 | void | 651 | void |
| 638 | print_usage (void) | 652 | print_usage (void) |
| 639 | { | 653 | { |
| 640 | printf ("Usage:\n" " %s %s\n" | 654 | printf ("\ |
| 641 | " %s (-h | --help) for detailed help\n" | 655 | Usage: %s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n\ |
| 642 | " %s (-V | --version) for version information\n", | 656 | [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n\ |
| 643 | progname, OPTIONS, progname, progname); | 657 | [-C command] [-v]\n", progname); |
| 658 | printf (_(UT_HLP_VRS), progname, progname); | ||
| 644 | } | 659 | } |
| 660 | |||
