diff options
51 files changed, 1424 insertions, 417 deletions
| @@ -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 |
| @@ -1,3 +1,7 @@ | |||
| 1 | 2013-01-23 Robin Sonefors <robin.sonefors@op5.com> | ||
| 2 | |||
| 3 | * plugins/check_snmp.c: fix memory allocation if using >= 8 oids | ||
| 4 | |||
| 1 | 2012-06-27 Holger Weiss <holger@zedat.fu-berlin.de> | 5 | 2012-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 |
| @@ -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 | ||
| 14 | 1.4.16 27th June 2012 | 43 | 1.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 | ||
| 37 | check_mysql, check_mysql_query: | 37 | check_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 | ||
| 45 | check_pqsql: | 44 | check_pqsql: |
| @@ -275,3 +275,13 @@ Tobias Brox | |||
| 275 | William Leibzon | 275 | William Leibzon |
| 276 | Jochen Bern | 276 | Jochen Bern |
| 277 | Anders Kaseorg | 277 | Anders Kaseorg |
| 278 | Robin Sonefors | ||
| 279 | Alex Bradley | ||
| 280 | Brian De Wolf | ||
| 281 | Richard Leitner | ||
| 282 | Diego Elio Pettenò | ||
| 283 | Vaclav Ovsik | ||
| 284 | Roman Fiedler | ||
| 285 | Fabio Rueda | ||
| 286 | Gabriele Tozzi | ||
| 287 | Sebastian Nohn | ||
diff --git a/configure.in b/configure.in index 1d4ed006..43fe4ade 100644 --- a/configure.in +++ b/configure.in | |||
| @@ -255,55 +255,66 @@ fi | |||
| 255 | LIBS="$_SAVEDLIBS" | 255 | LIBS="$_SAVEDLIBS" |
| 256 | CPPFLAGS="$_SAVEDCPPFLAGS" | 256 | CPPFLAGS="$_SAVEDCPPFLAGS" |
| 257 | 257 | ||
| 258 | AC_ARG_WITH([dbi], [AS_HELP_STRING([--without-dbi], [Skips the dbi plugin])]) | ||
| 258 | dnl Check for DBI libraries | 259 | dnl Check for DBI libraries |
| 259 | _SAVEDLIBS="$LIBS" | 260 | AS_IF([test "x$with_dbi" != "xno"], [ |
| 260 | AC_CHECK_LIB(dbi,dbi_initialize) | 261 | _SAVEDLIBS="$LIBS" |
| 261 | if 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" |
| 265 | else | 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]) |
| 268 | fi | 269 | AC_MSG_WARN([install DBI libs to compile this plugin (see REQUIREMENTS).]) |
| 269 | LIBS="$_SAVEDLIBS" | 270 | fi |
| 271 | LIBS="$_SAVEDLIBS" | ||
| 272 | ]) | ||
| 273 | |||
| 274 | AC_ARG_WITH([radius], [AS_HELP_STRING([--without-radius], [Skips the radius plugin])]) | ||
| 270 | 275 | ||
| 271 | dnl Check for radius libraries | 276 | dnl Check for radius libraries |
| 272 | _SAVEDLIBS="$LIBS" | 277 | AS_IF([test "x$with_radius" != "xno"], [ |
| 273 | AC_CHECK_LIB(radiusclient,rc_read_config) | 278 | _SAVEDLIBS="$LIBS" |
| 274 | if 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) | ||
| 278 | else | ||
| 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 |
| 288 | fi | 295 | LIBS="$_SAVEDLIBS" |
| 289 | LIBS="$_SAVEDLIBS" | 296 | ]) |
| 297 | |||
| 298 | AC_ARG_WITH([ldap], [AS_HELP_STRING([--without-ldap], [Skips the LDAP plugin])]) | ||
| 290 | 299 | ||
| 291 | dnl Check for LDAP libraries | 300 | dnl Check for LDAP libraries |
| 292 | _SAVEDLIBS="$LIBS" | 301 | AS_IF([test "x$with_ldap" != "xno"], [ |
| 293 | AC_CHECK_LIB(ldap,main,,,-llber) | 302 | _SAVEDLIBS="$LIBS" |
| 294 | if 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" |
| 302 | else | 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]) |
| 305 | fi | 314 | AC_MSG_WARN([install LDAP libs to compile this plugin (see REQUIREMENTS).]) |
| 306 | LIBS="$_SAVEDLIBS" | 315 | fi |
| 316 | LIBS="$_SAVEDLIBS" | ||
| 317 | ]) | ||
| 307 | 318 | ||
| 308 | dnl Check for headers used by check_ide_smart | 319 | dnl Check for headers used by check_ide_smart |
| 309 | AC_CHECK_HEADER(linux/hdreg.h, FOUNDINCLUDE=yes, FOUNDINCLUDE=no) | 320 | AC_CHECK_HEADER(linux/hdreg.h, FOUNDINCLUDE=yes, FOUNDINCLUDE=no) |
| @@ -1367,13 +1378,22 @@ then | |||
| 1367 | fi | 1378 | fi |
| 1368 | 1379 | ||
| 1369 | AC_PATH_PROG(PATH_TO_FPING,fping) | 1380 | AC_PATH_PROG(PATH_TO_FPING,fping) |
| 1381 | AC_PATH_PROG(PATH_TO_FPING6,fping6) | ||
| 1382 | |||
| 1370 | AC_ARG_WITH(fping_command, | 1383 | AC_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) |
| 1386 | AC_ARG_WITH(fping6_command, | ||
| 1387 | ACX_HELP_STRING([--with-fping6-command=PATH], | ||
| 1388 | [Path to fping6 command]), PATH_TO_FPING6=$withval) | ||
| 1389 | |||
| 1373 | if test -n "$PATH_TO_FPING" | 1390 | if test -n "$PATH_TO_FPING" |
| 1374 | then | 1391 | then |
| 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 | ||
| 1377 | else | 1397 | else |
| 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]) |
| 1379 | fi | 1399 | fi |
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 |
| 30 | if ($^O ne 'linux') { | 30 | if ($^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 | ||
| 35 | sub max_state($$){ | 35 | sub max_state($$){ |
| @@ -50,6 +50,7 @@ my $code = "UNKNOWN"; | |||
| 50 | my $msg = ""; | 50 | my $msg = ""; |
| 51 | my %status; | 51 | my %status; |
| 52 | my %recovery; | 52 | my %recovery; |
| 53 | my %resyncing; | ||
| 53 | my %finish; | 54 | my %finish; |
| 54 | my %active; | 55 | my %active; |
| 55 | my %devices; | 56 | my %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 | ||
| 113 | print $code, $msg, "\n"; | 124 | print $code, $msg, "\n"; |
| 114 | exit ($ERRORS{$code}); | 125 | exit ($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 | ||
| 46 | import sys, os, string, whrandom | 46 | import sys, os, string, random |
| 47 | 47 | ||
| 48 | import tempfile | 48 | import tempfile |
| 49 | from getopt import getopt | 49 | from 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 | ||
| 389 | def doc_syntax(): | 388 | def doc_syntax(): |
| 390 | print """ | 389 | print """ |
| 391 | Usage: check_ports [-v|--debug] [-H|--host host] [-V|--version] [-h|--help] | 390 | Usage: 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 @@ | |||
| 94 | int | 94 | int |
| 95 | get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp) | 95 | get_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 |
| 2 | dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc. |
| 3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
| 4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
| @@ -12,7 +12,11 @@ dnl Written by Paul Eggert. | |||
| 12 | AC_DEFUN([gl_FCNTL_O_FLAGS], | 12 | AC_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. |
| 46 | if test $ac_fsusage_space = no; then | 46 | if 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 | |||
| 97 | fi | 98 | fi |
| 98 | 99 | ||
| 99 | if test $ac_fsusage_space = no; then | 100 | if 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 | ||
| 102 | member (AIX, 4.3BSD)]) | 108 | member (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)]) | |||
| 131 | fi | 137 | fi |
| 132 | 138 | ||
| 133 | if test $ac_fsusage_space = no; then | 139 | if 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 |
| 155 | fi | 162 | fi |
| 156 | 163 | ||
| 157 | if test $ac_fsusage_space = no; then | 164 | if 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 | ||
| 160 | member (4.4BSD and NetBSD)]) | 171 | member (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 | ||
| 224 | if test $ac_fsusage_space = no; then | 235 | if 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) |
| 2 | dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. |
| 3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
| 4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl 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 |
| 2 | dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. |
| 3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
| 4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
| 5 | dnl with or without modifications, as long as this notice is preserved. | 5 | dnl 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. | ||
| 11 | AC_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. |
| 11 | AC_DEFUN([gl_FUNC_MALLOC_POSIX], | 28 | AC_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 | |||
| 58 | AC_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 |
| 2 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2007-2010 Free Software Foundation, Inc. |
| 3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
| 4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl 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 | ||
| 51 | AC_DEFUN([gl_STDLIB_H_DEFAULTS], | 51 | AC_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. */ |
| 104 | static size_t | 107 | static size_t |
| 105 | critical_factorization (const unsigned char *needle, size_t needle_len, | 108 | critical_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 | ;; |
| 68 | esac | 71 | esac |
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 | ||
| 42 | EXTRA_DIST = t tests utils.c netutils.c sslutils.c popen.c utils.h netutils.h \ | 42 | EXTRA_DIST = t tests |
| 43 | popen.h common.h runcmd.c runcmd.h | ||
| 44 | 43 | ||
| 45 | PLUGINHDRS = common.h | 44 | PLUGINHDRS = common.h |
| 46 | 45 | ||
| 47 | BASEOBJS = utils.o ../lib/libnagiosplug.a ../gl/libgnu.a | 46 | noinst_LIBRARIES = libnpcommon.a |
| 48 | NETOBJS = netutils.o $(BASEOBJS) $(EXTRA_NETOBJS) | 47 | |
| 49 | SSLOBJS = sslutils.o | 48 | libnpcommon_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 | |||
| 51 | BASEOBJS = libnpcommon.a ../lib/libnagiosplug.a ../gl/libgnu.a | ||
| 52 | NETOBJS = $(BASEOBJS) $(EXTRA_NETOBLS) | ||
| 50 | NETLIBS = $(NETOBJS) $(SOCKETLIBS) | 53 | NETLIBS = $(NETOBJS) $(SOCKETLIBS) |
| 54 | SSLOBJS = $(BASEOBJS) $(NETLIBS) $(SSLLIBS) | ||
| 51 | 55 | ||
| 52 | TESTS_ENVIRONMENT = perl -I $(top_builddir) -I $(top_srcdir) | 56 | TESTS_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 | ||
| 65 | check_apt_LDADD = $(BASEOBJS) runcmd.o | 69 | check_apt_LDADD = $(BASEOBJS) |
| 66 | check_cluster_LDADD = $(BASEOBJS) | 70 | check_cluster_LDADD = $(BASEOBJS) |
| 67 | check_dbi_LDADD = $(NETLIBS) $(DBILIBS) | 71 | check_dbi_LDADD = $(NETLIBS) $(DBILIBS) |
| 68 | check_dig_LDADD = $(NETLIBS) runcmd.o | 72 | check_dig_LDADD = $(NETLIBS) |
| 69 | check_disk_LDADD = $(BASEOBJS) popen.o | 73 | check_disk_LDADD = $(BASEOBJS) |
| 70 | check_dns_LDADD = $(NETLIBS) runcmd.o | 74 | check_dns_LDADD = $(NETLIBS) |
| 71 | check_dummy_LDADD = $(BASEOBJS) | 75 | check_dummy_LDADD = $(BASEOBJS) |
| 72 | check_fping_LDADD = $(NETLIBS) popen.o | 76 | check_fping_LDADD = $(NETLIBS) |
| 73 | check_game_LDADD = $(BASEOBJS) runcmd.o | 77 | check_game_LDADD = $(BASEOBJS) |
| 74 | check_http_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) | 78 | check_http_LDADD = $(SSLOBJS) |
| 75 | check_hpjd_LDADD = $(NETLIBS) popen.o | 79 | check_hpjd_LDADD = $(NETLIBS) |
| 76 | check_ldap_LDADD = $(NETLIBS) $(LDAPLIBS) | 80 | check_ldap_LDADD = $(NETLIBS) $(LDAPLIBS) |
| 77 | check_load_LDADD = $(BASEOBJS) popen.o | 81 | check_load_LDADD = $(BASEOBJS) |
| 78 | check_mrtg_LDADD = $(BASEOBJS) | 82 | check_mrtg_LDADD = $(BASEOBJS) |
| 79 | check_mrtgtraf_LDADD = $(BASEOBJS) | 83 | check_mrtgtraf_LDADD = $(BASEOBJS) |
| 80 | check_mysql_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"' | 84 | check_mysql_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"' |
| @@ -83,22 +87,22 @@ check_mysql_LDADD = $(NETLIBS) $(MYSQLLIBS) | |||
| 83 | check_mysql_query_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"' | 87 | check_mysql_query_CFLAGS = $(MYSQLCFLAGS) -DNP_VERSION='"$(NP_VERSION)"' |
| 84 | check_mysql_query_CPPFLAGS = $(MYSQLINCLUDE) | 88 | check_mysql_query_CPPFLAGS = $(MYSQLINCLUDE) |
| 85 | check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS) | 89 | check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS) |
| 86 | check_nagios_LDADD = $(BASEOBJS) runcmd.o | 90 | check_nagios_LDADD = $(BASEOBJS) |
| 87 | check_nt_LDADD = $(NETLIBS) | 91 | check_nt_LDADD = $(NETLIBS) |
| 88 | check_ntp_LDADD = $(NETLIBS) $(MATHLIBS) | 92 | check_ntp_LDADD = $(NETLIBS) $(MATHLIBS) |
| 89 | check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS) | 93 | check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS) |
| 90 | check_nwstat_LDADD = $(NETLIBS) | 94 | check_nwstat_LDADD = $(NETLIBS) |
| 91 | check_overcr_LDADD = $(NETLIBS) | 95 | check_overcr_LDADD = $(NETLIBS) |
| 92 | check_pgsql_LDADD = $(NETLIBS) $(PGLIBS) | 96 | check_pgsql_LDADD = $(NETLIBS) $(PGLIBS) |
| 93 | check_ping_LDADD = $(NETLIBS) popen.o | 97 | check_ping_LDADD = $(NETLIBS) |
| 94 | check_procs_LDADD = $(BASEOBJS) | 98 | check_procs_LDADD = $(BASEOBJS) |
| 95 | check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS) | 99 | check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS) |
| 96 | check_real_LDADD = $(NETLIBS) | 100 | check_real_LDADD = $(NETLIBS) |
| 97 | check_snmp_LDADD = $(BASEOBJS) | 101 | check_snmp_LDADD = $(BASEOBJS) |
| 98 | check_smtp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) | 102 | check_smtp_LDADD = $(SSLOBJS) |
| 99 | check_ssh_LDADD = $(NETLIBS) | 103 | check_ssh_LDADD = $(NETLIBS) |
| 100 | check_swap_LDADD = $(MATHLIBS) $(BASEOBJS) popen.o | 104 | check_swap_LDADD = $(MATHLIBS) $(BASEOBJS) |
| 101 | check_tcp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS) | 105 | check_tcp_LDADD = $(SSLOBJS) |
| 102 | check_time_LDADD = $(NETLIBS) | 106 | check_time_LDADD = $(NETLIBS) |
| 103 | check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS) | 107 | check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS) |
| 104 | check_ups_LDADD = $(NETLIBS) | 108 | check_ups_LDADD = $(NETLIBS) |
| @@ -106,62 +110,11 @@ check_users_LDADD = $(BASEOBJS) | |||
| 106 | check_by_ssh_LDADD = $(NETLIBS) | 110 | check_by_ssh_LDADD = $(NETLIBS) |
| 107 | check_ide_smart_LDADD = $(BASEOBJS) | 111 | check_ide_smart_LDADD = $(BASEOBJS) |
| 108 | negate_LDADD = $(BASEOBJS) | 112 | negate_LDADD = $(BASEOBJS) |
| 109 | urlize_LDADD = $(BASEOBJS) popen.o | 113 | urlize_LDADD = $(BASEOBJS) |
| 110 | |||
| 111 | check_apt_DEPENDENCIES = check_apt.c $(BASEOBJS) runcmd.o $(DEPLIBS) | ||
| 112 | check_cluster_DEPENDENCIES = check_cluster.c $(BASEOBJS) $(DEPLIBS) | ||
| 113 | check_dbi_DEPENDENCIES = check_dbi.c $(NETOBJS) $(DEPLIBS) | ||
| 114 | check_dig_DEPENDENCIES = check_dig.c $(NETOBJS) runcmd.o $(DEPLIBS) | ||
| 115 | check_disk_DEPENDENCIES = check_disk.c $(BASEOBJS) popen.o $(DEPLIBS) | ||
| 116 | check_dns_DEPENDENCIES = check_dns.c $(NETOBJS) runcmd.o $(DEPLIBS) | ||
| 117 | check_dummy_DEPENDENCIES = check_dummy.c $(DEPLIBS) | ||
| 118 | check_fping_DEPENDENCIES = check_fping.c $(NETOBJS) popen.o $(DEPLIBS) | ||
| 119 | check_game_DEPENDENCIES = check_game.c $(DEPLIBS) runcmd.o | ||
| 120 | check_http_DEPENDENCIES = check_http.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS) | ||
| 121 | check_hpjd_DEPENDENCIES = check_hpjd.c $(NETOBJS) popen.o $(DEPLIBS) | ||
| 122 | check_ide_smart_DEPENDENCIES = check_ide_smart.c $(BASEOBJS) $(DEPLIBS) | ||
| 123 | check_ldap_DEPENDENCIES = check_ldap.c $(NETOBJS) $(DEPLIBS) | ||
| 124 | check_load_DEPENDENCIES = check_load.c $(BASEOBJS) popen.o $(DEPLIBS) | ||
| 125 | check_mrtg_DEPENDENCIES = check_mrtg.c $(DEPLIBS) | ||
| 126 | check_mrtgtraf_DEPENDENCIES = check_mrtgtraf.c $(DEPLIBS) | ||
| 127 | check_mysql_DEPENDENCIES = check_mysql.c $(NETOBJS) $(DEPLIBS) | ||
| 128 | check_mysql_query_DEPENDENCIES = check_mysql_query.c $(NETOBJS) $(DEPLIBS) | ||
| 129 | check_nagios_DEPENDENCIES = check_nagios.c $(BASEOBJS) runcmd.o $(DEPLIBS) | ||
| 130 | check_nt_DEPENDENCIES = check_nt.c $(NETOBJS) $(DEPLIBS) | ||
| 131 | check_ntp_DEPENDENCIES = check_ntp.c $(NETOBJS) $(DEPLIBS) | ||
| 132 | check_ntp_peer_DEPENDENCIES = check_ntp_peer.c $(NETOBJS) $(DEPLIBS) | ||
| 133 | check_nwstat_DEPENDENCIES = check_nwstat.c $(NETOBJS) $(DEPLIBS) | ||
| 134 | check_overcr_DEPENDENCIES = check_overcr.c $(NETOBJS) $(DEPLIBS) | ||
| 135 | check_pgsql_DEPENDENCIES = check_pgsql.c $(NETOBJS) $(DEPLIBS) | ||
| 136 | check_ping_DEPENDENCIES = check_ping.c $(NETOBJS) popen.o $(DEPLIBS) | ||
| 137 | check_procs_DEPENDENCIES = check_procs.c $(BASEOBJS) popen.o $(DEPLIBS) | ||
| 138 | check_radius_DEPENDENCIES = check_radius.c $(NETOBJS) $(DEPLIBS) | ||
| 139 | check_real_DEPENDENCIES = check_real.c $(NETOBJS) $(DEPLIBS) | ||
| 140 | check_snmp_DEPENDENCIES = check_snmp.c $(BASEOBJS) $(DEPLIBS) | ||
| 141 | check_smtp_DEPENDENCIES = check_smtp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS) | ||
| 142 | check_ssh_DEPENDENCIES = check_ssh.c $(NETOBJS) $(DEPLIBS) | ||
| 143 | check_swap_DEPENDENCIES = check_swap.c $(BASEOBJS) popen.o $(DEPLIBS) | ||
| 144 | check_tcp_DEPENDENCIES = check_tcp.c $(SSLOBJS) $(NETOBJS) $(DEPLIBS) | ||
| 145 | check_time_DEPENDENCIES = check_time.c $(NETOBJS) $(DEPLIBS) | ||
| 146 | check_ntp_time_DEPENDENCIES = check_ntp_time.c $(NETOBJS) $(DEPLIBS) | ||
| 147 | check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS) | ||
| 148 | check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS) | ||
| 149 | check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) $(DEPLIBS) | ||
| 150 | negate_DEPENDENCIES = negate.c $(BASEOBJS) $(DEPLIBS) | ||
| 151 | urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS) | ||
| 152 | 114 | ||
| 153 | ############################################################################## | 115 | ############################################################################## |
| 154 | # secondary dependencies | 116 | # secondary dependencies |
| 155 | 117 | ||
| 156 | popen.o: popen.c popen.h $(PLUGINHDRS) | ||
| 157 | |||
| 158 | runcmd.o: runcmd.c runcmd.h $(PLUGINHDRS) | ||
| 159 | |||
| 160 | utils.o: utils.c utils.h $(PLUGINHDRS) | ||
| 161 | |||
| 162 | netutils.o: netutils.c netutils.h $(PLUGINHDRS) | ||
| 163 | sslutils.o: sslutils.c netutils.h $(PLUGINHDRS) | ||
| 164 | |||
| 165 | all-local: $(check_tcp_programs) | 118 | all-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 */ |
| 42 | typedef enum { UPGRADE, DIST_UPGRADE, NO_UPGRADE } upgrade_type; | 42 | typedef 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 */ |
| 56 | int process_arguments(int, char **); | 60 | int process_arguments(int, char **); |
| @@ -75,6 +79,7 @@ static char *update_opts = NULL; /* options to override defaults for update */ | |||
| 75 | static char *do_include = NULL; /* regexp to only include certain packages */ | 79 | static char *do_include = NULL; /* regexp to only include certain packages */ |
| 76 | static char *do_exclude = NULL; /* regexp to only exclude certain packages */ | 80 | static char *do_exclude = NULL; /* regexp to only exclude certain packages */ |
| 77 | static char *do_critical = NULL; /* regexp specifying critical packages */ | 81 | static char *do_critical = NULL; /* regexp specifying critical packages */ |
| 82 | static char *input_filename = NULL; /* input filename for testing */ | ||
| 78 | 83 | ||
| 79 | /* other global variables */ | 84 | /* other global variables */ |
| 80 | static int stderr_warning = 0; /* if a cmd issued output on stderr */ | 85 | static 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"; | |||
| 54 | char *expected_address = NULL; | 54 | char *expected_address = NULL; |
| 55 | char *dns_server = NULL; | 55 | char *dns_server = NULL; |
| 56 | char *dig_args = ""; | 56 | char *dig_args = ""; |
| 57 | char *query_transport = ""; | ||
| 57 | int verbose = FALSE; | 58 | int verbose = FALSE; |
| 58 | int server_port = DEFAULT_PORT; | 59 | int server_port = DEFAULT_PORT; |
| 59 | double warning_interval = UNDEFINED; | 60 | double 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 | |||
| 95 | static struct name_list *fs_exclude_list; | 94 | static 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. */ | ||
| 98 | static struct name_list *fs_include_list; | ||
| 99 | |||
| 97 | static struct name_list *dp_exclude_list; | 100 | static struct name_list *dp_exclude_list; |
| 98 | 101 | ||
| 99 | static struct parameter_list *path_select_list = NULL; | 102 | static 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 | ||
| 928 | void | 940 | void |
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); | |||
| 52 | void print_usage (void); | 52 | void print_usage (void); |
| 53 | 53 | ||
| 54 | char *server_name = NULL; | 54 | char *server_name = NULL; |
| 55 | char *sourceip = NULL; | ||
| 56 | char *sourceif = NULL; | ||
| 55 | int packet_size = PACKET_SIZE; | 57 | int packet_size = PACKET_SIZE; |
| 56 | int packet_count = PACKET_COUNT; | 58 | int packet_count = PACKET_COUNT; |
| 57 | int target_timeout = 0; | 59 | int 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 | ||
| 36 | const char *progname = "check_http"; | 36 | const char *progname = "check_http"; |
| 37 | const char *copyright = "1999-2011"; | 37 | const char *copyright = "1999-2013"; |
| 38 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 38 | const 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; | |||
| 85 | int invert_regex = 0; | 84 | int invert_regex = 0; |
| 86 | 85 | ||
| 87 | struct timeval tv; | 86 | struct timeval tv; |
| 87 | struct 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; | |||
| 100 | int server_url_length; | 100 | int server_url_length; |
| 101 | int server_expect_yn = 0; | 101 | int server_expect_yn = 0; |
| 102 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; | 102 | char server_expect[MAX_INPUT_BUFFER] = HTTP_EXPECT; |
| 103 | char header_expect[MAX_INPUT_BUFFER] = ""; | ||
| 103 | char string_expect[MAX_INPUT_BUFFER] = ""; | 104 | char string_expect[MAX_INPUT_BUFFER] = ""; |
| 105 | char output_header_search[30] = ""; | ||
| 104 | char output_string_search[30] = ""; | 106 | char output_string_search[30] = ""; |
| 105 | char *warning_thresholds = NULL; | 107 | char *warning_thresholds = NULL; |
| 106 | char *critical_thresholds = NULL; | 108 | char *critical_thresholds = NULL; |
| @@ -115,6 +117,7 @@ int followsticky = STICKY_NONE; | |||
| 115 | int use_ssl = FALSE; | 117 | int use_ssl = FALSE; |
| 116 | int use_sni = FALSE; | 118 | int use_sni = FALSE; |
| 117 | int verbose = FALSE; | 119 | int verbose = FALSE; |
| 120 | int show_extended_perfdata = FALSE; | ||
| 118 | int sd; | 121 | int sd; |
| 119 | int min_page_len = 0; | 122 | int min_page_len = 0; |
| 120 | int max_page_len = 0; | 123 | int max_page_len = 0; |
| @@ -131,6 +134,11 @@ void redir (char *pos, char *status_line); | |||
| 131 | int server_type_check(const char *type); | 134 | int server_type_check(const char *type); |
| 132 | int server_port_check(int ssl_flag); | 135 | int server_port_check(int ssl_flag); |
| 133 | char *perfd_time (double microsec); | 136 | char *perfd_time (double microsec); |
| 137 | char *perfd_time_connect (double microsec); | ||
| 138 | char *perfd_time_ssl (double microsec); | ||
| 139 | char *perfd_time_firstbyte (double microsec); | ||
| 140 | char *perfd_time_headers (double microsec); | ||
| 141 | char *perfd_time_transfer (double microsec); | ||
| 134 | char *perfd_size (int page_len); | 142 | char *perfd_size (int page_len); |
| 135 | void print_help (void); | 143 | void print_help (void); |
| 136 | void print_usage (void); | 144 | void 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 | ||
| 1371 | char *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 | |||
| 1376 | char *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 | |||
| 1381 | char *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 | |||
| 1386 | char *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 | ||
| 1391 | char *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 | ||
| 1306 | char *perfd_size (int page_len) | 1396 | char *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 | ||
| 33 | const char *progname = "check_mysql"; | 33 | const char *progname = "check_mysql"; |
| 34 | const char *copyright = "1999-2007"; | 34 | const char *copyright = "1999-2011"; |
| 35 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 35 | const 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; | |||
| 49 | char *db_socket = NULL; | 49 | char *db_socket = NULL; |
| 50 | char *db_pass = NULL; | 50 | char *db_pass = NULL; |
| 51 | char *db = NULL; | 51 | char *db = NULL; |
| 52 | char *ca_cert = NULL; | ||
| 53 | char *ca_dir = NULL; | ||
| 54 | char *cert = NULL; | ||
| 55 | char *key = NULL; | ||
| 56 | char *ciphers = NULL; | ||
| 57 | bool ssl = false; | ||
| 52 | char *opt_file = NULL; | 58 | char *opt_file = NULL; |
| 53 | char *opt_group = NULL; | 59 | char *opt_group = NULL; |
| 54 | unsigned int db_port = MYSQL_PORT; | 60 | unsigned int db_port = MYSQL_PORT; |
| 55 | int check_slave = 0, warn_sec = 0, crit_sec = 0; | 61 | int check_slave = 0, warn_sec = 0, crit_sec = 0; |
| 56 | int verbose = 0; | 62 | int verbose = 0; |
| 57 | 63 | ||
| 64 | static double warning_time = 0; | ||
| 65 | static double critical_time = 0; | ||
| 66 | |||
| 67 | #define LENGTH_METRIC_UNIT 6 | ||
| 68 | static 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 | ||
| 78 | static 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 | |||
| 58 | thresholds *my_threshold = NULL; | 90 | thresholds *my_threshold = NULL; |
| 59 | 91 | ||
| 60 | int process_arguments (int, char **); | 92 | int 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 | |||
| 311 | print_usage (void) | 321 | print_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 | ||
| 31 | const char *progname = "check_pgsql"; | 31 | const char *progname = "check_pgsql"; |
| 32 | const char *copyright = "1999-2007"; | 32 | const char *copyright = "1999-2011"; |
| 33 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 33 | const 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 | |||
| 45 | enum { | 59 | enum { |
| 46 | DEFAULT_PORT = 5432, | 60 | DEFAULT_PORT = 5432, |
| 47 | DEFAULT_WARN = 2, | 61 | DEFAULT_WARN = 2, |
| @@ -56,6 +70,7 @@ void print_usage (void); | |||
| 56 | void print_help (void); | 70 | void print_help (void); |
| 57 | int is_pg_dbname (char *); | 71 | int is_pg_dbname (char *); |
| 58 | int is_pg_logname (char *); | 72 | int is_pg_logname (char *); |
| 73 | int do_query (PGconn *, char *); | ||
| 59 | 74 | ||
| 60 | char *pghost = NULL; /* host name of the backend server */ | 75 | char *pghost = NULL; /* host name of the backend server */ |
| 61 | char *pgport = NULL; /* port of the backend server */ | 76 | char *pgport = NULL; /* port of the backend server */ |
| @@ -65,14 +80,15 @@ char *pgtty = NULL; | |||
| 65 | char dbName[NAMEDATALEN] = DEFAULT_DB; | 80 | char dbName[NAMEDATALEN] = DEFAULT_DB; |
| 66 | char *pguser = NULL; | 81 | char *pguser = NULL; |
| 67 | char *pgpasswd = NULL; | 82 | char *pgpasswd = NULL; |
| 83 | char *pgparams = NULL; | ||
| 68 | double twarn = (double)DEFAULT_WARN; | 84 | double twarn = (double)DEFAULT_WARN; |
| 69 | double tcrit = (double)DEFAULT_CRIT; | 85 | double tcrit = (double)DEFAULT_CRIT; |
| 86 | char *pgquery = NULL; | ||
| 87 | char *query_warning = NULL; | ||
| 88 | char *query_critical = NULL; | ||
| 89 | thresholds *qthresholds = NULL; | ||
| 70 | int verbose = 0; | 90 | int verbose = 0; |
| 71 | 91 | ||
| 72 | PGconn *conn; | ||
| 73 | /*PGresult *res;*/ | ||
| 74 | |||
| 75 | |||
| 76 | /****************************************************************************** | 92 | /****************************************************************************** |
| 77 | 93 | ||
| 78 | The (psuedo?)literate programming XML is contained within \@\@\- <XML> \-\@\@ | 94 | The (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. | |||
| 132 | int | 144 | int |
| 133 | main (int argc, char **argv) | 145 | main (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 | |||
| 475 | print_usage (void) | 576 | print_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 | |||
| 584 | int | ||
| 585 | do_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 | ||
| 46 | int process_arguments (int, char **); | 51 | int process_arguments (int, char **); |
| 47 | int validate_arguments (void); | 52 | int 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 */ |
| 69 | char *metric_name; | 78 | char *metric_name; |
| 70 | enum metric { | 79 | enum metric { |
| @@ -90,9 +99,21 @@ regex_t re_args; | |||
| 90 | char *fmt; | 99 | char *fmt; |
| 91 | char *fails; | 100 | char *fails; |
| 92 | char tmp[MAX_INPUT_BUFFER]; | 101 | char tmp[MAX_INPUT_BUFFER]; |
| 102 | int kthread_filter = 0; | ||
| 103 | int usepid = 0; /* whether to test for pid or /proc/pid/exe */ | ||
| 93 | 104 | ||
| 94 | FILE *ps_input = NULL; | 105 | FILE *ps_input = NULL; |
| 95 | 106 | ||
| 107 | static int | ||
| 108 | stat_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 | ||
| 97 | int | 118 | int |
| 98 | main (int argc, char **argv) | 119 | main (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\ |
| 675 | RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\ | 744 | RANGEs 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; | |||
| 99 | char *authtype = NULL; | 99 | char *authtype = NULL; |
| 100 | char *authuser = NULL; | 100 | char *authuser = NULL; |
| 101 | char *authpass = NULL; | 101 | char *authpass = NULL; |
| 102 | int warning_time = 0; | 102 | double warning_time = 0; |
| 103 | int check_warning_time = FALSE; | 103 | int check_warning_time = FALSE; |
| 104 | int critical_time = 0; | 104 | double critical_time = 0; |
| 105 | int check_critical_time = FALSE; | 105 | int check_critical_time = FALSE; |
| 106 | int verbose = 0; | 106 | int verbose = 0; |
| 107 | int use_ssl = FALSE; | 107 | int 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; | |||
| 138 | char *miblist = NULL; | 139 | char *miblist = NULL; |
| 139 | int needmibs = FALSE; | 140 | int needmibs = FALSE; |
| 140 | int calculate_rate = 0; | 141 | int calculate_rate = 0; |
| 142 | double offset = 0.0; | ||
| 141 | int rate_multiplier = 1; | 143 | int rate_multiplier = 1; |
| 142 | state_data *previous_state; | 144 | state_data *previous_state; |
| 143 | double previous_value[MAX_OIDS]; | 145 | double 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 | ||
| 62 | static int server_port = 0; | 62 | static int server_port = 0; |
| 63 | static char *server_address = NULL; | 63 | static char *server_address = NULL; |
| 64 | static int host_specified = FALSE; | ||
| 64 | static char *server_send = NULL; | 65 | static char *server_send = NULL; |
| 65 | static char *server_quit = NULL; | 66 | static char *server_quit = NULL; |
| 66 | static char **server_expect; | 67 | static 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 | ||
| 258 | void | 258 | void |
| 259 | popen_timeout_alarm_handler (int signo) | 259 | runcmd_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 **/ |
| 41 | int np_runcmd(const char *, output *, output *, int); | 41 | int np_runcmd(const char *, output *, output *, int); |
| 42 | void popen_timeout_alarm_handler(int) | 42 | void 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 | |||
| 7 | use strict; | ||
| 8 | use Test::More; | ||
| 9 | use NPTest; | ||
| 10 | |||
| 11 | sub 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 | |||
| 25 | if (-x "./check_apt") { | ||
| 26 | plan tests => 28; | ||
| 27 | } else { | ||
| 28 | plan skip_all => "No check_apt compiled"; | ||
| 29 | } | ||
| 30 | |||
| 31 | my $result; | ||
| 32 | |||
| 33 | my $testfile_command = "./check_apt %s --input-file=t/check_apt_input/%s"; | ||
| 34 | |||
| 35 | $result = NPTest->testCmd( sprintf($testfile_command, "", "debian1") ); | ||
| 36 | is( $result->return_code, 0, "No upgrades" ); | ||
| 37 | like( $result->output, make_result_regexp(0, 0), "Output correct" ); | ||
| 38 | |||
| 39 | $result = NPTest->testCmd( sprintf($testfile_command, "", "debian2") ); | ||
| 40 | is( $result->return_code, 1, "Debian apt output, warning" ); | ||
| 41 | like( $result->output, make_result_regexp(13, 0), "Output correct" ); | ||
| 42 | |||
| 43 | $result = NPTest->testCmd( sprintf($testfile_command, "", "debian3") ); | ||
| 44 | is( $result->return_code, 2, "Debian apt output, some critical" ); | ||
| 45 | like( $result->output, make_result_regexp(19, 4), "Output correct" ); | ||
| 46 | |||
| 47 | $result = NPTest->testCmd( sprintf($testfile_command, "-c '^[^\\(]*\\(.* (Debian-Security:|Ubuntu:[^/]*/[^-]*-security)'", "debian3") ); | ||
| 48 | is( $result->return_code, 2, "Debian apt output - should have same result when default security regexp specified via -c" ); | ||
| 49 | like( $result->output, make_result_regexp(19, 4), "Output correct" ); | ||
| 50 | |||
| 51 | $result = NPTest->testCmd( sprintf($testfile_command, "-i libc6", "debian3") ); | ||
| 52 | is( $result->return_code, 1, "Debian apt output, filter for libc6" ); | ||
| 53 | like( $result->output, make_result_regexp(3, 0), "Output correct" ); | ||
| 54 | |||
| 55 | $result = NPTest->testCmd( sprintf($testfile_command, "-i libc6 -i xen", "debian3") ); | ||
| 56 | is( $result->return_code, 2, "Debian apt output, filter for libc6 and xen" ); | ||
| 57 | like( $result->output, make_result_regexp(9, 4), "Output correct" ); | ||
| 58 | |||
| 59 | $result = NPTest->testCmd( sprintf($testfile_command, "-i libc6 -i xen -i linux", "debian3") ); | ||
| 60 | is( $result->return_code, 2, "Debian apt output, filter for libc6, xen, linux" ); | ||
| 61 | like( $result->output, make_result_regexp(12, 4), "Output correct" ); | ||
| 62 | |||
| 63 | $result = NPTest->testCmd( sprintf($testfile_command, "-e libc6", "debian3") ); | ||
| 64 | is( $result->return_code, 2, "Debian apt output, filter out libc6" ); | ||
| 65 | like( $result->output, make_result_regexp(16, 4), "Output correct" ); | ||
| 66 | |||
| 67 | $result = NPTest->testCmd( sprintf($testfile_command, "-e libc6 -e xen", "debian3") ); | ||
| 68 | is( $result->return_code, 1, "Debian apt output, filter out libc6 and xen" ); | ||
| 69 | like( $result->output, make_result_regexp(10, 0), "Output correct" ); | ||
| 70 | |||
| 71 | $result = NPTest->testCmd( sprintf($testfile_command, "-e libc6 -e xen -e linux", "debian3") ); | ||
| 72 | is( $result->return_code, 1, "Debian apt output, filter out libc6, xen, linux" ); | ||
| 73 | like( $result->output, make_result_regexp(7, 0), "Output correct" ); | ||
| 74 | |||
| 75 | $result = NPTest->testCmd( sprintf($testfile_command, "-c Debian-Security -c linux", "debian3") ); | ||
| 76 | is( $result->return_code, 2, "Debian apt output, critical on Debian-Security or linux" ); | ||
| 77 | like( $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") ); | ||
| 80 | is( $result->return_code, 2, "Debian apt output, include lib and linux, exclude gc1c, critical on linux-image" ); | ||
| 81 | like( $result->output, make_result_regexp(10, 2), "Output correct" ); | ||
| 82 | |||
| 83 | $result = NPTest->testCmd( sprintf($testfile_command, "", "ubuntu1") ); | ||
| 84 | is( $result->return_code, 1, "Ubuntu apt output, warning" ); | ||
| 85 | like( $result->output, make_result_regexp(5, 0), "Output correct" ); | ||
| 86 | |||
| 87 | $result = NPTest->testCmd( sprintf($testfile_command, "", "ubuntu2") ); | ||
| 88 | is( $result->return_code, 2, "Ubuntu apt output, some critical" ); | ||
| 89 | like( $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 @@ | |||
| 1 | NOTE: 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 @@ | |||
| 1 | NOTE: 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! | ||
| 5 | Reading package lists... Done | ||
| 6 | Building dependency tree | ||
| 7 | Reading state information... Done | ||
| 8 | The 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 | ||
| 11 | 13 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. | ||
| 12 | Inst base-files [6.0squeeze5] (6.0squeeze6 Debian:6.0.6/stable [amd64]) | ||
| 13 | Conf base-files (6.0squeeze6 Debian:6.0.6/stable [amd64]) | ||
| 14 | Inst dpkg [1.15.8.12] (1.15.8.13 Debian:6.0.6/stable [amd64]) | ||
| 15 | Conf dpkg (1.15.8.13 Debian:6.0.6/stable [amd64]) | ||
| 16 | Inst linux-base [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 17 | Inst linux-image-2.6.32-5-xen-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 18 | Inst debian-archive-keyring [2010.08.28] (2010.08.28+squeeze1 Debian:6.0.6/stable [all]) | ||
| 19 | Conf debian-archive-keyring (2010.08.28+squeeze1 Debian:6.0.6/stable [all]) | ||
| 20 | Inst libc6-dev [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) [] | ||
| 21 | Inst libc-dev-bin [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) [] | ||
| 22 | Inst linux-libc-dev [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64]) [] | ||
| 23 | Inst libc-bin [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ] | ||
| 24 | Conf libc-bin (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ] | ||
| 25 | Inst libc6 [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) | ||
| 26 | Conf libc6 (2.11.3-4 Debian:6.0.6/stable [amd64]) | ||
| 27 | Inst locales [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [all]) | ||
| 28 | Inst firmware-linux-free [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 29 | Inst lockfile-progs [0.1.15] (0.1.15+squeeze1 Debian:6.0.6/stable [amd64]) | ||
| 30 | Conf linux-base (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 31 | Conf linux-image-2.6.32-5-xen-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 32 | Conf libc-dev-bin (2.11.3-4 Debian:6.0.6/stable [amd64]) | ||
| 33 | Conf linux-libc-dev (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 34 | Conf libc6-dev (2.11.3-4 Debian:6.0.6/stable [amd64]) | ||
| 35 | Conf locales (2.11.3-4 Debian:6.0.6/stable [all]) | ||
| 36 | Conf firmware-linux-free (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 37 | Conf 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 @@ | |||
| 1 | NOTE: 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! | ||
| 5 | Inst base-files [6.0squeeze5] (6.0squeeze6 Debian:6.0.6/stable [amd64]) | ||
| 6 | Conf base-files (6.0squeeze6 Debian:6.0.6/stable [amd64]) | ||
| 7 | Inst dpkg [1.15.8.12] (1.15.8.13 Debian:6.0.6/stable [amd64]) | ||
| 8 | Conf dpkg (1.15.8.13 Debian:6.0.6/stable [amd64]) | ||
| 9 | Inst linux-base [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 10 | Inst linux-image-2.6.32-5-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 11 | Inst 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]) | ||
| 12 | Inst xen-linux-system-2.6.32-5-xen-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64]) [] | ||
| 13 | Inst linux-image-2.6.32-5-xen-amd64 [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 14 | Inst debian-archive-keyring [2010.08.28] (2010.08.28+squeeze1 Debian:6.0.6/stable [all]) | ||
| 15 | Conf debian-archive-keyring (2010.08.28+squeeze1 Debian:6.0.6/stable [all]) | ||
| 16 | Inst libc6-i386 [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) [] | ||
| 17 | Inst libc-bin [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ] | ||
| 18 | Conf libc-bin (2.11.3-4 Debian:6.0.6/stable [amd64]) [libc6:amd64 ] | ||
| 19 | Inst libc6 [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [amd64]) | ||
| 20 | Conf libc6 (2.11.3-4 Debian:6.0.6/stable [amd64]) | ||
| 21 | Inst libgc1c2 [1:6.8-1.2] (1:6.8-2 Debian:6.0.6/stable [amd64]) | ||
| 22 | Inst locales [2.11.3-3] (2.11.3-4 Debian:6.0.6/stable [all]) | ||
| 23 | Inst firmware-linux-free [2.6.32-45] (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 24 | Inst libxenstore3.0 [4.0.1-5.3] (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64]) | ||
| 25 | Inst lockfile-progs [0.1.15] (0.1.15+squeeze1 Debian:6.0.6/stable [amd64]) | ||
| 26 | Inst 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]) | ||
| 27 | Inst xenstore-utils [4.0.1-5.3] (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64]) | ||
| 28 | Inst libconfig-inifiles-perl [2.52-1] (2.52-1+squeeze1 Debian:6.0.6/stable [all]) | ||
| 29 | Conf linux-base (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 30 | Conf linux-image-2.6.32-5-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 31 | Conf xen-hypervisor-4.0-amd64 (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64]) | ||
| 32 | Conf linux-image-2.6.32-5-xen-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 33 | Conf xen-linux-system-2.6.32-5-xen-amd64 (2.6.32-46 Debian:6.0.6/stable [amd64]) | ||
| 34 | Conf libc6-i386 (2.11.3-4 Debian:6.0.6/stable [amd64]) | ||
| 35 | Conf libgc1c2 (1:6.8-2 Debian:6.0.6/stable [amd64]) | ||
| 36 | Conf locales (2.11.3-4 Debian:6.0.6/stable [all]) | ||
| 37 | Conf firmware-linux-free (2.6.32-46 Debian:6.0.6/stable [all]) | ||
| 38 | Conf libxenstore3.0 (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64]) | ||
| 39 | Conf lockfile-progs (0.1.15+squeeze1 Debian:6.0.6/stable [amd64]) | ||
| 40 | Conf xen-utils-4.0 (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64]) | ||
| 41 | Conf xenstore-utils (4.0.1-5.4 Debian:6.0.6/stable, Debian-Security:6.0/stable [amd64]) | ||
| 42 | Conf 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 @@ | |||
| 1 | NOTE: 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! | ||
| 5 | Inst grub-pc [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) [] | ||
| 6 | Inst grub-pc-bin [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) [] | ||
| 7 | Inst grub2-common [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) [] | ||
| 8 | Inst grub-efi-amd64-bin [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) [] | ||
| 9 | Inst grub-common [1.99-21ubuntu3.1] (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) | ||
| 10 | Conf grub-common (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) | ||
| 11 | Conf grub2-common (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) | ||
| 12 | Conf grub-pc-bin (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) | ||
| 13 | Conf grub-pc (1.99-21ubuntu3.4 Ubuntu:12.04/precise-updates [amd64]) | ||
| 14 | Conf 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 @@ | |||
| 1 | NOTE: 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! | ||
| 5 | Inst libc6-dev [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) [] | ||
| 6 | Inst libc-dev-bin [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) [] | ||
| 7 | Inst linux-libc-dev [3.2.0-29.46] (3.2.0-31.50 Ubuntu:12.04/precise-security [amd64]) [] | ||
| 8 | Inst tzdata [2012e-0ubuntu0.12.04] (2012e-0ubuntu0.12.04.1 Ubuntu:12.04/precise-security [all]) [] | ||
| 9 | Conf tzdata (2012e-0ubuntu0.12.04.1 Ubuntu:12.04/precise-security [all]) [] | ||
| 10 | Inst libc-bin [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) [libc6:amd64 ] | ||
| 11 | Conf libc-bin (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) [libc6:amd64 ] | ||
| 12 | Inst libc6 [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 13 | Conf libc6 (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 14 | Inst libapt-pkg4.12 [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 15 | Conf libapt-pkg4.12 (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 16 | Inst ubuntu-keyring [2011.11.21] (2011.11.21.1 Ubuntu:12.04/precise-updates [all]) | ||
| 17 | Conf ubuntu-keyring (2011.11.21.1 Ubuntu:12.04/precise-updates [all]) | ||
| 18 | Inst gpgv [1.4.11-3ubuntu2] (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 19 | Conf gpgv (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 20 | Inst gnupg [1.4.11-3ubuntu2] (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 21 | Conf gnupg (1.4.11-3ubuntu2.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 22 | Inst apt [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 23 | Conf apt (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 24 | Inst libssl1.0.0 [1.0.1-4ubuntu5.3] (1.0.1-4ubuntu5.5 Ubuntu:12.04/precise-updates [amd64]) | ||
| 25 | Conf libssl1.0.0 (1.0.1-4ubuntu5.5 Ubuntu:12.04/precise-updates [amd64]) | ||
| 26 | Inst libapt-inst1.4 [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 27 | Inst resolvconf [1.63ubuntu15] (1.63ubuntu16 Ubuntu:12.04/precise-updates [all]) | ||
| 28 | Inst libdbus-1-3 [1.4.18-1ubuntu1] (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 29 | Inst libxml2 [2.7.8.dfsg-5.1ubuntu4.1] (2.7.8.dfsg-5.1ubuntu4.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 30 | Inst multiarch-support [2.15-0ubuntu10] (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 31 | Conf multiarch-support (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 32 | Inst apt-utils [0.8.16~exp12ubuntu10.2] (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 33 | Inst isc-dhcp-client [4.1.ESV-R4-0ubuntu5.2] (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64]) [] | ||
| 34 | Inst isc-dhcp-common [4.1.ESV-R4-0ubuntu5.2] (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64]) | ||
| 35 | Inst dbus [1.4.18-1ubuntu1] (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 36 | Inst linux-firmware [1.79] (1.79.1 Ubuntu:12.04/precise-updates [all]) | ||
| 37 | Inst xserver-common [2:1.11.4-0ubuntu10.7] (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [all]) | ||
| 38 | Inst xserver-xorg-core [2:1.11.4-0ubuntu10.7] (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [amd64]) | ||
| 39 | Inst xserver-xorg-input-synaptics [1.6.2-1ubuntu1~precise1] (1.6.2-1ubuntu1~precise2 Ubuntu:12.04/precise-updates [amd64]) | ||
| 40 | Conf libc-dev-bin (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 41 | Conf linux-libc-dev (3.2.0-31.50 Ubuntu:12.04/precise-security [amd64]) | ||
| 42 | Conf libc6-dev (2.15-0ubuntu10.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 43 | Conf libapt-inst1.4 (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 44 | Conf resolvconf (1.63ubuntu16 Ubuntu:12.04/precise-updates [all]) | ||
| 45 | Conf libdbus-1-3 (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 46 | Conf libxml2 (2.7.8.dfsg-5.1ubuntu4.2 Ubuntu:12.04/precise-security [amd64]) | ||
| 47 | Conf apt-utils (0.8.16~exp12ubuntu10.3 Ubuntu:12.04/precise-updates [amd64]) | ||
| 48 | Conf isc-dhcp-common (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64]) | ||
| 49 | Conf isc-dhcp-client (4.1.ESV-R4-0ubuntu5.5 Ubuntu:12.04/precise-security [amd64]) | ||
| 50 | Conf dbus (1.4.18-1ubuntu1.1 Ubuntu:12.04/precise-security [amd64]) | ||
| 51 | Conf linux-firmware (1.79.1 Ubuntu:12.04/precise-updates [all]) | ||
| 52 | Conf xserver-common (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [all]) | ||
| 53 | Conf xserver-xorg-core (2:1.11.4-0ubuntu10.8 Ubuntu:12.04/precise-updates [amd64]) | ||
| 54 | Conf 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 | ||
| 11 | plan skip_all => "check_dig not compiled" unless (-x "check_dig"); | 11 | plan skip_all => "check_dig not compiled" unless (-x "check_dig"); |
| 12 | 12 | ||
| 13 | plan tests => 12; | 13 | plan tests => 16; |
| 14 | 14 | ||
| 15 | my $successOutput = '/DNS OK - [\.0-9]+ seconds? response time/'; | 15 | my $successOutput = '/DNS OK - [\.0-9]+ seconds? response time/'; |
| 16 | 16 | ||
| 17 | my $hostname_valid = getTestParameter( | 17 | my $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 | ||
| 23 | my $hostname_valid_ip = getTestParameter( | 23 | my $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 | ||
| 29 | my $hostname_valid_reverse = getTestParameter( | 29 | my $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 | ||
| 35 | my $hostname_invalid = getTestParameter( | 35 | my $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; | |||
| 8 | use Test::More; | 8 | use Test::More; |
| 9 | use NPTest; | 9 | use NPTest; |
| 10 | 10 | ||
| 11 | plan tests => 28; | 11 | plan tests => 30; |
| 12 | 12 | ||
| 13 | my $successOutput = '/OK.*HTTP.*second/'; | 13 | my $successOutput = '/OK.*HTTP.*second/'; |
| 14 | 14 | ||
| 15 | my $res; | 15 | my $res; |
| 16 | 16 | ||
| 17 | my $host_tcp_http = getTestParameter( "NP_HOST_TCP_HTTP", | 17 | my $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 | ||
| 21 | my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE", | 21 | my $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 | ||
| 25 | my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID", | 25 | my $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 | ||
| 29 | my $internet_access = getTestParameter( "NP_INTERNET_ACCESS", | 29 | my $internet_access = getTestParameter( "NP_INTERNET_ACCESS", |
| @@ -32,8 +32,8 @@ my $internet_access = getTestParameter( "NP_INTERNET_ACCESS", | |||
| 32 | 32 | ||
| 33 | my $host_tcp_http2; | 33 | my $host_tcp_http2; |
| 34 | if ($internet_access eq "no") { | 34 | if ($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" ); | |||
| 45 | like( $res->output, $successOutput, "Output OK" ); | 45 | like( $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 | ); |
| 50 | like( $res->output, '/bob:there\r\nfred:here\r\n/', "Got headers, delimited with ';'" ); | 50 | like( $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 | ); | ||
| 55 | like( $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" ); |
| 22 | is( $result->return_code, 0, "Checking less than 10000 processes" ); | 22 | is( $result->return_code, 0, "Checking less than 10000 processes" ); |
| 23 | like( $result->output, '/^PROCS OK: [0-9]+ process(es)?$/', "Output correct" ); | 23 | like( $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" ); |
| 26 | is( $result->return_code, 0, "Checking less than 100000 zombie processes" ); | 26 | is( $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" ); |
| 30 | is( $result->return_code, 1, "Checking warning if processes > 0" ); | 30 | is( $result->return_code, 1, "Checking warning if processes > 0" ); |
| 31 | like( $result->output, '/^PROCS WARNING: [0-9]+ process(es)?$/', "Output correct" ); | 31 | like( $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" ); |
| 34 | is( $result->return_code, 2, "Checking critical if processes > 0" ); | 34 | is( $result->return_code, 2, "Checking critical if processes > 0" ); |
| 35 | like( $result->output, '/^PROCS CRITICAL: [0-9]+ process(es)?$/', "Output correct" ); | 35 | like( $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" ); |
| 38 | is( $result->return_code, 2, "Checking critical if sleeping processes" ); | 38 | is( $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; | |||
| 9 | use NPTest; | 9 | use NPTest; |
| 10 | 10 | ||
| 11 | use vars qw($tests); | 11 | use vars qw($tests); |
| 12 | BEGIN {$tests = 7; plan tests => $tests} | 12 | BEGIN {$tests = 14; plan tests => $tests} |
| 13 | 13 | ||
| 14 | my $host_tcp_http = getTestParameter( "host_tcp_http", "NP_HOST_TCP_HTTP", "localhost", | 14 | my $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 | |||
| 27 | my $t; | 27 | my $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; | |||
| 17 | use NPTest; | 17 | use NPTest; |
| 18 | use FindBin qw($Bin); | 18 | use FindBin qw($Bin); |
| 19 | 19 | ||
| 20 | my $common_tests = 66; | 20 | my $common_tests = 70; |
| 21 | my $ssl_only_tests = 8; | 21 | my $ssl_only_tests = 8; |
| 22 | # Check that all dependent modules are available | 22 | # Check that all dependent modules are available |
| 23 | eval { | 23 | eval { |
| @@ -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"; |
