summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--configure.in49
-rw-r--r--plugins-root/Makefile.am3
-rw-r--r--plugins-root/pst3.c3
-rw-r--r--plugins/check_procs.c26
-rw-r--r--plugins/t/check_procs.t44
6 files changed, 105 insertions, 22 deletions
diff --git a/NEWS b/NEWS
index cf257f7b..b50e22c4 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ This file documents the major additions and syntax changes between releases.
12 check_ntp_peer now checks for the LI_ALARM flag 12 check_ntp_peer now checks for the LI_ALARM flag
13 Sync to latest Gnulib (includes new floorf function) 13 Sync to latest Gnulib (includes new floorf function)
14 check_pgsql now successfully builds with postgres lib v8.3 (Bug #1878972) 14 check_pgsql now successfully builds with postgres lib v8.3 (Bug #1878972)
15 check_procs now accepts --ereg-argument-array for a regular expression match to the argument array
16 Reverted back to using pst3 for Solaris systems. Fixed issues re: -m64 needed to compile on 64bit systems
15 17
161.4.11 13th December 2007 181.4.11 13th December 2007
17 Fixed check_http regression in 1.4.10 where following redirects to 19 Fixed check_http regression in 1.4.10 where following redirects to
diff --git a/configure.in b/configure.in
index 341add80..6d94582c 100644
--- a/configure.in
+++ b/configure.in
@@ -512,16 +512,49 @@ if test -n "$PS_COMMAND" && test -n "$PS_FORMAT" && test -n "$PS_COLS" && test -
512 ac_cv_ps_cols="$PS_COLS" 512 ac_cv_ps_cols="$PS_COLS"
513 AC_MSG_RESULT([(command-line) $ac_cv_ps_command]) 513 AC_MSG_RESULT([(command-line) $ac_cv_ps_command])
514 514
515dnl Now using the pst3/kmem hack for solaris systems to avoid truncation
516elif test "$ac_cv_uname_s" = "SunOS"; then
517 #
518 # this is a very, very ugly hack, to hardcode the location for plugins
519 #
520 if test "$libexecdir" = '${exec_prefix}/libexec'; then
521 if test "$exec_prefix" = "NONE"; then
522 if test "$prefix" = "NONE"; then
523 pst3="$ac_default_prefix/libexec/pst3"
524 else
525 pst3="$prefix/libexec/pst3"
526 fi
527 else
528 pst3="$exec_prefix/libexec/pst3"
529 fi
530 else
531 pst3="$libexecdir/pst3"
532 fi
533 ac_cv_ps_command="$pst3"
534 ac_cv_ps_format="%s %d %d %d %d %d %f %s %n"
535 ac_cv_ps_varlist="[procstat,&procuid,&procpid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
536 ac_cv_ps_cols=9
537 AC_MSG_RESULT([using nagios-plugins internal ps command (pst3) for solaris])
538 if test `isainfo -b` = 64 ; then
539 PST3CFLAGS="-m64"
540 AC_SUBST(PST3CFLAGS)
541 AC_MSG_NOTICE([using 64bit pst3])
542 else
543 AC_MSG_NOTICE([using 32bit pst3])
544 fi
545 EXTRAS_ROOT="$EXTRAS_ROOT pst3"
546
547dnl Removing this for the moment - Ton
515dnl Using /usr/ucb/ps on Solaris systems, to avoid truncation 548dnl Using /usr/ucb/ps on Solaris systems, to avoid truncation
516dnl Limitation that command name is not available 549dnl Limitation that command name is not available
517elif test "$ac_cv_uname_s" = "SunOS" && /usr/ucb/ps -alxwwn 2>/dev/null | \ 550dnl elif test "$ac_cv_uname_s" = "SunOS" && /usr/ucb/ps -alxwwn 2>/dev/null | \
518 egrep -i ["^ *F +UID +PID +PPID +%C +PRI +NI +SZ +RSS +WCHAN +S +TT +TIME +COMMAND"] > /dev/null 551dnl egrep -i ["^ *F +UID +PID +PPID +%C +PRI +NI +SZ +RSS +WCHAN +S +TT +TIME +COMMAND"] > /dev/null
519then 552dnl then
520 ac_cv_ps_varlist="[&procuid,&procpid,&procppid,&procpcpu,&procvsz,&procrss,procstat,&pos]" 553dnl ac_cv_ps_varlist="[&procuid,&procpid,&procppid,&procpcpu,&procvsz,&procrss,procstat,&pos]"
521 ac_cv_ps_command="/usr/ucb/ps -alxwwn" 554dnl ac_cv_ps_command="/usr/ucb/ps -alxwwn"
522 ac_cv_ps_format=["%*s %d %d %d %d %*d %*d %d %d%*[ 0123456789abcdef]%[OSRZT]%*s %*s %n"] 555dnl ac_cv_ps_format=["%*s %d %d %d %d %*d %*d %d %d%*[ 0123456789abcdef]%[OSRZT]%*s %*s %n"]
523 ac_cv_ps_cols=8 556dnl ac_cv_ps_cols=8
524 AC_MSG_RESULT([$ac_cv_ps_command]) 557dnl AC_MSG_RESULT([$ac_cv_ps_command])
525 558
526dnl Some gnu/linux systems (debian for one) don't like -axwo and need axwo. 559dnl Some gnu/linux systems (debian for one) don't like -axwo and need axwo.
527dnl so test for this first... 560dnl so test for this first...
diff --git a/plugins-root/Makefile.am b/plugins-root/Makefile.am
index e61ebc75..3e6ee43d 100644
--- a/plugins-root/Makefile.am
+++ b/plugins-root/Makefile.am
@@ -7,7 +7,7 @@ INCLUDES = -I.. -I$(top_srcdir)/lib -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(
7datadir = @datadir@ 7datadir = @datadir@
8localedir = $(datadir)/locale 8localedir = $(datadir)/locale
9DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ 9DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
10LIBS = @LIBINTL@ @LIBS@ @SSLLIBS@ 10LIBS = @LIBINTL@ @LIBS@
11 11
12noinst_PROGRAMS = check_dhcp check_icmp @EXTRAS_ROOT@ 12noinst_PROGRAMS = check_dhcp check_icmp @EXTRAS_ROOT@
13 13
@@ -68,6 +68,7 @@ install-exec-local: $(noinst_PROGRAMS)
68# the actual targets 68# the actual targets
69check_dhcp_LDADD = $(NETLIBS) 69check_dhcp_LDADD = $(NETLIBS)
70check_icmp_LDADD = $(NETLIBS) $(SOCKETLIBS) 70check_icmp_LDADD = $(NETLIBS) $(SOCKETLIBS)
71pst3_CFLAGS = @PST3CFLAGS@
71pst3_LDADD = -lkvm 72pst3_LDADD = -lkvm
72 73
73check_dhcp_DEPENDENCIES = check_dhcp.c $(NETOBJS) $(DEPLIBS) 74check_dhcp_DEPENDENCIES = check_dhcp.c $(NETOBJS) $(DEPLIBS)
diff --git a/plugins-root/pst3.c b/plugins-root/pst3.c
index bf4b40d3..87340062 100644
--- a/plugins-root/pst3.c
+++ b/plugins-root/pst3.c
@@ -187,9 +187,10 @@ static int HandlePsInfo (char *szPath, psinfo_t *pPsInfo)
187 thisProg = myArgv[0]; 187 thisProg = myArgv[0];
188 188
189 /* Display the ps columns (except for argv) */ 189 /* Display the ps columns (except for argv) */
190 printf("%c %5d %5d %6lu %6lu %4.1f %s ", 190 printf("%c %5d %5d %5d %6lu %6lu %4.1f %s ",
191 pPsInfo->pr_lwp.pr_sname, 191 pPsInfo->pr_lwp.pr_sname,
192 (int)(pPsInfo->pr_euid), 192 (int)(pPsInfo->pr_euid),
193 (int)(pPsInfo->pr_pid),
193 (int)(pPsInfo->pr_ppid), 194 (int)(pPsInfo->pr_ppid),
194 (unsigned long)(pPsInfo->pr_size), 195 (unsigned long)(pPsInfo->pr_size),
195 (unsigned long)(pPsInfo->pr_rssize), 196 (unsigned long)(pPsInfo->pr_rssize),
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index 690b8554..7dae8454 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -43,6 +43,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
43#include "common.h" 43#include "common.h"
44#include "popen.h" 44#include "popen.h"
45#include "utils.h" 45#include "utils.h"
46#include "regex.h"
46 47
47#include <pwd.h> 48#include <pwd.h>
48 49
@@ -69,6 +70,7 @@ int options = 0; /* bitmask of filter criteria to test against */
69#define RSS 128 70#define RSS 128
70#define PCPU 256 71#define PCPU 256
71#define ELAPSED 512 72#define ELAPSED 512
73#define EREG_ARGS 1024
72/* Different metrics */ 74/* Different metrics */
73char *metric_name; 75char *metric_name;
74enum metric { 76enum metric {
@@ -89,6 +91,7 @@ float pcpu;
89char *statopts; 91char *statopts;
90char *prog; 92char *prog;
91char *args; 93char *args;
94regex_t re_args;
92char *fmt; 95char *fmt;
93char *fails; 96char *fails;
94char tmp[MAX_INPUT_BUFFER]; 97char tmp[MAX_INPUT_BUFFER];
@@ -211,6 +214,8 @@ main (int argc, char **argv)
211 resultsum |= STAT; 214 resultsum |= STAT;
212 if ((options & ARGS) && procargs && (strstr (procargs, args) != NULL)) 215 if ((options & ARGS) && procargs && (strstr (procargs, args) != NULL))
213 resultsum |= ARGS; 216 resultsum |= ARGS;
217 if ((options & EREG_ARGS) && procargs && (regexec(&re_args, procargs, (size_t) 0, NULL, 0) == 0))
218 resultsum |= EREG_ARGS;
214 if ((options & PROG) && procprog && (strcmp (prog, procprog) == 0)) 219 if ((options & PROG) && procprog && (strcmp (prog, procprog) == 0))
215 resultsum |= PROG; 220 resultsum |= PROG;
216 if ((options & PPID) && (procppid == ppid)) 221 if ((options & PPID) && (procppid == ppid))
@@ -231,6 +236,12 @@ main (int argc, char **argv)
231 continue; 236 continue;
232 237
233 procs++; 238 procs++;
239 if (verbose >= 2) {
240 printf ("Matched: uid=%d vsz=%d rss=%d pid=%d ppid=%d pcpu=%.2f stat=%s etime=%s prog=%s args=%s\n",
241 procuid, procvsz, procrss,
242 procpid, procppid, procpcpu, procstat,
243 procetime, procprog, procargs);
244 }
234 245
235 if (metric == METRIC_VSZ) 246 if (metric == METRIC_VSZ)
236 i = check_thresholds (procvsz); 247 i = check_thresholds (procvsz);
@@ -326,6 +337,9 @@ process_arguments (int argc, char **argv)
326 char *user; 337 char *user;
327 struct passwd *pw; 338 struct passwd *pw;
328 int option = 0; 339 int option = 0;
340 int err;
341 int cflags = REG_NOSUB | REG_EXTENDED;
342 char errbuf[MAX_INPUT_BUFFER];
329 static struct option longopts[] = { 343 static struct option longopts[] = {
330 {"warning", required_argument, 0, 'w'}, 344 {"warning", required_argument, 0, 'w'},
331 {"critical", required_argument, 0, 'c'}, 345 {"critical", required_argument, 0, 'c'},
@@ -342,6 +356,7 @@ process_arguments (int argc, char **argv)
342 {"help", no_argument, 0, 'h'}, 356 {"help", no_argument, 0, 'h'},
343 {"version", no_argument, 0, 'V'}, 357 {"version", no_argument, 0, 'V'},
344 {"verbose", no_argument, 0, 'v'}, 358 {"verbose", no_argument, 0, 'v'},
359 {"ereg-argument-array", required_argument, 0, CHAR_MAX+1},
345 {0, 0, 0, 0} 360 {0, 0, 0, 0}
346 }; 361 };
347 362
@@ -450,6 +465,15 @@ process_arguments (int argc, char **argv)
450 asprintf (&fmt, "%s%sargs '%s'", (fmt ? fmt : ""), (options ? ", " : ""), args); 465 asprintf (&fmt, "%s%sargs '%s'", (fmt ? fmt : ""), (options ? ", " : ""), args);
451 options |= ARGS; 466 options |= ARGS;
452 break; 467 break;
468 case CHAR_MAX+1:
469 err = regcomp(&re_args, optarg, cflags);
470 if (err != 0) {
471 regerror (err, &re_args, errbuf, MAX_INPUT_BUFFER);
472 die (STATE_UNKNOWN, "PROCS %s: %s - %s\n", _("UNKNOWN"), _("Could not compile regular expression"), errbuf);
473 }
474 asprintf (&fmt, "%s%sregex args '%s'", (fmt ? fmt : ""), (options ? ", " : ""), optarg);
475 options |= EREG_ARGS;
476 break;
453 case 'r': /* RSS */ 477 case 'r': /* RSS */
454 if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) { 478 if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) {
455 asprintf (&fmt, "%s%sRSS >= %d", (fmt ? fmt : ""), (options ? ", " : ""), rss); 479 asprintf (&fmt, "%s%sRSS >= %d", (fmt ? fmt : ""), (options ? ", " : ""), rss);
@@ -716,6 +740,8 @@ print_help (void)
716 printf (" %s\n", _("Only scan for processes with user name or ID indicated.")); 740 printf (" %s\n", _("Only scan for processes with user name or ID indicated."));
717 printf (" %s\n", "-a, --argument-array=STRING"); 741 printf (" %s\n", "-a, --argument-array=STRING");
718 printf (" %s\n", _("Only scan for processes with args that contain STRING.")); 742 printf (" %s\n", _("Only scan for processes with args that contain STRING."));
743 printf (" %s\n", "--ereg-argument-array=STRING");
744 printf (" %s\n", _("Only scan for processes with args that contain the regex STRING."));
719 printf (" %s\n", "-C, --command=COMMAND"); 745 printf (" %s\n", "-C, --command=COMMAND");
720 printf (" %s\n", _("Only scan for exact matches of COMMAND (without path).")); 746 printf (" %s\n", _("Only scan for exact matches of COMMAND (without path)."));
721 747
diff --git a/plugins/t/check_procs.t b/plugins/t/check_procs.t
index b8c2e8a5..2a41ac5c 100644
--- a/plugins/t/check_procs.t
+++ b/plugins/t/check_procs.t
@@ -6,20 +6,40 @@
6# 6#
7 7
8use strict; 8use strict;
9use Test; 9use Test::More;
10use NPTest; 10use NPTest;
11 11
12use vars qw($tests);
13BEGIN {$tests = 12; plan tests => $tests}
14
15my $t; 12my $t;
16 13
17$t += checkCmd( "./check_procs -w 100000 -c 100000", 0, '/^PROCS OK: [0-9]+ process(es)?$/' ); 14if (`uname -s` eq "SunOS\n") {
18$t += checkCmd( "./check_procs -w 100000 -c 100000 -s Z", 0, '/^PROCS OK: [0-9]+ process(es)? with /' ); 15 plan skip_all => "Ignoring tests on solaris because of pst3";
19$t += checkCmd( "./check_procs -w 0 -c 10000000", 1, '/^PROCS WARNING: [0-9]+ process(es)?$/' ); 16} else {
20$t += checkCmd( "./check_procs -w 0 -c 0", 2, '/^PROCS CRITICAL: [0-9]+ process(es)?$/' ); 17 plan tests => 12;
21$t += checkCmd( "./check_procs -w 0 -c 0 -s S", 2, '/^PROCS CRITICAL: [0-9]+ process(es)? with /' ); 18}
22$t += checkCmd( "./check_procs -w 0 -c 10000000 -p 1", 1, '/^PROCS WARNING: [0-9]+ process(es)? with PPID = 1/' ); 19
20my $result;
21
22$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000" );
23is( $result->return_code, 0, "Checking less than 10000 processes" );
24like( $result->output, '/^PROCS OK: [0-9]+ process(es)?$/', "Output correct" );
25
26$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000 -s Z" );
27is( $result->return_code, 0, "Checking less than 100000 zombie processes" );
28like( $result->output, '/^PROCS OK: [0-9]+ process(es)? with /', "Output correct" );
29
30$result = NPTest->testCmd( "./check_procs -w 0 -c 100000" );
31is( $result->return_code, 1, "Checking warning if processes > 0" );
32like( $result->output, '/^PROCS WARNING: [0-9]+ process(es)?$/', "Output correct" );
33
34$result = NPTest->testCmd( "./check_procs -w 0 -c 0" );
35is( $result->return_code, 2, "Checking critical if processes > 0" );
36like( $result->output, '/^PROCS CRITICAL: [0-9]+ process(es)?$/', "Output correct" );
37
38$result = NPTest->testCmd( "./check_procs -w 0 -c 0 -s S" );
39is( $result->return_code, 2, "Checking critical if sleeping processes" );
40like( $result->output, '/^PROCS CRITICAL: [0-9]+ process(es)? with /', "Output correct" );
41
42$result = NPTest->testCmd( "./check_procs -w 0 -c 100000 -p 1" );
43is( $result->return_code, 1, "Checking warning for processes by parentid = 1" );
44like( $result->output, '/^PROCS WARNING: [0-9]+ process(es)? with PPID = 1/', "Output correct" );
23 45
24exit(0) if defined($Test::Harness::VERSION);
25exit($tests - $t);