From 9f3d864fd3e47d4e728b196b1b6948a8a5e47e4e Mon Sep 17 00:00:00 2001 From: Ton Voon Date: Thu, 28 Feb 2008 16:21:59 +0000 Subject: [PATCH] Reverted check_procs for solaris back to using pst3 due to truncation for argument fields using other methods git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1937 f882894a-f735-0410-b71e-b25c423dba1c --- NEWS | 2 ++ configure.in | 49 +++++++++++++++++++++++++++++++++------- plugins-root/Makefile.am | 3 ++- plugins-root/pst3.c | 3 ++- plugins/check_procs.c | 26 +++++++++++++++++++++ plugins/t/check_procs.t | 44 ++++++++++++++++++++++++++---------- 6 files changed, 105 insertions(+), 22 deletions(-) diff --git a/NEWS b/NEWS index cf257f7..b50e22c 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,8 @@ This file documents the major additions and syntax changes between releases. check_ntp_peer now checks for the LI_ALARM flag Sync to latest Gnulib (includes new floorf function) check_pgsql now successfully builds with postgres lib v8.3 (Bug #1878972) + check_procs now accepts --ereg-argument-array for a regular expression match to the argument array + Reverted back to using pst3 for Solaris systems. Fixed issues re: -m64 needed to compile on 64bit systems 1.4.11 13th December 2007 Fixed check_http regression in 1.4.10 where following redirects to diff --git a/configure.in b/configure.in index 341add8..6d94582 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 - ac_cv_ps_cols="$PS_COLS" AC_MSG_RESULT([(command-line) $ac_cv_ps_command]) +dnl Now using the pst3/kmem hack for solaris systems to avoid truncation +elif test "$ac_cv_uname_s" = "SunOS"; then + # + # this is a very, very ugly hack, to hardcode the location for plugins + # + if test "$libexecdir" = '${exec_prefix}/libexec'; then + if test "$exec_prefix" = "NONE"; then + if test "$prefix" = "NONE"; then + pst3="$ac_default_prefix/libexec/pst3" + else + pst3="$prefix/libexec/pst3" + fi + else + pst3="$exec_prefix/libexec/pst3" + fi + else + pst3="$libexecdir/pst3" + fi + ac_cv_ps_command="$pst3" + ac_cv_ps_format="%s %d %d %d %d %d %f %s %n" + ac_cv_ps_varlist="[procstat,&procuid,&procpid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]" + ac_cv_ps_cols=9 + AC_MSG_RESULT([using nagios-plugins internal ps command (pst3) for solaris]) + if test `isainfo -b` = 64 ; then + PST3CFLAGS="-m64" + AC_SUBST(PST3CFLAGS) + AC_MSG_NOTICE([using 64bit pst3]) + else + AC_MSG_NOTICE([using 32bit pst3]) + fi + EXTRAS_ROOT="$EXTRAS_ROOT pst3" + +dnl Removing this for the moment - Ton dnl Using /usr/ucb/ps on Solaris systems, to avoid truncation dnl Limitation that command name is not available -elif test "$ac_cv_uname_s" = "SunOS" && /usr/ucb/ps -alxwwn 2>/dev/null | \ - egrep -i ["^ *F +UID +PID +PPID +%C +PRI +NI +SZ +RSS +WCHAN +S +TT +TIME +COMMAND"] > /dev/null -then - ac_cv_ps_varlist="[&procuid,&procpid,&procppid,&procpcpu,&procvsz,&procrss,procstat,&pos]" - ac_cv_ps_command="/usr/ucb/ps -alxwwn" - ac_cv_ps_format=["%*s %d %d %d %d %*d %*d %d %d%*[ 0123456789abcdef]%[OSRZT]%*s %*s %n"] - ac_cv_ps_cols=8 - AC_MSG_RESULT([$ac_cv_ps_command]) +dnl elif test "$ac_cv_uname_s" = "SunOS" && /usr/ucb/ps -alxwwn 2>/dev/null | \ +dnl egrep -i ["^ *F +UID +PID +PPID +%C +PRI +NI +SZ +RSS +WCHAN +S +TT +TIME +COMMAND"] > /dev/null +dnl then +dnl ac_cv_ps_varlist="[&procuid,&procpid,&procppid,&procpcpu,&procvsz,&procrss,procstat,&pos]" +dnl ac_cv_ps_command="/usr/ucb/ps -alxwwn" +dnl ac_cv_ps_format=["%*s %d %d %d %d %*d %*d %d %d%*[ 0123456789abcdef]%[OSRZT]%*s %*s %n"] +dnl ac_cv_ps_cols=8 +dnl AC_MSG_RESULT([$ac_cv_ps_command]) dnl Some gnu/linux systems (debian for one) don't like -axwo and need axwo. dnl so test for this first... diff --git a/plugins-root/Makefile.am b/plugins-root/Makefile.am index e61ebc7..3e6ee43 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$( datadir = @datadir@ localedir = $(datadir)/locale DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ -LIBS = @LIBINTL@ @LIBS@ @SSLLIBS@ +LIBS = @LIBINTL@ @LIBS@ noinst_PROGRAMS = check_dhcp check_icmp @EXTRAS_ROOT@ @@ -68,6 +68,7 @@ install-exec-local: $(noinst_PROGRAMS) # the actual targets check_dhcp_LDADD = $(NETLIBS) check_icmp_LDADD = $(NETLIBS) $(SOCKETLIBS) +pst3_CFLAGS = @PST3CFLAGS@ pst3_LDADD = -lkvm check_dhcp_DEPENDENCIES = check_dhcp.c $(NETOBJS) $(DEPLIBS) diff --git a/plugins-root/pst3.c b/plugins-root/pst3.c index bf4b40d..8734006 100644 --- a/plugins-root/pst3.c +++ b/plugins-root/pst3.c @@ -187,9 +187,10 @@ static int HandlePsInfo (char *szPath, psinfo_t *pPsInfo) thisProg = myArgv[0]; /* Display the ps columns (except for argv) */ - printf("%c %5d %5d %6lu %6lu %4.1f %s ", + printf("%c %5d %5d %5d %6lu %6lu %4.1f %s ", pPsInfo->pr_lwp.pr_sname, (int)(pPsInfo->pr_euid), + (int)(pPsInfo->pr_pid), (int)(pPsInfo->pr_ppid), (unsigned long)(pPsInfo->pr_size), (unsigned long)(pPsInfo->pr_rssize), diff --git a/plugins/check_procs.c b/plugins/check_procs.c index 690b855..7dae845 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c @@ -43,6 +43,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; #include "common.h" #include "popen.h" #include "utils.h" +#include "regex.h" #include @@ -69,6 +70,7 @@ int options = 0; /* bitmask of filter criteria to test against */ #define RSS 128 #define PCPU 256 #define ELAPSED 512 +#define EREG_ARGS 1024 /* Different metrics */ char *metric_name; enum metric { @@ -89,6 +91,7 @@ float pcpu; char *statopts; char *prog; char *args; +regex_t re_args; char *fmt; char *fails; char tmp[MAX_INPUT_BUFFER]; @@ -211,6 +214,8 @@ main (int argc, char **argv) resultsum |= STAT; if ((options & ARGS) && procargs && (strstr (procargs, args) != NULL)) resultsum |= ARGS; + if ((options & EREG_ARGS) && procargs && (regexec(&re_args, procargs, (size_t) 0, NULL, 0) == 0)) + resultsum |= EREG_ARGS; if ((options & PROG) && procprog && (strcmp (prog, procprog) == 0)) resultsum |= PROG; if ((options & PPID) && (procppid == ppid)) @@ -231,6 +236,12 @@ main (int argc, char **argv) continue; procs++; + if (verbose >= 2) { + printf ("Matched: uid=%d vsz=%d rss=%d pid=%d ppid=%d pcpu=%.2f stat=%s etime=%s prog=%s args=%s\n", + procuid, procvsz, procrss, + procpid, procppid, procpcpu, procstat, + procetime, procprog, procargs); + } if (metric == METRIC_VSZ) i = check_thresholds (procvsz); @@ -326,6 +337,9 @@ process_arguments (int argc, char **argv) char *user; struct passwd *pw; int option = 0; + int err; + int cflags = REG_NOSUB | REG_EXTENDED; + char errbuf[MAX_INPUT_BUFFER]; static struct option longopts[] = { {"warning", required_argument, 0, 'w'}, {"critical", required_argument, 0, 'c'}, @@ -342,6 +356,7 @@ process_arguments (int argc, char **argv) {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"verbose", no_argument, 0, 'v'}, + {"ereg-argument-array", required_argument, 0, CHAR_MAX+1}, {0, 0, 0, 0} }; @@ -450,6 +465,15 @@ process_arguments (int argc, char **argv) asprintf (&fmt, "%s%sargs '%s'", (fmt ? fmt : ""), (options ? ", " : ""), args); options |= ARGS; break; + case CHAR_MAX+1: + err = regcomp(&re_args, optarg, cflags); + if (err != 0) { + regerror (err, &re_args, errbuf, MAX_INPUT_BUFFER); + die (STATE_UNKNOWN, "PROCS %s: %s - %s\n", _("UNKNOWN"), _("Could not compile regular expression"), errbuf); + } + asprintf (&fmt, "%s%sregex args '%s'", (fmt ? fmt : ""), (options ? ", " : ""), optarg); + options |= EREG_ARGS; + break; case 'r': /* RSS */ if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) { asprintf (&fmt, "%s%sRSS >= %d", (fmt ? fmt : ""), (options ? ", " : ""), rss); @@ -716,6 +740,8 @@ print_help (void) printf (" %s\n", _("Only scan for processes with user name or ID indicated.")); printf (" %s\n", "-a, --argument-array=STRING"); printf (" %s\n", _("Only scan for processes with args that contain STRING.")); + printf (" %s\n", "--ereg-argument-array=STRING"); + printf (" %s\n", _("Only scan for processes with args that contain the regex STRING.")); printf (" %s\n", "-C, --command=COMMAND"); printf (" %s\n", _("Only scan for exact matches of COMMAND (without path).")); diff --git a/plugins/t/check_procs.t b/plugins/t/check_procs.t index b8c2e8a..2a41ac5 100644 --- a/plugins/t/check_procs.t +++ b/plugins/t/check_procs.t @@ -6,20 +6,40 @@ # use strict; -use Test; +use Test::More; use NPTest; -use vars qw($tests); -BEGIN {$tests = 12; plan tests => $tests} - my $t; -$t += checkCmd( "./check_procs -w 100000 -c 100000", 0, '/^PROCS OK: [0-9]+ process(es)?$/' ); -$t += checkCmd( "./check_procs -w 100000 -c 100000 -s Z", 0, '/^PROCS OK: [0-9]+ process(es)? with /' ); -$t += checkCmd( "./check_procs -w 0 -c 10000000", 1, '/^PROCS WARNING: [0-9]+ process(es)?$/' ); -$t += checkCmd( "./check_procs -w 0 -c 0", 2, '/^PROCS CRITICAL: [0-9]+ process(es)?$/' ); -$t += checkCmd( "./check_procs -w 0 -c 0 -s S", 2, '/^PROCS CRITICAL: [0-9]+ process(es)? with /' ); -$t += checkCmd( "./check_procs -w 0 -c 10000000 -p 1", 1, '/^PROCS WARNING: [0-9]+ process(es)? with PPID = 1/' ); +if (`uname -s` eq "SunOS\n") { + plan skip_all => "Ignoring tests on solaris because of pst3"; +} else { + plan tests => 12; +} + +my $result; + +$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000" ); +is( $result->return_code, 0, "Checking less than 10000 processes" ); +like( $result->output, '/^PROCS OK: [0-9]+ process(es)?$/', "Output correct" ); + +$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000 -s Z" ); +is( $result->return_code, 0, "Checking less than 100000 zombie processes" ); +like( $result->output, '/^PROCS OK: [0-9]+ process(es)? with /', "Output correct" ); + +$result = NPTest->testCmd( "./check_procs -w 0 -c 100000" ); +is( $result->return_code, 1, "Checking warning if processes > 0" ); +like( $result->output, '/^PROCS WARNING: [0-9]+ process(es)?$/', "Output correct" ); + +$result = NPTest->testCmd( "./check_procs -w 0 -c 0" ); +is( $result->return_code, 2, "Checking critical if processes > 0" ); +like( $result->output, '/^PROCS CRITICAL: [0-9]+ process(es)?$/', "Output correct" ); + +$result = NPTest->testCmd( "./check_procs -w 0 -c 0 -s S" ); +is( $result->return_code, 2, "Checking critical if sleeping processes" ); +like( $result->output, '/^PROCS CRITICAL: [0-9]+ process(es)? with /', "Output correct" ); + +$result = NPTest->testCmd( "./check_procs -w 0 -c 100000 -p 1" ); +is( $result->return_code, 1, "Checking warning for processes by parentid = 1" ); +like( $result->output, '/^PROCS WARNING: [0-9]+ process(es)? with PPID = 1/', "Output correct" ); -exit(0) if defined($Test::Harness::VERSION); -exit($tests - $t); -- 2.30.2