summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--ChangeLog4
-rw-r--r--NEWS29
-rw-r--r--REQUIREMENTS5
-rw-r--r--THANKS.in10
-rw-r--r--configure.in100
-rw-r--r--contrib/check_linux_raid.pl20
-rw-r--r--contrib/check_nmap.py7
-rw-r--r--gl/Makefile.am8
-rw-r--r--gl/fsusage.c13
-rw-r--r--gl/m4/fcntl-o.m48
-rw-r--r--gl/m4/fsusage.m428
-rw-r--r--gl/m4/gnulib-comp.m42
-rw-r--r--gl/m4/lib-link.m44
-rw-r--r--gl/m4/malloc.m431
-rw-r--r--gl/m4/stdlib_h.m412
-rw-r--r--gl/stdlib.in.h29
-rw-r--r--gl/str-two-way.h59
-rw-r--r--gl/string.in.h38
-rw-r--r--lib/tests/test_utils.c14
-rwxr-xr-xplugins-scripts/check_oracle.sh15
-rwxr-xr-xplugins-scripts/check_sensors.sh33
-rw-r--r--plugins/Makefile.am95
-rw-r--r--plugins/check_apt.c68
-rw-r--r--plugins/check_dig.c21
-rw-r--r--plugins/check_disk.c18
-rw-r--r--plugins/check_dns.c2
-rw-r--r--plugins/check_fping.c78
-rw-r--r--plugins/check_http.c138
-rw-r--r--plugins/check_mysql.c138
-rw-r--r--plugins/check_nagios.c16
-rw-r--r--plugins/check_nt.c16
-rw-r--r--plugins/check_ntp_peer.c32
-rw-r--r--plugins/check_pgsql.c236
-rw-r--r--plugins/check_procs.c77
-rw-r--r--plugins/check_smtp.c26
-rw-r--r--plugins/check_snmp.c63
-rw-r--r--plugins/check_tcp.c25
-rw-r--r--plugins/runcmd.c2
-rw-r--r--plugins/runcmd.h2
-rw-r--r--plugins/t/check_apt.t90
-rw-r--r--plugins/t/check_apt_input/debian14
-rw-r--r--plugins/t/check_apt_input/debian237
-rw-r--r--plugins/t/check_apt_input/debian342
-rw-r--r--plugins/t/check_apt_input/ubuntu114
-rw-r--r--plugins/t/check_apt_input/ubuntu254
-rw-r--r--plugins/t/check_dig.t22
-rw-r--r--plugins/t/check_http.t32
-rw-r--r--plugins/t/check_procs.t6
-rw-r--r--plugins/t/check_tcp.t4
-rwxr-xr-xplugins/tests/check_http.t13
51 files changed, 1424 insertions, 417 deletions
diff --git a/.gitignore b/.gitignore
index bda7b276..4dca502c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -191,6 +191,7 @@ NP-VERSION-FILE
191/plugins/.libs 191/plugins/.libs
192/plugins/Makefile 192/plugins/Makefile
193/plugins/Makefile.in 193/plugins/Makefile.in
194/plugins/libnpcommon.a
194/plugins/negate 195/plugins/negate
195/plugins/stamp-h* 196/plugins/stamp-h*
196/plugins/urlize 197/plugins/urlize
diff --git a/ChangeLog b/ChangeLog
index 050d42bf..acc35759 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
12013-01-23 Robin Sonefors <robin.sonefors@op5.com>
2
3 * plugins/check_snmp.c: fix memory allocation if using >= 8 oids
4
12012-06-27 Holger Weiss <holger@zedat.fu-berlin.de> 52012-06-27 Holger Weiss <holger@zedat.fu-berlin.de>
2 6
3 * plugins/check_tcp.c: check_tcp: Print performance data even with 7 * plugins/check_tcp.c: check_tcp: Print performance data even with
diff --git a/NEWS b/NEWS
index 293bd9dc..df2652f9 100644
--- a/NEWS
+++ b/NEWS
@@ -4,12 +4,41 @@ This file documents the major additions and syntax changes between releases.
4 ENHANCEMENTS 4 ENHANCEMENTS
5 New check_dbi plugin for checking an (SQL) database using DBI 5 New check_dbi plugin for checking an (SQL) database using DBI
6 Let OpenSSL load its configuration file (see the OPENSSL_config(3) man page) 6 Let OpenSSL load its configuration file (see the OPENSSL_config(3) man page)
7 Add performance data to check_apt
7 Add performance data to check_procs 8 Add performance data to check_procs
9 Added -4/-6 options to check_dig (Ville Mattila)
10 New check_oracle --connect option to perform real login
11 New check_nagios -t option to override the default timeout
12 New check_disk -N/--include-type option to limit the filesystem types to check
13 Allow for building the plugins in parallel
14 Add --without-{dbi,ldap,radius} options to ./configure
15 Made Verbose output of check_sensors compliant (Gabriele Tozzi)
16 New switch -E/--extended-perfdata for check_http to print additional performance data (Sebastian Nohn)
17 New check_http -d option to specify a string to expect within the response headers
18 Add support for executing queries to check_pgsql
19 Let check_pgsql accept a UNIX socket directory as hostname
20 New check_pgsql -o option to specify additional connection parameters
21 New check_fping -S option to specify the source IP address
22 New check_fping -I option to specify the interface to bind to
23 Let check_fping support IPv6
24 New check_procs -k option to ignore kernel threads (on Linux)
25 Let check_procs use /proc/<PID>/exe (if available) instead of getpid(2), unless -T is specified
26 Let check_mysql support SSL
27 Let check_mysql add perfromance metrics for all checks
28 New check_snmp --offset option to allow for adding/substracting an offset value to sensor data
8 29
9 FIXES 30 FIXES
10 Change the MAIL FROM command generated by check_smtp to be RFC compliant 31 Change the MAIL FROM command generated by check_smtp to be RFC compliant
11 Fix compilation of check_http without SSL support 32 Fix compilation of check_http without SSL support
12 Fix check_snmp reversed threshold ranges (backward-compatibility) 33 Fix check_snmp reversed threshold ranges (backward-compatibility)
34 Fix check_snmp memory violation when using more than 8 oids (Robin Sonefors)
35 Fix check_apt security regular expression (Alex Bradley)
36 Fix check_http handling extra header (-k) containing semicolons (Richard Leitner)
37 Fix check_apt handling unknown exit codes from apt-get (Richard Leitner)
38 Fix deprecated imports of check_nmap.py (Fabio Rueda)
39
40 WARNINGS
41 check_http behaviour of -k/--header changed since it does not seperate multiple headers by semicolons anymore. Use multiple -k switches instead.
13 42
141.4.16 27th June 2012 431.4.16 27th June 2012
15 ENHANCEMENTS 44 ENHANCEMENTS
diff --git a/REQUIREMENTS b/REQUIREMENTS
index 9f2eec0f..1f673e98 100644
--- a/REQUIREMENTS
+++ b/REQUIREMENTS
@@ -36,10 +36,9 @@ check_ldap:
36 36
37check_mysql, check_mysql_query: 37check_mysql, check_mysql_query:
38 - Requires the MySQL libraries available from 38 - Requires the MySQL libraries available from
39 http://www.mysql.org/ 39 http://dev.mysql.com/downloads/
40 Lib: libmysql, libmysqlclient 40 Lib: libmysql, libmysqlclient
41 Redhat Powertools Source: mysql-3.20.32a-3.i386.rpm, mysql-devel-3.20.32a-3.i386.rpm (these seem to be broken, however) 41 Redhat Source (RHEL6, YUM): mysql-devel, mysql-libs
42 RPMS from www.mysql.org work better
43 Must have mysql_config in PATH or specified with --with-mysql=DIR for DIR/bin/mysql_config 42 Must have mysql_config in PATH or specified with --with-mysql=DIR for DIR/bin/mysql_config
44 43
45check_pqsql: 44check_pqsql:
diff --git a/THANKS.in b/THANKS.in
index 51935119..54315afa 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -275,3 +275,13 @@ Tobias Brox
275William Leibzon 275William Leibzon
276Jochen Bern 276Jochen Bern
277Anders Kaseorg 277Anders Kaseorg
278Robin Sonefors
279Alex Bradley
280Brian De Wolf
281Richard Leitner
282Diego Elio Pettenò
283Vaclav Ovsik
284Roman Fiedler
285Fabio Rueda
286Gabriele Tozzi
287Sebastian Nohn
diff --git a/configure.in b/configure.in
index 1d4ed006..43fe4ade 100644
--- a/configure.in
+++ b/configure.in
@@ -255,55 +255,66 @@ fi
255LIBS="$_SAVEDLIBS" 255LIBS="$_SAVEDLIBS"
256CPPFLAGS="$_SAVEDCPPFLAGS" 256CPPFLAGS="$_SAVEDCPPFLAGS"
257 257
258AC_ARG_WITH([dbi], [AS_HELP_STRING([--without-dbi], [Skips the dbi plugin])])
258dnl Check for DBI libraries 259dnl Check for DBI libraries
259_SAVEDLIBS="$LIBS" 260AS_IF([test "x$with_dbi" != "xno"], [
260AC_CHECK_LIB(dbi,dbi_initialize) 261 _SAVEDLIBS="$LIBS"
261if test "$ac_cv_lib_dbi_dbi_initialize" = "yes"; then 262 AC_CHECK_LIB(dbi,dbi_initialize)
262 EXTRAS="$EXTRAS check_dbi" 263 if test "$ac_cv_lib_dbi_dbi_initialize" = "yes"; then
263 DBILIBS="-ldbi" 264 EXTRAS="$EXTRAS check_dbi"
264 AC_SUBST(DBILIBS) 265 DBILIBS="-ldbi"
265else 266 AC_SUBST(DBILIBS)
266 AC_MSG_WARN([Skipping dbi plugin]) 267 else
267 AC_MSG_WARN([install DBI libs to compile this plugin (see REQUIREMENTS).]) 268 AC_MSG_WARN([Skipping dbi plugin])
268fi 269 AC_MSG_WARN([install DBI libs to compile this plugin (see REQUIREMENTS).])
269LIBS="$_SAVEDLIBS" 270 fi
271 LIBS="$_SAVEDLIBS"
272])
273
274AC_ARG_WITH([radius], [AS_HELP_STRING([--without-radius], [Skips the radius plugin])])
270 275
271dnl Check for radius libraries 276dnl Check for radius libraries
272_SAVEDLIBS="$LIBS" 277AS_IF([test "x$with_radius" != "xno"], [
273AC_CHECK_LIB(radiusclient,rc_read_config) 278 _SAVEDLIBS="$LIBS"
274if test "$ac_cv_lib_radiusclient_rc_read_config" = "yes"; then 279 AC_CHECK_LIB(radiusclient,rc_read_config)
275 EXTRAS="$EXTRAS check_radius" 280 if test "$ac_cv_lib_radiusclient_rc_read_config" = "yes"; then
276 RADIUSLIBS="-lradiusclient"
277 AC_SUBST(RADIUSLIBS)
278else
279 AC_CHECK_LIB(radiusclient-ng,rc_read_config)
280 if test "$ac_cv_lib_radiusclient_ng_rc_read_config" = "yes"; then
281 EXTRAS="$EXTRAS check_radius" 281 EXTRAS="$EXTRAS check_radius"
282 RADIUSLIBS="-lradiusclient-ng" 282 RADIUSLIBS="-lradiusclient"
283 AC_SUBST(RADIUSLIBS) 283 AC_SUBST(RADIUSLIBS)
284 else 284 else
285 AC_MSG_WARN([Skipping radius plugin]) 285 AC_CHECK_LIB(radiusclient-ng,rc_read_config)
286 AC_MSG_WARN([install radius libs to compile this plugin (see REQUIREMENTS).]) 286 if test "$ac_cv_lib_radiusclient_ng_rc_read_config" = "yes"; then
287 EXTRAS="$EXTRAS check_radius"
288 RADIUSLIBS="-lradiusclient-ng"
289 AC_SUBST(RADIUSLIBS)
290 else
291 AC_MSG_WARN([Skipping radius plugin])
292 AC_MSG_WARN([install radius libs to compile this plugin (see REQUIREMENTS).])
293 fi
287 fi 294 fi
288fi 295 LIBS="$_SAVEDLIBS"
289LIBS="$_SAVEDLIBS" 296])
297
298AC_ARG_WITH([ldap], [AS_HELP_STRING([--without-ldap], [Skips the LDAP plugin])])
290 299
291dnl Check for LDAP libraries 300dnl Check for LDAP libraries
292_SAVEDLIBS="$LIBS" 301AS_IF([test "x$with_ldap" != "xno"], [
293AC_CHECK_LIB(ldap,main,,,-llber) 302 _SAVEDLIBS="$LIBS"
294if test "$ac_cv_lib_ldap_main" = "yes"; then 303 AC_CHECK_LIB(ldap,main,,,-llber)
295 LDAPLIBS="-lldap -llber"\ 304 if test "$ac_cv_lib_ldap_main" = "yes"; then
296 LDAPINCLUDE="-I/usr/include/ldap" 305 LDAPLIBS="-lldap -llber"\
297 AC_SUBST(LDAPLIBS) 306 LDAPINCLUDE="-I/usr/include/ldap"
298 AC_SUBST(LDAPINCLUDE) 307 AC_SUBST(LDAPLIBS)
299 AC_CHECK_FUNCS(ldap_set_option) 308 AC_SUBST(LDAPINCLUDE)
300 EXTRAS="$EXTRAS check_ldap" 309 AC_CHECK_FUNCS(ldap_set_option)
301 AC_CHECK_FUNCS(ldap_init ldap_set_option ldap_get_option ldap_start_tls_s) 310 EXTRAS="$EXTRAS check_ldap"
302else 311 AC_CHECK_FUNCS(ldap_init ldap_set_option ldap_get_option ldap_start_tls_s)
303 AC_MSG_WARN([Skipping LDAP plugin]) 312 else
304 AC_MSG_WARN([install LDAP libs to compile this plugin (see REQUIREMENTS).]) 313 AC_MSG_WARN([Skipping LDAP plugin])
305fi 314 AC_MSG_WARN([install LDAP libs to compile this plugin (see REQUIREMENTS).])
306LIBS="$_SAVEDLIBS" 315 fi
316 LIBS="$_SAVEDLIBS"
317])
307 318
308dnl Check for headers used by check_ide_smart 319dnl Check for headers used by check_ide_smart
309AC_CHECK_HEADER(linux/hdreg.h, FOUNDINCLUDE=yes, FOUNDINCLUDE=no) 320AC_CHECK_HEADER(linux/hdreg.h, FOUNDINCLUDE=yes, FOUNDINCLUDE=no)
@@ -1367,13 +1378,22 @@ then
1367fi 1378fi
1368 1379
1369AC_PATH_PROG(PATH_TO_FPING,fping) 1380AC_PATH_PROG(PATH_TO_FPING,fping)
1381AC_PATH_PROG(PATH_TO_FPING6,fping6)
1382
1370AC_ARG_WITH(fping_command, 1383AC_ARG_WITH(fping_command,
1371 ACX_HELP_STRING([--with-fping-command=PATH], 1384 ACX_HELP_STRING([--with-fping-command=PATH],
1372 [Path to fping command]), PATH_TO_FPING=$withval) 1385 [Path to fping command]), PATH_TO_FPING=$withval)
1386AC_ARG_WITH(fping6_command,
1387 ACX_HELP_STRING([--with-fping6-command=PATH],
1388 [Path to fping6 command]), PATH_TO_FPING6=$withval)
1389
1373if test -n "$PATH_TO_FPING" 1390if test -n "$PATH_TO_FPING"
1374then 1391then
1375 AC_DEFINE_UNQUOTED(PATH_TO_FPING,"$PATH_TO_FPING",[path to fping]) 1392 AC_DEFINE_UNQUOTED(PATH_TO_FPING,"$PATH_TO_FPING",[path to fping])
1376 EXTRAS="$EXTRAS check_fping" 1393 EXTRAS="$EXTRAS check_fping"
1394 if test x"$with_ipv6" != xno && test -n "$PATH_TO_FPING6"; then
1395 AC_DEFINE_UNQUOTED(PATH_TO_FPING6,"$PATH_TO_FPING6",[path to fping6])
1396 fi
1377else 1397else
1378 AC_MSG_WARN([Get fping from http://www.fping.com in order to make check_fping plugin]) 1398 AC_MSG_WARN([Get fping from http://www.fping.com in order to make check_fping plugin])
1379fi 1399fi
diff --git a/contrib/check_linux_raid.pl b/contrib/check_linux_raid.pl
index c24b0cd2..6650a42b 100644
--- a/contrib/check_linux_raid.pl
+++ b/contrib/check_linux_raid.pl
@@ -28,8 +28,8 @@ use utils qw(%ERRORS);
28 28
29# die with an error if we're not on Linux 29# die with an error if we're not on Linux
30if ($^O ne 'linux') { 30if ($^O ne 'linux') {
31 print "This plugin only applicable on Linux.\n"; 31 print "This plugin only applicable on Linux.\n";
32 exit $ERRORS{'UNKNOWN'}; 32 exit $ERRORS{'UNKNOWN'};
33} 33}
34 34
35sub max_state($$){ 35sub max_state($$){
@@ -50,6 +50,7 @@ my $code = "UNKNOWN";
50my $msg = ""; 50my $msg = "";
51my %status; 51my %status;
52my %recovery; 52my %recovery;
53my %resyncing;
53my %finish; 54my %finish;
54my %active; 55my %active;
55my %devices; 56my %devices;
@@ -65,6 +66,10 @@ while(defined $nextdev){
65 $recovery{$device} = $1; 66 $recovery{$device} = $1;
66 ($finish{$device}) = /finish=(.*?min)/; 67 ($finish{$device}) = /finish=(.*?min)/;
67 $device=undef; 68 $device=undef;
69 } elsif (/resync =\s+(.*?)\s/) {
70 $resyncing{$device} = $1;
71 ($finish{$device}) = /finish=(.*?min)/;
72 $device=undef;
68 } elsif (/^\s*$/) { 73 } elsif (/^\s*$/) {
69 $device=undef; 74 $device=undef;
70 } 75 }
@@ -95,8 +100,14 @@ foreach my $k (sort keys %devices){
95 $code = max_state($code, "CRITICAL"); 100 $code = max_state($code, "CRITICAL");
96 } 101 }
97 } elsif ($status{$k} =~ /U+/) { 102 } elsif ($status{$k} =~ /U+/) {
98 $msg .= sprintf " %s status=%s.", $devices{$k}, $status{$k}; 103 if (defined $resyncing{$k}) {
99 $code = max_state($code, "OK"); 104 $msg .= sprintf " %s status=%s, resync=%s, finish=%s.",
105 $devices{$k}, $status{$k}, $resyncing{$k}, $finish{$k};
106 $code = max_state($code, "WARNING");
107 } else {
108 $msg .= sprintf " %s status=%s.", $devices{$k}, $status{$k};
109 $code = max_state($code, "OK");
110 }
100 } else { 111 } else {
101 if ($active{$k}) { 112 if ($active{$k}) {
102 $msg .= sprintf " %s active with no status information.", 113 $msg .= sprintf " %s active with no status information.",
@@ -112,4 +123,3 @@ foreach my $k (sort keys %devices){
112 123
113print $code, $msg, "\n"; 124print $code, $msg, "\n";
114exit ($ERRORS{$code}); 125exit ($ERRORS{$code});
115
diff --git a/contrib/check_nmap.py b/contrib/check_nmap.py
index 07f6d7fa..481a62bf 100644
--- a/contrib/check_nmap.py
+++ b/contrib/check_nmap.py
@@ -43,7 +43,7 @@ _version_ = '1.21'
43# 0.20 2000-07-10 jaclu Initial release 43# 0.20 2000-07-10 jaclu Initial release
44 44
45 45
46import sys, os, string, whrandom 46import sys, os, string, random
47 47
48import tempfile 48import tempfile
49from getopt import getopt 49from getopt import getopt
@@ -207,8 +207,7 @@ class CheckNmap:
207 # _if_ two processes in deed get the same tmp-file 207 # _if_ two processes in deed get the same tmp-file
208 # the only result is a normal error message to nagios 208 # the only result is a normal error message to nagios
209 # 209 #
210 r=whrandom.whrandom() 210 self.tmp_file=tempfile.mktemp('.%s') % random.randint(0,100000)
211 self.tmp_file=tempfile.mktemp('.%s')%r.randint(0,100000)
212 if self.debug: 211 if self.debug:
213 print 'Tmpfile is: %s'%self.tmp_file 212 print 'Tmpfile is: %s'%self.tmp_file
214 # 213 #
@@ -388,7 +387,7 @@ Version: %s""" % _version_
388 387
389def doc_syntax(): 388def doc_syntax():
390 print """ 389 print """
391Usage: check_ports [-v|--debug] [-H|--host host] [-V|--version] [-h|--help] 390Usage: check_nmap.py [-v|--debug] [-H|--host host] [-V|--version] [-h|--help]
392 [-o|--optional port1,port2,port3 ...] [-r|--range range] 391 [-o|--optional port1,port2,port3 ...] [-r|--range range]
393 [-p|--port port1,port2,port3 ...] [-t|--timeout timeout]""" 392 [-p|--port port1,port2,port3 ...] [-t|--timeout timeout]"""
394 393
diff --git a/gl/Makefile.am b/gl/Makefile.am
index e9e23026..edc7db15 100644
--- a/gl/Makefile.am
+++ b/gl/Makefile.am
@@ -1182,6 +1182,7 @@ stdlib.h: stdlib.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
1182 sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ 1182 sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
1183 -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ 1183 -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
1184 -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ 1184 -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
1185 -e 's|@''GNULIB__EXIT''@|$(GNULIB__EXIT)|g' \
1185 -e 's|@''GNULIB_ATOLL''@|$(GNULIB_ATOLL)|g' \ 1186 -e 's|@''GNULIB_ATOLL''@|$(GNULIB_ATOLL)|g' \
1186 -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \ 1187 -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \
1187 -e 's|@''GNULIB_CANONICALIZE_FILE_NAME''@|$(GNULIB_CANONICALIZE_FILE_NAME)|g' \ 1188 -e 's|@''GNULIB_CANONICALIZE_FILE_NAME''@|$(GNULIB_CANONICALIZE_FILE_NAME)|g' \
@@ -1206,13 +1207,12 @@ stdlib.h: stdlib.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
1206 -e 's|@''GNULIB_STRTOULL''@|$(GNULIB_STRTOULL)|g' \ 1207 -e 's|@''GNULIB_STRTOULL''@|$(GNULIB_STRTOULL)|g' \
1207 -e 's|@''GNULIB_UNLOCKPT''@|$(GNULIB_UNLOCKPT)|g' \ 1208 -e 's|@''GNULIB_UNLOCKPT''@|$(GNULIB_UNLOCKPT)|g' \
1208 -e 's|@''GNULIB_UNSETENV''@|$(GNULIB_UNSETENV)|g' \ 1209 -e 's|@''GNULIB_UNSETENV''@|$(GNULIB_UNSETENV)|g' \
1210 -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
1209 -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \ 1211 -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
1210 -e 's|@''HAVE_CALLOC_POSIX''@|$(HAVE_CALLOC_POSIX)|g' \
1211 -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \ 1212 -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
1212 -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \ 1213 -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
1213 -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ 1214 -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
1214 -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \ 1215 -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
1215 -e 's|@''HAVE_MALLOC_POSIX''@|$(HAVE_MALLOC_POSIX)|g' \
1216 -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ 1216 -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
1217 -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \ 1217 -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
1218 -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \ 1218 -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
@@ -1221,7 +1221,6 @@ stdlib.h: stdlib.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
1221 -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \ 1221 -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
1222 -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \ 1222 -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
1223 -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \ 1223 -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
1224 -e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \
1225 -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \ 1224 -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
1226 -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \ 1225 -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
1227 -e 's|@''HAVE_SETENV''@|$(HAVE_SETENV)|g' \ 1226 -e 's|@''HAVE_SETENV''@|$(HAVE_SETENV)|g' \
@@ -1232,9 +1231,12 @@ stdlib.h: stdlib.in.h $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
1232 -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \ 1231 -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
1233 -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \ 1232 -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
1234 -e 's|@''HAVE_UNSETENV''@|$(HAVE_UNSETENV)|g' \ 1233 -e 's|@''HAVE_UNSETENV''@|$(HAVE_UNSETENV)|g' \
1234 -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
1235 -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \ 1235 -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
1236 -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
1236 -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ 1237 -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
1237 -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ 1238 -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
1239 -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
1238 -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \ 1240 -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
1239 -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \ 1241 -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
1240 -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ 1242 -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
diff --git a/gl/fsusage.c b/gl/fsusage.c
index 10db467d..17102aad 100644
--- a/gl/fsusage.c
+++ b/gl/fsusage.c
@@ -94,7 +94,7 @@
94int 94int
95get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) 95get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
96{ 96{
97#if defined STAT_STATVFS /* POSIX */ 97#if defined STAT_STATVFS /* POSIX, except glibc/Linux */
98 98
99 struct statvfs fsd; 99 struct statvfs fsd;
100 100
@@ -156,7 +156,7 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
156 : (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1)); 156 : (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1));
157 fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode); 157 fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode);
158 158
159#elif defined STAT_STATFS3_OSF1 159#elif defined STAT_STATFS3_OSF1 /* OSF/1 */
160 160
161 struct statfs fsd; 161 struct statfs fsd;
162 162
@@ -165,7 +165,9 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
165 165
166 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); 166 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
167 167
168#elif defined STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */ 168#elif defined STAT_STATFS2_BSIZE /* glibc/Linux, 4.3BSD, SunOS 4, \
169 MacOS X < 10.4, FreeBSD < 5.0, \
170 NetBSD < 3.0, OpenBSD < 4.4 */
169 171
170 struct statfs fsd; 172 struct statfs fsd;
171 173
@@ -189,7 +191,7 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
189 } 191 }
190# endif /* STATFS_TRUNCATES_BLOCK_COUNTS */ 192# endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
191 193
192#elif defined STAT_STATFS2_FSIZE /* 4.4BSD */ 194#elif defined STAT_STATFS2_FSIZE /* 4.4BSD and older NetBSD */
193 195
194 struct statfs fsd; 196 struct statfs fsd;
195 197
@@ -198,7 +200,8 @@ get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
198 200
199 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize); 201 fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
200 202
201#elif defined STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */ 203#elif defined STAT_STATFS4 /* SVR3, Dynix, old Irix, old AIX, \
204 Dolphin */
202 205
203# if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN 206# if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN
204# define f_bavail f_bfree 207# define f_bavail f_bfree
diff --git a/gl/m4/fcntl-o.m4 b/gl/m4/fcntl-o.m4
index d416a61c..1adacc8a 100644
--- a/gl/m4/fcntl-o.m4
+++ b/gl/m4/fcntl-o.m4
@@ -1,4 +1,4 @@
1# fcntl-o.m4 serial 1 1# fcntl-o.m4 serial 2
2dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. 2dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation 3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it, 4dnl gives unlimited permission to copy and/or distribute it,
@@ -12,7 +12,11 @@ dnl Written by Paul Eggert.
12AC_DEFUN([gl_FCNTL_O_FLAGS], 12AC_DEFUN([gl_FCNTL_O_FLAGS],
13[ 13[
14 dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW. 14 dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
15 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) 15 dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
16 dnl AC_GNU_SOURCE.
17 m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
18 [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
19 [AC_REQUIRE([AC_GNU_SOURCE])])
16 AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], 20 AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
17 [AC_RUN_IFELSE( 21 [AC_RUN_IFELSE(
18 [AC_LANG_PROGRAM( 22 [AC_LANG_PROGRAM(
diff --git a/gl/m4/fsusage.m4 b/gl/m4/fsusage.m4
index 216b9dd8..68684c27 100644
--- a/gl/m4/fsusage.m4
+++ b/gl/m4/fsusage.m4
@@ -1,4 +1,4 @@
1# serial 25 1# serial 26
2# Obtaining file system usage information. 2# Obtaining file system usage information.
3 3
4# Copyright (C) 1997-1998, 2000-2001, 2003-2010 Free Software Foundation, Inc. 4# Copyright (C) 1997-1998, 2000-2001, 2003-2010 Free Software Foundation, Inc.
@@ -44,7 +44,8 @@ ac_fsusage_space=no
44# systems. That system is reported to work fine with STAT_STATFS4 which 44# systems. That system is reported to work fine with STAT_STATFS4 which
45# is what it gets when this test fails. 45# is what it gets when this test fails.
46if test $ac_fsusage_space = no; then 46if test $ac_fsusage_space = no; then
47 # SVR4 47 # glibc/{Hurd,kFreeBSD}, MacOS X >= 10.4, FreeBSD >= 5.0, NetBSD >= 3.0,
48 # OpenBSD >= 4.4, AIX, HP-UX, IRIX, Solaris, Cygwin, Interix, BeOS.
48 AC_CACHE_CHECK([for statvfs function (SVR4)], [fu_cv_sys_stat_statvfs], 49 AC_CACHE_CHECK([for statvfs function (SVR4)], [fu_cv_sys_stat_statvfs],
49 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> 50 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
50#if defined __GLIBC__ && defined __linux__ 51#if defined __GLIBC__ && defined __linux__
@@ -97,8 +98,13 @@ if test $ac_fsusage_space = no; then
97fi 98fi
98 99
99if test $ac_fsusage_space = no; then 100if test $ac_fsusage_space = no; then
100# AIX 101 # glibc/Linux, MacOS X < 10.4, FreeBSD < 5.0, NetBSD < 3.0, OpenBSD < 4.4.
101 AC_MSG_CHECKING([for two-argument statfs with statfs.bsize dnl 102 # (glibc/{Hurd,kFreeBSD}, MacOS X >= 10.4, FreeBSD >= 5.0, NetBSD >= 3.0,
103 # OpenBSD >= 4.4, AIX, HP-UX, OSF/1, Cygwin already handled above.)
104 # (On IRIX you need to include <sys/statfs.h>, not only <sys/mount.h> and
105 # <sys/vfs.h>.)
106 # (On Solaris, statfs has 4 arguments.)
107 AC_MSG_CHECKING([for two-argument statfs with statfs.f_bsize dnl
102member (AIX, 4.3BSD)]) 108member (AIX, 4.3BSD)])
103 AC_CACHE_VAL([fu_cv_sys_stat_statfs2_bsize], 109 AC_CACHE_VAL([fu_cv_sys_stat_statfs2_bsize],
104 [AC_RUN_IFELSE([AC_LANG_SOURCE([[ 110 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
@@ -131,7 +137,8 @@ member (AIX, 4.3BSD)])
131fi 137fi
132 138
133if test $ac_fsusage_space = no; then 139if test $ac_fsusage_space = no; then
134# SVR3 140 # SVR3
141 # (Solaris already handled above.)
135 AC_MSG_CHECKING([for four-argument statfs (AIX-3.2.5, SVR3)]) 142 AC_MSG_CHECKING([for four-argument statfs (AIX-3.2.5, SVR3)])
136 AC_CACHE_VAL([fu_cv_sys_stat_statfs4], 143 AC_CACHE_VAL([fu_cv_sys_stat_statfs4],
137 [AC_RUN_IFELSE([AC_LANG_SOURCE([[ 144 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
@@ -150,13 +157,17 @@ if test $ac_fsusage_space = no; then
150 if test $fu_cv_sys_stat_statfs4 = yes; then 157 if test $fu_cv_sys_stat_statfs4 = yes; then
151 ac_fsusage_space=yes 158 ac_fsusage_space=yes
152 AC_DEFINE([STAT_STATFS4], [1], 159 AC_DEFINE([STAT_STATFS4], [1],
153 [ Define if statfs takes 4 args. (SVR3, Dynix, Irix, Dolphin)]) 160 [ Define if statfs takes 4 args. (SVR3, Dynix, old Irix, old AIX, Dolphin)])
154 fi 161 fi
155fi 162fi
156 163
157if test $ac_fsusage_space = no; then 164if test $ac_fsusage_space = no; then
158# 4.4BSD and NetBSD 165 # 4.4BSD and older NetBSD
159 AC_MSG_CHECKING([for two-argument statfs with statfs.fsize dnl 166 # (OSF/1 already handled above.)
167 # (On AIX, you need to include <sys/statfs.h>, not only <sys/mount.h>.)
168 # (On Solaris, statfs has 4 arguments and 'struct statfs' is not declared in
169 # <sys/mount.h>.)
170 AC_MSG_CHECKING([for two-argument statfs with statfs.f_fsize dnl
160member (4.4BSD and NetBSD)]) 171member (4.4BSD and NetBSD)])
161 AC_CACHE_VAL([fu_cv_sys_stat_statfs2_fsize], 172 AC_CACHE_VAL([fu_cv_sys_stat_statfs2_fsize],
162 [AC_RUN_IFELSE([AC_LANG_SOURCE([[ 173 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
@@ -223,6 +234,7 @@ fi
223 234
224if test $ac_fsusage_space = no; then 235if test $ac_fsusage_space = no; then
225 # SVR2 236 # SVR2
237 # (AIX, HP-UX, OSF/1 already handled above.)
226 AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <sys/filsys.h> 238 AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <sys/filsys.h>
227 ]])], 239 ]])],
228 [AC_DEFINE([STAT_READ_FILSYS], [1], 240 [AC_DEFINE([STAT_READ_FILSYS], [1],
diff --git a/gl/m4/gnulib-comp.m4 b/gl/m4/gnulib-comp.m4
index fc3f3538..b5e6b438 100644
--- a/gl/m4/gnulib-comp.m4
+++ b/gl/m4/gnulib-comp.m4
@@ -254,7 +254,7 @@ AC_DEFUN([gl_INIT],
254 # Code from module locale: 254 # Code from module locale:
255 gl_LOCALE_H 255 gl_LOCALE_H
256 # Code from module malloc: 256 # Code from module malloc:
257 AC_FUNC_MALLOC 257 gl_FUNC_MALLOC_GNU
258 AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.]) 258 AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.])
259 # Code from module malloc-posix: 259 # Code from module malloc-posix:
260 gl_FUNC_MALLOC_POSIX 260 gl_FUNC_MALLOC_POSIX
diff --git a/gl/m4/lib-link.m4 b/gl/m4/lib-link.m4
index 59b367df..9f3be3a2 100644
--- a/gl/m4/lib-link.m4
+++ b/gl/m4/lib-link.m4
@@ -1,4 +1,4 @@
1# lib-link.m4 serial 23 (gettext-0.18.2) 1# lib-link.m4 serial 24 (gettext-0.18.2)
2dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. 2dnl Copyright (C) 2001-2010 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation 3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it, 4dnl gives unlimited permission to copy and/or distribute it,
@@ -165,7 +165,7 @@ AC_DEFUN([AC_LIB_FROMPACKAGE],
165 pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], 165 pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
166 [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) 166 [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
167 define([acl_libsinpackage_]PACKUP, 167 define([acl_libsinpackage_]PACKUP,
168 m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) 168 m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
169 popdef([PACKUP]) 169 popdef([PACKUP])
170 popdef([PACK]) 170 popdef([PACK])
171]) 171])
diff --git a/gl/m4/malloc.m4 b/gl/m4/malloc.m4
index 910ac922..fe5befc2 100644
--- a/gl/m4/malloc.m4
+++ b/gl/m4/malloc.m4
@@ -1,25 +1,40 @@
1# malloc.m4 serial 9 1# malloc.m4 serial 10
2dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. 2dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation 3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it, 4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved. 5dnl with or without modifications, as long as this notice is preserved.
6 6
7# gl_FUNC_MALLOC_GNU
8# ------------------
9# Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if
10# it is not.
11AC_DEFUN([gl_FUNC_MALLOC_GNU],
12[
13 AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
14 dnl _AC_FUNC_MALLOC_IF is defined in Autoconf.
15 _AC_FUNC_MALLOC_IF(
16 [AC_DEFINE([HAVE_MALLOC], [1],
17 [Define to 1 if your system has a GNU libc compatible 'malloc'
18 function, and to 0 otherwise.])],
19 [AC_DEFINE([HAVE_MALLOC], [0])
20 gl_REPLACE_MALLOC
21 ])
22])
23
7# gl_FUNC_MALLOC_POSIX 24# gl_FUNC_MALLOC_POSIX
8# -------------------- 25# --------------------
9# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it 26# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it
10# fails), and replace malloc if it is not. 27# fails), and replace malloc if it is not.
11AC_DEFUN([gl_FUNC_MALLOC_POSIX], 28AC_DEFUN([gl_FUNC_MALLOC_POSIX],
12[ 29[
30 AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
13 AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) 31 AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
14 if test $gl_cv_func_malloc_posix = yes; then 32 if test $gl_cv_func_malloc_posix = yes; then
15 HAVE_MALLOC_POSIX=1
16 AC_DEFINE([HAVE_MALLOC_POSIX], [1], 33 AC_DEFINE([HAVE_MALLOC_POSIX], [1],
17 [Define if the 'malloc' function is POSIX compliant.]) 34 [Define if the 'malloc' function is POSIX compliant.])
18 else 35 else
19 AC_LIBOBJ([malloc]) 36 gl_REPLACE_MALLOC
20 HAVE_MALLOC_POSIX=0
21 fi 37 fi
22 AC_SUBST([HAVE_MALLOC_POSIX])
23]) 38])
24 39
25# Test whether malloc, realloc, calloc are POSIX compliant, 40# Test whether malloc, realloc, calloc are POSIX compliant,
@@ -39,3 +54,9 @@ AC_DEFUN([gl_CHECK_MALLOC_POSIX],
39 ], [gl_cv_func_malloc_posix=yes], [gl_cv_func_malloc_posix=no]) 54 ], [gl_cv_func_malloc_posix=yes], [gl_cv_func_malloc_posix=no])
40 ]) 55 ])
41]) 56])
57
58AC_DEFUN([gl_REPLACE_MALLOC],
59[
60 AC_LIBOBJ([malloc])
61 REPLACE_MALLOC=1
62])
diff --git a/gl/m4/stdlib_h.m4 b/gl/m4/stdlib_h.m4
index dd84796d..fc150197 100644
--- a/gl/m4/stdlib_h.m4
+++ b/gl/m4/stdlib_h.m4
@@ -1,4 +1,4 @@
1# stdlib_h.m4 serial 28 1# stdlib_h.m4 serial 30
2dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. 2dnl Copyright (C) 2007-2010 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation 3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it, 4dnl gives unlimited permission to copy and/or distribute it,
@@ -33,7 +33,7 @@ AC_DEFUN([gl_STDLIB_H],
33#if HAVE_RANDOM_H 33#if HAVE_RANDOM_H
34# include <random.h> 34# include <random.h>
35#endif 35#endif
36 ]], [atoll canonicalize_file_name getloadavg getsubopt grantpt mkdtemp 36 ]], [_Exit atoll canonicalize_file_name getloadavg getsubopt grantpt mkdtemp
37 mkostemp mkostemps mkstemp mkstemps ptsname random_r initstat_r srandom_r 37 mkostemp mkostemps mkstemp mkstemps ptsname random_r initstat_r srandom_r
38 setstate_r realpath rpmatch setenv strtod strtoll strtoull unlockpt 38 setstate_r realpath rpmatch setenv strtod strtoll strtoull unlockpt
39 unsetenv]) 39 unsetenv])
@@ -50,6 +50,7 @@ AC_DEFUN([gl_STDLIB_MODULE_INDICATOR],
50 50
51AC_DEFUN([gl_STDLIB_H_DEFAULTS], 51AC_DEFUN([gl_STDLIB_H_DEFAULTS],
52[ 52[
53 GNULIB__EXIT=0; AC_SUBST([GNULIB__EXIT])
53 GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL]) 54 GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL])
54 GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) 55 GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX])
55 GNULIB_CANONICALIZE_FILE_NAME=0; AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME]) 56 GNULIB_CANONICALIZE_FILE_NAME=0; AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME])
@@ -75,13 +76,12 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
75 GNULIB_UNLOCKPT=0; AC_SUBST([GNULIB_UNLOCKPT]) 76 GNULIB_UNLOCKPT=0; AC_SUBST([GNULIB_UNLOCKPT])
76 GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV]) 77 GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV])
77 dnl Assume proper GNU behavior unless another module says otherwise. 78 dnl Assume proper GNU behavior unless another module says otherwise.
79 HAVE__EXIT=1; AC_SUBST([HAVE__EXIT])
78 HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL]) 80 HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL])
79 HAVE_CALLOC_POSIX=1; AC_SUBST([HAVE_CALLOC_POSIX])
80 HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME]) 81 HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME])
81 HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG]) 82 HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG])
82 HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) 83 HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT])
83 HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT]) 84 HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT])
84 HAVE_MALLOC_POSIX=1; AC_SUBST([HAVE_MALLOC_POSIX])
85 HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) 85 HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP])
86 HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP]) 86 HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP])
87 HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS]) 87 HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS])
@@ -89,7 +89,6 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
89 HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS]) 89 HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS])
90 HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME]) 90 HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME])
91 HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R]) 91 HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R])
92 HAVE_REALLOC_POSIX=1; AC_SUBST([HAVE_REALLOC_POSIX])
93 HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH]) 92 HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH])
94 HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH]) 93 HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH])
95 HAVE_SETENV=1; AC_SUBST([HAVE_SETENV]) 94 HAVE_SETENV=1; AC_SUBST([HAVE_SETENV])
@@ -100,9 +99,12 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
100 HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H]) 99 HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H])
101 HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT]) 100 HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT])
102 HAVE_UNSETENV=1; AC_SUBST([HAVE_UNSETENV]) 101 HAVE_UNSETENV=1; AC_SUBST([HAVE_UNSETENV])
102 REPLACE_CALLOC=0; AC_SUBST([REPLACE_CALLOC])
103 REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME]) 103 REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME])
104 REPLACE_MALLOC=0; AC_SUBST([REPLACE_MALLOC])
104 REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) 105 REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP])
105 REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV]) 106 REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV])
107 REPLACE_REALLOC=0; AC_SUBST([REPLACE_REALLOC])
106 REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH]) 108 REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH])
107 REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV]) 109 REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV])
108 REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD]) 110 REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD])
diff --git a/gl/stdlib.in.h b/gl/stdlib.in.h
index d74c2518..d4ac4690 100644
--- a/gl/stdlib.in.h
+++ b/gl/stdlib.in.h
@@ -74,6 +74,12 @@ struct random_data
74# include <unistd.h> 74# include <unistd.h>
75#endif 75#endif
76 76
77#ifndef __attribute__
78# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
79# define __attribute__(Spec) /* empty */
80# endif
81#endif
82
77/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ 83/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
78 84
79/* The definition of _GL_ARG_NONNULL is copied here. */ 85/* The definition of _GL_ARG_NONNULL is copied here. */
@@ -95,6 +101,23 @@ struct random_data
95#endif 101#endif
96 102
97 103
104#if @GNULIB__EXIT@
105/* Terminate the current process with the given return code, without running
106 the 'atexit' handlers. */
107# if !@HAVE__EXIT@
108_GL_FUNCDECL_SYS (_Exit, void, (int status) __attribute__ ((__noreturn__)));
109# endif
110_GL_CXXALIAS_SYS (_Exit, void, (int status));
111_GL_CXXALIASWARN (_Exit);
112#elif defined GNULIB_POSIXCHECK
113# undef _Exit
114# if HAVE_RAW_DECL__EXIT
115_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
116 "use gnulib module _Exit for portability");
117# endif
118#endif
119
120
98#if @GNULIB_ATOLL@ 121#if @GNULIB_ATOLL@
99/* Parse a signed decimal integer. 122/* Parse a signed decimal integer.
100 Returns the value of the integer. Errors are not detected. */ 123 Returns the value of the integer. Errors are not detected. */
@@ -112,7 +135,7 @@ _GL_WARN_ON_USE (atoll, "atoll is unportable - "
112#endif 135#endif
113 136
114#if @GNULIB_CALLOC_POSIX@ 137#if @GNULIB_CALLOC_POSIX@
115# if !@HAVE_CALLOC_POSIX@ 138# if @REPLACE_CALLOC@
116# if !(defined __cplusplus && defined GNULIB_NAMESPACE) 139# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
117# undef calloc 140# undef calloc
118# define calloc rpl_calloc 141# define calloc rpl_calloc
@@ -218,7 +241,7 @@ _GL_WARN_ON_USE (ptsname, "grantpt is not portable - "
218#endif 241#endif
219 242
220#if @GNULIB_MALLOC_POSIX@ 243#if @GNULIB_MALLOC_POSIX@
221# if !@HAVE_MALLOC_POSIX@ 244# if @REPLACE_MALLOC@
222# if !(defined __cplusplus && defined GNULIB_NAMESPACE) 245# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
223# undef malloc 246# undef malloc
224# define malloc rpl_malloc 247# define malloc rpl_malloc
@@ -477,7 +500,7 @@ _GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
477 500
478 501
479#if @GNULIB_REALLOC_POSIX@ 502#if @GNULIB_REALLOC_POSIX@
480# if !@HAVE_REALLOC_POSIX@ 503# if @REPLACE_REALLOC@
481# if !(defined __cplusplus && defined GNULIB_NAMESPACE) 504# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
482# undef realloc 505# undef realloc
483# define realloc rpl_realloc 506# define realloc rpl_realloc
diff --git a/gl/str-two-way.h b/gl/str-two-way.h
index c08f60ef..4d555f92 100644
--- a/gl/str-two-way.h
+++ b/gl/str-two-way.h
@@ -95,26 +95,37 @@
95 A critical factorization has the property that the local period 95 A critical factorization has the property that the local period
96 equals the global period. All strings have at least one critical 96 equals the global period. All strings have at least one critical
97 factorization with the left half smaller than the global period. 97 factorization with the left half smaller than the global period.
98 And while some strings have more than one critical factorization,
99 it is provable that with an ordered alphabet, at least one of the
100 critical factorizations corresponds to a maximal suffix.
98 101
99 Given an ordered alphabet, a critical factorization can be computed 102 Given an ordered alphabet, a critical factorization can be computed
100 in linear time, with 2 * NEEDLE_LEN comparisons, by computing the 103 in linear time, with 2 * NEEDLE_LEN comparisons, by computing the
101 larger of two ordered maximal suffixes. The ordered maximal 104 shorter of two ordered maximal suffixes. The ordered maximal
102 suffixes are determined by lexicographic comparison of 105 suffixes are determined by lexicographic comparison while tracking
103 periodicity. */ 106 periodicity. */
104static size_t 107static size_t
105critical_factorization (const unsigned char *needle, size_t needle_len, 108critical_factorization (const unsigned char *needle, size_t needle_len,
106 size_t *period) 109 size_t *period)
107{ 110{
108 /* Index of last byte of left half, or SIZE_MAX. */ 111 /* Index of last byte of left half. */
109 size_t max_suffix, max_suffix_rev; 112 size_t max_suffix, max_suffix_rev;
110 size_t j; /* Index into NEEDLE for current candidate suffix. */ 113 size_t j; /* Index into NEEDLE for current candidate suffix. */
111 size_t k; /* Offset into current period. */ 114 size_t k; /* Offset into current period. */
112 size_t p; /* Intermediate period. */ 115 size_t p; /* Intermediate period. */
113 unsigned char a, b; /* Current comparison bytes. */ 116 unsigned char a, b; /* Current comparison bytes. */
114 117
118 /* Special case NEEDLE_LEN of 1 or 2 (all callers already filtered
119 out 0-length needles. */
120 if (needle_len < 3)
121 {
122 *period = 1;
123 return needle_len - 1;
124 }
125
115 /* Invariants: 126 /* Invariants:
116 0 <= j < NEEDLE_LEN - 1 127 1 <= j < NEEDLE_LEN - 1
117 -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed) 128 0 <= max_suffix{,_rev} < j
118 min(max_suffix, max_suffix_rev) < global period of NEEDLE 129 min(max_suffix, max_suffix_rev) < global period of NEEDLE
119 1 <= p <= global period of NEEDLE 130 1 <= p <= global period of NEEDLE
120 p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j] 131 p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j]
@@ -122,9 +133,8 @@ critical_factorization (const unsigned char *needle, size_t needle_len,
122 */ 133 */
123 134
124 /* Perform lexicographic search. */ 135 /* Perform lexicographic search. */
125 max_suffix = SIZE_MAX; 136 max_suffix = 0;
126 j = 0; 137 j = k = p = 1;
127 k = p = 1;
128 while (j + k < needle_len) 138 while (j + k < needle_len)
129 { 139 {
130 a = CANON_ELEMENT (needle[j + k]); 140 a = CANON_ELEMENT (needle[j + k]);
@@ -157,9 +167,8 @@ critical_factorization (const unsigned char *needle, size_t needle_len,
157 *period = p; 167 *period = p;
158 168
159 /* Perform reverse lexicographic search. */ 169 /* Perform reverse lexicographic search. */
160 max_suffix_rev = SIZE_MAX; 170 max_suffix_rev = 0;
161 j = 0; 171 j = k = p = 1;
162 k = p = 1;
163 while (j + k < needle_len) 172 while (j + k < needle_len)
164 { 173 {
165 a = CANON_ELEMENT (needle[j + k]); 174 a = CANON_ELEMENT (needle[j + k]);
@@ -190,8 +199,20 @@ critical_factorization (const unsigned char *needle, size_t needle_len,
190 } 199 }
191 } 200 }
192 201
193 /* Choose the longer suffix. Return the first byte of the right 202 /* Choose the shorter suffix. Return the index of the first byte of
194 half, rather than the last byte of the left half. */ 203 the right half, rather than the last byte of the left half.
204
205 For some examples, 'banana' has two critical factorizations, both
206 exposed by the two lexicographic extreme suffixes of 'anana' and
207 'nana', where both suffixes have a period of 2. On the other
208 hand, with 'aab' and 'bba', both strings have a single critical
209 factorization of the last byte, with the suffix having a period
210 of 1. While the maximal lexicographic suffix of 'aab' is 'b',
211 the maximal lexicographic suffix of 'bba' is 'ba', which is not a
212 critical factorization. Conversely, the maximal reverse
213 lexicographic suffix of 'a' works for 'bba', but not 'ab' for
214 'aab'. The shorter suffix of the two will always be a critical
215 factorization. */
195 if (max_suffix_rev + 1 < max_suffix + 1) 216 if (max_suffix_rev + 1 < max_suffix + 1)
196 return max_suffix + 1; 217 return max_suffix + 1;
197 *period = p; 218 *period = p;
@@ -226,9 +247,9 @@ two_way_short_needle (const unsigned char *haystack, size_t haystack_len,
226 first. */ 247 first. */
227 if (CMP_FUNC (needle, needle + period, suffix) == 0) 248 if (CMP_FUNC (needle, needle + period, suffix) == 0)
228 { 249 {
229 /* Entire needle is periodic; a mismatch can only advance by the 250 /* Entire needle is periodic; a mismatch in the left half can
230 period, so use memory to avoid rescanning known occurrences 251 only advance by the period, so use memory to avoid rescanning
231 of the period. */ 252 known occurrences of the period in the right half. */
232 size_t memory = 0; 253 size_t memory = 0;
233 j = 0; 254 j = 0;
234 while (AVAILABLE (haystack, haystack_len, j, needle_len)) 255 while (AVAILABLE (haystack, haystack_len, j, needle_len))
@@ -330,9 +351,9 @@ two_way_long_needle (const unsigned char *haystack, size_t haystack_len,
330 first. */ 351 first. */
331 if (CMP_FUNC (needle, needle + period, suffix) == 0) 352 if (CMP_FUNC (needle, needle + period, suffix) == 0)
332 { 353 {
333 /* Entire needle is periodic; a mismatch can only advance by the 354 /* Entire needle is periodic; a mismatch in the left half can
334 period, so use memory to avoid rescanning known occurrences 355 only advance by the period, so use memory to avoid rescanning
335 of the period. */ 356 known occurrences of the period in the right half. */
336 size_t memory = 0; 357 size_t memory = 0;
337 size_t shift; 358 size_t shift;
338 j = 0; 359 j = 0;
diff --git a/gl/string.in.h b/gl/string.in.h
index 13c0f095..f64fce30 100644
--- a/gl/string.in.h
+++ b/gl/string.in.h
@@ -41,10 +41,12 @@
41# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) 41# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
42# define __attribute__(Spec) /* empty */ 42# define __attribute__(Spec) /* empty */
43# endif 43# endif
44#endif
44/* The attribute __pure__ was added in gcc 2.96. */ 45/* The attribute __pure__ was added in gcc 2.96. */
45# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) 46#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
46# define __pure__ /* empty */ 47# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
47# endif 48#else
49# define _GL_ATTRIBUTE_PURE /* empty */
48#endif 50#endif
49 51
50 52
@@ -62,13 +64,13 @@
62# define memchr rpl_memchr 64# define memchr rpl_memchr
63# endif 65# endif
64_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n) 66_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
65 __attribute__ ((__pure__)) 67 _GL_ATTRIBUTE_PURE
66 _GL_ARG_NONNULL ((1))); 68 _GL_ARG_NONNULL ((1)));
67_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n)); 69_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
68# else 70# else
69# if ! @HAVE_MEMCHR@ 71# if ! @HAVE_MEMCHR@
70_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n) 72_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
71 __attribute__ ((__pure__)) 73 _GL_ATTRIBUTE_PURE
72 _GL_ARG_NONNULL ((1))); 74 _GL_ARG_NONNULL ((1)));
73# endif 75# endif
74 /* On some systems, this function is defined as an overloaded function: 76 /* On some systems, this function is defined as an overloaded function:
@@ -102,7 +104,8 @@ _GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
102_GL_FUNCDECL_RPL (memmem, void *, 104_GL_FUNCDECL_RPL (memmem, void *,
103 (void const *__haystack, size_t __haystack_len, 105 (void const *__haystack, size_t __haystack_len,
104 void const *__needle, size_t __needle_len) 106 void const *__needle, size_t __needle_len)
105 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3))); 107 _GL_ATTRIBUTE_PURE
108 _GL_ARG_NONNULL ((1, 3)));
106_GL_CXXALIAS_RPL (memmem, void *, 109_GL_CXXALIAS_RPL (memmem, void *,
107 (void const *__haystack, size_t __haystack_len, 110 (void const *__haystack, size_t __haystack_len,
108 void const *__needle, size_t __needle_len)); 111 void const *__needle, size_t __needle_len));
@@ -111,7 +114,8 @@ _GL_CXXALIAS_RPL (memmem, void *,
111_GL_FUNCDECL_SYS (memmem, void *, 114_GL_FUNCDECL_SYS (memmem, void *,
112 (void const *__haystack, size_t __haystack_len, 115 (void const *__haystack, size_t __haystack_len,
113 void const *__needle, size_t __needle_len) 116 void const *__needle, size_t __needle_len)
114 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3))); 117 _GL_ATTRIBUTE_PURE
118 _GL_ARG_NONNULL ((1, 3)));
115# endif 119# endif
116_GL_CXXALIAS_SYS (memmem, void *, 120_GL_CXXALIAS_SYS (memmem, void *,
117 (void const *__haystack, size_t __haystack_len, 121 (void const *__haystack, size_t __haystack_len,
@@ -152,7 +156,7 @@ _GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
152#if @GNULIB_MEMRCHR@ 156#if @GNULIB_MEMRCHR@
153# if ! @HAVE_DECL_MEMRCHR@ 157# if ! @HAVE_DECL_MEMRCHR@
154_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t) 158_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
155 __attribute__ ((__pure__)) 159 _GL_ATTRIBUTE_PURE
156 _GL_ARG_NONNULL ((1))); 160 _GL_ARG_NONNULL ((1)));
157# endif 161# endif
158 /* On some systems, this function is defined as an overloaded function: 162 /* On some systems, this function is defined as an overloaded function:
@@ -182,7 +186,7 @@ _GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
182#if @GNULIB_RAWMEMCHR@ 186#if @GNULIB_RAWMEMCHR@
183# if ! @HAVE_RAWMEMCHR@ 187# if ! @HAVE_RAWMEMCHR@
184_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in) 188_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
185 __attribute__ ((__pure__)) 189 _GL_ATTRIBUTE_PURE
186 _GL_ARG_NONNULL ((1))); 190 _GL_ARG_NONNULL ((1)));
187# endif 191# endif
188 /* On some systems, this function is defined as an overloaded function: 192 /* On some systems, this function is defined as an overloaded function:
@@ -272,7 +276,7 @@ _GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
272#if @GNULIB_STRCHRNUL@ 276#if @GNULIB_STRCHRNUL@
273# if ! @HAVE_STRCHRNUL@ 277# if ! @HAVE_STRCHRNUL@
274_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in) 278_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
275 __attribute__ ((__pure__)) 279 _GL_ATTRIBUTE_PURE
276 _GL_ARG_NONNULL ((1))); 280 _GL_ARG_NONNULL ((1)));
277# endif 281# endif
278 /* On some systems, this function is defined as an overloaded function: 282 /* On some systems, this function is defined as an overloaded function:
@@ -378,13 +382,13 @@ _GL_WARN_ON_USE (strndup, "strndup is unportable - "
378# define strnlen rpl_strnlen 382# define strnlen rpl_strnlen
379# endif 383# endif
380_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen) 384_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)
381 __attribute__ ((__pure__)) 385 _GL_ATTRIBUTE_PURE
382 _GL_ARG_NONNULL ((1))); 386 _GL_ARG_NONNULL ((1)));
383_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)); 387_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen));
384# else 388# else
385# if ! @HAVE_DECL_STRNLEN@ 389# if ! @HAVE_DECL_STRNLEN@
386_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen) 390_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)
387 __attribute__ ((__pure__)) 391 _GL_ATTRIBUTE_PURE
388 _GL_ARG_NONNULL ((1))); 392 _GL_ARG_NONNULL ((1)));
389# endif 393# endif
390_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)); 394_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen));
@@ -414,7 +418,7 @@ _GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
414#if @GNULIB_STRPBRK@ 418#if @GNULIB_STRPBRK@
415# if ! @HAVE_STRPBRK@ 419# if ! @HAVE_STRPBRK@
416_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept) 420_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
417 __attribute__ ((__pure__)) 421 _GL_ATTRIBUTE_PURE
418 _GL_ARG_NONNULL ((1, 2))); 422 _GL_ARG_NONNULL ((1, 2)));
419# endif 423# endif
420 /* On some systems, this function is defined as an overloaded function: 424 /* On some systems, this function is defined as an overloaded function:
@@ -514,7 +518,7 @@ _GL_WARN_ON_USE (strsep, "strsep is unportable - "
514# define strstr rpl_strstr 518# define strstr rpl_strstr
515# endif 519# endif
516_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle) 520_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
517 __attribute__ ((__pure__)) 521 _GL_ATTRIBUTE_PURE
518 _GL_ARG_NONNULL ((1, 2))); 522 _GL_ARG_NONNULL ((1, 2)));
519_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle)); 523_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
520# else 524# else
@@ -556,14 +560,16 @@ _GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
556# endif 560# endif
557_GL_FUNCDECL_RPL (strcasestr, char *, 561_GL_FUNCDECL_RPL (strcasestr, char *,
558 (const char *haystack, const char *needle) 562 (const char *haystack, const char *needle)
559 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2))); 563 _GL_ATTRIBUTE_PURE
564 _GL_ARG_NONNULL ((1, 2)));
560_GL_CXXALIAS_RPL (strcasestr, char *, 565_GL_CXXALIAS_RPL (strcasestr, char *,
561 (const char *haystack, const char *needle)); 566 (const char *haystack, const char *needle));
562# else 567# else
563# if ! @HAVE_STRCASESTR@ 568# if ! @HAVE_STRCASESTR@
564_GL_FUNCDECL_SYS (strcasestr, char *, 569_GL_FUNCDECL_SYS (strcasestr, char *,
565 (const char *haystack, const char *needle) 570 (const char *haystack, const char *needle)
566 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2))); 571 _GL_ATTRIBUTE_PURE
572 _GL_ARG_NONNULL ((1, 2)));
567# endif 573# endif
568 /* On some systems, this function is defined as an overloaded function: 574 /* On some systems, this function is defined as an overloaded function:
569 extern "C++" { const char * strcasestr (const char *, const char *); } 575 extern "C++" { const char * strcasestr (const char *, const char *); }
diff --git a/lib/tests/test_utils.c b/lib/tests/test_utils.c
index d4a08005..79e1110a 100644
--- a/lib/tests/test_utils.c
+++ b/lib/tests/test_utils.c
@@ -38,7 +38,7 @@ main (int argc, char **argv)
38 state_data *temp_state_data; 38 state_data *temp_state_data;
39 time_t current_time; 39 time_t current_time;
40 40
41 plan_tests(141); 41 plan_tests(150);
42 42
43 ok( this_nagios_plugin==NULL, "nagios_plugin not initialised"); 43 ok( this_nagios_plugin==NULL, "nagios_plugin not initialised");
44 44
@@ -132,6 +132,18 @@ main (int argc, char **argv)
132 ok( check_range(0, range) == TRUE, "0 - alert"); 132 ok( check_range(0, range) == TRUE, "0 - alert");
133 free(range); 133 free(range);
134 134
135 range = parse_range_string("@1:1");
136 ok( range != NULL, "'@1:1' is a valid range");
137 ok( range->start == 1, "Start correct");
138 ok( range->start_infinity == FALSE, "Not using negative infinity");
139 ok( range->end == 1, "End correct");
140 ok( range->end_infinity == FALSE, "Not using infinity");
141 ok( range->alert_on == INSIDE, "Will alert on inside of this range" );
142 ok( check_range(0.5, range) == FALSE, "0.5 - no alert");
143 ok( check_range(1, range) == TRUE, "1 - alert");
144 ok( check_range(5.2, range) == FALSE, "5.2 - no alert");
145 free(range);
146
135 range = parse_range_string("1:1"); 147 range = parse_range_string("1:1");
136 ok( range != NULL, "'1:1' is a valid range"); 148 ok( range != NULL, "'1:1' is a valid range");
137 ok( range->start == 1, "Start correct"); 149 ok( range->start == 1, "Start correct");
diff --git a/plugins-scripts/check_oracle.sh b/plugins-scripts/check_oracle.sh
index 664795eb..2a8ab21d 100755
--- a/plugins-scripts/check_oracle.sh
+++ b/plugins-scripts/check_oracle.sh
@@ -18,6 +18,7 @@ print_usage() {
18 echo " $PROGNAME --tns <Oracle Sid or Hostname/IP address>" 18 echo " $PROGNAME --tns <Oracle Sid or Hostname/IP address>"
19 echo " $PROGNAME --db <ORACLE_SID>" 19 echo " $PROGNAME --db <ORACLE_SID>"
20 echo " $PROGNAME --login <ORACLE_SID>" 20 echo " $PROGNAME --login <ORACLE_SID>"
21 echo " $PROGNAME --connect <ORACLE_SID>"
21 echo " $PROGNAME --cache <ORACLE_SID> <USER> <PASS> <CRITICAL> <WARNING>" 22 echo " $PROGNAME --cache <ORACLE_SID> <USER> <PASS> <CRITICAL> <WARNING>"
22 echo " $PROGNAME --tablespace <ORACLE_SID> <USER> <PASS> <TABLESPACE> <CRITICAL> <WARNING>" 23 echo " $PROGNAME --tablespace <ORACLE_SID> <USER> <PASS> <TABLESPACE> <CRITICAL> <WARNING>"
23 echo " $PROGNAME --oranames <Hostname>" 24 echo " $PROGNAME --oranames <Hostname>"
@@ -39,6 +40,8 @@ print_help() {
39 echo " filesystem for sgadefORACLE_SID.dbf" 40 echo " filesystem for sgadefORACLE_SID.dbf"
40 echo "--login SID" 41 echo "--login SID"
41 echo " Attempt a dummy login and alert if not ORA-01017: invalid username/password" 42 echo " Attempt a dummy login and alert if not ORA-01017: invalid username/password"
43 echo "--connect SID"
44 echo " Attempt a login and alert if an ORA- error is returned"
42 echo "--cache" 45 echo "--cache"
43 echo " Check local database for library and buffer cache hit ratios" 46 echo " Check local database for library and buffer cache hit ratios"
44 echo " ---> Requires Oracle user/password and SID specified." 47 echo " ---> Requires Oracle user/password and SID specified."
@@ -187,6 +190,18 @@ case "$cmd" in
187 exit $STATE_CRITICAL 190 exit $STATE_CRITICAL
188 fi 191 fi
189 ;; 192 ;;
193--connect)
194 connectchk=`sqlplus $2 < /dev/null`
195 connectchk2=` echo $connectchk | grep -c ORA-`
196 if [ ${connectchk2} -eq 0 ] ; then
197 echo "OK - login successful"
198 exit $STATE_OK
199 else
200 connectchk3=` echo "$connectchk" | grep "ORA-" | head -1`
201 echo "CRITICAL - $connectchk3"
202 exit $STATE_CRITICAL
203 fi
204 ;;
190--cache) 205--cache)
191 if [ ${5} -gt ${6} ] ; then 206 if [ ${5} -gt ${6} ] ; then
192 echo "UNKNOWN - Warning level is less then Crit" 207 echo "UNKNOWN - Warning level is less then Crit"
diff --git a/plugins-scripts/check_sensors.sh b/plugins-scripts/check_sensors.sh
index ffaa9748..874e1049 100755
--- a/plugins-scripts/check_sensors.sh
+++ b/plugins-scripts/check_sensors.sh
@@ -44,25 +44,28 @@ case "$1" in
44 *) 44 *)
45 sensordata=`sensors 2>&1` 45 sensordata=`sensors 2>&1`
46 status=$? 46 status=$?
47 if test "$1" = "-v" -o "$1" = "--verbose"; then
48 echo ${sensordata}
49 fi
50 if test ${status} -eq 127; then 47 if test ${status} -eq 127; then
51 echo "SENSORS UNKNOWN - command not found (did you install lmsensors?)" 48 text="SENSORS UNKNOWN - command not found (did you install lmsensors?)"
52 exit $STATE_UNKNOWN 49 exit=$STATE_UNKNOWN
53 elif test ${status} -ne 0; then 50 elif test ${status} -ne 0; then
54 echo "WARNING - sensors returned state $status" 51 text="WARNING - sensors returned state $status"
55 exit $STATE_WARNING 52 exit=$STATE_WARNING
56 fi 53 elif echo ${sensordata} | egrep ALARM > /dev/null; then
57 if echo ${sensordata} | egrep ALARM > /dev/null; then 54 text="SENSOR CRITICAL - Sensor alarm detected!"
58 echo SENSOR CRITICAL - Sensor alarm detected! 55 exit=$STATE_CRITICAL
59 exit $STATE_CRITICAL
60 elif echo ${sensordata} | egrep FAULT > /dev/null \ 56 elif echo ${sensordata} | egrep FAULT > /dev/null \
61 && test "$1" != "-i" -a "$1" != "--ignore-fault"; then 57 && test "$1" != "-i" -a "$1" != "--ignore-fault"; then
62 echo SENSOR UNKNOWN - Sensor reported fault 58 text="SENSOR UNKNOWN - Sensor reported fault"
63 exit $STATE_UNKNOWN 59 exit=$STATE_UNKNOWN
60 else
61 text="SENSORS OK"
62 exit=$STATE_OK
64 fi 63 fi
65 echo sensor ok 64
66 exit $STATE_OK 65 echo "$text"
66 if test "$1" = "-v" -o "$1" = "--verbose"; then
67 echo ${sensordata}
68 fi
69 exit $exit
67 ;; 70 ;;
68esac 71esac
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 0eb0255b..64969dbf 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -39,15 +39,19 @@ EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \
39 check_nagios check_by_ssh check_dns check_nt check_ide_smart \ 39 check_nagios check_by_ssh check_dns check_nt check_ide_smart \
40 check_procs check_mysql_query check_apt check_dbi 40 check_procs check_mysql_query check_apt check_dbi
41 41
42EXTRA_DIST = t tests utils.c netutils.c sslutils.c popen.c utils.h netutils.h \ 42EXTRA_DIST = t tests
43 popen.h common.h runcmd.c runcmd.h
44 43
45PLUGINHDRS = common.h 44PLUGINHDRS = common.h
46 45
47BASEOBJS = utils.o ../lib/libnagiosplug.a ../gl/libgnu.a 46noinst_LIBRARIES = libnpcommon.a
48NETOBJS = netutils.o $(BASEOBJS) $(EXTRA_NETOBJS) 47
49SSLOBJS = sslutils.o 48libnpcommon_a_SOURCES = utils.c netutils.c sslutils.c runcmd.c \
49 popen.c utils.h netutils.h popen.h common.h runcmd.c runcmd.h
50
51BASEOBJS = libnpcommon.a ../lib/libnagiosplug.a ../gl/libgnu.a
52NETOBJS = $(BASEOBJS) $(EXTRA_NETOBLS)
50NETLIBS = $(NETOBJS) $(SOCKETLIBS) 53NETLIBS = $(NETOBJS) $(SOCKETLIBS)
54SSLOBJS = $(BASEOBJS) $(NETLIBS) $(SSLLIBS)
51 55
52TESTS_ENVIRONMENT = perl -I $(top_builddir) -I $(top_srcdir) 56TESTS_ENVIRONMENT = perl -I $(top_builddir) -I $(top_srcdir)
53 57
@@ -62,19 +66,19 @@ test-debug:
62############################################################################## 66##############################################################################
63# the actual targets 67# the actual targets
64 68
65check_apt_LDADD = $(BASEOBJS) runcmd.o 69check_apt_LDADD = $(BASEOBJS)
66check_cluster_LDADD = $(BASEOBJS) 70check_cluster_LDADD = $(BASEOBJS)
67check_dbi_LDADD = $(NETLIBS) $(DBILIBS) 71check_dbi_LDADD = $(NETLIBS) $(DBILIBS)
68check_dig_LDADD = $(NETLIBS) runcmd.o 72check_dig_LDADD = $(NETLIBS)
69check_disk_LDADD = $(BASEOBJS) popen.o 73check_disk_LDADD = $(BASEOBJS)
70check_dns_LDADD = $(NETLIBS) runcmd.o 74check_dns_LDADD = $(NETLIBS)
71check_dummy_LDADD = $(BASEOBJS) 75check_dummy_LDADD = $(BASEOBJS)
72check_fping_LDADD = $(NETLIBS) popen.o 76check_fping_LDADD = $(NETLIBS)
73check_game_LDADD = $(BASEOBJS) runcmd.o 77check_game_LDADD = $(BASEOBJS)
74check_http_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) 78check_http_LDADD = $(SSLOBJS)
75check_hpjd_LDADD = $(NETLIBS) popen.o 79check_hpjd_LDADD = $(NETLIBS)
76check_ldap_LDADD = $(NETLIBS) $(LDAPLIBS) 80check_ldap_LDADD = $(NETLIBS) $(LDAPLIBS)
77check_load_LDADD = $(BASEOBJS) popen.o 81check_load_LDADD = $(BASEOBJS)
78check_mrtg_LDADD = $(BASEOBJS) 82check_mrtg_LDADD = $(BASEOBJS)
79check_mrtgtraf_LDADD = $(BASEOBJS) 83check_mrtgtraf_LDADD = $(BASEOBJS)
80check_mysql_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"' 84check_mysql_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"'
@@ -83,22 +87,22 @@ check_mysql_LDADD = $(NETLIBS) $(MYSQLLIBS)
83check_mysql_query_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"' 87check_mysql_query_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"'
84check_mysql_query_CPPFLAGS = $(MYSQLINCLUDE) 88check_mysql_query_CPPFLAGS = $(MYSQLINCLUDE)
85check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS) 89check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS)
86check_nagios_LDADD = $(BASEOBJS) runcmd.o 90check_nagios_LDADD = $(BASEOBJS)
87check_nt_LDADD = $(NETLIBS) 91check_nt_LDADD = $(NETLIBS)
88check_ntp_LDADD = $(NETLIBS) $(MATHLIBS) 92check_ntp_LDADD = $(NETLIBS) $(MATHLIBS)
89check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS) 93check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS)
90check_nwstat_LDADD = $(NETLIBS) 94check_nwstat_LDADD = $(NETLIBS)
91check_overcr_LDADD = $(NETLIBS) 95check_overcr_LDADD = $(NETLIBS)
92check_pgsql_LDADD = $(NETLIBS) $(PGLIBS) 96check_pgsql_LDADD = $(NETLIBS) $(PGLIBS)
93check_ping_LDADD = $(NETLIBS) popen.o 97check_ping_LDADD = $(NETLIBS)
94check_procs_LDADD = $(BASEOBJS) 98check_procs_LDADD = $(BASEOBJS)
95check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS) 99check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS)
96check_real_LDADD = $(NETLIBS) 100check_real_LDADD = $(NETLIBS)
97check_snmp_LDADD = $(BASEOBJS) 101check_snmp_LDADD = $(BASEOBJS)
98check_smtp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) 102check_smtp_LDADD = $(SSLOBJS)
99check_ssh_LDADD = $(NETLIBS) 103check_ssh_LDADD = $(NETLIBS)
100check_swap_LDADD = $(MATHLIBS) $(BASEOBJS) popen.o 104check_swap_LDADD = $(MATHLIBS) $(BASEOBJS)
101check_tcp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) 105check_tcp_LDADD = $(SSLOBJS)
102check_time_LDADD = $(NETLIBS) 106check_time_LDADD = $(NETLIBS)
103check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS) 107check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
104check_ups_LDADD = $(NETLIBS) 108check_ups_LDADD = $(NETLIBS)
@@ -106,62 +110,11 @@ check_users_LDADD = $(BASEOBJS)
106check_by_ssh_LDADD = $(NETLIBS) 110check_by_ssh_LDADD = $(NETLIBS)
107check_ide_smart_LDADD = $(BASEOBJS) 111check_ide_smart_LDADD = $(BASEOBJS)
108negate_LDADD = $(BASEOBJS) 112negate_LDADD = $(BASEOBJS)
109urlize_LDADD = $(BASEOBJS) popen.o 113urlize_LDADD = $(BASEOBJS)
110
111check_apt_DEPENDENCIES = check_apt.c $(BASEOBJS) runcmd.o $(DEPLIBS)
112check_cluster_DEPENDENCIES = check_cluster.c $(BASEOBJS) $(DEPLIBS)
113check_dbi_DEPENDENCIES = check_dbi.c $(NETOBJS) $(DEPLIBS)
114check_dig_DEPENDENCIES = check_dig.c $(NETOBJS) runcmd.o $(DEPLIBS)
115check_disk_DEPENDENCIES = check_disk.c $(BASEOBJS) popen.o $(DEPLIBS)
116check_dns_DEPENDENCIES = check_dns.c $(NETOBJS) runcmd.o $(DEPLIBS)
117check_dummy_DEPENDENCIES = check_dummy.c $(DEPLIBS)
118check_fping_DEPENDENCIES = check_fping.c $(NETOBJS) popen.o $(DEPLIBS)
119check_game_DEPENDENCIES = check_game.c $(DEPLIBS) runcmd.o
120check_http_DEPENDENCIES = check_http.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS)
121check_hpjd_DEPENDENCIES = check_hpjd.c $(NETOBJS) popen.o $(DEPLIBS)
122check_ide_smart_DEPENDENCIES = check_ide_smart.c $(BASEOBJS) $(DEPLIBS)
123check_ldap_DEPENDENCIES = check_ldap.c $(NETOBJS) $(DEPLIBS)
124check_load_DEPENDENCIES = check_load.c $(BASEOBJS) popen.o $(DEPLIBS)
125check_mrtg_DEPENDENCIES = check_mrtg.c $(DEPLIBS)
126check_mrtgtraf_DEPENDENCIES = check_mrtgtraf.c $(DEPLIBS)
127check_mysql_DEPENDENCIES = check_mysql.c $(NETOBJS) $(DEPLIBS)
128check_mysql_query_DEPENDENCIES = check_mysql_query.c $(NETOBJS) $(DEPLIBS)
129check_nagios_DEPENDENCIES = check_nagios.c $(BASEOBJS) runcmd.o $(DEPLIBS)
130check_nt_DEPENDENCIES = check_nt.c $(NETOBJS) $(DEPLIBS)
131check_ntp_DEPENDENCIES = check_ntp.c $(NETOBJS) $(DEPLIBS)
132check_ntp_peer_DEPENDENCIES = check_ntp_peer.c $(NETOBJS) $(DEPLIBS)
133check_nwstat_DEPENDENCIES = check_nwstat.c $(NETOBJS) $(DEPLIBS)
134check_overcr_DEPENDENCIES = check_overcr.c $(NETOBJS) $(DEPLIBS)
135check_pgsql_DEPENDENCIES = check_pgsql.c $(NETOBJS) $(DEPLIBS)
136check_ping_DEPENDENCIES = check_ping.c $(NETOBJS) popen.o $(DEPLIBS)
137check_procs_DEPENDENCIES = check_procs.c $(BASEOBJS) popen.o $(DEPLIBS)
138check_radius_DEPENDENCIES = check_radius.c $(NETOBJS) $(DEPLIBS)
139check_real_DEPENDENCIES = check_real.c $(NETOBJS) $(DEPLIBS)
140check_snmp_DEPENDENCIES = check_snmp.c $(BASEOBJS) $(DEPLIBS)
141check_smtp_DEPENDENCIES = check_smtp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS)
142check_ssh_DEPENDENCIES = check_ssh.c $(NETOBJS) $(DEPLIBS)
143check_swap_DEPENDENCIES = check_swap.c $(BASEOBJS) popen.o $(DEPLIBS)
144check_tcp_DEPENDENCIES = check_tcp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS)
145check_time_DEPENDENCIES = check_time.c $(NETOBJS) $(DEPLIBS)
146check_ntp_time_DEPENDENCIES = check_ntp_time.c $(NETOBJS) $(DEPLIBS)
147check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS)
148check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS)
149check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) $(DEPLIBS)
150negate_DEPENDENCIES = negate.c $(BASEOBJS) $(DEPLIBS)
151urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS)
152 114
153############################################################################## 115##############################################################################
154# secondary dependencies 116# secondary dependencies
155 117
156popen.o: popen.c popen.h $(PLUGINHDRS)
157
158runcmd.o: runcmd.c runcmd.h $(PLUGINHDRS)
159
160utils.o: utils.c utils.h $(PLUGINHDRS)
161
162netutils.o: netutils.c netutils.h $(PLUGINHDRS)
163sslutils.o: sslutils.c netutils.h $(PLUGINHDRS)
164
165all-local: $(check_tcp_programs) 118all-local: $(check_tcp_programs)
166 119
167$(check_tcp_programs): check_tcp 120$(check_tcp_programs): check_tcp
diff --git a/plugins/check_apt.c b/plugins/check_apt.c
index 7efa596b..daeb7578 100644
--- a/plugins/check_apt.c
+++ b/plugins/check_apt.c
@@ -41,6 +41,8 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
41/* some constants */ 41/* some constants */
42typedef enum { UPGRADE, DIST_UPGRADE, NO_UPGRADE } upgrade_type; 42typedef enum { UPGRADE, DIST_UPGRADE, NO_UPGRADE } upgrade_type;
43 43
44/* Character for hidden input file option (for testing). */
45#define INPUT_FILE_OPT CHAR_MAX+1
44/* the default opts can be overridden via the cmdline */ 46/* the default opts can be overridden via the cmdline */
45#define UPGRADE_DEFAULT_OPTS "-o 'Debug::NoLocking=true' -s -qq" 47#define UPGRADE_DEFAULT_OPTS "-o 'Debug::NoLocking=true' -s -qq"
46#define UPDATE_DEFAULT_OPTS "-q" 48#define UPDATE_DEFAULT_OPTS "-q"
@@ -49,8 +51,10 @@ typedef enum { UPGRADE, DIST_UPGRADE, NO_UPGRADE } upgrade_type;
49#ifndef PATH_TO_APTGET 51#ifndef PATH_TO_APTGET
50# define PATH_TO_APTGET "/usr/bin/apt-get" 52# define PATH_TO_APTGET "/usr/bin/apt-get"
51#endif /* PATH_TO_APTGET */ 53#endif /* PATH_TO_APTGET */
54/* String found at the beginning of the apt output lines we're interested in */
55#define PKGINST_PREFIX "Inst "
52/* the RE that catches security updates */ 56/* the RE that catches security updates */
53#define SECURITY_RE "^[^\\(]*\\([^ ]* (Debian-Security:|Ubuntu:[^/]*/[^-]*-security)" 57#define SECURITY_RE "^[^\\(]*\\(.* (Debian-Security:|Ubuntu:[^/]*/[^-]*-security)"
54 58
55/* some standard functions */ 59/* some standard functions */
56int process_arguments(int, char **); 60int process_arguments(int, char **);
@@ -75,6 +79,7 @@ static char *update_opts = NULL; /* options to override defaults for update */
75static char *do_include = NULL; /* regexp to only include certain packages */ 79static char *do_include = NULL; /* regexp to only include certain packages */
76static char *do_exclude = NULL; /* regexp to only exclude certain packages */ 80static char *do_exclude = NULL; /* regexp to only exclude certain packages */
77static char *do_critical = NULL; /* regexp specifying critical packages */ 81static char *do_critical = NULL; /* regexp specifying critical packages */
82static char *input_filename = NULL; /* input filename for testing */
78 83
79/* other global variables */ 84/* other global variables */
80static int stderr_warning = 0; /* if a cmd issued output on stderr */ 85static int stderr_warning = 0; /* if a cmd issued output on stderr */
@@ -107,11 +112,11 @@ int main (int argc, char **argv) {
107 result = max_state(result, STATE_CRITICAL); 112 result = max_state(result, STATE_CRITICAL);
108 } else if(packages_available > 0){ 113 } else if(packages_available > 0){
109 result = max_state(result, STATE_WARNING); 114 result = max_state(result, STATE_WARNING);
110 } else { 115 } else if(result > STATE_UNKNOWN){
111 result = max_state(result, STATE_OK); 116 result = STATE_UNKNOWN;
112 } 117 }
113 118
114 printf(_("APT %s: %d packages available for %s (%d critical updates). %s%s%s%s\n"), 119 printf(_("APT %s: %d packages available for %s (%d critical updates). %s%s%s%s|available_upgrades=%d;;;0 critical_updates=%d;;;0\n"),
115 state_text(result), 120 state_text(result),
116 packages_available, 121 packages_available,
117 (upgrade==DIST_UPGRADE)?"dist-upgrade":"upgrade", 122 (upgrade==DIST_UPGRADE)?"dist-upgrade":"upgrade",
@@ -119,7 +124,9 @@ int main (int argc, char **argv) {
119 (stderr_warning)?" warnings detected":"", 124 (stderr_warning)?" warnings detected":"",
120 (stderr_warning && exec_warning)?",":"", 125 (stderr_warning && exec_warning)?",":"",
121 (exec_warning)?" errors detected":"", 126 (exec_warning)?" errors detected":"",
122 (stderr_warning||exec_warning)?". run with -v for information.":"" 127 (stderr_warning||exec_warning)?". run with -v for information.":"",
128 packages_available,
129 sec_count
123 ); 130 );
124 131
125 return result; 132 return result;
@@ -141,6 +148,7 @@ int process_arguments (int argc, char **argv) {
141 {"include", required_argument, 0, 'i'}, 148 {"include", required_argument, 0, 'i'},
142 {"exclude", required_argument, 0, 'e'}, 149 {"exclude", required_argument, 0, 'e'},
143 {"critical", required_argument, 0, 'c'}, 150 {"critical", required_argument, 0, 'c'},
151 {"input-file", required_argument, 0, INPUT_FILE_OPT},
144 {0, 0, 0, 0} 152 {0, 0, 0, 0}
145 }; 153 };
146 154
@@ -195,6 +203,9 @@ int process_arguments (int argc, char **argv) {
195 case 'c': 203 case 'c':
196 do_critical=add_to_regexp(do_critical, optarg); 204 do_critical=add_to_regexp(do_critical, optarg);
197 break; 205 break;
206 case INPUT_FILE_OPT:
207 input_filename = optarg;
208 break;
198 default: 209 default:
199 /* print short usage statement if args not parsable */ 210 /* print short usage statement if args not parsable */
200 usage5(); 211 usage5();
@@ -211,22 +222,18 @@ int run_upgrade(int *pkgcount, int *secpkgcount){
211 struct output chld_out, chld_err; 222 struct output chld_out, chld_err;
212 regex_t ireg, ereg, sreg; 223 regex_t ireg, ereg, sreg;
213 char *cmdline=NULL, rerrbuf[64]; 224 char *cmdline=NULL, rerrbuf[64];
214 const char *include_ptr=NULL, *crit_ptr=NULL;
215 225
216 if(upgrade==NO_UPGRADE) return STATE_OK; 226 if(upgrade==NO_UPGRADE) return STATE_OK;
217 227
218 /* compile the regexps */ 228 /* compile the regexps */
219 if(do_include!=NULL) include_ptr=do_include; 229 if (do_include != NULL) {
220 else include_ptr="^Inst"; 230 regres=regcomp(&ireg, do_include, REG_EXTENDED);
221 if(do_critical!=NULL) crit_ptr=do_critical; 231 if (regres!=0) {
222 else crit_ptr=SECURITY_RE; 232 regerror(regres, &ireg, rerrbuf, 64);
223 233 die(STATE_UNKNOWN, _("%s: Error compiling regexp: %s"), progname, rerrbuf);
224 regres=regcomp(&ireg, include_ptr, REG_EXTENDED); 234 }
225 if(regres!=0) {
226 regerror(regres, &ireg, rerrbuf, 64);
227 die(STATE_UNKNOWN, _("%s: Error compiling regexp: %s"), progname, rerrbuf);
228 } 235 }
229 236
230 if(do_exclude!=NULL){ 237 if(do_exclude!=NULL){
231 regres=regcomp(&ereg, do_exclude, REG_EXTENDED); 238 regres=regcomp(&ereg, do_exclude, REG_EXTENDED);
232 if(regres!=0) { 239 if(regres!=0) {
@@ -235,6 +242,8 @@ int run_upgrade(int *pkgcount, int *secpkgcount){
235 progname, rerrbuf); 242 progname, rerrbuf);
236 } 243 }
237 } 244 }
245
246 const char *crit_ptr = (do_critical != NULL) ? do_critical : SECURITY_RE;
238 regres=regcomp(&sreg, crit_ptr, REG_EXTENDED); 247 regres=regcomp(&sreg, crit_ptr, REG_EXTENDED);
239 if(regres!=0) { 248 if(regres!=0) {
240 regerror(regres, &ereg, rerrbuf, 64); 249 regerror(regres, &ereg, rerrbuf, 64);
@@ -243,8 +252,14 @@ int run_upgrade(int *pkgcount, int *secpkgcount){
243 } 252 }
244 253
245 cmdline=construct_cmdline(upgrade, upgrade_opts); 254 cmdline=construct_cmdline(upgrade, upgrade_opts);
246 /* run the upgrade */ 255 if (input_filename != NULL) {
247 result = np_runcmd(cmdline, &chld_out, &chld_err, 0); 256 /* read input from a file for testing */
257 result = cmd_file_read(input_filename, &chld_out, 0);
258 } else {
259 /* run the upgrade */
260 result = np_runcmd(cmdline, &chld_out, &chld_err, 0);
261 }
262
248 /* apt-get upgrade only changes exit status if there is an 263 /* apt-get upgrade only changes exit status if there is an
249 * internal error when run in dry-run mode. therefore we will 264 * internal error when run in dry-run mode. therefore we will
250 * treat such an error as UNKNOWN */ 265 * treat such an error as UNKNOWN */
@@ -269,7 +284,8 @@ int run_upgrade(int *pkgcount, int *secpkgcount){
269 printf("%s\n", chld_out.line[i]); 284 printf("%s\n", chld_out.line[i]);
270 } 285 }
271 /* if it is a package we care about */ 286 /* if it is a package we care about */
272 if(regexec(&ireg, chld_out.line[i], 0, NULL, 0)==0){ 287 if (strncmp(PKGINST_PREFIX, chld_out.line[i], strlen(PKGINST_PREFIX)) == 0 &&
288 (do_include == NULL || regexec(&ireg, chld_out.line[i], 0, NULL, 0) == 0)) {
273 /* if we're not excluding, or it's not in the 289 /* if we're not excluding, or it's not in the
274 * list of stuff to exclude */ 290 * list of stuff to exclude */
275 if(do_exclude==NULL || 291 if(do_exclude==NULL ||
@@ -289,7 +305,7 @@ int run_upgrade(int *pkgcount, int *secpkgcount){
289 *secpkgcount=spc; 305 *secpkgcount=spc;
290 306
291 /* If we get anything on stderr, at least set warning */ 307 /* If we get anything on stderr, at least set warning */
292 if(chld_err.buflen){ 308 if (input_filename == NULL && chld_err.buflen) {
293 stderr_warning=1; 309 stderr_warning=1;
294 result = max_state(result, STATE_WARNING); 310 result = max_state(result, STATE_WARNING);
295 if(verbose){ 311 if(verbose){
@@ -298,7 +314,7 @@ int run_upgrade(int *pkgcount, int *secpkgcount){
298 } 314 }
299 } 315 }
300 } 316 }
301 regfree(&ireg); 317 if (do_include != NULL) regfree(&ireg);
302 regfree(&sreg); 318 regfree(&sreg);
303 if(do_exclude!=NULL) regfree(&ereg); 319 if(do_exclude!=NULL) regfree(&ereg);
304 free(cmdline); 320 free(cmdline);
@@ -348,15 +364,15 @@ char* add_to_regexp(char *expr, const char *next){
348 char *re=NULL; 364 char *re=NULL;
349 365
350 if(expr==NULL){ 366 if(expr==NULL){
351 re=malloc(sizeof(char)*(strlen("^Inst () ")+strlen(next)+1)); 367 re=malloc(sizeof(char)*(strlen("()")+strlen(next)+1));
352 if(!re) die(STATE_UNKNOWN, "malloc failed!\n"); 368 if(!re) die(STATE_UNKNOWN, "malloc failed!\n");
353 sprintf(re, "^Inst (%s) ", next); 369 sprintf(re, "(%s)", next);
354 } else { 370 } else {
355 /* resize it, adding an extra char for the new '|' separator */ 371 /* resize it, adding an extra char for the new '|' separator */
356 re=realloc(expr, sizeof(char)*strlen(expr)+1+strlen(next)+1); 372 re=realloc(expr, sizeof(char)*(strlen(expr)+1+strlen(next)+1));
357 if(!re) die(STATE_UNKNOWN, "realloc failed!\n"); 373 if(!re) die(STATE_UNKNOWN, "realloc failed!\n");
358 /* append it starting at ')' in the old re */ 374 /* append it starting at ')' in the old re */
359 sprintf((char*)(re+strlen(re)-2), "|%s) ", next); 375 sprintf((char*)(re+strlen(re)-1), "|%s)", next);
360 } 376 }
361 377
362 return re; 378 return re;
@@ -430,7 +446,7 @@ print_help (void)
430 printf (" %s\n", _("Do not run the upgrade. Probably not useful (without -u at least).")); 446 printf (" %s\n", _("Do not run the upgrade. Probably not useful (without -u at least)."));
431 printf (" %s\n", "-i, --include=REGEXP"); 447 printf (" %s\n", "-i, --include=REGEXP");
432 printf (" %s\n", _("Include only packages matching REGEXP. Can be specified multiple times")); 448 printf (" %s\n", _("Include only packages matching REGEXP. Can be specified multiple times"));
433 printf (" %s\n", _("the values will be combined together. Any patches matching this list")); 449 printf (" %s\n", _("the values will be combined together. Any packages matching this list"));
434 printf (" %s\n", _("cause the plugin to return WARNING status. Others will be ignored.")); 450 printf (" %s\n", _("cause the plugin to return WARNING status. Others will be ignored."));
435 printf (" %s\n", _("Default is to include all packages.")); 451 printf (" %s\n", _("Default is to include all packages."));
436 printf (" %s\n", "-e, --exclude=REGEXP"); 452 printf (" %s\n", "-e, --exclude=REGEXP");
diff --git a/plugins/check_dig.c b/plugins/check_dig.c
index 893e0a14..c113d87b 100644
--- a/plugins/check_dig.c
+++ b/plugins/check_dig.c
@@ -54,6 +54,7 @@ char *record_type = "A";
54char *expected_address = NULL; 54char *expected_address = NULL;
55char *dns_server = NULL; 55char *dns_server = NULL;
56char *dig_args = ""; 56char *dig_args = "";
57char *query_transport = "";
57int verbose = FALSE; 58int verbose = FALSE;
58int server_port = DEFAULT_PORT; 59int server_port = DEFAULT_PORT;
59double warning_interval = UNDEFINED; 60double warning_interval = UNDEFINED;
@@ -77,7 +78,7 @@ main (int argc, char **argv)
77 textdomain (PACKAGE); 78 textdomain (PACKAGE);
78 79
79 /* Set signal handling and alarm */ 80 /* Set signal handling and alarm */
80 if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) 81 if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR)
81 usage_va(_("Cannot catch SIGALRM")); 82 usage_va(_("Cannot catch SIGALRM"));
82 83
83 /* Parse extra opts if any */ 84 /* Parse extra opts if any */
@@ -87,8 +88,8 @@ main (int argc, char **argv)
87 usage_va(_("Could not parse arguments")); 88 usage_va(_("Could not parse arguments"));
88 89
89 /* get the command to run */ 90 /* get the command to run */
90 xasprintf (&command_line, "%s @%s -p %d %s -t %s %s", 91 xasprintf (&command_line, "%s @%s -p %d %s -t %s %s %s",
91 PATH_TO_DIG, dns_server, server_port, query_address, record_type, dig_args); 92 PATH_TO_DIG, dns_server, server_port, query_address, record_type, dig_args, query_transport);
92 93
93 alarm (timeout_interval); 94 alarm (timeout_interval);
94 gettimeofday (&tv, NULL); 95 gettimeofday (&tv, NULL);
@@ -199,6 +200,8 @@ process_arguments (int argc, char **argv)
199 {"record_type", required_argument, 0, 'T'}, 200 {"record_type", required_argument, 0, 'T'},
200 {"expected_address", required_argument, 0, 'a'}, 201 {"expected_address", required_argument, 0, 'a'},
201 {"port", required_argument, 0, 'p'}, 202 {"port", required_argument, 0, 'p'},
203 {"use-ipv4", no_argument, 0, '4'},
204 {"use-ipv6", no_argument, 0, '6'},
202 {0, 0, 0, 0} 205 {0, 0, 0, 0}
203 }; 206 };
204 207
@@ -206,7 +209,7 @@ process_arguments (int argc, char **argv)
206 return ERROR; 209 return ERROR;
207 210
208 while (1) { 211 while (1) {
209 c = getopt_long (argc, argv, "hVvt:l:H:w:c:T:p:a:A:", longopts, &option); 212 c = getopt_long (argc, argv, "hVvt:l:H:w:c:T:p:a:A:46", longopts, &option);
210 213
211 if (c == -1 || c == EOF) 214 if (c == -1 || c == EOF)
212 break; 215 break;
@@ -269,6 +272,12 @@ process_arguments (int argc, char **argv)
269 case 'a': 272 case 'a':
270 expected_address = optarg; 273 expected_address = optarg;
271 break; 274 break;
275 case '4':
276 query_transport = "-4";
277 break;
278 case '6':
279 query_transport = "-6";
280 break;
272 default: /* usage5 */ 281 default: /* usage5 */
273 usage5(); 282 usage5();
274 } 283 }
@@ -325,6 +334,10 @@ print_help (void)
325 334
326 printf (UT_HOST_PORT, 'p', myport); 335 printf (UT_HOST_PORT, 'p', myport);
327 336
337 printf (" %s\n","-4, --use-ipv4");
338 printf (" %s\n",_("Force dig to only use IPv4 query transport"));
339 printf (" %s\n","-6, --use-ipv6");
340 printf (" %s\n",_("Force dig to only use IPv6 query transport"));
328 printf (" %s\n","-l, --query_address=STRING"); 341 printf (" %s\n","-l, --query_address=STRING");
329 printf (" %s\n",_("Machine name to lookup")); 342 printf (" %s\n",_("Machine name to lookup"));
330 printf (" %s\n","-T, --record_type=STRING"); 343 printf (" %s\n","-T, --record_type=STRING");
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index 6ba7bdf3..4ea03935 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -91,9 +91,12 @@ static int stat_remote_fs = 0;
91 91
92/* Linked list of filesystem types to omit. 92/* Linked list of filesystem types to omit.
93 If the list is empty, don't exclude any types. */ 93 If the list is empty, don't exclude any types. */
94
95static struct name_list *fs_exclude_list; 94static struct name_list *fs_exclude_list;
96 95
96/* Linked list of filesystem types to check.
97 If the list is empty, include all types. */
98static struct name_list *fs_include_list;
99
97static struct name_list *dp_exclude_list; 100static struct name_list *dp_exclude_list;
98 101
99static struct parameter_list *path_select_list = NULL; 102static struct parameter_list *path_select_list = NULL;
@@ -255,6 +258,9 @@ main (int argc, char **argv)
255 (np_find_name (dp_exclude_list, me->me_devname) || 258 (np_find_name (dp_exclude_list, me->me_devname) ||
256 np_find_name (dp_exclude_list, me->me_mountdir))) { 259 np_find_name (dp_exclude_list, me->me_mountdir))) {
257 continue; 260 continue;
261 /* Skip not included fstypes */
262 } else if (fs_include_list && !np_find_name (fs_include_list, me->me_type)) {
263 continue;
258 } 264 }
259 265
260 stat_path(path); 266 stat_path(path);
@@ -419,6 +425,7 @@ process_arguments (int argc, char **argv)
419 {"partition", required_argument, 0, 'p'}, 425 {"partition", required_argument, 0, 'p'},
420 {"exclude_device", required_argument, 0, 'x'}, 426 {"exclude_device", required_argument, 0, 'x'},
421 {"exclude-type", required_argument, 0, 'X'}, 427 {"exclude-type", required_argument, 0, 'X'},
428 {"include-type", required_argument, 0, 'N'},
422 {"group", required_argument, 0, 'g'}, 429 {"group", required_argument, 0, 'g'},
423 {"eregi-path", required_argument, 0, 'R'}, 430 {"eregi-path", required_argument, 0, 'R'},
424 {"eregi-partition", required_argument, 0, 'R'}, 431 {"eregi-partition", required_argument, 0, 'R'},
@@ -452,7 +459,7 @@ process_arguments (int argc, char **argv)
452 strcpy (argv[c], "-t"); 459 strcpy (argv[c], "-t");
453 460
454 while (1) { 461 while (1) {
455 c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklLg:R:r:i:I:MEA", longopts, &option); 462 c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:N:mklLg:R:r:i:I:MEA", longopts, &option);
456 463
457 if (c == -1 || c == EOF) 464 if (c == -1 || c == EOF)
458 break; 465 break;
@@ -591,6 +598,9 @@ process_arguments (int argc, char **argv)
591 case 'X': /* exclude file system type */ 598 case 'X': /* exclude file system type */
592 np_add_name(&fs_exclude_list, optarg); 599 np_add_name(&fs_exclude_list, optarg);
593 break; 600 break;
601 case 'N': /* include file system type */
602 np_add_name(&fs_include_list, optarg);
603 break;
594 case 'v': /* verbose */ 604 case 'v': /* verbose */
595 verbose++; 605 verbose++;
596 break; 606 break;
@@ -900,6 +910,8 @@ print_help (void)
900 printf (UT_VERBOSE); 910 printf (UT_VERBOSE);
901 printf (" %s\n", "-X, --exclude-type=TYPE"); 911 printf (" %s\n", "-X, --exclude-type=TYPE");
902 printf (" %s\n", _("Ignore all filesystems of indicated type (may be repeated)")); 912 printf (" %s\n", _("Ignore all filesystems of indicated type (may be repeated)"));
913 printf (" %s\n", "-N, --include-type=TYPE");
914 printf (" %s\n", _("Check only filesystems of indicated type (may be repeated)"));
903 915
904 printf ("\n"); 916 printf ("\n");
905 printf ("%s\n", _("Examples:")); 917 printf ("%s\n", _("Examples:"));
@@ -922,7 +934,7 @@ print_usage (void)
922 printf ("%s\n", _("Usage:")); 934 printf ("%s\n", _("Usage:"));
923 printf (" %s -w limit -c limit [-W limit] [-K limit] {-p path | -x device}\n", progname); 935 printf (" %s -w limit -c limit [-W limit] [-K limit] {-p path | -x device}\n", progname);
924 printf ("[-C] [-E] [-e] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n"); 936 printf ("[-C] [-E] [-e] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n");
925 printf ("[-t timeout] [-u unit] [-v] [-X type]\n"); 937 printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n");
926} 938}
927 939
928void 940void
diff --git a/plugins/check_dns.c b/plugins/check_dns.c
index 91af730b..ac6cfc38 100644
--- a/plugins/check_dns.c
+++ b/plugins/check_dns.c
@@ -91,7 +91,7 @@ main (int argc, char **argv)
91 textdomain (PACKAGE); 91 textdomain (PACKAGE);
92 92
93 /* Set signal handling and alarm */ 93 /* Set signal handling and alarm */
94 if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { 94 if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) {
95 usage_va(_("Cannot catch SIGALRM")); 95 usage_va(_("Cannot catch SIGALRM"));
96 } 96 }
97 97
diff --git a/plugins/check_fping.c b/plugins/check_fping.c
index 675a547c..c7cce97d 100644
--- a/plugins/check_fping.c
+++ b/plugins/check_fping.c
@@ -52,6 +52,8 @@ void print_help (void);
52void print_usage (void); 52void print_usage (void);
53 53
54char *server_name = NULL; 54char *server_name = NULL;
55char *sourceip = NULL;
56char *sourceif = NULL;
55int packet_size = PACKET_SIZE; 57int packet_size = PACKET_SIZE;
56int packet_count = PACKET_COUNT; 58int packet_count = PACKET_COUNT;
57int target_timeout = 0; 59int target_timeout = 0;
@@ -72,6 +74,8 @@ main (int argc, char **argv)
72/* normaly should be int result = STATE_UNKNOWN; */ 74/* normaly should be int result = STATE_UNKNOWN; */
73 75
74 int status = STATE_UNKNOWN; 76 int status = STATE_UNKNOWN;
77 int result = 0;
78 char *fping_prog = NULL;
75 char *server = NULL; 79 char *server = NULL;
76 char *command_line = NULL; 80 char *command_line = NULL;
77 char *input_buffer = NULL; 81 char *input_buffer = NULL;
@@ -95,8 +99,21 @@ main (int argc, char **argv)
95 xasprintf(&option_string, "%s-t %d ", option_string, target_timeout); 99 xasprintf(&option_string, "%s-t %d ", option_string, target_timeout);
96 if (packet_interval) 100 if (packet_interval)
97 xasprintf(&option_string, "%s-p %d ", option_string, packet_interval); 101 xasprintf(&option_string, "%s-p %d ", option_string, packet_interval);
98 102 if (sourceip)
99 xasprintf (&command_line, "%s %s-b %d -c %d %s", PATH_TO_FPING, 103 xasprintf(&option_string, "%s-S %s ", option_string, sourceip);
104 if (sourceif)
105 xasprintf(&option_string, "%s-I %s ", option_string, sourceif);
106
107#ifdef PATH_TO_FPING6
108 if (address_family == AF_INET6)
109 fping_prog = strdup(PATH_TO_FPING6);
110 else
111 fping_prog = strdup(PATH_TO_FPING);
112#else
113 fping_prog = strdup(PATH_TO_FPING);
114#endif
115
116 xasprintf (&command_line, "%s %s-b %d -c %d %s", fping_prog,
100 option_string, packet_size, packet_count, server); 117 option_string, packet_size, packet_count, server);
101 118
102 if (verbose) 119 if (verbose)
@@ -130,10 +147,24 @@ main (int argc, char **argv)
130 (void) fclose (child_stderr); 147 (void) fclose (child_stderr);
131 148
132 /* close the pipe */ 149 /* close the pipe */
133 if (spclose (child_process)) 150 if (result = spclose (child_process))
134 /* need to use max_state not max */ 151 /* need to use max_state not max */
135 status = max_state (status, STATE_WARNING); 152 status = max_state (status, STATE_WARNING);
136 153
154 if (result > 1 ) {
155 status = max_state (status, STATE_UNKNOWN);
156 if (result == 2) {
157 die (STATE_UNKNOWN, _("FPING UNKNOWN - IP address not found\n"));
158 }
159 if (result == 3) {
160 die (STATE_UNKNOWN, _("FPING UNKNOWN - invalid commandline argument\n"));
161 }
162 if (result == 4) {
163 die (STATE_UNKNOWN, _("FPING UNKNOWN - failed system call\n"));
164 }
165
166 }
167
137 printf ("FPING %s - %s\n", state_text (status), server_name); 168 printf ("FPING %s - %s\n", state_text (status), server_name);
138 169
139 return status; 170 return status;
@@ -159,6 +190,10 @@ textscan (char *buf)
159 "host"); 190 "host");
160 191
161 } 192 }
193 else if (strstr (buf, "Operation not permitted") || strstr (buf, "No such device") ) {
194 die (STATE_UNKNOWN, _("FPING UNKNOWN - %s parameter error\n"),
195 "host");
196 }
162 else if (strstr (buf, "is down")) { 197 else if (strstr (buf, "is down")) {
163 die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); 198 die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name);
164 199
@@ -232,6 +267,8 @@ process_arguments (int argc, char **argv)
232 int option = 0; 267 int option = 0;
233 static struct option longopts[] = { 268 static struct option longopts[] = {
234 {"hostname", required_argument, 0, 'H'}, 269 {"hostname", required_argument, 0, 'H'},
270 {"sourceip", required_argument, 0, 'S'},
271 {"sourceif", required_argument, 0, 'I'},
235 {"critical", required_argument, 0, 'c'}, 272 {"critical", required_argument, 0, 'c'},
236 {"warning", required_argument, 0, 'w'}, 273 {"warning", required_argument, 0, 'w'},
237 {"bytes", required_argument, 0, 'b'}, 274 {"bytes", required_argument, 0, 'b'},
@@ -241,6 +278,8 @@ process_arguments (int argc, char **argv)
241 {"verbose", no_argument, 0, 'v'}, 278 {"verbose", no_argument, 0, 'v'},
242 {"version", no_argument, 0, 'V'}, 279 {"version", no_argument, 0, 'V'},
243 {"help", no_argument, 0, 'h'}, 280 {"help", no_argument, 0, 'h'},
281 {"use-ipv4", no_argument, 0, '4'},
282 {"use-ipv6", no_argument, 0, '6'},
244 {0, 0, 0, 0} 283 {0, 0, 0, 0}
245 }; 284 };
246 285
@@ -258,7 +297,7 @@ process_arguments (int argc, char **argv)
258 } 297 }
259 298
260 while (1) { 299 while (1) {
261 c = getopt_long (argc, argv, "+hVvH:c:w:b:n:T:i:", longopts, &option); 300 c = getopt_long (argc, argv, "+hVvH:S:c:w:b:n:T:i:I:46", longopts, &option);
262 301
263 if (c == -1 || c == EOF || c == 1) 302 if (c == -1 || c == EOF || c == 1)
264 break; 303 break;
@@ -281,6 +320,24 @@ process_arguments (int argc, char **argv)
281 } 320 }
282 server_name = strscpy (server_name, optarg); 321 server_name = strscpy (server_name, optarg);
283 break; 322 break;
323 case 'S': /* sourceip */
324 if (is_host (optarg) == FALSE) {
325 usage2 (_("Invalid hostname/address"), optarg);
326 }
327 sourceip = strscpy (sourceip, optarg);
328 break;
329 case 'I': /* sourceip */
330 sourceif = strscpy (sourceif, optarg);
331 case '4': /* IPv4 only */
332 address_family = AF_INET;
333 break;
334 case '6': /* IPv6 only */
335#ifdef USE_IPV6
336 address_family = AF_INET6;
337#else
338 usage (_("IPv6 support not available\n"));
339#endif
340 break;
284 case 'c': 341 case 'c':
285 get_threshold (optarg, rv); 342 get_threshold (optarg, rv);
286 if (rv[RTA]) { 343 if (rv[RTA]) {
@@ -402,6 +459,8 @@ print_help (void)
402 printf (UT_HELP_VRSN); 459 printf (UT_HELP_VRSN);
403 printf (UT_EXTRA_OPTS); 460 printf (UT_EXTRA_OPTS);
404 461
462 printf (UT_IPv46);
463
405 printf (" %s\n", "-H, --hostname=HOST"); 464 printf (" %s\n", "-H, --hostname=HOST");
406 printf (" %s\n", _("name or IP Address of host to ping (IP Address bypasses name lookup, reducing system load)")); 465 printf (" %s\n", _("name or IP Address of host to ping (IP Address bypasses name lookup, reducing system load)"));
407 printf (" %s\n", "-w, --warning=THRESHOLD"); 466 printf (" %s\n", "-w, --warning=THRESHOLD");
@@ -413,15 +472,22 @@ print_help (void)
413 printf (" %s\n", "-n, --number=INTEGER"); 472 printf (" %s\n", "-n, --number=INTEGER");
414 printf (" %s (default: %d)\n", _("number of ICMP packets to send"),PACKET_COUNT); 473 printf (" %s (default: %d)\n", _("number of ICMP packets to send"),PACKET_COUNT);
415 printf (" %s\n", "-T, --target-timeout=INTEGER"); 474 printf (" %s\n", "-T, --target-timeout=INTEGER");
416 printf (" %s (default: fping's default for -t)\n", _("Target timeout (ms)"),PACKET_COUNT); 475 printf (" %s (default: fping's default for -t)\n", _("Target timeout (ms)"));
417 printf (" %s\n", "-i, --interval=INTEGER"); 476 printf (" %s\n", "-i, --interval=INTEGER");
418 printf (" %s (default: fping's default for -p)\n", _("Interval (ms) between sending packets"),PACKET_COUNT); 477 printf (" %s (default: fping's default for -p)\n", _("Interval (ms) between sending packets"));
478 printf (" %s\n", "-S, --sourceip=HOST");
479 printf (" %s\n", _("name or IP Address of sourceip"));
480 printf (" %s\n", "-I, --sourceif=IF");
481 printf (" %s\n", _("source interface name"));
419 printf (UT_VERBOSE); 482 printf (UT_VERBOSE);
420 printf ("\n"); 483 printf ("\n");
421 printf (" %s\n", _("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)")); 484 printf (" %s\n", _("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)"));
422 printf (" %s\n", _("which triggers a WARNING or CRITICAL state, and <pl> is the percentage of")); 485 printf (" %s\n", _("which triggers a WARNING or CRITICAL state, and <pl> is the percentage of"));
423 printf (" %s\n", _("packet loss to trigger an alarm state.")); 486 printf (" %s\n", _("packet loss to trigger an alarm state."));
424 487
488 printf ("\n");
489 printf (" %s\n", _("IPv4 is used by default. Specify -6 to use IPv6."));
490
425 printf (UT_SUPPORT); 491 printf (UT_SUPPORT);
426} 492}
427 493
diff --git a/plugins/check_http.c b/plugins/check_http.c
index 9231a559..ea7a6736 100644
--- a/plugins/check_http.c
+++ b/plugins/check_http.c
@@ -1,40 +1,40 @@
1/***************************************************************************** 1/*****************************************************************************
2* 2*
3* Nagios check_http plugin 3* Nagios check_http plugin
4* 4*
5* License: GPL 5* License: GPL
6* Copyright (c) 1999-2008 Nagios Plugins Development Team 6* Copyright (c) 1999-2013 Nagios Plugins Development Team
7* 7*
8* Description: 8* Description:
9* 9*
10* This file contains the check_http plugin 10* This file contains the check_http plugin
11* 11*
12* This plugin tests the HTTP service on the specified host. It can test 12* This plugin tests the HTTP service on the specified host. It can test
13* normal (http) and secure (https) servers, follow redirects, search for 13* normal (http) and secure (https) servers, follow redirects, search for
14* strings and regular expressions, check connection times, and report on 14* strings and regular expressions, check connection times, and report on
15* certificate expiration times. 15* certificate expiration times.
16* 16*
17* 17*
18* This program is free software: you can redistribute it and/or modify 18* This program is free software: you can redistribute it and/or modify
19* it under the terms of the GNU General Public License as published by 19* it under the terms of the GNU General Public License as published by
20* the Free Software Foundation, either version 3 of the License, or 20* the Free Software Foundation, either version 3 of the License, or
21* (at your option) any later version. 21* (at your option) any later version.
22* 22*
23* This program is distributed in the hope that it will be useful, 23* This program is distributed in the hope that it will be useful,
24* but WITHOUT ANY WARRANTY; without even the implied warranty of 24* but WITHOUT ANY WARRANTY; without even the implied warranty of
25* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26* GNU General Public License for more details. 26* GNU General Public License for more details.
27* 27*
28* You should have received a copy of the GNU General Public License 28* You should have received a copy of the GNU General Public License
29* along with this program. If not, see <http://www.gnu.org/licenses/>. 29* along with this program. If not, see <http://www.gnu.org/licenses/>.
30* 30*
31* 31*
32*****************************************************************************/ 32*****************************************************************************/
33 33
34/* splint -I. -I../../plugins -I../../lib/ -I/usr/kerberos/include/ ../../plugins/check_http.c */ 34/* splint -I. -I../../plugins -I../../lib/ -I/usr/kerberos/include/ ../../plugins/check_http.c */
35 35
36const char *progname = "check_http"; 36const char *progname = "check_http";
37const char *copyright = "1999-2011"; 37const char *copyright = "1999-2013";
38const char *email = "nagiosplug-devel@lists.sourceforge.net"; 38const char *email = "nagiosplug-devel@lists.sourceforge.net";
39 39
40#include "common.h" 40#include "common.h"
@@ -43,7 +43,6 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
43#include "base64.h" 43#include "base64.h"
44#include <ctype.h> 44#include <ctype.h>
45 45
46#define INPUT_DELIMITER ";"
47#define STICKY_NONE 0 46#define STICKY_NONE 0
48#define STICKY_HOST 1 47#define STICKY_HOST 1
49#define STICKY_PORT 2 48#define STICKY_PORT 2
@@ -85,6 +84,7 @@ int errcode;
85int invert_regex = 0; 84int invert_regex = 0;
86 85
87struct timeval tv; 86struct timeval tv;
87struct timeval tv_temp;
88 88
89#define HTTP_URL "/" 89#define HTTP_URL "/"
90#define CRLF "\r\n" 90#define CRLF "\r\n"
@@ -100,7 +100,9 @@ char *user_agent;
100int server_url_length; 100int server_url_length;
101int server_expect_yn = 0; 101int server_expect_yn = 0;
102char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; 102char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT;
103char header_expect[MAX_INPUT_BUFFER] = "";
103char string_expect[MAX_INPUT_BUFFER] = ""; 104char string_expect[MAX_INPUT_BUFFER] = "";
105char output_header_search[30] = "";
104char output_string_search[30] = ""; 106char output_string_search[30] = "";
105char *warning_thresholds = NULL; 107char *warning_thresholds = NULL;
106char *critical_thresholds = NULL; 108char *critical_thresholds = NULL;
@@ -115,6 +117,7 @@ int followsticky = STICKY_NONE;
115int use_ssl = FALSE; 117int use_ssl = FALSE;
116int use_sni = FALSE; 118int use_sni = FALSE;
117int verbose = FALSE; 119int verbose = FALSE;
120int show_extended_perfdata = FALSE;
118int sd; 121int sd;
119int min_page_len = 0; 122int min_page_len = 0;
120int max_page_len = 0; 123int max_page_len = 0;
@@ -131,6 +134,11 @@ void redir (char *pos, char *status_line);
131int server_type_check(const char *type); 134int server_type_check(const char *type);
132int server_port_check(int ssl_flag); 135int server_port_check(int ssl_flag);
133char *perfd_time (double microsec); 136char *perfd_time (double microsec);
137char *perfd_time_connect (double microsec);
138char *perfd_time_ssl (double microsec);
139char *perfd_time_firstbyte (double microsec);
140char *perfd_time_headers (double microsec);
141char *perfd_time_transfer (double microsec);
134char *perfd_size (int page_len); 142char *perfd_size (int page_len);
135void print_help (void); 143void print_help (void);
136void print_usage (void); 144void print_usage (void);
@@ -199,6 +207,7 @@ process_arguments (int argc, char **argv)
199 {"port", required_argument, 0, 'p'}, 207 {"port", required_argument, 0, 'p'},
200 {"authorization", required_argument, 0, 'a'}, 208 {"authorization", required_argument, 0, 'a'},
201 {"proxy_authorization", required_argument, 0, 'b'}, 209 {"proxy_authorization", required_argument, 0, 'b'},
210 {"header-string", required_argument, 0, 'd'},
202 {"string", required_argument, 0, 's'}, 211 {"string", required_argument, 0, 's'},
203 {"expect", required_argument, 0, 'e'}, 212 {"expect", required_argument, 0, 'e'},
204 {"regex", required_argument, 0, 'r'}, 213 {"regex", required_argument, 0, 'r'},
@@ -216,6 +225,7 @@ process_arguments (int argc, char **argv)
216 {"invert-regex", no_argument, NULL, INVERT_REGEX}, 225 {"invert-regex", no_argument, NULL, INVERT_REGEX},
217 {"use-ipv4", no_argument, 0, '4'}, 226 {"use-ipv4", no_argument, 0, '4'},
218 {"use-ipv6", no_argument, 0, '6'}, 227 {"use-ipv6", no_argument, 0, '6'},
228 {"extended-perfdata", no_argument, 0, 'E'},
219 {0, 0, 0, 0} 229 {0, 0, 0, 0}
220 }; 230 };
221 231
@@ -236,7 +246,7 @@ process_arguments (int argc, char **argv)
236 } 246 }
237 247
238 while (1) { 248 while (1) {
239 c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:j:T:I:a:b:e:p:s:R:r:u:f:C:nlLS::m:M:N", longopts, &option); 249 c = getopt_long (argc, argv, "Vvh46t:c:w:A:k:H:P:j:T:I:a:b:d:e:p:s:R:r:u:f:C:nlLS::m:M:N:E", longopts, &option);
240 if (c == -1 || c == EOF) 250 if (c == -1 || c == EOF)
241 break; 251 break;
242 252
@@ -385,6 +395,10 @@ process_arguments (int argc, char **argv)
385 free(http_method); 395 free(http_method);
386 http_method = strdup (optarg); 396 http_method = strdup (optarg);
387 break; 397 break;
398 case 'd': /* string or substring */
399 strncpy (header_expect, optarg, MAX_INPUT_BUFFER - 1);
400 header_expect[MAX_INPUT_BUFFER - 1] = 0;
401 break;
388 case 's': /* string or substring */ 402 case 's': /* string or substring */
389 strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1); 403 strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1);
390 string_expect[MAX_INPUT_BUFFER - 1] = 0; 404 string_expect[MAX_INPUT_BUFFER - 1] = 0;
@@ -471,6 +485,9 @@ process_arguments (int argc, char **argv)
471 } 485 }
472 } 486 }
473 break; 487 break;
488 case 'E': /* show extended perfdata */
489 show_extended_perfdata = TRUE;
490 break;
474 } 491 }
475 } 492 }
476 493
@@ -812,17 +829,33 @@ check_http (void)
812 char *pos; 829 char *pos;
813 long microsec; 830 long microsec;
814 double elapsed_time; 831 double elapsed_time;
832 long microsec_connect;
833 double elapsed_time_connect;
834 long microsec_ssl;
835 double elapsed_time_ssl;
836 long microsec_firstbyte;
837 double elapsed_time_firstbyte;
838 long microsec_headers;
839 double elapsed_time_headers;
840 long microsec_transfer;
841 double elapsed_time_transfer;
815 int page_len = 0; 842 int page_len = 0;
816 int result = STATE_OK; 843 int result = STATE_OK;
817 844
818 /* try to connect to the host at the given port number */ 845 /* try to connect to the host at the given port number */
846 gettimeofday (&tv_temp, NULL);
819 if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK) 847 if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK)
820 die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n")); 848 die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n"));
849 microsec_connect = deltime (tv_temp);
821#ifdef HAVE_SSL 850#ifdef HAVE_SSL
851 elapsed_time_connect = (double)microsec_connect / 1.0e6;
822 if (use_ssl == TRUE) { 852 if (use_ssl == TRUE) {
853 gettimeofday (&tv_temp, NULL);
823 result = np_net_ssl_init_with_hostname_and_version(sd, (use_sni ? host_name : NULL), ssl_version); 854 result = np_net_ssl_init_with_hostname_and_version(sd, (use_sni ? host_name : NULL), ssl_version);
824 if (result != STATE_OK) 855 if (result != STATE_OK)
825 return result; 856 return result;
857 microsec_ssl = deltime (tv_temp);
858 elapsed_time_ssl = (double)microsec_ssl / 1.0e6;
826 if (check_cert == TRUE) { 859 if (check_cert == TRUE) {
827 result = np_net_ssl_check_cert(days_till_exp_warn, days_till_exp_crit); 860 result = np_net_ssl_check_cert(days_till_exp_warn, days_till_exp_crit);
828 np_net_ssl_cleanup(); 861 np_net_ssl_cleanup();
@@ -854,8 +887,7 @@ check_http (void)
854 /* optionally send any other header tag */ 887 /* optionally send any other header tag */
855 if (http_opt_headers_count) { 888 if (http_opt_headers_count) {
856 for (i = 0; i < http_opt_headers_count ; i++) { 889 for (i = 0; i < http_opt_headers_count ; i++) {
857 for ((pos = strtok(http_opt_headers[i], INPUT_DELIMITER)); pos; (pos = strtok(NULL, INPUT_DELIMITER))) 890 xasprintf (&buf, "%s%s\r\n", buf, http_opt_headers[i]);
858 xasprintf (&buf, "%s%s\r\n", buf, pos);
859 } 891 }
860 /* This cannot be free'd here because a redirection will then try to access this and segfault */ 892 /* This cannot be free'd here because a redirection will then try to access this and segfault */
861 /* Covered in a testcase in tests/check_http.t */ 893 /* Covered in a testcase in tests/check_http.t */
@@ -891,11 +923,19 @@ check_http (void)
891 } 923 }
892 924
893 if (verbose) printf ("%s\n", buf); 925 if (verbose) printf ("%s\n", buf);
926 gettimeofday (&tv_temp, NULL);
894 my_send (buf, strlen (buf)); 927 my_send (buf, strlen (buf));
928 microsec_headers = deltime (tv_temp);
929 elapsed_time_headers = (double)microsec_headers / 1.0e6;
895 930
896 /* fetch the page */ 931 /* fetch the page */
897 full_page = strdup(""); 932 full_page = strdup("");
933 gettimeofday (&tv_temp, NULL);
898 while ((i = my_recv (buffer, MAX_INPUT_BUFFER-1)) > 0) { 934 while ((i = my_recv (buffer, MAX_INPUT_BUFFER-1)) > 0) {
935 if ((i >= 1) && (elapsed_time_firstbyte <= 0.000001)) {
936 microsec_firstbyte = deltime (tv_temp);
937 elapsed_time_firstbyte = (double)microsec_firstbyte / 1.0e6;
938 }
899 buffer[i] = '\0'; 939 buffer[i] = '\0';
900 xasprintf (&full_page_new, "%s%s", full_page, buffer); 940 xasprintf (&full_page_new, "%s%s", full_page, buffer);
901 free (full_page); 941 free (full_page);
@@ -907,6 +947,8 @@ check_http (void)
907 break; 947 break;
908 } 948 }
909 } 949 }
950 microsec_transfer = deltime (tv_temp);
951 elapsed_time_transfer = (double)microsec_transfer / 1.0e6;
910 952
911 if (i < 0 && errno != ECONNRESET) { 953 if (i < 0 && errno != ECONNRESET) {
912#ifdef HAVE_SSL 954#ifdef HAVE_SSL
@@ -1050,6 +1092,17 @@ check_http (void)
1050 } 1092 }
1051 1093
1052 /* Page and Header content checks go here */ 1094 /* Page and Header content checks go here */
1095 if (strlen (header_expect)) {
1096 if (!strstr (header, header_expect)) {
1097 strncpy(&output_header_search[0],header_expect,sizeof(output_header_search));
1098 if(output_header_search[sizeof(output_header_search)-1]!='\0') {
1099 bcopy("...",&output_header_search[sizeof(output_header_search)-4],4);
1100 }
1101 xasprintf (&msg, _("%sheader '%s' not found on '%s://%s:%d%s', "), msg, output_header_search, use_ssl ? "https" : "http", host_name ? host_name : server_address, server_port, server_url);
1102 result = STATE_CRITICAL;
1103 }
1104 }
1105
1053 1106
1054 if (strlen (string_expect)) { 1107 if (strlen (string_expect)) {
1055 if (!strstr (page, string_expect)) { 1108 if (!strstr (page, string_expect)) {
@@ -1108,11 +1161,25 @@ check_http (void)
1108 msg[strlen(msg)-3] = '\0'; 1161 msg[strlen(msg)-3] = '\0';
1109 1162
1110 /* check elapsed time */ 1163 /* check elapsed time */
1111 xasprintf (&msg, 1164 if (show_extended_perfdata)
1112 _("%s - %d bytes in %.3f second response time %s|%s %s"), 1165 xasprintf (&msg,
1113 msg, page_len, elapsed_time, 1166 _("%s - %d bytes in %.3f second response time %s|%s %s %s %s %s %s %s"),
1114 (display_html ? "</A>" : ""), 1167 msg, page_len, elapsed_time,
1115 perfd_time (elapsed_time), perfd_size (page_len)); 1168 (display_html ? "</A>" : ""),
1169 perfd_time (elapsed_time),
1170 perfd_size (page_len),
1171 perfd_time_connect (elapsed_time_connect),
1172 use_ssl == TRUE ? perfd_time_ssl (elapsed_time_ssl) : "",
1173 perfd_time_headers (elapsed_time_headers),
1174 perfd_time_firstbyte (elapsed_time_firstbyte),
1175 perfd_time_transfer (elapsed_time_transfer));
1176 else
1177 xasprintf (&msg,
1178 _("%s - %d bytes in %.3f second response time %s|%s %s"),
1179 msg, page_len, elapsed_time,
1180 (display_html ? "</A>" : ""),
1181 perfd_time (elapsed_time),
1182 perfd_size (page_len));
1116 1183
1117 result = max_state_alt(get_status(elapsed_time, thlds), result); 1184 result = max_state_alt(get_status(elapsed_time, thlds), result);
1118 1185
@@ -1301,7 +1368,30 @@ char *perfd_time (double elapsed_time)
1301 TRUE, 0, FALSE, 0); 1368 TRUE, 0, FALSE, 0);
1302} 1369}
1303 1370
1371char *perfd_time_connect (double elapsed_time_connect)
1372{
1373 return fperfdata ("time_connect", elapsed_time_connect, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0);
1374}
1375
1376char *perfd_time_ssl (double elapsed_time_ssl)
1377{
1378 return fperfdata ("time_ssl", elapsed_time_ssl, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0);
1379}
1380
1381char *perfd_time_headers (double elapsed_time_headers)
1382{
1383 return fperfdata ("time_headers", elapsed_time_headers, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0);
1384}
1385
1386char *perfd_time_firstbyte (double elapsed_time_firstbyte)
1387{
1388 return fperfdata ("time_firstbyte", elapsed_time_firstbyte, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0);
1389}
1304 1390
1391char *perfd_time_transfer (double elapsed_time_transfer)
1392{
1393 return fperfdata ("time_transfer", elapsed_time_transfer, "s", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0);
1394}
1305 1395
1306char *perfd_size (int page_len) 1396char *perfd_size (int page_len)
1307{ 1397{
@@ -1362,6 +1452,8 @@ print_help (void)
1362 printf (" %s", _("the first (status) line of the server response (default: ")); 1452 printf (" %s", _("the first (status) line of the server response (default: "));
1363 printf ("%s)\n", HTTP_EXPECT); 1453 printf ("%s)\n", HTTP_EXPECT);
1364 printf (" %s\n", _("If specified skips all other status line logic (ex: 3xx, 4xx, 5xx processing)")); 1454 printf (" %s\n", _("If specified skips all other status line logic (ex: 3xx, 4xx, 5xx processing)"));
1455 printf (" %s\n", "-d, --header-string=STRING");
1456 printf (" %s\n", _("String to expect in the response headers"));
1365 printf (" %s\n", "-s, --string=STRING"); 1457 printf (" %s\n", "-s, --string=STRING");
1366 printf (" %s\n", _("String to expect in the content")); 1458 printf (" %s\n", _("String to expect in the content"));
1367 printf (" %s\n", "-u, --url=PATH"); 1459 printf (" %s\n", "-u, --url=PATH");
@@ -1463,7 +1555,7 @@ print_usage (void)
1463 printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname); 1555 printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname);
1464 printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-a auth]\n"); 1556 printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-a auth]\n");
1465 printf (" [-b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>]\n"); 1557 printf (" [-b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>]\n");
1466 printf (" [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n"); 1558 printf (" [-e <expect>] [-d string] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n");
1467 printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n"); 1559 printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n");
1468 printf (" [-A string] [-k string] [-S <version>] [--sni] [-C <warn_age>[,<crit_age>]]\n"); 1560 printf (" [-A string] [-k string] [-S <version>] [--sni] [-C <warn_age>[,<crit_age>]]\n");
1469 printf (" [-T <content-type>] [-j method]\n"); 1561 printf (" [-T <content-type>] [-j method]\n");
diff --git a/plugins/check_mysql.c b/plugins/check_mysql.c
index cacc6c24..521c902d 100644
--- a/plugins/check_mysql.c
+++ b/plugins/check_mysql.c
@@ -5,7 +5,7 @@
5* License: GPL 5* License: GPL
6* Copyright (c) 1999 Didi Rieder (adrieder@sbox.tu-graz.ac.at) 6* Copyright (c) 1999 Didi Rieder (adrieder@sbox.tu-graz.ac.at)
7* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net) 7* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net)
8* Copyright (c) 1999-2009 Nagios Plugins Development Team 8* Copyright (c) 1999-2011 Nagios Plugins Development Team
9* 9*
10* Description: 10* Description:
11* 11*
@@ -31,7 +31,7 @@
31*****************************************************************************/ 31*****************************************************************************/
32 32
33const char *progname = "check_mysql"; 33const char *progname = "check_mysql";
34const char *copyright = "1999-2007"; 34const char *copyright = "1999-2011";
35const char *email = "nagiosplug-devel@lists.sourceforge.net"; 35const char *email = "nagiosplug-devel@lists.sourceforge.net";
36 36
37#define SLAVERESULTSIZE 70 37#define SLAVERESULTSIZE 70
@@ -49,12 +49,44 @@ char *db_host = NULL;
49char *db_socket = NULL; 49char *db_socket = NULL;
50char *db_pass = NULL; 50char *db_pass = NULL;
51char *db = NULL; 51char *db = NULL;
52char *ca_cert = NULL;
53char *ca_dir = NULL;
54char *cert = NULL;
55char *key = NULL;
56char *ciphers = NULL;
57bool ssl = false;
52char *opt_file = NULL; 58char *opt_file = NULL;
53char *opt_group = NULL; 59char *opt_group = NULL;
54unsigned int db_port = MYSQL_PORT; 60unsigned int db_port = MYSQL_PORT;
55int check_slave = 0, warn_sec = 0, crit_sec = 0; 61int check_slave = 0, warn_sec = 0, crit_sec = 0;
56int verbose = 0; 62int verbose = 0;
57 63
64static double warning_time = 0;
65static double critical_time = 0;
66
67#define LENGTH_METRIC_UNIT 6
68static const char *metric_unit[LENGTH_METRIC_UNIT] = {
69 "Open_files",
70 "Open_tables",
71 "Qcache_free_memory",
72 "Qcache_queries_in_cache",
73 "Threads_connected",
74 "Threads_running"
75};
76
77#define LENGTH_METRIC_COUNTER 9
78static const char *metric_counter[LENGTH_METRIC_COUNTER] = {
79 "Connections",
80 "Qcache_hits",
81 "Qcache_inserts",
82 "Qcache_lowmem_prunes",
83 "Qcache_not_cached",
84 "Queries",
85 "Questions",
86 "Table_locks_waited",
87 "Uptime"
88};
89
58thresholds *my_threshold = NULL; 90thresholds *my_threshold = NULL;
59 91
60int process_arguments (int, char **); 92int process_arguments (int, char **);
@@ -75,6 +107,9 @@ main (int argc, char **argv)
75 char *result = NULL; 107 char *result = NULL;
76 char *error = NULL; 108 char *error = NULL;
77 char slaveresult[SLAVERESULTSIZE]; 109 char slaveresult[SLAVERESULTSIZE];
110 char* perf;
111
112 perf = strdup ("");
78 113
79 setlocale (LC_ALL, ""); 114 setlocale (LC_ALL, "");
80 bindtextdomain (PACKAGE, LOCALEDIR); 115 bindtextdomain (PACKAGE, LOCALEDIR);
@@ -97,6 +132,8 @@ main (int argc, char **argv)
97 else 132 else
98 mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"client"); 133 mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"client");
99 134
135 if (ssl)
136 mysql_ssl_set(&mysql,key,cert,ca_cert,ca_dir,ciphers);
100 /* establish a connection to the server and error checking */ 137 /* establish a connection to the server and error checking */
101 if (!mysql_real_connect(&mysql,db_host,db_user,db_pass,db,db_port,db_socket,0)) { 138 if (!mysql_real_connect(&mysql,db_host,db_user,db_pass,db,db_port,db_socket,0)) {
102 if (mysql_errno (&mysql) == CR_UNKNOWN_HOST) 139 if (mysql_errno (&mysql) == CR_UNKNOWN_HOST)
@@ -126,6 +163,37 @@ main (int argc, char **argv)
126 die (STATE_CRITICAL, "%s\n", mysql_error (&mysql)); 163 die (STATE_CRITICAL, "%s\n", mysql_error (&mysql));
127 } 164 }
128 165
166 /* try to fetch some perf data */
167 if (mysql_query (&mysql, "show global status") == 0) {
168 if ( (res = mysql_store_result (&mysql)) == NULL) {
169 error = strdup(mysql_error(&mysql));
170 mysql_close (&mysql);
171 die (STATE_CRITICAL, _("status store_result error: %s\n"), error);
172 }
173
174 while ( (row = mysql_fetch_row (res)) != NULL) {
175 int i;
176
177 for(i = 0; i < LENGTH_METRIC_UNIT; i++) {
178 if (strcmp(row[0], metric_unit[i]) == 0) {
179 xasprintf(&perf, "%s%s ", perf, perfdata(metric_unit[i],
180 atol(row[1]), "", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0));
181 continue;
182 }
183 }
184 for(i = 0; i < LENGTH_METRIC_COUNTER; i++) {
185 if (strcmp(row[0], metric_counter[i]) == 0) {
186 xasprintf(&perf, "%s%s ", perf, perfdata(metric_counter[i],
187 atol(row[1]), "c", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0));
188 continue;
189 }
190 }
191 }
192 /* remove trailing space */
193 if (strlen(perf) > 0)
194 perf[strlen(perf) - 1] = '\0';
195 }
196
129 if(check_slave) { 197 if(check_slave) {
130 /* check the slave status */ 198 /* check the slave status */
131 if (mysql_query (&mysql, "show slave status") != 0) { 199 if (mysql_query (&mysql, "show slave status") != 0) {
@@ -165,7 +233,7 @@ main (int argc, char **argv)
165 } 233 }
166 234
167 } else { 235 } else {
168 /* mysql 4.x.x */ 236 /* mysql 4.x.x and mysql 5.x.x */
169 int slave_io_field = -1 , slave_sql_field = -1, seconds_behind_field = -1, i, num_fields; 237 int slave_io_field = -1 , slave_sql_field = -1, seconds_behind_field = -1, i, num_fields;
170 MYSQL_FIELD* fields; 238 MYSQL_FIELD* fields;
171 239
@@ -186,13 +254,17 @@ main (int argc, char **argv)
186 } 254 }
187 } 255 }
188 256
257 /* Check if slave status is available */
189 if ((slave_io_field < 0) || (slave_sql_field < 0) || (num_fields == 0)) { 258 if ((slave_io_field < 0) || (slave_sql_field < 0) || (num_fields == 0)) {
190 mysql_free_result (res); 259 mysql_free_result (res);
191 mysql_close (&mysql); 260 mysql_close (&mysql);
192 die (STATE_CRITICAL, "Slave status unavailable\n"); 261 die (STATE_CRITICAL, "Slave status unavailable\n");
193 } 262 }
194 263
264 /* Save slave status in slaveresult */
195 snprintf (slaveresult, SLAVERESULTSIZE, "Slave IO: %s Slave SQL: %s Seconds Behind Master: %s", row[slave_io_field], row[slave_sql_field], seconds_behind_field!=-1?row[seconds_behind_field]:"Unknown"); 265 snprintf (slaveresult, SLAVERESULTSIZE, "Slave IO: %s Slave SQL: %s Seconds Behind Master: %s", row[slave_io_field], row[slave_sql_field], seconds_behind_field!=-1?row[seconds_behind_field]:"Unknown");
266
267 /* Raise critical error if SQL THREAD or IO THREAD are stopped */
196 if (strcmp (row[slave_io_field], "Yes") != 0 || strcmp (row[slave_sql_field], "Yes") != 0) { 268 if (strcmp (row[slave_io_field], "Yes") != 0 || strcmp (row[slave_sql_field], "Yes") != 0) {
197 mysql_free_result (res); 269 mysql_free_result (res);
198 mysql_close (&mysql); 270 mysql_close (&mysql);
@@ -207,17 +279,24 @@ main (int argc, char **argv)
207 } 279 }
208 } 280 }
209 281
282 /* Check Seconds Behind against threshold */
210 if ((seconds_behind_field != -1) && (strcmp (row[seconds_behind_field], "NULL") != 0)) { 283 if ((seconds_behind_field != -1) && (strcmp (row[seconds_behind_field], "NULL") != 0)) {
211 double value = atof(row[seconds_behind_field]); 284 double value = atof(row[seconds_behind_field]);
212 int status; 285 int status;
213 286
214 status = get_status(value, my_threshold); 287 status = get_status(value, my_threshold);
215 288
289 xasprintf (&perf, "%s %s", perf, fperfdata ("seconds behind master", value, "s",
290 TRUE, (double) warning_time,
291 TRUE, (double) critical_time,
292 FALSE, 0,
293 FALSE, 0));
294
216 if (status == STATE_WARNING) { 295 if (status == STATE_WARNING) {
217 printf("SLOW_SLAVE %s: %s\n", _("WARNING"), slaveresult); 296 printf("SLOW_SLAVE %s: %s|%s\n", _("WARNING"), slaveresult, perf);
218 exit(STATE_WARNING); 297 exit(STATE_WARNING);
219 } else if (status == STATE_CRITICAL) { 298 } else if (status == STATE_CRITICAL) {
220 printf("SLOW_SLAVE %s: %s\n", _("CRITICAL"), slaveresult); 299 printf("SLOW_SLAVE %s: %s|%s\n", _("CRITICAL"), slaveresult, perf);
221 exit(STATE_CRITICAL); 300 exit(STATE_CRITICAL);
222 } 301 }
223 } 302 }
@@ -232,9 +311,9 @@ main (int argc, char **argv)
232 311
233 /* print out the result of stats */ 312 /* print out the result of stats */
234 if (check_slave) { 313 if (check_slave) {
235 printf ("%s %s\n", result, slaveresult); 314 printf ("%s %s|%s\n", result, slaveresult, perf);
236 } else { 315 } else {
237 printf ("%s\n", result); 316 printf ("%s|%s\n", result, perf);
238 } 317 }
239 318
240 return STATE_OK; 319 return STATE_OK;
@@ -265,6 +344,12 @@ process_arguments (int argc, char **argv)
265 {"verbose", no_argument, 0, 'v'}, 344 {"verbose", no_argument, 0, 'v'},
266 {"version", no_argument, 0, 'V'}, 345 {"version", no_argument, 0, 'V'},
267 {"help", no_argument, 0, 'h'}, 346 {"help", no_argument, 0, 'h'},
347 {"ssl", no_argument, 0, 'l'},
348 {"ca-cert", optional_argument, 0, 'C'},
349 {"key", required_argument,0,'k'},
350 {"cert", required_argument,0,'a'},
351 {"ca-dir", required_argument, 0, 'D'},
352 {"ciphers", required_argument, 0, 'L'},
268 {0, 0, 0, 0} 353 {0, 0, 0, 0}
269 }; 354 };
270 355
@@ -272,7 +357,7 @@ process_arguments (int argc, char **argv)
272 return ERROR; 357 return ERROR;
273 358
274 while (1) { 359 while (1) {
275 c = getopt_long (argc, argv, "hvVSP:p:u:d:f:g:H:s:c:w:", longopts, &option); 360 c = getopt_long (argc, argv, "hlvVSP:p:u:d:H:s:c:w:a:k:C:D:L:f:g:", longopts, &option);
276 361
277 if (c == -1 || c == EOF) 362 if (c == -1 || c == EOF)
278 break; 363 break;
@@ -292,6 +377,24 @@ process_arguments (int argc, char **argv)
292 case 'd': /* database */ 377 case 'd': /* database */
293 db = optarg; 378 db = optarg;
294 break; 379 break;
380 case 'l':
381 ssl = true;
382 break;
383 case 'C':
384 ca_cert = optarg;
385 break;
386 case 'a':
387 cert = optarg;
388 break;
389 case 'k':
390 key = optarg;
391 break;
392 case 'D':
393 ca_dir = optarg;
394 break;
395 case 'L':
396 ciphers = optarg;
397 break;
295 case 'u': /* username */ 398 case 'u': /* username */
296 db_user = optarg; 399 db_user = optarg;
297 break; 400 break;
@@ -318,9 +421,11 @@ process_arguments (int argc, char **argv)
318 break; 421 break;
319 case 'w': 422 case 'w':
320 warning = optarg; 423 warning = optarg;
424 warning_time = strtod (warning, NULL);
321 break; 425 break;
322 case 'c': 426 case 'c':
323 critical = optarg; 427 critical = optarg;
428 critical_time = strtod (critical, NULL);
324 break; 429 break;
325 case 'V': /* version */ 430 case 'V': /* version */
326 print_revision (progname, NP_VERSION); 431 print_revision (progname, NP_VERSION);
@@ -434,6 +539,19 @@ print_help (void)
434 printf (" %s\n", "-c, --critical"); 539 printf (" %s\n", "-c, --critical");
435 printf (" %s\n", _("Exit with CRITICAL status if slave server is more then INTEGER seconds")); 540 printf (" %s\n", _("Exit with CRITICAL status if slave server is more then INTEGER seconds"));
436 printf (" %s\n", _("behind master")); 541 printf (" %s\n", _("behind master"));
542 printf (" %s\n", "-l, --ssl");
543 printf (" %s\n", _("Use ssl encryptation"));
544 printf (" %s\n", "-C, --ca-cert=STRING");
545 printf (" %s\n", _("Path to CA signing the cert"));
546 printf (" %s\n", "-a, --cert=STRING");
547 printf (" %s\n", _("Path to SSL certificate"));
548 printf (" %s\n", "-k, --key=STRING");
549 printf (" %s\n", _("Path to private SSL key"));
550 printf (" %s\n", "-D, --ca-dir=STRING");
551 printf (" %s\n", _("Path to CA directory"));
552 printf (" %s\n", "-L, --ciphers=STRING");
553 printf (" %s\n", _("List of valid SSL ciphers"));
554
437 555
438 printf ("\n"); 556 printf ("\n");
439 printf (" %s\n", _("There are no required arguments. By default, the local database is checked")); 557 printf (" %s\n", _("There are no required arguments. By default, the local database is checked"));
@@ -454,6 +572,6 @@ print_usage (void)
454{ 572{
455 printf ("%s\n", _("Usage:")); 573 printf ("%s\n", _("Usage:"));
456 printf (" %s [-d database] [-H host] [-P port] [-s socket]\n",progname); 574 printf (" %s [-d database] [-H host] [-P port] [-s socket]\n",progname);
457 printf (" [-u user] [-p password] [-S] [-f optfile]\n"); 575 printf (" [-u user] [-p password] [-S] [-l] [-a cert] [-k key]\n");
458 printf (" [-g group]\n"); 576 printf (" [-C ca-cert] [-D ca-dir] [-L ciphers] [-f optfile] [-g group]\n");
459} 577}
diff --git a/plugins/check_nagios.c b/plugins/check_nagios.c
index c8cdbc02..4fd6342d 100644
--- a/plugins/check_nagios.c
+++ b/plugins/check_nagios.c
@@ -205,6 +205,7 @@ process_arguments (int argc, char **argv)
205 {"filename", required_argument, 0, 'F'}, 205 {"filename", required_argument, 0, 'F'},
206 {"expires", required_argument, 0, 'e'}, 206 {"expires", required_argument, 0, 'e'},
207 {"command", required_argument, 0, 'C'}, 207 {"command", required_argument, 0, 'C'},
208 {"timeout", optional_argument, 0, 't'},
208 {"version", no_argument, 0, 'V'}, 209 {"version", no_argument, 0, 'V'},
209 {"help", no_argument, 0, 'h'}, 210 {"help", no_argument, 0, 'h'},
210 {"verbose", no_argument, 0, 'v'}, 211 {"verbose", no_argument, 0, 'v'},
@@ -226,7 +227,7 @@ process_arguments (int argc, char **argv)
226 } 227 }
227 228
228 while (1) { 229 while (1) {
229 c = getopt_long (argc, argv, "+hVvF:C:e:", longopts, &option); 230 c = getopt_long (argc, argv, "+hVvF:C:e:t:", longopts, &option);
230 231
231 if (c == -1 || c == EOF || c == 1) 232 if (c == -1 || c == EOF || c == 1)
232 break; 233 break;
@@ -251,6 +252,13 @@ process_arguments (int argc, char **argv)
251 die (STATE_UNKNOWN, 252 die (STATE_UNKNOWN,
252 _("Expiration time must be an integer (seconds)\n")); 253 _("Expiration time must be an integer (seconds)\n"));
253 break; 254 break;
255 case 't': /* timeout */
256 if (is_intnonneg (optarg))
257 timeout_interval = atoi (optarg);
258 else
259 die (STATE_UNKNOWN,
260 _("Timeout must be an integer (seconds)\n"));
261 break;
254 case 'v': 262 case 'v':
255 verbose++; 263 verbose++;
256 break; 264 break;
@@ -296,11 +304,13 @@ print_help (void)
296 printf (" %s\n", _("Minutes aging after which logfile is considered stale")); 304 printf (" %s\n", _("Minutes aging after which logfile is considered stale"));
297 printf (" %s\n", "-C, --command=STRING"); 305 printf (" %s\n", "-C, --command=STRING");
298 printf (" %s\n", _("Substring to search for in process arguments")); 306 printf (" %s\n", _("Substring to search for in process arguments"));
307 printf (" %s\n", "-t, --timeout=INTEGER");
308 printf (" %s\n", _("Timeout for the plugin in seconds"));
299 printf (UT_VERBOSE); 309 printf (UT_VERBOSE);
300 310
301 printf ("\n"); 311 printf ("\n");
302 printf ("%s\n", _("Examples:")); 312 printf ("%s\n", _("Examples:"));
303 printf (" %s\n", "check_nagios -e 5 -F /usr/local/nagios/var/status.log -C /usr/local/nagios/bin/nagios"); 313 printf (" %s\n", "check_nagios -t 20 -e 5 -F /usr/local/nagios/var/status.log -C /usr/local/nagios/bin/nagios");
304 314
305 printf (UT_SUPPORT); 315 printf (UT_SUPPORT);
306} 316}
@@ -311,5 +321,5 @@ void
311print_usage (void) 321print_usage (void)
312{ 322{
313 printf ("%s\n", _("Usage:")); 323 printf ("%s\n", _("Usage:"));
314 printf ("%s -F <status log file> -e <expire_minutes> -C <process_string>\n", progname); 324 printf ("%s -F <status log file> -t <timeout_seconds> -e <expire_minutes> -C <process_string>\n", progname);
315} 325}
diff --git a/plugins/check_nt.c b/plugins/check_nt.c
index 89c4d8d3..52bbd1c5 100644
--- a/plugins/check_nt.c
+++ b/plugins/check_nt.c
@@ -94,6 +94,7 @@ int main(int argc, char **argv){
94 char *description=NULL,*counter_unit = NULL; 94 char *description=NULL,*counter_unit = NULL;
95 char *minval = NULL, *maxval = NULL, *errcvt = NULL; 95 char *minval = NULL, *maxval = NULL, *errcvt = NULL;
96 char *fds=NULL, *tds=NULL; 96 char *fds=NULL, *tds=NULL;
97 char *numstr;
97 98
98 double total_disk_space=0; 99 double total_disk_space=0;
99 double free_disk_space=0; 100 double free_disk_space=0;
@@ -265,7 +266,10 @@ int main(int argc, char **argv){
265 xasprintf(&send_buffer,"%s&%u&%s&%s", req_password,(vars_to_check==CHECK_SERVICESTATE)?5:6, 266 xasprintf(&send_buffer,"%s&%u&%s&%s", req_password,(vars_to_check==CHECK_SERVICESTATE)?5:6,
266 (show_all==TRUE) ? "ShowAll" : "ShowFail",value_list); 267 (show_all==TRUE) ? "ShowAll" : "ShowFail",value_list);
267 fetch_data (server_address, server_port, send_buffer); 268 fetch_data (server_address, server_port, send_buffer);
268 return_code=atoi(strtok(recv_buffer,"&")); 269 numstr = strtok(recv_buffer,"&");
270 if (numstr == NULL)
271 die(STATE_UNKNOWN, _("could not fetch information from server\n"));
272 return_code=atoi(numstr);
269 temp_string=strtok(NULL,"&"); 273 temp_string=strtok(NULL,"&");
270 output_message = strdup (temp_string); 274 output_message = strdup (temp_string);
271 } 275 }
@@ -275,8 +279,14 @@ int main(int argc, char **argv){
275 279
276 xasprintf(&send_buffer,"%s&7", req_password); 280 xasprintf(&send_buffer,"%s&7", req_password);
277 fetch_data (server_address, server_port, send_buffer); 281 fetch_data (server_address, server_port, send_buffer);
278 mem_commitLimit=atof(strtok(recv_buffer,"&")); 282 numstr = strtok(recv_buffer,"&");
279 mem_commitByte=atof(strtok(NULL,"&")); 283 if (numstr == NULL)
284 die(STATE_UNKNOWN, _("could not fetch information from server\n"));
285 mem_commitLimit=atof(numstr);
286 numstr = strtok(NULL,"&");
287 if (numstr == NULL)
288 die(STATE_UNKNOWN, _("could not fetch information from server\n"));
289 mem_commitByte=atof(numstr);
280 percent_used_space = (mem_commitByte / mem_commitLimit) * 100; 290 percent_used_space = (mem_commitByte / mem_commitLimit) * 100;
281 warning_used_space = ((float)warning_value / 100) * mem_commitLimit; 291 warning_used_space = ((float)warning_value / 100) * mem_commitLimit;
282 critical_used_space = ((float)critical_value / 100) * mem_commitLimit; 292 critical_used_space = ((float)critical_value / 100) * mem_commitLimit;
diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c
index b59c056d..76152e17 100644
--- a/plugins/check_ntp_peer.c
+++ b/plugins/check_ntp_peer.c
@@ -241,15 +241,19 @@ int ntp_request(const char *host, double *offset, int *offset_result, double *ji
241 DBG(printf("sending READSTAT request")); 241 DBG(printf("sending READSTAT request"));
242 write(conn, &req, SIZEOF_NTPCM(req)); 242 write(conn, &req, SIZEOF_NTPCM(req));
243 DBG(print_ntp_control_message(&req)); 243 DBG(print_ntp_control_message(&req));
244 /* Attempt to read the largest size packet possible */ 244
245 req.count=htons(MAX_CM_SIZE); 245 do {
246 DBG(printf("recieving READSTAT response")) 246 /* Attempt to read the largest size packet possible */
247 if(read(conn, &req, SIZEOF_NTPCM(req)) == -1) 247 req.count=htons(MAX_CM_SIZE);
248 die(STATE_CRITICAL, "NTP CRITICAL: No response from NTP server\n"); 248 DBG(printf("recieving READSTAT response"))
249 DBG(print_ntp_control_message(&req)); 249 if(read(conn, &req, SIZEOF_NTPCM(req)) == -1)
250 /* discard obviously invalid packets */ 250 die(STATE_CRITICAL, "NTP CRITICAL: No response from NTP server\n");
251 if (ntohs(req.count) > MAX_CM_SIZE) 251 DBG(print_ntp_control_message(&req));
252 die(STATE_CRITICAL, "NTP CRITICAL: Invalid packet received from NTP server\n"); 252 /* discard obviously invalid packets */
253 if (ntohs(req.count) > MAX_CM_SIZE)
254 die(STATE_CRITICAL, "NTP CRITICAL: Invalid packet received from NTP server\n");
255 } while (!(req.op&OP_READSTAT && ntohs(req.seq) == 1));
256
253 if (LI(req.flags) == LI_ALARM) li_alarm = 1; 257 if (LI(req.flags) == LI_ALARM) li_alarm = 1;
254 /* Each peer identifier is 4 bytes in the data section, which 258 /* Each peer identifier is 4 bytes in the data section, which
255 * we represent as a ntp_assoc_status_pair datatype. 259 * we represent as a ntp_assoc_status_pair datatype.
@@ -312,10 +316,12 @@ int ntp_request(const char *host, double *offset, int *offset_result, double *ji
312 write(conn, &req, SIZEOF_NTPCM(req)); 316 write(conn, &req, SIZEOF_NTPCM(req));
313 DBG(print_ntp_control_message(&req)); 317 DBG(print_ntp_control_message(&req));
314 318
315 req.count = htons(MAX_CM_SIZE); 319 do {
316 DBG(printf("receiving READVAR response...\n")); 320 req.count = htons(MAX_CM_SIZE);
317 read(conn, &req, SIZEOF_NTPCM(req)); 321 DBG(printf("receiving READVAR response...\n"));
318 DBG(print_ntp_control_message(&req)); 322 read(conn, &req, SIZEOF_NTPCM(req));
323 DBG(print_ntp_control_message(&req));
324 } while (!(req.op&OP_READVAR && ntohs(req.seq) == 2));
319 325
320 if(!(req.op&REM_ERROR)) 326 if(!(req.op&REM_ERROR))
321 xasprintf(&data, "%s%s", data, req.data); 327 xasprintf(&data, "%s%s", data, req.data);
diff --git a/plugins/check_pgsql.c b/plugins/check_pgsql.c
index 8b0769f1..8d60701f 100644
--- a/plugins/check_pgsql.c
+++ b/plugins/check_pgsql.c
@@ -3,7 +3,7 @@
3* Nagios check_pgsql plugin 3* Nagios check_pgsql plugin
4* 4*
5* License: GPL 5* License: GPL
6* Copyright (c) 1999-2007 Nagios Plugins Development Team 6* Copyright (c) 1999-2011 Nagios Plugins Development Team
7* 7*
8* Description: 8* Description:
9* 9*
@@ -29,7 +29,7 @@
29*****************************************************************************/ 29*****************************************************************************/
30 30
31const char *progname = "check_pgsql"; 31const char *progname = "check_pgsql";
32const char *copyright = "1999-2007"; 32const char *copyright = "1999-2011";
33const char *email = "nagiosplug-devel@lists.sourceforge.net"; 33const char *email = "nagiosplug-devel@lists.sourceforge.net";
34 34
35#include "common.h" 35#include "common.h"
@@ -42,6 +42,20 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
42#define DEFAULT_DB "template1" 42#define DEFAULT_DB "template1"
43#define DEFAULT_HOST "127.0.0.1" 43#define DEFAULT_HOST "127.0.0.1"
44 44
45/* return the PSQL server version as a 3-tuple */
46#define PSQL_SERVER_VERSION3(server_version) \
47 (server_version) / 10000, \
48 (server_version) / 100 - (int)((server_version) / 10000) * 100, \
49 (server_version) - (int)((server_version) / 100) * 100
50/* return true if the given host is a UNIX domain socket */
51#define PSQL_IS_UNIX_DOMAIN_SOCKET(host) \
52 ((NULL == (host)) || ('\0' == *(host)) || ('/' == *(host)))
53/* return a 3-tuple identifying a host/port independent of the socket type */
54#define PSQL_SOCKET3(host, port) \
55 ((NULL == (host)) || ('\0' == *(host))) ? DEFAULT_PGSOCKET_DIR : host, \
56 PSQL_IS_UNIX_DOMAIN_SOCKET (host) ? "/.s.PGSQL." : ":", \
57 port
58
45enum { 59enum {
46 DEFAULT_PORT = 5432, 60 DEFAULT_PORT = 5432,
47 DEFAULT_WARN = 2, 61 DEFAULT_WARN = 2,
@@ -56,6 +70,7 @@ void print_usage (void);
56void print_help (void); 70void print_help (void);
57int is_pg_dbname (char *); 71int is_pg_dbname (char *);
58int is_pg_logname (char *); 72int is_pg_logname (char *);
73int do_query (PGconn *, char *);
59 74
60char *pghost = NULL; /* host name of the backend server */ 75char *pghost = NULL; /* host name of the backend server */
61char *pgport = NULL; /* port of the backend server */ 76char *pgport = NULL; /* port of the backend server */
@@ -65,14 +80,15 @@ char *pgtty = NULL;
65char dbName[NAMEDATALEN] = DEFAULT_DB; 80char dbName[NAMEDATALEN] = DEFAULT_DB;
66char *pguser = NULL; 81char *pguser = NULL;
67char *pgpasswd = NULL; 82char *pgpasswd = NULL;
83char *pgparams = NULL;
68double twarn = (double)DEFAULT_WARN; 84double twarn = (double)DEFAULT_WARN;
69double tcrit = (double)DEFAULT_CRIT; 85double tcrit = (double)DEFAULT_CRIT;
86char *pgquery = NULL;
87char *query_warning = NULL;
88char *query_critical = NULL;
89thresholds *qthresholds = NULL;
70int verbose = 0; 90int verbose = 0;
71 91
72PGconn *conn;
73/*PGresult *res;*/
74
75
76/****************************************************************************** 92/******************************************************************************
77 93
78The (psuedo?)literate programming XML is contained within \@\@\- <XML> \-\@\@ 94The (psuedo?)literate programming XML is contained within \@\@\- <XML> \-\@\@
@@ -115,10 +131,6 @@ Please note that all tags must be lowercase to use the DocBook XML DTD.
115<sect2> 131<sect2>
116<title>Future Enhancements</title> 132<title>Future Enhancements</title>
117<para>ToDo List</para> 133<para>ToDo List</para>
118<itemizedlist>
119<listitem>Add option to get password from a secured file rather than the command line</listitem>
120<listitem>Add option to specify the query to execute</listitem>
121</itemizedlist>
122</sect2> 134</sect2>
123 135
124 136
@@ -132,8 +144,14 @@ Please note that all tags must be lowercase to use the DocBook XML DTD.
132int 144int
133main (int argc, char **argv) 145main (int argc, char **argv)
134{ 146{
135 int elapsed_time; 147 PGconn *conn;
148 char *conninfo = NULL;
149
150 struct timeval start_timeval;
151 struct timeval end_timeval;
152 double elapsed_time;
136 int status = STATE_UNKNOWN; 153 int status = STATE_UNKNOWN;
154 int query_status = STATE_UNKNOWN;
137 155
138 /* begin, by setting the parameters for a backend connection if the 156 /* begin, by setting the parameters for a backend connection if the
139 * parameters are null, then the system will try to use reasonable 157 * parameters are null, then the system will try to use reasonable
@@ -161,20 +179,41 @@ main (int argc, char **argv)
161 } 179 }
162 alarm (timeout_interval); 180 alarm (timeout_interval);
163 181
164 if (verbose) 182 if (pgparams)
165 printf("Connecting to database:\n DB: %s\n User: %s\n Host: %s\n Port: %d\n", dbName, 183 asprintf (&conninfo, "%s ", pgparams);
166 (pguser != NULL) ? pguser : "unspecified", 184
167 (pghost != NULL) ? pghost : "unspecified", 185 asprintf (&conninfo, "%sdbname = '%s'", conninfo ? conninfo : "", dbName);
168 (pgport != NULL) ? atoi(pgport) : DEFAULT_PORT); 186 if (pghost)
187 asprintf (&conninfo, "%s host = '%s'", conninfo, pghost);
188 if (pgport)
189 asprintf (&conninfo, "%s port = '%s'", conninfo, pgport);
190 if (pgoptions)
191 asprintf (&conninfo, "%s options = '%s'", conninfo, pgoptions);
192 /* if (pgtty) -- ignored by PQconnectdb */
193 if (pguser)
194 asprintf (&conninfo, "%s user = '%s'", conninfo, pguser);
195
196 if (verbose) /* do not include password (see right below) in output */
197 printf ("Connecting to PostgreSQL using conninfo: %s%s\n", conninfo,
198 pgpasswd ? " password = <hidden>" : "");
199
200 if (pgpasswd)
201 asprintf (&conninfo, "%s password = '%s'", conninfo, pgpasswd);
169 202
170 /* make a connection to the database */ 203 /* make a connection to the database */
171 time (&start_time); 204 gettimeofday (&start_timeval, NULL);
172 conn = 205 conn = PQconnectdb (conninfo);
173 PQsetdbLogin (pghost, pgport, pgoptions, pgtty, dbName, pguser, pgpasswd); 206 gettimeofday (&end_timeval, NULL);
174 time (&end_time); 207
175 elapsed_time = (int) (end_time - start_time); 208 while (start_timeval.tv_usec > end_timeval.tv_usec) {
209 --end_timeval.tv_sec;
210 end_timeval.tv_usec += 1000000;
211 }
212 elapsed_time = (double)(end_timeval.tv_sec - start_timeval.tv_sec)
213 + (double)(end_timeval.tv_usec - start_timeval.tv_usec) / 1000000.0;
214
176 if (verbose) 215 if (verbose)
177 printf("Time elapsed: %d\n", elapsed_time); 216 printf("Time elapsed: %f\n", elapsed_time);
178 217
179 /* check to see that the backend connection was successfully made */ 218 /* check to see that the backend connection was successfully made */
180 if (verbose) 219 if (verbose)
@@ -194,14 +233,32 @@ main (int argc, char **argv)
194 else { 233 else {
195 status = STATE_OK; 234 status = STATE_OK;
196 } 235 }
236
237 if (verbose) {
238 char *server_host = PQhost (conn);
239 int server_version = PQserverVersion (conn);
240
241 printf ("Successfully connected to database %s (user %s) "
242 "at server %s%s%s (server version: %d.%d.%d, "
243 "protocol version: %d, pid: %d)\n",
244 PQdb (conn), PQuser (conn),
245 PSQL_SOCKET3 (server_host, PQport (conn)),
246 PSQL_SERVER_VERSION3 (server_version),
247 PQprotocolVersion (conn), PQbackendPID (conn));
248 }
249
250 printf (_(" %s - database %s (%f sec.)|%s\n"),
251 state_text(status), dbName, elapsed_time,
252 fperfdata("time", elapsed_time, "s",
253 !!(twarn > 0.0), twarn, !!(tcrit > 0.0), tcrit, TRUE, 0, FALSE,0));
254
255 if (pgquery)
256 query_status = do_query (conn, pgquery);
257
197 if (verbose) 258 if (verbose)
198 printf("Closing connection\n"); 259 printf("Closing connection\n");
199 PQfinish (conn); 260 PQfinish (conn);
200 printf (_(" %s - database %s (%d sec.)|%s\n"), 261 return (query_status > status) ? query_status : status;
201 state_text(status), dbName, elapsed_time,
202 fperfdata("time", elapsed_time, "s",
203 (int)twarn, twarn, (int)tcrit, tcrit, TRUE, 0, FALSE,0));
204 return status;
205} 262}
206 263
207 264
@@ -225,12 +282,16 @@ process_arguments (int argc, char **argv)
225 {"authorization", required_argument, 0, 'a'}, 282 {"authorization", required_argument, 0, 'a'},
226 {"port", required_argument, 0, 'P'}, 283 {"port", required_argument, 0, 'P'},
227 {"database", required_argument, 0, 'd'}, 284 {"database", required_argument, 0, 'd'},
285 {"option", required_argument, 0, 'o'},
286 {"query", required_argument, 0, 'q'},
287 {"query_critical", required_argument, 0, 'C'},
288 {"query_warning", required_argument, 0, 'W'},
228 {"verbose", no_argument, 0, 'v'}, 289 {"verbose", no_argument, 0, 'v'},
229 {0, 0, 0, 0} 290 {0, 0, 0, 0}
230 }; 291 };
231 292
232 while (1) { 293 while (1) {
233 c = getopt_long (argc, argv, "hVt:c:w:H:P:d:l:p:a:v", 294 c = getopt_long (argc, argv, "hVt:c:w:H:P:d:l:p:a:o:q:C:W:v",
234 longopts, &option); 295 longopts, &option);
235 296
236 if (c == EOF) 297 if (c == EOF)
@@ -263,8 +324,14 @@ process_arguments (int argc, char **argv)
263 else 324 else
264 twarn = strtod (optarg, NULL); 325 twarn = strtod (optarg, NULL);
265 break; 326 break;
327 case 'C': /* critical query threshold */
328 query_critical = optarg;
329 break;
330 case 'W': /* warning query threshold */
331 query_warning = optarg;
332 break;
266 case 'H': /* host */ 333 case 'H': /* host */
267 if (!is_host (optarg)) 334 if ((*optarg != '/') && (!is_host (optarg)))
268 usage2 (_("Invalid hostname/address"), optarg); 335 usage2 (_("Invalid hostname/address"), optarg);
269 else 336 else
270 pghost = optarg; 337 pghost = optarg;
@@ -291,12 +358,23 @@ process_arguments (int argc, char **argv)
291 case 'a': 358 case 'a':
292 pgpasswd = optarg; 359 pgpasswd = optarg;
293 break; 360 break;
361 case 'o':
362 if (pgparams)
363 asprintf (&pgparams, "%s %s", pgparams, optarg);
364 else
365 asprintf (&pgparams, "%s", optarg);
366 break;
367 case 'q':
368 pgquery = optarg;
369 break;
294 case 'v': 370 case 'v':
295 verbose++; 371 verbose++;
296 break; 372 break;
297 } 373 }
298 } 374 }
299 375
376 set_thresholds (&qthresholds, query_warning, query_critical);
377
300 return validate_arguments (); 378 return validate_arguments ();
301} 379}
302 380
@@ -434,8 +512,6 @@ print_help (void)
434 512
435 printf (UT_HOST_PORT, 'P', myport); 513 printf (UT_HOST_PORT, 'P', myport);
436 514
437 printf (UT_IPv46);
438
439 printf (" %s\n", "-d, --database=STRING"); 515 printf (" %s\n", "-d, --database=STRING");
440 printf (" %s", _("Database to check ")); 516 printf (" %s", _("Database to check "));
441 printf (_("(default: %s)"), DEFAULT_DB); 517 printf (_("(default: %s)"), DEFAULT_DB);
@@ -443,11 +519,20 @@ print_help (void)
443 printf (" %s\n", _("Login name of user")); 519 printf (" %s\n", _("Login name of user"));
444 printf (" %s\n", "-p, --password = STRING"); 520 printf (" %s\n", "-p, --password = STRING");
445 printf (" %s\n", _("Password (BIG SECURITY ISSUE)")); 521 printf (" %s\n", _("Password (BIG SECURITY ISSUE)"));
522 printf (" %s\n", "-o, --option = STRING");
523 printf (" %s\n", _("Connection parameters (keyword = value), see below"));
446 524
447 printf (UT_WARN_CRIT); 525 printf (UT_WARN_CRIT);
448 526
449 printf (UT_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); 527 printf (UT_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
450 528
529 printf (" %s\n", "-q, --query=STRING");
530 printf (" %s\n", _("SQL query to run. Only first column in first row will be read"));
531 printf (" %s\n", "-W, --query-warning=RANGE");
532 printf (" %s\n", _("SQL query value to result in warning status (double)"));
533 printf (" %s\n", "-C, --query-critical=RANGE");
534 printf (" %s\n", _("SQL query value to result in critical status (double)"));
535
451 printf (UT_VERBOSE); 536 printf (UT_VERBOSE);
452 537
453 printf ("\n"); 538 printf ("\n");
@@ -458,6 +543,22 @@ print_help (void)
458 printf (" %s\n", _("connects to the template1 database, which is present in every functioning")); 543 printf (" %s\n", _("connects to the template1 database, which is present in every functioning"));
459 printf (" %s\n\n", _("PostgreSQL DBMS.")); 544 printf (" %s\n\n", _("PostgreSQL DBMS."));
460 545
546 printf (" %s\n", _("If a query is specified using the -q option, it will be executed after"));
547 printf (" %s\n", _("connecting to the server. The result from the query has to be numeric."));
548 printf (" %s\n", _("Multiple SQL commands, separated by semicolon, are allowed but the result "));
549 printf (" %s\n", _("of the last command is taken into account only. The value of the first"));
550 printf (" %s\n\n", _("column in the first row is used as the check result."));
551
552 printf (" %s\n", _("See the chapter \"Monitoring Database Activity\" of the PostgreSQL manual"));
553 printf (" %s\n\n", _("for details about how to access internal statistics of the database server."));
554
555 printf (" %s\n", _("For a list of available connection parameters which may be used with the -o"));
556 printf (" %s\n", _("command line option, see the documentation for PQconnectdb() in the chapter"));
557 printf (" %s\n", _("\"libpq - C Library\" of the PostgreSQL manual. For example, this may be"));
558 printf (" %s\n", _("used to specify a service name in pg_service.conf to be used for additional"));
559 printf (" %s\n", _("connection parameters: -o 'service=<name>' or to specify the SSL mode:"));
560 printf (" %s\n\n", _("-o 'sslmode=require'."));
561
461 printf (" %s\n", _("The plugin will connect to a local postmaster if no host is specified. To")); 562 printf (" %s\n", _("The plugin will connect to a local postmaster if no host is specified. To"));
462 printf (" %s\n", _("connect to a remote host, be sure that the remote postmaster accepts TCP/IP")); 563 printf (" %s\n", _("connect to a remote host, be sure that the remote postmaster accepts TCP/IP"));
463 printf (" %s\n\n", _("connections (start the postmaster with the -i option).")); 564 printf (" %s\n\n", _("connections (start the postmaster with the -i option)."));
@@ -475,6 +576,75 @@ void
475print_usage (void) 576print_usage (void)
476{ 577{
477 printf ("%s\n", _("Usage:")); 578 printf ("%s\n", _("Usage:"));
478 printf ("%s [-H <host>] [-4|-6] [-P <port>] [-c <critical time>] [-w <warning time>]\n", progname); 579 printf ("%s [-H <host>] [-P <port>] [-c <critical time>] [-w <warning time>]\n", progname);
479 printf (" [-t <timeout>] [-d <database>] [-l <logname>] [-p <password>]\n"); 580 printf (" [-t <timeout>] [-d <database>] [-l <logname>] [-p <password>]\n"
581 "[-q <query>] [-C <critical query range>] [-W <warning query range>]\n");
480} 582}
583
584int
585do_query (PGconn *conn, char *query)
586{
587 PGresult *res;
588
589 char *val_str;
590 double value;
591
592 char *endptr = NULL;
593
594 int my_status = STATE_UNKNOWN;
595
596 if (verbose)
597 printf ("Executing SQL query \"%s\".\n", query);
598 res = PQexec (conn, query);
599
600 if (PGRES_TUPLES_OK != PQresultStatus (res)) {
601 printf (_("QUERY %s - %s: %s.\n"), _("CRITICAL"), _("Error with query"),
602 PQerrorMessage (conn));
603 return STATE_CRITICAL;
604 }
605
606 if (PQntuples (res) < 1) {
607 printf ("QUERY %s - %s.\n", _("WARNING"), _("No rows returned"));
608 return STATE_WARNING;
609 }
610
611 if (PQnfields (res) < 1) {
612 printf ("QUERY %s - %s.\n", _("WARNING"), _("No columns returned"));
613 return STATE_WARNING;
614 }
615
616 val_str = PQgetvalue (res, 0, 0);
617 if (! val_str) {
618 printf ("QUERY %s - %s.\n", _("CRITICAL"), _("No data returned"));
619 return STATE_CRITICAL;
620 }
621
622 value = strtod (val_str, &endptr);
623 if (verbose)
624 printf ("Query result: %f\n", value);
625
626 if (endptr == val_str) {
627 printf ("QUERY %s - %s: %s\n", _("CRITICAL"), _("Is not a numeric"), val_str);
628 return STATE_CRITICAL;
629 }
630 else if ((endptr != NULL) && (*endptr != '\0')) {
631 if (verbose)
632 printf ("Garbage after value: %s.\n", endptr);
633 }
634
635 my_status = get_status (value, qthresholds);
636 printf ("QUERY %s - ",
637 (my_status == STATE_OK)
638 ? _("OK")
639 : (my_status == STATE_WARNING)
640 ? _("WARNING")
641 : (my_status == STATE_CRITICAL)
642 ? _("CRITICAL")
643 : _("UNKNOWN"));
644 printf (_("'%s' returned %f"), query, value);
645 printf ("|query=%f;%s;%s;;\n", value,
646 query_warning ? query_warning : "",
647 query_critical ? query_critical : "");
648 return my_status;
649}
650
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index 00b032a7..d09bd8b6 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -42,6 +42,11 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
42#include "regex.h" 42#include "regex.h"
43 43
44#include <pwd.h> 44#include <pwd.h>
45#include <errno.h>
46
47#ifdef HAVE_SYS_STAT_H
48#include <sys/stat.h>
49#endif
45 50
46int process_arguments (int, char **); 51int process_arguments (int, char **);
47int validate_arguments (void); 52int validate_arguments (void);
@@ -65,6 +70,10 @@ int options = 0; /* bitmask of filter criteria to test against */
65#define PCPU 256 70#define PCPU 256
66#define ELAPSED 512 71#define ELAPSED 512
67#define EREG_ARGS 1024 72#define EREG_ARGS 1024
73
74#define KTHREAD_PARENT "kthreadd" /* the parent process of kernel threads:
75 ppid of procs are compared to pid of this proc*/
76
68/* Different metrics */ 77/* Different metrics */
69char *metric_name; 78char *metric_name;
70enum metric { 79enum metric {
@@ -90,9 +99,21 @@ regex_t re_args;
90char *fmt; 99char *fmt;
91char *fails; 100char *fails;
92char tmp[MAX_INPUT_BUFFER]; 101char tmp[MAX_INPUT_BUFFER];
102int kthread_filter = 0;
103int usepid = 0; /* whether to test for pid or /proc/pid/exe */
93 104
94FILE *ps_input = NULL; 105FILE *ps_input = NULL;
95 106
107static int
108stat_exe (const pid_t pid, struct stat *buf) {
109 char *path;
110 int ret;
111 xasprintf(&path, "/proc/%d/exe", pid);
112 ret = stat(path, buf);
113 free(path);
114 return ret;
115}
116
96 117
97int 118int
98main (int argc, char **argv) 119main (int argc, char **argv)
@@ -102,9 +123,13 @@ main (int argc, char **argv)
102 char *procprog; 123 char *procprog;
103 124
104 pid_t mypid = 0; 125 pid_t mypid = 0;
126 struct stat statbuf;
127 dev_t mydev = 0;
128 ino_t myino = 0;
105 int procuid = 0; 129 int procuid = 0;
106 pid_t procpid = 0; 130 pid_t procpid = 0;
107 pid_t procppid = 0; 131 pid_t procppid = 0;
132 pid_t kthread_ppid = 0;
108 int procvsz = 0; 133 int procvsz = 0;
109 int procrss = 0; 134 int procrss = 0;
110 int procseconds = 0; 135 int procseconds = 0;
@@ -125,6 +150,7 @@ main (int argc, char **argv)
125 int crit = 0; /* number of processes in crit state */ 150 int crit = 0; /* number of processes in crit state */
126 int i = 0, j = 0; 151 int i = 0, j = 0;
127 int result = STATE_UNKNOWN; 152 int result = STATE_UNKNOWN;
153 int ret;
128 output chld_out, chld_err; 154 output chld_out, chld_err;
129 155
130 setlocale (LC_ALL, ""); 156 setlocale (LC_ALL, "");
@@ -144,8 +170,16 @@ main (int argc, char **argv)
144 if (process_arguments (argc, argv) == ERROR) 170 if (process_arguments (argc, argv) == ERROR)
145 usage4 (_("Could not parse arguments")); 171 usage4 (_("Could not parse arguments"));
146 172
147 /* get our pid */ 173 /* find ourself */
148 mypid = getpid(); 174 mypid = getpid();
175 if (usepid || stat_exe(mypid, &statbuf) == -1) {
176 /* usepid might have been set by -T */
177 usepid = 1;
178 } else {
179 usepid = 0;
180 mydev = statbuf.st_dev;
181 myino = statbuf.st_ino;
182 }
149 183
150 /* Set signal handling and alarm timeout */ 184 /* Set signal handling and alarm timeout */
151 if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) { 185 if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) {
@@ -200,7 +234,28 @@ main (int argc, char **argv)
200 procetime, procprog, procargs); 234 procetime, procprog, procargs);
201 235
202 /* Ignore self */ 236 /* Ignore self */
203 if (mypid == procpid) continue; 237 if ((usepid && mypid == procpid) ||
238 (!usepid && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino) ||
239 (ret == -1 && errno == ENOENT))) {
240 if (verbose >= 3)
241 printf("not considering - is myself or gone\n");
242 continue;
243 }
244
245 /* filter kernel threads (childs of KTHREAD_PARENT)*/
246 /* TODO adapt for other OSes than GNU/Linux
247 sorry for not doing that, but I've no other OSes to test :-( */
248 if (kthread_filter == 1) {
249 /* get pid KTHREAD_PARENT */
250 if (kthread_ppid == 0 && !strcmp(procprog, KTHREAD_PARENT) )
251 kthread_ppid = procpid;
252
253 if (kthread_ppid == procppid) {
254 if (verbose >= 2)
255 printf ("Ignore kernel thread: pid=%d ppid=%d prog=%s args=%s\n", procpid, procppid, procprog, procargs);
256 continue;
257 }
258 }
204 259
205 if ((options & STAT) && (strstr (statopts, procstat))) 260 if ((options & STAT) && (strstr (statopts, procstat)))
206 resultsum |= STAT; 261 resultsum |= STAT;
@@ -332,6 +387,7 @@ process_arguments (int argc, char **argv)
332 {"timeout", required_argument, 0, 't'}, 387 {"timeout", required_argument, 0, 't'},
333 {"status", required_argument, 0, 's'}, 388 {"status", required_argument, 0, 's'},
334 {"ppid", required_argument, 0, 'p'}, 389 {"ppid", required_argument, 0, 'p'},
390 {"user", required_argument, 0, 'u'},
335 {"command", required_argument, 0, 'C'}, 391 {"command", required_argument, 0, 'C'},
336 {"vsz", required_argument, 0, 'z'}, 392 {"vsz", required_argument, 0, 'z'},
337 {"rss", required_argument, 0, 'r'}, 393 {"rss", required_argument, 0, 'r'},
@@ -343,6 +399,8 @@ process_arguments (int argc, char **argv)
343 {"verbose", no_argument, 0, 'v'}, 399 {"verbose", no_argument, 0, 'v'},
344 {"ereg-argument-array", required_argument, 0, CHAR_MAX+1}, 400 {"ereg-argument-array", required_argument, 0, CHAR_MAX+1},
345 {"input-file", required_argument, 0, CHAR_MAX+2}, 401 {"input-file", required_argument, 0, CHAR_MAX+2},
402 {"no-kthreads", required_argument, 0, 'k'},
403 {"traditional-filter", no_argument, 0, 'T'},
346 {0, 0, 0, 0} 404 {0, 0, 0, 0}
347 }; 405 };
348 406
@@ -351,7 +409,7 @@ process_arguments (int argc, char **argv)
351 strcpy (argv[c], "-t"); 409 strcpy (argv[c], "-t");
352 410
353 while (1) { 411 while (1) {
354 c = getopt_long (argc, argv, "Vvht:c:w:p:s:u:C:a:z:r:m:P:", 412 c = getopt_long (argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T",
355 longopts, &option); 413 longopts, &option);
356 414
357 if (c == -1 || c == EOF) 415 if (c == -1 || c == EOF)
@@ -495,9 +553,15 @@ process_arguments (int argc, char **argv)
495 } 553 }
496 554
497 usage4 (_("Metric must be one of PROCS, VSZ, RSS, CPU, ELAPSED!")); 555 usage4 (_("Metric must be one of PROCS, VSZ, RSS, CPU, ELAPSED!"));
556 case 'k': /* linux kernel thread filter */
557 kthread_filter = 1;
558 break;
498 case 'v': /* command */ 559 case 'v': /* command */
499 verbose++; 560 verbose++;
500 break; 561 break;
562 case 'T':
563 usepid = 1;
564 break;
501 case CHAR_MAX+2: 565 case CHAR_MAX+2:
502 input_filename = optarg; 566 input_filename = optarg;
503 break; 567 break;
@@ -648,6 +712,9 @@ print_help (void)
648 printf (" %s\n", "-v, --verbose"); 712 printf (" %s\n", "-v, --verbose");
649 printf (" %s\n", _("Extra information. Up to 3 verbosity levels")); 713 printf (" %s\n", _("Extra information. Up to 3 verbosity levels"));
650 714
715 printf (" %s\n", "-T, --traditional");
716 printf (" %s\n", _("Filter own process the traditional way by PID instead of /proc/pid/exe"));
717
651 printf ("\n"); 718 printf ("\n");
652 printf ("%s\n", "Filters:"); 719 printf ("%s\n", "Filters:");
653 printf (" %s\n", "-s, --state=STATUSFLAGS"); 720 printf (" %s\n", "-s, --state=STATUSFLAGS");
@@ -670,6 +737,8 @@ print_help (void)
670 printf (" %s\n", _("Only scan for processes with args that contain the regex STRING.")); 737 printf (" %s\n", _("Only scan for processes with args that contain the regex STRING."));
671 printf (" %s\n", "-C, --command=COMMAND"); 738 printf (" %s\n", "-C, --command=COMMAND");
672 printf (" %s\n", _("Only scan for exact matches of COMMAND (without path).")); 739 printf (" %s\n", _("Only scan for exact matches of COMMAND (without path)."));
740 printf (" %s\n", "-k, --no-kthreads");
741 printf (" %s\n", _("Only scan for non kernel threads (works on Linux only)."));
673 742
674 printf(_("\n\ 743 printf(_("\n\
675RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\ 744RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\
@@ -704,5 +773,5 @@ print_usage (void)
704 printf ("%s\n", _("Usage:")); 773 printf ("%s\n", _("Usage:"));
705 printf ("%s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n", progname); 774 printf ("%s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n", progname);
706 printf (" [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n"); 775 printf (" [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n");
707 printf (" [-C command] [-t timeout] [-v]\n"); 776 printf (" [-C command] [-k] [-t timeout] [-v]\n");
708} 777}
diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c
index 79fa4824..d477a51e 100644
--- a/plugins/check_smtp.c
+++ b/plugins/check_smtp.c
@@ -99,9 +99,9 @@ char **responses = NULL;
99char *authtype = NULL; 99char *authtype = NULL;
100char *authuser = NULL; 100char *authuser = NULL;
101char *authpass = NULL; 101char *authpass = NULL;
102int warning_time = 0; 102double warning_time = 0;
103int check_warning_time = FALSE; 103int check_warning_time = FALSE;
104int critical_time = 0; 104double critical_time = 0;
105int check_critical_time = FALSE; 105int check_critical_time = FALSE;
106int verbose = 0; 106int verbose = 0;
107int use_ssl = FALSE; 107int use_ssl = FALSE;
@@ -417,9 +417,9 @@ main (int argc, char **argv)
417 elapsed_time = (double)microsec / 1.0e6; 417 elapsed_time = (double)microsec / 1.0e6;
418 418
419 if (result == STATE_OK) { 419 if (result == STATE_OK) {
420 if (check_critical_time && elapsed_time > (double) critical_time) 420 if (check_critical_time && elapsed_time > critical_time)
421 result = STATE_CRITICAL; 421 result = STATE_CRITICAL;
422 else if (check_warning_time && elapsed_time > (double) warning_time) 422 else if (check_warning_time && elapsed_time > warning_time)
423 result = STATE_WARNING; 423 result = STATE_WARNING;
424 } 424 }
425 425
@@ -552,21 +552,19 @@ process_arguments (int argc, char **argv)
552 nresponses++; 552 nresponses++;
553 break; 553 break;
554 case 'c': /* critical time threshold */ 554 case 'c': /* critical time threshold */
555 if (is_intnonneg (optarg)) { 555 if (!is_nonnegative (optarg))
556 critical_time = atoi (optarg); 556 usage4 (_("Critical time must be a positive"));
557 check_critical_time = TRUE;
558 }
559 else { 557 else {
560 usage4 (_("Critical time must be a positive integer")); 558 critical_time = strtod (optarg, NULL);
559 check_critical_time = TRUE;
561 } 560 }
562 break; 561 break;
563 case 'w': /* warning time threshold */ 562 case 'w': /* warning time threshold */
564 if (is_intnonneg (optarg)) { 563 if (!is_nonnegative (optarg))
565 warning_time = atoi (optarg); 564 usage4 (_("Warning time must be a positive"));
566 check_warning_time = TRUE;
567 }
568 else { 565 else {
569 usage4 (_("Warning time must be a positive integer")); 566 warning_time = strtod (optarg, NULL);
567 check_warning_time = TRUE;
570 } 568 }
571 break; 569 break;
572 case 'v': /* verbose */ 570 case 'v': /* verbose */
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 8a8ee180..7c3bc4b9 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -63,6 +63,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
63#define L_CALCULATE_RATE CHAR_MAX+1 63#define L_CALCULATE_RATE CHAR_MAX+1
64#define L_RATE_MULTIPLIER CHAR_MAX+2 64#define L_RATE_MULTIPLIER CHAR_MAX+2
65#define L_INVERT_SEARCH CHAR_MAX+3 65#define L_INVERT_SEARCH CHAR_MAX+3
66#define L_OFFSET CHAR_MAX+4
66 67
67/* Gobble to string - stop incrementing c when c[0] match one of the 68/* Gobble to string - stop incrementing c when c[0] match one of the
68 * characters in s */ 69 * characters in s */
@@ -138,6 +139,7 @@ char *output_delim;
138char *miblist = NULL; 139char *miblist = NULL;
139int needmibs = FALSE; 140int needmibs = FALSE;
140int calculate_rate = 0; 141int calculate_rate = 0;
142double offset = 0.0;
141int rate_multiplier = 1; 143int rate_multiplier = 1;
142state_data *previous_state; 144state_data *previous_state;
143double previous_value[MAX_OIDS]; 145double previous_value[MAX_OIDS];
@@ -200,8 +202,8 @@ main (int argc, char **argv)
200 bindtextdomain (PACKAGE, LOCALEDIR); 202 bindtextdomain (PACKAGE, LOCALEDIR);
201 textdomain (PACKAGE); 203 textdomain (PACKAGE);
202 204
203 labels = malloc (labels_size); 205 labels = malloc (labels_size * sizeof(*labels));
204 unitv = malloc (unitv_size); 206 unitv = malloc (unitv_size * sizeof(*unitv));
205 for (i = 0; i < MAX_OIDS; i++) 207 for (i = 0; i < MAX_OIDS; i++)
206 eval_method[i] = CHECK_UNDEF; 208 eval_method[i] = CHECK_UNDEF;
207 209
@@ -274,35 +276,36 @@ main (int argc, char **argv)
274 snmpcmd = strdup (PATH_TO_SNMPGET); 276 snmpcmd = strdup (PATH_TO_SNMPGET);
275 } 277 }
276 278
277 /* 9 arguments to pass before authpriv options + 1 for host and numoids. Add one for terminating NULL */ 279 /* 10 arguments to pass before authpriv options + 1 for host and numoids. Add one for terminating NULL */
278 command_line = calloc (9 + numauthpriv + 1 + numoids + 1, sizeof (char *)); 280 command_line = calloc (10 + numauthpriv + 1 + numoids + 1, sizeof (char *));
279 command_line[0] = snmpcmd; 281 command_line[0] = snmpcmd;
280 command_line[1] = strdup ("-t"); 282 command_line[1] = strdup ("-Le");
281 xasprintf (&command_line[2], "%d", timeout_interval); 283 command_line[2] = strdup ("-t");
282 command_line[3] = strdup ("-r"); 284 xasprintf (&command_line[3], "%d", timeout_interval);
283 xasprintf (&command_line[4], "%d", retries); 285 command_line[4] = strdup ("-r");
284 command_line[5] = strdup ("-m"); 286 xasprintf (&command_line[5], "%d", retries);
285 command_line[6] = strdup (miblist); 287 command_line[6] = strdup ("-m");
286 command_line[7] = "-v"; 288 command_line[7] = strdup (miblist);
287 command_line[8] = strdup (proto); 289 command_line[8] = "-v";
290 command_line[9] = strdup (proto);
288 291
289 for (i = 0; i < numauthpriv; i++) { 292 for (i = 0; i < numauthpriv; i++) {
290 command_line[9 + i] = authpriv[i]; 293 command_line[10 + i] = authpriv[i];
291 } 294 }
292 295
293 xasprintf (&command_line[9 + numauthpriv], "%s:%s", server_address, port); 296 xasprintf (&command_line[10 + numauthpriv], "%s:%s", server_address, port);
294 297
295 /* This is just for display purposes, so it can remain a string */ 298 /* This is just for display purposes, so it can remain a string */
296 xasprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s", 299 xasprintf(&cl_hidden_auth, "%s -Le -t %d -r %d -m %s -v %s %s %s:%s",
297 snmpcmd, timeout_interval, retries, strlen(miblist) ? miblist : "''", proto, "[authpriv]", 300 snmpcmd, timeout_interval, retries, strlen(miblist) ? miblist : "''", proto, "[authpriv]",
298 server_address, port); 301 server_address, port);
299 302
300 for (i = 0; i < numoids; i++) { 303 for (i = 0; i < numoids; i++) {
301 command_line[9 + numauthpriv + 1 + i] = oids[i]; 304 command_line[10 + numauthpriv + 1 + i] = oids[i];
302 xasprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]); 305 xasprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]);
303 } 306 }
304 307
305 command_line[9 + numauthpriv + 1 + numoids] = NULL; 308 command_line[10 + numauthpriv + 1 + numoids] = NULL;
306 309
307 if (verbose) 310 if (verbose)
308 printf ("%s\n", cl_hidden_auth); 311 printf ("%s\n", cl_hidden_auth);
@@ -429,7 +432,7 @@ main (int argc, char **argv)
429 ptr = strpbrk (show, "0123456789"); 432 ptr = strpbrk (show, "0123456789");
430 if (ptr == NULL) 433 if (ptr == NULL)
431 die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show); 434 die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show);
432 response_value[i] = strtod (ptr, NULL); 435 response_value[i] = strtod (ptr, NULL) + offset;
433 436
434 if(calculate_rate) { 437 if(calculate_rate) {
435 if (previous_state!=NULL) { 438 if (previous_state!=NULL) {
@@ -618,6 +621,7 @@ process_arguments (int argc, char **argv)
618 {"next", no_argument, 0, 'n'}, 621 {"next", no_argument, 0, 'n'},
619 {"rate", no_argument, 0, L_CALCULATE_RATE}, 622 {"rate", no_argument, 0, L_CALCULATE_RATE},
620 {"rate-multiplier", required_argument, 0, L_RATE_MULTIPLIER}, 623 {"rate-multiplier", required_argument, 0, L_RATE_MULTIPLIER},
624 {"offset", required_argument, 0, L_OFFSET},
621 {"invert-search", no_argument, 0, L_INVERT_SEARCH}, 625 {"invert-search", no_argument, 0, L_INVERT_SEARCH},
622 {"perf-oids", no_argument, 0, 'O'}, 626 {"perf-oids", no_argument, 0, 'O'},
623 {0, 0, 0, 0} 627 {0, 0, 0, 0}
@@ -768,9 +772,9 @@ process_arguments (int argc, char **argv)
768 break; 772 break;
769 case 'l': /* label */ 773 case 'l': /* label */
770 nlabels++; 774 nlabels++;
771 if (nlabels >= labels_size) { 775 if (nlabels > labels_size) {
772 labels_size += 8; 776 labels_size += 8;
773 labels = realloc (labels, labels_size); 777 labels = realloc (labels, labels_size * sizeof(*labels));
774 if (labels == NULL) 778 if (labels == NULL)
775 die (STATE_UNKNOWN, _("Could not reallocate labels[%d]"), (int)nlabels); 779 die (STATE_UNKNOWN, _("Could not reallocate labels[%d]"), (int)nlabels);
776 } 780 }
@@ -780,13 +784,13 @@ process_arguments (int argc, char **argv)
780 if (ptr[0] == '\'') 784 if (ptr[0] == '\'')
781 labels[nlabels - 1] = ptr + 1; 785 labels[nlabels - 1] = ptr + 1;
782 while (ptr && (ptr = nextarg (ptr))) { 786 while (ptr && (ptr = nextarg (ptr))) {
783 if (nlabels >= labels_size) { 787 nlabels++;
788 if (nlabels > labels_size) {
784 labels_size += 8; 789 labels_size += 8;
785 labels = realloc (labels, labels_size); 790 labels = realloc (labels, labels_size * sizeof(*labels));
786 if (labels == NULL) 791 if (labels == NULL)
787 die (STATE_UNKNOWN, _("Could not reallocate labels\n")); 792 die (STATE_UNKNOWN, _("Could not reallocate labels\n"));
788 } 793 }
789 nlabels++;
790 ptr = thisarg (ptr); 794 ptr = thisarg (ptr);
791 if (ptr[0] == '\'') 795 if (ptr[0] == '\'')
792 labels[nlabels - 1] = ptr + 1; 796 labels[nlabels - 1] = ptr + 1;
@@ -797,9 +801,9 @@ process_arguments (int argc, char **argv)
797 case 'u': /* units */ 801 case 'u': /* units */
798 units = optarg; 802 units = optarg;
799 nunits++; 803 nunits++;
800 if (nunits >= unitv_size) { 804 if (nunits > unitv_size) {
801 unitv_size += 8; 805 unitv_size += 8;
802 unitv = realloc (unitv, unitv_size); 806 unitv = realloc (unitv, unitv_size * sizeof(*unitv));
803 if (unitv == NULL) 807 if (unitv == NULL)
804 die (STATE_UNKNOWN, _("Could not reallocate units [%d]\n"), (int)nunits); 808 die (STATE_UNKNOWN, _("Could not reallocate units [%d]\n"), (int)nunits);
805 } 809 }
@@ -809,9 +813,9 @@ process_arguments (int argc, char **argv)
809 if (ptr[0] == '\'') 813 if (ptr[0] == '\'')
810 unitv[nunits - 1] = ptr + 1; 814 unitv[nunits - 1] = ptr + 1;
811 while (ptr && (ptr = nextarg (ptr))) { 815 while (ptr && (ptr = nextarg (ptr))) {
812 if (nunits >= unitv_size) { 816 if (nunits > unitv_size) {
813 unitv_size += 8; 817 unitv_size += 8;
814 unitv = realloc (unitv, unitv_size); 818 unitv = realloc (unitv, unitv_size * sizeof(*unitv));
815 if (units == NULL) 819 if (units == NULL)
816 die (STATE_UNKNOWN, _("Could not realloc() units\n")); 820 die (STATE_UNKNOWN, _("Could not realloc() units\n"));
817 } 821 }
@@ -832,6 +836,9 @@ process_arguments (int argc, char **argv)
832 if(!is_integer(optarg)||((rate_multiplier=atoi(optarg))<=0)) 836 if(!is_integer(optarg)||((rate_multiplier=atoi(optarg))<=0))
833 usage2(_("Rate multiplier must be a positive integer"),optarg); 837 usage2(_("Rate multiplier must be a positive integer"),optarg);
834 break; 838 break;
839 case L_OFFSET:
840 offset=strtod(optarg,NULL);
841 break;
835 case L_INVERT_SEARCH: 842 case L_INVERT_SEARCH:
836 invert_search=1; 843 invert_search=1;
837 break; 844 break;
@@ -1080,6 +1087,8 @@ print_help (void)
1080 printf (" %s\n", _("Enable rate calculation. See 'Rate Calculation' below")); 1087 printf (" %s\n", _("Enable rate calculation. See 'Rate Calculation' below"));
1081 printf (" %s\n", "--rate-multiplier"); 1088 printf (" %s\n", "--rate-multiplier");
1082 printf (" %s\n", _("Converts rate per second. For example, set to 60 to convert to per minute")); 1089 printf (" %s\n", _("Converts rate per second. For example, set to 60 to convert to per minute"));
1090 printf (" %s\n", "--offset=OFFSET");
1091 printf (" %s\n", _("Add/substract the specified OFFSET to numeric sensor data"));
1083 1092
1084 /* Tests Against Strings */ 1093 /* Tests Against Strings */
1085 printf (" %s\n", "-s, --string=STRING"); 1094 printf (" %s\n", "-s, --string=STRING");
diff --git a/plugins/check_tcp.c b/plugins/check_tcp.c
index af3ae241..ce966c38 100644
--- a/plugins/check_tcp.c
+++ b/plugins/check_tcp.c
@@ -1,30 +1,30 @@
1/***************************************************************************** 1/*****************************************************************************
2* 2*
3* Nagios check_tcp plugin 3* Nagios check_tcp plugin
4* 4*
5* License: GPL 5* License: GPL
6* Copyright (c) 1999-2008 Nagios Plugins Development Team 6* Copyright (c) 1999-2008 Nagios Plugins Development Team
7* 7*
8* Description: 8* Description:
9* 9*
10* This file contains the check_tcp plugin 10* This file contains the check_tcp plugin
11* 11*
12* 12*
13* This program is free software: you can redistribute it and/or modify 13* This program is free software: you can redistribute it and/or modify
14* it under the terms of the GNU General Public License as published by 14* it under the terms of the GNU General Public License as published by
15* the Free Software Foundation, either version 3 of the License, or 15* the Free Software Foundation, either version 3 of the License, or
16* (at your option) any later version. 16* (at your option) any later version.
17* 17*
18* This program is distributed in the hope that it will be useful, 18* This program is distributed in the hope that it will be useful,
19* but WITHOUT ANY WARRANTY; without even the implied warranty of 19* but WITHOUT ANY WARRANTY; without even the implied warranty of
20* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21* GNU General Public License for more details. 21* GNU General Public License for more details.
22* 22*
23* You should have received a copy of the GNU General Public License 23* You should have received a copy of the GNU General Public License
24* along with this program. If not, see <http://www.gnu.org/licenses/>. 24* along with this program. If not, see <http://www.gnu.org/licenses/>.
25* 25*
26* $Id$ 26* $Id$
27* 27*
28*****************************************************************************/ 28*****************************************************************************/
29 29
30/* progname "check_tcp" changes depending on symlink called */ 30/* progname "check_tcp" changes depending on symlink called */
@@ -61,6 +61,7 @@ static int PORT = 0;
61 61
62static int server_port = 0; 62static int server_port = 0;
63static char *server_address = NULL; 63static char *server_address = NULL;
64static int host_specified = FALSE;
64static char *server_send = NULL; 65static char *server_send = NULL;
65static char *server_quit = NULL; 66static char *server_quit = NULL;
66static char **server_expect; 67static char **server_expect;
@@ -462,6 +463,7 @@ process_arguments (int argc, char **argv)
462#endif 463#endif
463 break; 464 break;
464 case 'H': /* hostname */ 465 case 'H': /* hostname */
466 host_specified = TRUE;
465 server_address = optarg; 467 server_address = optarg;
466 break; 468 break;
467 case 'c': /* critical */ 469 case 'c': /* critical */
@@ -588,6 +590,10 @@ process_arguments (int argc, char **argv)
588 } 590 }
589 } 591 }
590 592
593 c = optind;
594 if(host_specified == FALSE && c < argc)
595 server_address = strdup (argv[c++]);
596
591 if (server_address == NULL) 597 if (server_address == NULL)
592 usage4 (_("You must provide a server address")); 598 usage4 (_("You must provide a server address"));
593 else if (server_address[0] != '/' && is_host (server_address) == FALSE) 599 else if (server_address[0] != '/' && is_host (server_address) == FALSE)
@@ -666,4 +672,3 @@ print_usage (void)
666 printf ("[-t <timeout seconds>] [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]\n"); 672 printf ("[-t <timeout seconds>] [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]\n");
667 printf ("[-D <warn days cert expire>[,<crit days cert expire>]] [-S <use SSL>] [-E]\n"); 673 printf ("[-D <warn days cert expire>[,<crit days cert expire>]] [-S <use SSL>] [-E]\n");
668} 674}
669
diff --git a/plugins/runcmd.c b/plugins/runcmd.c
index 7574b121..8aba1e33 100644
--- a/plugins/runcmd.c
+++ b/plugins/runcmd.c
@@ -256,7 +256,7 @@ np_runcmd_close(int fd)
256 256
257 257
258void 258void
259popen_timeout_alarm_handler (int signo) 259runcmd_timeout_alarm_handler (int signo)
260{ 260{
261 size_t i; 261 size_t i;
262 262
diff --git a/plugins/runcmd.h b/plugins/runcmd.h
index 211dee2c..5957562b 100644
--- a/plugins/runcmd.h
+++ b/plugins/runcmd.h
@@ -39,7 +39,7 @@ typedef struct output output;
39 39
40/** prototypes **/ 40/** prototypes **/
41int np_runcmd(const char *, output *, output *, int); 41int np_runcmd(const char *, output *, output *, int);
42void popen_timeout_alarm_handler(int) 42void runcmd_timeout_alarm_handler(int)
43 __attribute__((__noreturn__)); 43 __attribute__((__noreturn__));
44 44
45/* only multi-threaded plugins need to bother with this */ 45/* only multi-threaded plugins need to bother with this */
diff --git a/plugins/t/check_apt.t b/plugins/t/check_apt.t
new file mode 100644
index 00000000..9ba0ff8e
--- /dev/null
+++ b/plugins/t/check_apt.t
@@ -0,0 +1,90 @@
1#!/usr/bin/perl -w -I ..
2#
3# Test check_apt using input files.
4# Contributed by Alex Bradley, October 2012
5#
6
7use strict;
8use Test::More;
9use NPTest;
10
11sub make_result_regexp {
12 my ($warning, $critical) = @_;
13 my $status;
14 if ($warning == 0 && $critical == 0) {
15 $status = "OK";
16 } elsif ($critical == 0) {
17 $status = "WARNING";
18 } else {
19 $status = "CRITICAL";
20 }
21 return sprintf('/^APT %s: %d packages available for upgrade \(%d critical updates\)\. |available_upgrades=%d;;;0 critical_updates=%d;;;0$/',
22 $status, $warning, $critical, $warning, $critical);
23}
24
25if (-x "./check_apt") {
26 plan tests => 28;
27} else {
28 plan skip_all => "No check_apt compiled";
29}
30
31my $result;
32
33my $testfile_command = "./check_apt %s --input-file=t/check_apt_input/%s";
34
35$result = NPTest->testCmd( sprintf($testfile_command, "", "debian1") );
36is( $result->return_code, 0, "No upgrades" );
37like( $result->output, make_result_regexp(0, 0), "Output correct" );
38
39$result = NPTest->testCmd( sprintf($testfile_command, "", "debian2") );
40is( $result->return_code, 1, "Debian apt output, warning" );
41like( $result->output, make_result_regexp(13, 0), "Output correct" );
42
43$result = NPTest->testCmd( sprintf($testfile_command, "", "debian3") );
44is( $result->return_code, 2, "Debian apt output, some critical" );
45like( $result->output, make_result_regexp(19, 4), "Output correct" );
46
47$result = NPTest->testCmd( sprintf($testfile_command, "-c '^[^\\(]*\\(.* (Debian-Security:|Ubuntu:[^/]*/[^-]*-security)'", "debian3") );
48is( $result->return_code, 2, "Debian apt output - should have same result when default security regexp specified via -c" );
49like( $result->output, make_result_regexp(19, 4), "Output correct" );
50
51$result = NPTest->testCmd( sprintf($testfile_command, "-i libc6", "debian3") );
52is( $result->return_code, 1, "Debian apt output, filter for libc6" );
53like( $result->output, make_result_regexp(3, 0), "Output correct" );
54
55$result = NPTest->testCmd( sprintf($testfile_command, "-i libc6 -i xen", "debian3") );
56is( $result->return_code, 2, "Debian apt output, filter for libc6 and xen" );
57like( $result->output, make_result_regexp(9, 4), "Output correct" );
58
59$result = NPTest->testCmd( sprintf($testfile_command, "-i libc6 -i xen -i linux", "debian3") );
60is( $result->return_code, 2, "Debian apt output, filter for libc6, xen, linux" );
61like( $result->output, make_result_regexp(12, 4), "Output correct" );
62
63$result = NPTest->testCmd( sprintf($testfile_command, "-e libc6", "debian3") );
64is( $result->return_code, 2, "Debian apt output, filter out libc6" );
65like( $result->output, make_result_regexp(16, 4), "Output correct" );
66
67$result = NPTest->testCmd( sprintf($testfile_command, "-e libc6 -e xen", "debian3") );
68is( $result->return_code, 1, "Debian apt output, filter out libc6 and xen" );
69like( $result->output, make_result_regexp(10, 0), "Output correct" );
70
71$result = NPTest->testCmd( sprintf($testfile_command, "-e libc6 -e xen -e linux", "debian3") );
72is( $result->return_code, 1, "Debian apt output, filter out libc6, xen, linux" );
73like( $result->output, make_result_regexp(7, 0), "Output correct" );
74
75$result = NPTest->testCmd( sprintf($testfile_command, "-c Debian-Security -c linux", "debian3") );
76is( $result->return_code, 2, "Debian apt output, critical on Debian-Security or linux" );
77like( $result->output, make_result_regexp(19, 9), "Output correct" );
78
79$result = NPTest->testCmd( sprintf($testfile_command, "-i lib -i linux -e gc1c -c linux-image", "debian3") );
80is( $result->return_code, 2, "Debian apt output, include lib and linux, exclude gc1c, critical on linux-image" );
81like( $result->output, make_result_regexp(10, 2), "Output correct" );
82
83$result = NPTest->testCmd( sprintf($testfile_command, "", "ubuntu1") );
84is( $result->return_code, 1, "Ubuntu apt output, warning" );
85like( $result->output, make_result_regexp(5, 0), "Output correct" );
86
87$result = NPTest->testCmd( sprintf($testfile_command, "", "ubuntu2") );
88is( $result->return_code, 2, "Ubuntu apt output, some critical" );
89like( $result->output, make_result_regexp(25, 14), "Output correct" );
90
diff --git a/plugins/t/check_apt_input/debian1 b/plugins/t/check_apt_input/debian1
new file mode 100644
index 00000000..317e7ea7
--- /dev/null
+++ b/plugins/t/check_apt_input/debian1
@@ -0,0 +1,4 @@
1NOTE: This is only a simulation!
2 apt-get needs root privileges for real execution.
3 Keep also in mind that locking is deactivated,
4 so don't depend on the relevance to the real current situation!
diff --git a/plugins/t/check_apt_input/debian2 b/plugins/t/check_apt_input/debian2
new file mode 100644
index 00000000..effd1553
--- /dev/null
+++ b/plugins/t/check_apt_input/debian2
@@ -0,0 +1,37 @@
1NOTE: This is only a simulation!
2 apt-get needs root privileges for real execution.
3 Keep also in mind that locking is deactivated,
4 so don't depend on the relevance to the real current situation!
5Reading package lists... Done
6Building dependency tree
7Reading state information... Done
8The following packages will be upgraded:
9 base-files debian-archive-keyring dpkg firmware-linux-free libc-bin libc-dev-bin libc6 libc6-dev linux-base
10 linux-image-2.6.32-5-xen-amd64 linux-libc-dev locales lockfile-progs
1113 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
12Inst base-files [6.0squeeze5] (6.0squeeze6 Debian:6.0.6/stable [amd64])
13Conf base-files (6.0squeeze6 Debian:6.0.6/stable [amd64])
14Inst dpkg [1.15.8.12] (1.15.8.13 Debian:6.0.6/stable [amd64])
15Conf dpkg (1.15.8.13 Debian:6.0.6/stable [amd64])
16Inst linux-base [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all])
17Inst linux-image-2.6.32-5-xen-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64])
18Inst debian-archive-keyring [2010.08.28] (2010.08.28+squeeze1 Debian:6.0.6/stable [all])
19Conf debian-archive-keyring (2010.08.28+squeeze1 Debian:6.0.6/stable [all])
20Inst libc6-dev [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) []
21Inst libc-dev-bin [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) []
22Inst linux-libc-dev [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64]) []
23Inst libc-bin [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ]
24Conf libc-bin (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ]
25Inst libc6 [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64])
26Conf libc6 (2.11.3-4 Debian:6.0.6/stable [amd64])
27Inst locales [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [all])
28Inst firmware-linux-free [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all])
29Inst lockfile-progs [0.1.15] (0.1.15+squeeze1 Debian:6.0.6/stable [amd64])
30Conf linux-base (2.6.32-46 Debian:6.0.6/stable [all])
31Conf linux-image-2.6.32-5-xen-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64])
32Conf libc-dev-bin (2.11.3-4 Debian:6.0.6/stable [amd64])
33Conf linux-libc-dev (2.6.32-46 Debian:6.0.6/stable [amd64])
34Conf libc6-dev (2.11.3-4 Debian:6.0.6/stable [amd64])
35Conf locales (2.11.3-4 Debian:6.0.6/stable [all])
36Conf firmware-linux-free (2.6.32-46 Debian:6.0.6/stable [all])
37Conf lockfile-progs (0.1.15+squeeze1 Debian:6.0.6/stable [amd64])
diff --git a/plugins/t/check_apt_input/debian3 b/plugins/t/check_apt_input/debian3
new file mode 100644
index 00000000..719dce9b
--- /dev/null
+++ b/plugins/t/check_apt_input/debian3
@@ -0,0 +1,42 @@
1NOTE: This is only a simulation!
2 apt-get needs root privileges for real execution.
3 Keep also in mind that locking is deactivated,
4 so don't depend on the relevance to the real current situation!
5Inst base-files [6.0squeeze5] (6.0squeeze6 Debian:6.0.6/stable [amd64])
6Conf base-files (6.0squeeze6 Debian:6.0.6/stable [amd64])
7Inst dpkg [1.15.8.12] (1.15.8.13 Debian:6.0.6/stable [amd64])
8Conf dpkg (1.15.8.13 Debian:6.0.6/stable [amd64])
9Inst linux-base [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all])
10Inst linux-image-2.6.32-5-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64])
11Inst xen-hypervisor-4.0-amd64 [4.0.1-5.3] (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
12Inst xen-linux-system-2.6.32-5-xen-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64]) []
13Inst linux-image-2.6.32-5-xen-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64])
14Inst debian-archive-keyring [2010.08.28] (2010.08.28+squeeze1 Debian:6.0.6/stable [all])
15Conf debian-archive-keyring (2010.08.28+squeeze1 Debian:6.0.6/stable [all])
16Inst libc6-i386 [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) []
17Inst libc-bin [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ]
18Conf libc-bin (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ]
19Inst libc6 [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64])
20Conf libc6 (2.11.3-4 Debian:6.0.6/stable [amd64])
21Inst libgc1c2 [1:6.8-1.2] (1:6.8-2 Debian:6.0.6/stable [amd64])
22Inst locales [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [all])
23Inst firmware-linux-free [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all])
24Inst libxenstore3.0 [4.0.1-5.3] (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
25Inst lockfile-progs [0.1.15] (0.1.15+squeeze1 Debian:6.0.6/stable [amd64])
26Inst xen-utils-4.0 [4.0.1-5.3] (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
27Inst xenstore-utils [4.0.1-5.3] (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
28Inst libconfig-inifiles-perl [2.52-1] (2.52-1+squeeze1 Debian:6.0.6/stable [all])
29Conf linux-base (2.6.32-46 Debian:6.0.6/stable [all])
30Conf linux-image-2.6.32-5-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64])
31Conf xen-hypervisor-4.0-amd64 (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
32Conf linux-image-2.6.32-5-xen-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64])
33Conf xen-linux-system-2.6.32-5-xen-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64])
34Conf libc6-i386 (2.11.3-4 Debian:6.0.6/stable [amd64])
35Conf libgc1c2 (1:6.8-2 Debian:6.0.6/stable [amd64])
36Conf locales (2.11.3-4 Debian:6.0.6/stable [all])
37Conf firmware-linux-free (2.6.32-46 Debian:6.0.6/stable [all])
38Conf libxenstore3.0 (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
39Conf lockfile-progs (0.1.15+squeeze1 Debian:6.0.6/stable [amd64])
40Conf xen-utils-4.0 (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
41Conf xenstore-utils (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64])
42Conf libconfig-inifiles-perl (2.52-1+squeeze1 Debian:6.0.6/stable [all])
diff --git a/plugins/t/check_apt_input/ubuntu1 b/plugins/t/check_apt_input/ubuntu1
new file mode 100644
index 00000000..2f61c30e
--- /dev/null
+++ b/plugins/t/check_apt_input/ubuntu1
@@ -0,0 +1,14 @@
1NOTE: This is only a simulation!
2 apt-get needs root privileges for real execution.
3 Also keep in mind that locking is deactivated,
4 so don't depend on the relevance to the real current situation!
5Inst grub-pc [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) []
6Inst grub-pc-bin [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) []
7Inst grub2-common [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) []
8Inst grub-efi-amd64-bin [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) []
9Inst grub-common [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64])
10Conf grub-common (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64])
11Conf grub2-common (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64])
12Conf grub-pc-bin (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64])
13Conf grub-pc (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64])
14Conf grub-efi-amd64-bin (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64])
diff --git a/plugins/t/check_apt_input/ubuntu2 b/plugins/t/check_apt_input/ubuntu2
new file mode 100644
index 00000000..29a14a02
--- /dev/null
+++ b/plugins/t/check_apt_input/ubuntu2
@@ -0,0 +1,54 @@
1NOTE: This is only a simulation!
2 apt-get needs root privileges for real execution.
3 Also keep in mind that locking is deactivated,
4 so don't depend on the relevance to the real current situation!
5Inst libc6-dev [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) []
6Inst libc-dev-bin [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) []
7Inst linux-libc-dev [3.2.0-29.46] (3.2.0-31.50 Ubuntu:12.04/precise-security [amd64]) []
8Inst tzdata [2012e-0ubuntu0.12.04] (2012e-0ubuntu0.12.04.1 Ubuntu:12.04/precise-security [all]) []
9Conf tzdata (2012e-0ubuntu0.12.04.1 Ubuntu:12.04/precise-security [all]) []
10Inst libc-bin [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) [libc6:amd64 ]
11Conf libc-bin (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) [libc6:amd64 ]
12Inst libc6 [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64])
13Conf libc6 (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64])
14Inst libapt-pkg4.12 [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
15Conf libapt-pkg4.12 (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
16Inst ubuntu-keyring [2011.11.21] (2011.11.21.1 Ubuntu:12.04/precise-updates [all])
17Conf ubuntu-keyring (2011.11.21.1 Ubuntu:12.04/precise-updates [all])
18Inst gpgv [1.4.11-3ubuntu2] (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64])
19Conf gpgv (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64])
20Inst gnupg [1.4.11-3ubuntu2] (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64])
21Conf gnupg (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64])
22Inst apt [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
23Conf apt (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
24Inst libssl1.0.0 [1.0.1-4ubuntu5.3] (1.0.1-4ubuntu5.5 Ubuntu:12.04/precise-updates [amd64])
25Conf libssl1.0.0 (1.0.1-4ubuntu5.5 Ubuntu:12.04/precise-updates [amd64])
26Inst libapt-inst1.4 [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
27Inst resolvconf [1.63ubuntu15] (1.63ubuntu16 Ubuntu:12.04/precise-updates [all])
28Inst libdbus-1-3 [1.4.18-1ubuntu1] (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64])
29Inst libxml2 [2.7.8.dfsg-5.1ubuntu4.1] (2.7.8.dfsg-5.1ubuntu4.2 Ubuntu:12.04/precise-security [amd64])
30Inst multiarch-support [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64])
31Conf multiarch-support (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64])
32Inst apt-utils [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
33Inst isc-dhcp-client [4.1.ESV-R4-0ubuntu5.2] (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64]) []
34Inst isc-dhcp-common [4.1.ESV-R4-0ubuntu5.2] (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64])
35Inst dbus [1.4.18-1ubuntu1] (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64])
36Inst linux-firmware [1.79] (1.79.1 Ubuntu:12.04/precise-updates [all])
37Inst xserver-common [2:1.11.4-0ubuntu10.7] (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [all])
38Inst xserver-xorg-core [2:1.11.4-0ubuntu10.7] (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [amd64])
39Inst xserver-xorg-input-synaptics [1.6.2-1ubuntu1~precise1] (1.6.2-1ubuntu1~precise2 Ubuntu:12.04/precise-updates [amd64])
40Conf libc-dev-bin (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64])
41Conf linux-libc-dev (3.2.0-31.50 Ubuntu:12.04/precise-security [amd64])
42Conf libc6-dev (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64])
43Conf libapt-inst1.4 (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
44Conf resolvconf (1.63ubuntu16 Ubuntu:12.04/precise-updates [all])
45Conf libdbus-1-3 (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64])
46Conf libxml2 (2.7.8.dfsg-5.1ubuntu4.2 Ubuntu:12.04/precise-security [amd64])
47Conf apt-utils (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64])
48Conf isc-dhcp-common (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64])
49Conf isc-dhcp-client (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64])
50Conf dbus (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64])
51Conf linux-firmware (1.79.1 Ubuntu:12.04/precise-updates [all])
52Conf xserver-common (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [all])
53Conf xserver-xorg-core (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [amd64])
54Conf xserver-xorg-input-synaptics (1.6.2-1ubuntu1~precise2 Ubuntu:12.04/precise-updates [amd64])
diff --git a/plugins/t/check_dig.t b/plugins/t/check_dig.t
index 323859e8..1ab4b426 100644
--- a/plugins/t/check_dig.t
+++ b/plugins/t/check_dig.t
@@ -10,30 +10,30 @@ use NPTest;
10 10
11plan skip_all => "check_dig not compiled" unless (-x "check_dig"); 11plan skip_all => "check_dig not compiled" unless (-x "check_dig");
12 12
13plan tests => 12; 13plan tests => 16;
14 14
15my $successOutput = '/DNS OK - [\.0-9]+ seconds? response time/'; 15my $successOutput = '/DNS OK - [\.0-9]+ seconds? response time/';
16 16
17my $hostname_valid = getTestParameter( 17my $hostname_valid = getTestParameter(
18 "NP_HOSTNAME_VALID", 18 "NP_HOSTNAME_VALID",
19 "A valid (known to DNS) hostname", 19 "A valid (known to DNS) hostname",
20 "nagios.com" 20 "nagiosplugins.org"
21 ); 21 );
22 22
23my $hostname_valid_ip = getTestParameter( 23my $hostname_valid_ip = getTestParameter(
24 "NP_HOSTNAME_VALID_IP", 24 "NP_HOSTNAME_VALID_IP",
25 "The IP address of the valid hostname $hostname_valid", 25 "The IP address of the valid hostname $hostname_valid",
26 "66.118.156.50", 26 "67.207.143.200",
27 ); 27 );
28 28
29my $hostname_valid_reverse = getTestParameter( 29my $hostname_valid_reverse = getTestParameter(
30 "NP_HOSTNAME_VALID_REVERSE", 30 "NP_HOSTNAME_VALID_REVERSE",
31 "The hostname of $hostname_valid_ip", 31 "The hostname of $hostname_valid_ip",
32 "66-118-156-50.static.sagonet.net.", 32 "nagiosplugins.org.",
33 ); 33 );
34 34
35my $hostname_invalid = getTestParameter( 35my $hostname_invalid = getTestParameter(
36 "NP_HOSTNAME_INVALID", 36 "NP_HOSTNAME_INVALID",
37 "An invalid (not known to DNS) hostname", 37 "An invalid (not known to DNS) hostname",
38 "nosuchhost.altinity.com", 38 "nosuchhost.altinity.com",
39 ); 39 );
@@ -69,6 +69,14 @@ SKIP: {
69 cmp_ok( $res->return_code, '==', 0, "Found $hostname_valid on $dns_server"); 69 cmp_ok( $res->return_code, '==', 0, "Found $hostname_valid on $dns_server");
70 like ( $res->output, $successOutput, "Output OK" ); 70 like ( $res->output, $successOutput, "Output OK" );
71 71
72 $res = NPTest->testCmd("./check_dig -H $dns_server -l $hostname_valid -t 5 -4");
73 cmp_ok( $res->return_code, '==', 0, "Found $hostname_valid on $dns_server");
74 like ( $res->output, $successOutput, "Output OK for IPv4" );
75
76 $res = NPTest->testCmd("./check_dig -H $dns_server -l $hostname_valid -t 5 -6");
77 cmp_ok( $res->return_code, '==', 0, "Found $hostname_valid on $dns_server");
78 like ( $res->output, $successOutput, "Output OK for IPv6" );
79
72 $res = NPTest->testCmd("./check_dig -H $dns_server -l $hostname_valid -a $hostname_valid_ip -t 5"); 80 $res = NPTest->testCmd("./check_dig -H $dns_server -l $hostname_valid -a $hostname_valid_ip -t 5");
73 cmp_ok( $res->return_code, '==', 0, "Got expected address"); 81 cmp_ok( $res->return_code, '==', 0, "Got expected address");
74 82
diff --git a/plugins/t/check_http.t b/plugins/t/check_http.t
index 0a25c775..9948c539 100644
--- a/plugins/t/check_http.t
+++ b/plugins/t/check_http.t
@@ -8,22 +8,22 @@ use strict;
8use Test::More; 8use Test::More;
9use NPTest; 9use NPTest;
10 10
11plan tests => 28; 11plan tests => 30;
12 12
13my $successOutput = '/OK.*HTTP.*second/'; 13my $successOutput = '/OK.*HTTP.*second/';
14 14
15my $res; 15my $res;
16 16
17my $host_tcp_http = getTestParameter( "NP_HOST_TCP_HTTP", 17my $host_tcp_http = getTestParameter( "NP_HOST_TCP_HTTP",
18 "A host providing the HTTP Service (a web server)", 18 "A host providing the HTTP Service (a web server)",
19 "localhost" ); 19 "localhost" );
20 20
21my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE", 21my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE",
22 "The hostname of system not responsive to network requests", 22 "The hostname of system not responsive to network requests",
23 "10.0.0.1" ); 23 "10.0.0.1" );
24 24
25my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID", 25my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID",
26 "An invalid (not known to DNS) hostname", 26 "An invalid (not known to DNS) hostname",
27 "nosuchhost"); 27 "nosuchhost");
28 28
29my $internet_access = getTestParameter( "NP_INTERNET_ACCESS", 29my $internet_access = getTestParameter( "NP_INTERNET_ACCESS",
@@ -32,8 +32,8 @@ my $internet_access = getTestParameter( "NP_INTERNET_ACCESS",
32 32
33my $host_tcp_http2; 33my $host_tcp_http2;
34if ($internet_access eq "no") { 34if ($internet_access eq "no") {
35 $host_tcp_http2 = getTestParameter( "NP_HOST_TCP_HTTP2", 35 $host_tcp_http2 = getTestParameter( "NP_HOST_TCP_HTTP2",
36 "A host providing an index page containing the string 'nagios'", 36 "A host providing an index page containing the string 'nagios'",
37 "www.nagios.com" ); 37 "www.nagios.com" );
38} 38}
39 39
@@ -45,14 +45,9 @@ cmp_ok( $res->return_code, '==', 0, "Webserver $host_tcp_http responded" );
45like( $res->output, $successOutput, "Output OK" ); 45like( $res->output, $successOutput, "Output OK" );
46 46
47$res = NPTest->testCmd( 47$res = NPTest->testCmd(
48 "./check_http $host_tcp_http -wt 300 -ct 600 -v -v -v -k 'bob:there;fred:here'" 48 "./check_http $host_tcp_http -wt 300 -ct 600 -v -v -v -k 'bob:there' -k 'carl:frown'"
49 ); 49 );
50like( $res->output, '/bob:there\r\nfred:here\r\n/', "Got headers, delimited with ';'" ); 50like( $res->output, '/bob:there\r\ncarl:frown\r\n/', "Got headers with multiple -k options" );
51
52$res = NPTest->testCmd(
53 "./check_http $host_tcp_http -wt 300 -ct 600 -v -v -v -k 'bob:there;fred:here' -k 'carl:frown'"
54 );
55like( $res->output, '/bob:there\r\nfred:here\r\ncarl:frown\r\n/', "Got headers with multiple -k options" );
56 51
57$res = NPTest->testCmd( 52$res = NPTest->testCmd(
58 "./check_http $host_nonresponsive -wt 1 -ct 2" 53 "./check_http $host_nonresponsive -wt 1 -ct 2"
@@ -123,6 +118,10 @@ SKIP: {
123 $res = NPTest->testCmd( "./check_http www.verisign.com -C 1" ); 118 $res = NPTest->testCmd( "./check_http www.verisign.com -C 1" );
124 cmp_ok( $res->output, 'eq', $saved_cert_output, "Old syntax for cert checking still works"); 119 cmp_ok( $res->output, 'eq', $saved_cert_output, "Old syntax for cert checking still works");
125 120
121 $res = NPTest->testCmd( "./check_http --ssl www.verisign.com -E" );
122 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
123 like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' );
124
126 $res = NPTest->testCmd( 125 $res = NPTest->testCmd(
127 "./check_http --ssl www.e-paycobalt.com" 126 "./check_http --ssl www.e-paycobalt.com"
128 ); 127 );
@@ -131,4 +130,7 @@ SKIP: {
131 130
132 $res = NPTest->testCmd( "./check_http -H www.mozilla.com -u /firefox -f follow" ); 131 $res = NPTest->testCmd( "./check_http -H www.mozilla.com -u /firefox -f follow" );
133 is( $res->return_code, 0, "Redirection based on location is okay"); 132 is( $res->return_code, 0, "Redirection based on location is okay");
133
134 $res = NPTest->testCmd( "./check_http -H www.mozilla.com --extended-perfdata" );
135 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
134} 136}
diff --git a/plugins/t/check_procs.t b/plugins/t/check_procs.t
index 30f02488..a1a28836 100644
--- a/plugins/t/check_procs.t
+++ b/plugins/t/check_procs.t
@@ -20,7 +20,7 @@ my $result;
20 20
21$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000" ); 21$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000" );
22is( $result->return_code, 0, "Checking less than 10000 processes" ); 22is( $result->return_code, 0, "Checking less than 10000 processes" );
23like( $result->output, '/^PROCS OK: [0-9]+ process(es)?$/', "Output correct" ); 23like( $result->output, '/^PROCS OK: [0-9]+ process(es)? | procs=[0-9]+;100000;100000;0;$/', "Output correct" );
24 24
25$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000 -s Z" ); 25$result = NPTest->testCmd( "./check_procs -w 100000 -c 100000 -s Z" );
26is( $result->return_code, 0, "Checking less than 100000 zombie processes" ); 26is( $result->return_code, 0, "Checking less than 100000 zombie processes" );
@@ -28,11 +28,11 @@ like( $result->output, '/^PROCS OK: [0-9]+ process(es)? with /', "Output correct
28 28
29$result = NPTest->testCmd( "./check_procs -w 0 -c 100000" ); 29$result = NPTest->testCmd( "./check_procs -w 0 -c 100000" );
30is( $result->return_code, 1, "Checking warning if processes > 0" ); 30is( $result->return_code, 1, "Checking warning if processes > 0" );
31like( $result->output, '/^PROCS WARNING: [0-9]+ process(es)?$/', "Output correct" ); 31like( $result->output, '/^PROCS WARNING: [0-9]+ process(es)? | procs=[0-9]+;0;100000;0;$/', "Output correct" );
32 32
33$result = NPTest->testCmd( "./check_procs -w 0 -c 0" ); 33$result = NPTest->testCmd( "./check_procs -w 0 -c 0" );
34is( $result->return_code, 2, "Checking critical if processes > 0" ); 34is( $result->return_code, 2, "Checking critical if processes > 0" );
35like( $result->output, '/^PROCS CRITICAL: [0-9]+ process(es)?$/', "Output correct" ); 35like( $result->output, '/^PROCS CRITICAL: [0-9]+ process(es)? | procs=[0-9]+;0;0;0;$/', "Output correct" );
36 36
37$result = NPTest->testCmd( "./check_procs -w 0 -c 0 -s S" ); 37$result = NPTest->testCmd( "./check_procs -w 0 -c 0 -s S" );
38is( $result->return_code, 2, "Checking critical if sleeping processes" ); 38is( $result->return_code, 2, "Checking critical if sleeping processes" );
diff --git a/plugins/t/check_tcp.t b/plugins/t/check_tcp.t
index 75c1e5fb..d6808bf2 100644
--- a/plugins/t/check_tcp.t
+++ b/plugins/t/check_tcp.t
@@ -9,7 +9,7 @@ use Test;
9use NPTest; 9use NPTest;
10 10
11use vars qw($tests); 11use vars qw($tests);
12BEGIN {$tests = 7; plan tests => $tests} 12BEGIN {$tests = 14; plan tests => $tests}
13 13
14my $host_tcp_http = getTestParameter( "host_tcp_http", "NP_HOST_TCP_HTTP", "localhost", 14my $host_tcp_http = getTestParameter( "host_tcp_http", "NP_HOST_TCP_HTTP", "localhost",
15 "A host providing the HTTP Service (a web server)" ); 15 "A host providing the HTTP Service (a web server)" );
@@ -27,6 +27,7 @@ my $failedExpect = '/^TCP WARNING\s-\sUnexpected response from host/socket on po
27my $t; 27my $t;
28 28
29$t += checkCmd( "./check_tcp $host_tcp_http -p 80 -wt 300 -ct 600", 0, $successOutput ); 29$t += checkCmd( "./check_tcp $host_tcp_http -p 80 -wt 300 -ct 600", 0, $successOutput );
30$t += checkCmd( "./check_tcp $host_tcp_http -p 80 -wt 300 -ct 600 -6 ", 0, $successOutput );
30$t += checkCmd( "./check_tcp $host_tcp_http -p 81 -wt 0 -ct 0 -to 1", 2 ); # use invalid port for this test 31$t += checkCmd( "./check_tcp $host_tcp_http -p 81 -wt 0 -ct 0 -to 1", 2 ); # use invalid port for this test
31$t += checkCmd( "./check_tcp $host_nonresponsive -p 80 -wt 0 -ct 0 -to 1", 2 ); 32$t += checkCmd( "./check_tcp $host_nonresponsive -p 80 -wt 0 -ct 0 -to 1", 2 );
32$t += checkCmd( "./check_tcp $hostname_invalid -p 80 -wt 0 -ct 0 -to 1", 2 ); 33$t += checkCmd( "./check_tcp $hostname_invalid -p 80 -wt 0 -ct 0 -to 1", 2 );
@@ -34,6 +35,7 @@ $t += checkCmd( "./check_tcp -S -D 1 -H www.verisign.com -p 443", 0
34$t += checkCmd( "./check_tcp -S -D 9000,1 -H www.verisign.com -p 443", 0 ); 35$t += checkCmd( "./check_tcp -S -D 9000,1 -H www.verisign.com -p 443", 0 );
35$t += checkCmd( "./check_tcp -S -D 9000 -H www.verisign.com -p 443", 1 ); 36$t += checkCmd( "./check_tcp -S -D 9000 -H www.verisign.com -p 443", 1 );
36$t += checkCmd( "./check_tcp -S -D 9000,8999 -H www.verisign.com -p 443", 2 ); 37$t += checkCmd( "./check_tcp -S -D 9000,8999 -H www.verisign.com -p 443", 2 );
38$t += checkCmd( "./check_tcp -6 -p 80 www.heise.de", 0 );
37 39
38# Need the \r\n to make it more standards compliant with web servers. Need the various quotes 40# Need the \r\n to make it more standards compliant with web servers. Need the various quotes
39# so that perl doesn't interpret the \r\n and is passed onto command line correctly 41# so that perl doesn't interpret the \r\n and is passed onto command line correctly
diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t
index 9f97abdc..c3085e13 100755
--- a/plugins/tests/check_http.t
+++ b/plugins/tests/check_http.t
@@ -17,7 +17,7 @@ use Test::More;
17use NPTest; 17use NPTest;
18use FindBin qw($Bin); 18use FindBin qw($Bin);
19 19
20my $common_tests = 66; 20my $common_tests = 70;
21my $ssl_only_tests = 8; 21my $ssl_only_tests = 8;
22# Check that all dependent modules are available 22# Check that all dependent modules are available
23eval { 23eval {
@@ -151,6 +151,10 @@ sub run_server {
151 unshift @persist, $c; 151 unshift @persist, $c;
152 delete($persist[1000]); 152 delete($persist[1000]);
153 next MAINLOOP; 153 next MAINLOOP;
154 } elsif ($r->url->path eq "/header_check") {
155 $c->send_basic_header;
156 $c->send_header('foo');
157 $c->send_crlf;
154 } else { 158 } else {
155 $c->send_error(HTTP::Status->RC_FORBIDDEN); 159 $c->send_error(HTTP::Status->RC_FORBIDDEN);
156 } 160 }
@@ -223,6 +227,13 @@ sub run_common_tests {
223 is( $result->return_code, 2, "Missing string check"); 227 is( $result->return_code, 2, "Missing string check");
224 like( $result->output, qr%HTTP CRITICAL: HTTP/1\.1 200 OK - string 'NonRootWithOver30charsAndM...' not found on 'https?://127\.0\.0\.1:\d+/file/root'%, "Shows search string and location"); 228 like( $result->output, qr%HTTP CRITICAL: HTTP/1\.1 200 OK - string 'NonRootWithOver30charsAndM...' not found on 'https?://127\.0\.0\.1:\d+/file/root'%, "Shows search string and location");
225 229
230 $result = NPTest->testCmd( "$command -u /header_check -d foo" );
231 is( $result->return_code, 0, "header_check search for string");
232 like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - 96 bytes in [\d\.]+ second/', "Output correct" );
233
234 $result = NPTest->testCmd( "$command -u /header_check -d bar" );
235 is( $result->return_code, 2, "Missing header string check");
236 like( $result->output, qr%^HTTP CRITICAL: HTTP/1\.1 200 OK - header 'bar' not found on 'https?://127\.0\.0\.1:\d+/header_check'%, "Shows search string and location");
226 237
227 my $cmd; 238 my $cmd;
228 $cmd = "$command -u /slow"; 239 $cmd = "$command -u /slow";