diff options
| -rw-r--r-- | configure.in | 6 | ||||
| -rw-r--r-- | plugins/check_procs.c | 52 |
2 files changed, 55 insertions, 3 deletions
diff --git a/configure.in b/configure.in index 43fe4ade..7efcb0f9 100644 --- a/configure.in +++ b/configure.in | |||
| @@ -1632,6 +1632,12 @@ if test -n "$ac_cv_proc_meminfo"; then | |||
| 1632 | EXTRAS="$EXTRAS check_swap" | 1632 | EXTRAS="$EXTRAS check_swap" |
| 1633 | fi | 1633 | fi |
| 1634 | 1634 | ||
| 1635 | AC_MSG_CHECKING([for /proc/pid/exe]) | ||
| 1636 | if [readlink /proc/$$/exe > /dev/null 2>&1]; then | ||
| 1637 | AC_MSG_RESULT([found]) | ||
| 1638 | AC_DEFINE(HAVE_PROC_PID_EXE,1,[Define if we have /proc/pid/exe]) | ||
| 1639 | fi | ||
| 1640 | |||
| 1635 | AC_PATH_PROG(PATH_TO_DIG,dig) | 1641 | AC_PATH_PROG(PATH_TO_DIG,dig) |
| 1636 | AC_ARG_WITH(dig_command, | 1642 | AC_ARG_WITH(dig_command, |
| 1637 | ACX_HELP_STRING([--with-dig-command=PATH], | 1643 | ACX_HELP_STRING([--with-dig-command=PATH], |
diff --git a/plugins/check_procs.c b/plugins/check_procs.c index 9de3cc25..467a1b4b 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c | |||
| @@ -43,6 +43,14 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
| 43 | 43 | ||
| 44 | #include <pwd.h> | 44 | #include <pwd.h> |
| 45 | 45 | ||
| 46 | #ifdef HAVE_SYS_STAT_H | ||
| 47 | #include <sys/stat.h> | ||
| 48 | typedef struct stat struct_stat_t; | ||
| 49 | #else | ||
| 50 | /* won't be used anyway */ | ||
| 51 | typedef struct { dev_t dev; ino_t ino; } struct_stat_t; | ||
| 52 | #endif | ||
| 53 | |||
| 46 | int process_arguments (int, char **); | 54 | int process_arguments (int, char **); |
| 47 | int validate_arguments (void); | 55 | int validate_arguments (void); |
| 48 | int convert_to_seconds (char *); | 56 | int convert_to_seconds (char *); |
| @@ -95,9 +103,24 @@ char *fmt; | |||
| 95 | char *fails; | 103 | char *fails; |
| 96 | char tmp[MAX_INPUT_BUFFER]; | 104 | char tmp[MAX_INPUT_BUFFER]; |
| 97 | int kthread_filter = 0; | 105 | int kthread_filter = 0; |
| 106 | int usepid = 0; /* whether to test for pid or /proc/pid/exe */ | ||
| 98 | 107 | ||
| 99 | FILE *ps_input = NULL; | 108 | FILE *ps_input = NULL; |
| 100 | 109 | ||
| 110 | static int | ||
| 111 | stat_exe (const pid_t pid, struct_stat_t *buf) { | ||
| 112 | #if defined(HAVE_PROC_PID_EXE) && defined(HAVE_SYS_STAT_H) | ||
| 113 | char *path; | ||
| 114 | int ret; | ||
| 115 | xasprintf(&path, "/proc/%d/exe", pid); | ||
| 116 | ret = stat(path, buf); | ||
| 117 | free(path); | ||
| 118 | return ret; | ||
| 119 | #else | ||
| 120 | return -1; | ||
| 121 | #endif | ||
| 122 | } | ||
| 123 | |||
| 101 | 124 | ||
| 102 | int | 125 | int |
| 103 | main (int argc, char **argv) | 126 | main (int argc, char **argv) |
| @@ -107,6 +130,9 @@ main (int argc, char **argv) | |||
| 107 | char *procprog; | 130 | char *procprog; |
| 108 | 131 | ||
| 109 | pid_t mypid = 0; | 132 | pid_t mypid = 0; |
| 133 | struct_stat_t statbuf; | ||
| 134 | dev_t mydev = 0; | ||
| 135 | ino_t myino = 0; | ||
| 110 | int procuid = 0; | 136 | int procuid = 0; |
| 111 | pid_t procpid = 0; | 137 | pid_t procpid = 0; |
| 112 | pid_t procppid = 0; | 138 | pid_t procppid = 0; |
| @@ -150,8 +176,16 @@ main (int argc, char **argv) | |||
| 150 | if (process_arguments (argc, argv) == ERROR) | 176 | if (process_arguments (argc, argv) == ERROR) |
| 151 | usage4 (_("Could not parse arguments")); | 177 | usage4 (_("Could not parse arguments")); |
| 152 | 178 | ||
| 153 | /* get our pid */ | 179 | /* find ourself */ |
| 154 | mypid = getpid(); | 180 | mypid = getpid(); |
| 181 | if (usepid || stat_exe(mypid, &statbuf) == -1) { | ||
| 182 | /* usepid might have been set by -T */ | ||
| 183 | usepid = 1; | ||
| 184 | } else { | ||
| 185 | usepid = 0; | ||
| 186 | mydev = statbuf.st_dev; | ||
| 187 | myino = statbuf.st_ino; | ||
| 188 | } | ||
| 155 | 189 | ||
| 156 | /* Set signal handling and alarm timeout */ | 190 | /* Set signal handling and alarm timeout */ |
| 157 | if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) { | 191 | if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) { |
| @@ -206,7 +240,12 @@ main (int argc, char **argv) | |||
| 206 | procetime, procprog, procargs); | 240 | procetime, procprog, procargs); |
| 207 | 241 | ||
| 208 | /* Ignore self */ | 242 | /* Ignore self */ |
| 209 | if (mypid == procpid) continue; | 243 | if ((usepid && mypid == procpid) || |
| 244 | (!usepid && stat_exe(procpid, &statbuf) != -1 && statbuf.st_dev == mydev && statbuf.st_ino == myino)) { | ||
| 245 | if (verbose >= 3) | ||
| 246 | printf("not considering - is myself\n"); | ||
| 247 | continue; | ||
| 248 | } | ||
| 210 | 249 | ||
| 211 | /* filter kernel threads (childs of KTHREAD_PARENT)*/ | 250 | /* filter kernel threads (childs of KTHREAD_PARENT)*/ |
| 212 | /* TODO adapt for other OSes than GNU/Linux | 251 | /* TODO adapt for other OSes than GNU/Linux |
| @@ -366,6 +405,7 @@ process_arguments (int argc, char **argv) | |||
| 366 | {"ereg-argument-array", required_argument, 0, CHAR_MAX+1}, | 405 | {"ereg-argument-array", required_argument, 0, CHAR_MAX+1}, |
| 367 | {"input-file", required_argument, 0, CHAR_MAX+2}, | 406 | {"input-file", required_argument, 0, CHAR_MAX+2}, |
| 368 | {"no-kthreads", required_argument, 0, 'k'}, | 407 | {"no-kthreads", required_argument, 0, 'k'}, |
| 408 | {"traditional-filter", no_argument, 0, 'T'}, | ||
| 369 | {0, 0, 0, 0} | 409 | {0, 0, 0, 0} |
| 370 | }; | 410 | }; |
| 371 | 411 | ||
| @@ -374,7 +414,7 @@ process_arguments (int argc, char **argv) | |||
| 374 | strcpy (argv[c], "-t"); | 414 | strcpy (argv[c], "-t"); |
| 375 | 415 | ||
| 376 | while (1) { | 416 | while (1) { |
| 377 | c = getopt_long (argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:", | 417 | c = getopt_long (argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T", |
| 378 | longopts, &option); | 418 | longopts, &option); |
| 379 | 419 | ||
| 380 | if (c == -1 || c == EOF) | 420 | if (c == -1 || c == EOF) |
| @@ -524,6 +564,9 @@ process_arguments (int argc, char **argv) | |||
| 524 | case 'v': /* command */ | 564 | case 'v': /* command */ |
| 525 | verbose++; | 565 | verbose++; |
| 526 | break; | 566 | break; |
| 567 | case 'T': | ||
| 568 | usepid = 1; | ||
| 569 | break; | ||
| 527 | case CHAR_MAX+2: | 570 | case CHAR_MAX+2: |
| 528 | input_filename = optarg; | 571 | input_filename = optarg; |
| 529 | break; | 572 | break; |
| @@ -674,6 +717,9 @@ print_help (void) | |||
| 674 | printf (" %s\n", "-v, --verbose"); | 717 | printf (" %s\n", "-v, --verbose"); |
| 675 | printf (" %s\n", _("Extra information. Up to 3 verbosity levels")); | 718 | printf (" %s\n", _("Extra information. Up to 3 verbosity levels")); |
| 676 | 719 | ||
| 720 | printf (" %s\n", "-T, --traditional"); | ||
| 721 | printf (" %s\n", _("Filter own process the traditional way by PID instead of /proc/pid/exe")); | ||
| 722 | |||
| 677 | printf ("\n"); | 723 | printf ("\n"); |
| 678 | printf ("%s\n", "Filters:"); | 724 | printf ("%s\n", "Filters:"); |
| 679 | printf (" %s\n", "-s, --state=STATUSFLAGS"); | 725 | printf (" %s\n", "-s, --state=STATUSFLAGS"); |
