summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml31
-rw-r--r--AUTHORS1
-rw-r--r--NEWS24
-rwxr-xr-xNP-VERSION-GEN2
-rw-r--r--THANKS.in4
-rw-r--r--configure.ac8
-rw-r--r--doc/RELEASING6
-rw-r--r--doc/developer-guidelines.sgml6
-rw-r--r--gl/Makefile.am11
-rw-r--r--gl/m4/gnulib-cache.m43
-rw-r--r--gl/m4/gnulib-comp.m415
-rw-r--r--gl/m4/strcasestr.m4142
-rw-r--r--gl/strcasestr.c82
-rw-r--r--perlmods/Monitoring-Plugin-0.37.tar.gzbin62278 -> 0 bytes
-rw-r--r--perlmods/Monitoring-Plugin-0.39.tar.gzbin0 -> 62733 bytes
-rw-r--r--plugins-root/check_dhcp.c60
-rw-r--r--plugins-root/check_icmp.c9
-rw-r--r--plugins-root/pst3.c4
-rw-r--r--plugins-scripts/Makefile.am2
-rwxr-xr-xplugins-scripts/check_breeze.pl5
-rwxr-xr-xplugins-scripts/check_disk_smb.pl5
-rwxr-xr-xplugins-scripts/check_file_age.pl5
-rwxr-xr-xplugins-scripts/check_flexlm.pl5
-rwxr-xr-xplugins-scripts/check_ifoperstatus.pl7
-rwxr-xr-xplugins-scripts/check_ifstatus.pl9
-rwxr-xr-xplugins-scripts/check_ircd.pl5
-rwxr-xr-xplugins-scripts/check_mailq.pl5
-rwxr-xr-xplugins-scripts/check_mssql.pl3
-rwxr-xr-xplugins-scripts/check_netdns.pl14
-rwxr-xr-xplugins-scripts/check_ntp.pl471
-rwxr-xr-xplugins-scripts/check_rpc.pl5
-rwxr-xr-xplugins-scripts/check_wave.pl5
-rw-r--r--plugins-scripts/t/check_rpc.t2
-rw-r--r--plugins/Makefile.am2
-rw-r--r--plugins/check_apt.c4
-rw-r--r--plugins/check_by_ssh.c11
-rw-r--r--plugins/check_cluster.c2
-rw-r--r--plugins/check_dbi.c4
-rw-r--r--plugins/check_dig.c6
-rw-r--r--plugins/check_disk.c56
-rw-r--r--plugins/check_dns.c12
-rw-r--r--plugins/check_dummy.c4
-rw-r--r--plugins/check_fping.c6
-rw-r--r--plugins/check_game.c4
-rw-r--r--plugins/check_hpjd.c4
-rw-r--r--plugins/check_http.c108
-rw-r--r--plugins/check_ide_smart.c6
-rw-r--r--plugins/check_ldap.c99
-rw-r--r--plugins/check_load.c4
-rw-r--r--plugins/check_mrtg.c4
-rw-r--r--plugins/check_mrtgtraf.c4
-rw-r--r--plugins/check_mysql.c4
-rw-r--r--plugins/check_mysql_query.c4
-rw-r--r--plugins/check_nagios.c4
-rw-r--r--plugins/check_nt.c4
-rw-r--r--plugins/check_ntp.c4
-rw-r--r--plugins/check_ntp_peer.c4
-rw-r--r--plugins/check_ntp_time.c10
-rw-r--r--plugins/check_nwstat.c4
-rw-r--r--plugins/check_overcr.c4
-rw-r--r--plugins/check_pgsql.c4
-rw-r--r--plugins/check_ping.c4
-rw-r--r--plugins/check_procs.c4
-rw-r--r--plugins/check_radius.c4
-rw-r--r--plugins/check_real.c4
-rw-r--r--plugins/check_smtp.c17
-rw-r--r--plugins/check_snmp.c26
-rw-r--r--plugins/check_ssh.c4
-rw-r--r--plugins/check_swap.c4
-rw-r--r--plugins/check_tcp.c9
-rw-r--r--plugins/check_time.c4
-rw-r--r--plugins/check_ups.c16
-rw-r--r--plugins/check_users.c64
-rw-r--r--plugins/negate.c4
-rw-r--r--plugins/netutils.c12
-rw-r--r--plugins/netutils.h10
-rw-r--r--plugins/sslutils.c129
-rw-r--r--plugins/t/NPTest.cache.travis4
-rw-r--r--plugins/t/check_http.t45
-rw-r--r--plugins/t/check_ldap.t80
-rw-r--r--plugins/t/check_snmp.t4
-rw-r--r--plugins/t/check_users.t4
-rwxr-xr-xplugins/tests/check_http.t8
-rwxr-xr-xplugins/tests/check_snmp.t22
-rw-r--r--plugins/utils.c83
-rw-r--r--plugins/utils.h34
86 files changed, 1043 insertions, 898 deletions
diff --git a/.travis.yml b/.travis.yml
index 2275be3f..29290fd1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,21 +1,42 @@
1sudo: required
2dist: trusty
1language: c 3language: c
2 4
3before_install: 5before_install:
4 - sudo add-apt-repository -y ppa:waja/precise-backports 6 # Trusty related fixed
7 # multiverse is no on trusty activated (https://github.com/travis-ci/travis-ci/issues/4979)
8 - sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ trusty multiverse" && sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ trusty-updates multiverse"
9 # /etc/hosts has IPv6 hosts (https://github.com/travis-ci/travis-ci/issues/4978)
10 - sudo [ $(ip addr show | grep "inet6 ::1" | wc -l) -lt "1" ] && sudo sed -i '/^::1/d' /etc/hosts
11 # Trusty has running ntpd on localhost, but we don't like that for our tests
12 - sudo killall -9 ntpd
13 # Trusty has no swap, lets create some
14 - sudo fallocate -l 20M /swapfile; sudo chmod 600 /swapfile; sudo mkswap /swapfile; sudo swapon /swapfile
15 - sudo add-apt-repository -y ppa:waja/trusty-backports
5 - sudo apt-get update -qq 16 - sudo apt-get update -qq
6 - sudo apt-get purge -qq gawk 17 - sudo apt-get purge -qq gawk
7 # ensure we have a test database in place for tests 18 # http://docs.travis-ci.com/user/trusty-ci-environment/ indicates, no MySQL on Trusty (yet)
8 - mysql -e "create database IF NOT EXISTS test;" -uroot 19 # # ensure we have a test database in place for tests
20 # - mysql -e "create database IF NOT EXISTS test;" -uroot
9 21
10install: 22install:
11 - sudo apt-get install -qq --no-install-recommends perl autotools-dev libdbi-dev libldap2-dev libpq-dev libmysqlclient-dev libfreeradius-client-dev libkrb5-dev libnet-snmp-perl procps 23 - sudo apt-get install -qq --no-install-recommends perl autotools-dev libdbi-dev libldap2-dev libpq-dev libmysqlclient-dev libfreeradius-client-dev libkrb5-dev libnet-snmp-perl procps
12 - sudo apt-get install -qq --no-install-recommends libdbi0-dev libdbd-sqlite3 libssl-dev dnsutils snmp-mibs-downloader 24 - sudo apt-get install -qq --no-install-recommends libdbi0-dev libdbd-sqlite3 libssl-dev dnsutils snmp-mibs-downloader libsnmp-perl snmpd
13 - sudo apt-get install -qq --no-install-recommends fping snmp netcat smbclient fping pure-ftpd apache2 postfix libhttp-daemon-ssl-perl 25 - sudo apt-get install -qq --no-install-recommends fping snmp netcat smbclient fping pure-ftpd apache2 postfix libhttp-daemon-ssl-perl
26 - sudo apt-get install -qq --no-install-recommends libdbd-sybase-perl libnet-dns-perl
27 - sudo apt-get install -qq --no-install-recommends slapd ldap-utils
14 - sudo apt-get install -qq --no-install-recommends autoconf automake 28 - sudo apt-get install -qq --no-install-recommends autoconf automake
29 - sudo apt-get install -qq --no-install-recommends faketime
30 # Trusty related dependencies (not yet provided)
31 - sudo apt-get install -qq --no-install-recommends mariadb-client mariadb-server
15 32
16before_script: 33before_script:
34 # ensure we have a test database in place for tests
35 - mysql -e "create database IF NOT EXISTS test;" -uroot
36 # Detect LDAP configuration (seems volatile on trusty env)
37 - sed -e 's/cn=admin,dc=nodomain/'$(sudo /usr/sbin/slapcat|grep ^dn:|grep cn=|awk '{print $2}')'/' -i plugins/t/NPTest.cache.travis
17 - tools/setup 38 - tools/setup
18 - ./configure 39 - ./configure --enable-libtap
19 - make 40 - make
20 - export NPTEST_CACHE="$(pwd)/plugins/t/NPTest.cache.travis" 41 - export NPTEST_CACHE="$(pwd)/plugins/t/NPTest.cache.travis"
21 - ssh-keygen -t dsa -N "" -f ~/.ssh/id_dsa 42 - ssh-keygen -t dsa -N "" -f ~/.ssh/id_dsa
diff --git a/AUTHORS b/AUTHORS
index 0c667f60..2d455be3 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -21,3 +21,4 @@ Ton Voon
21Jan Wagner 21Jan Wagner
22Holger Weiss 22Holger Weiss
23Michael Wirtgen 23Michael Wirtgen
24Oliver Skibbe
diff --git a/NEWS b/NEWS
index b3d2f1fb..26f18cd9 100644
--- a/NEWS
+++ b/NEWS
@@ -6,18 +6,37 @@ This file documents the major additions and syntax changes between releases.
6 thresholds 6 thresholds
7 New check_snmp "-N" option to specify SNMPv3 context name 7 New check_snmp "-N" option to specify SNMPv3 context name
8 New check_nt "-l" parameters: seconds|minutes|hours|days 8 New check_nt "-l" parameters: seconds|minutes|hours|days
9 Make sure check_disk won't hang on hanging (network) file systems
10 New check_mailq -s option which tells the plugin to use sudo(8) 9 New check_mailq -s option which tells the plugin to use sudo(8)
10 New -W/-C option for check_ldap to check number of entries (Gerhard Lausser)
11 The check_http -S/--ssl option now accepts the arguments "1.1" and "1.2"
12 to force TLSv1.1 and TLSv1.2 connections, respectively
13 The check_http -S/--ssl option now allows for specifying the desired
14 protocol with a "+" suffix to also accept newer versions
15 check_users: add support for range thresholds (John C. Frickson)
16 check_snmp: add ipv6 support (abrist)
17 check_http: report certificate expire date in UTC (pirtoo / ylfingr)
11 18
12 FIXES 19 FIXES
13 Let check_real terminate lines with CRLF when talking to the server, as 20 Let check_real terminate lines with CRLF when talking to the server, as
14 mandated by 2326 21 mandated by 2326
15 Fix check_procs on HP-UX 22 Fix check_procs on HP-UX
23 check_smtp's -e/--expect option can now be combined with -S/--starttls
24 Fix incorrect performance data thresholds emitted by check_ups
16 25
17 WARNINGS 26 WARNINGS
18 The format of the performance data emitted by check_mrtgtraf has been 27 The format of the performance data emitted by check_mrtgtraf has been
19 changed to comply with the development guidelines 28 changed to comply with the development guidelines
20 check_ssh not returns CRITICAL for protocal/version errors 29 check_ssh now returns CRITICAL for protocol/version errors
30 If a plugin is invoked with -h/--help or -V/--version, the exit status
31 is now UNKNOWN
32 The superseded check_ntp.pl was removed, please use check_ntp_peer or
33 check_ntp_time instead
34
352.1.2 16th October 2015
36 FIXES
37 Fix incorrect performance data thresholds emitted by check_ups
38 Fix check_dhcp's option parsing to not crash with certain arguments
39 Fix check_snmp using correct timeout
21 40
222.1.1 2nd December 2014 412.1.1 2nd December 2014
23 FIXES 42 FIXES
@@ -26,6 +45,7 @@ This file documents the major additions and syntax changes between releases.
26 Fix check_apt's handling of invalid regular expressions 45 Fix check_apt's handling of invalid regular expressions
27 Fix check_real's server response processing 46 Fix check_real's server response processing
28 Fix backslash escaping in check_tcp's --help output 47 Fix backslash escaping in check_tcp's --help output
48 Fix check_procs's unclosed filehandle in pst3 on Solaris
29 49
302.1 15th October 2014 502.1 15th October 2014
31 ENHANCEMENTS 51 ENHANCEMENTS
diff --git a/NP-VERSION-GEN b/NP-VERSION-GEN
index 12efad72..dd82bf11 100755
--- a/NP-VERSION-GEN
+++ b/NP-VERSION-GEN
@@ -6,7 +6,7 @@
6SRC_ROOT=`dirname $0` 6SRC_ROOT=`dirname $0`
7 7
8NPVF=NP-VERSION-FILE 8NPVF=NP-VERSION-FILE
9DEF_VER=2.1.1.git 9DEF_VER=2.1.2.git
10 10
11LF=' 11LF='
12' 12'
diff --git a/THANKS.in b/THANKS.in
index 9a9ca3fd..20283f6a 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -335,3 +335,7 @@ Jonas Genannt
335Nick Peelman 335Nick Peelman
336Sebastian Herbszt 336Sebastian Herbszt
337Christopher Schultz 337Christopher Schultz
338Matthias Hähnel
339Roberto Greiner
340Peter (pirtoo)
341ylfingr
diff --git a/configure.ac b/configure.ac
index ce1728e3..0a554af6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
1dnl Process this file with autoconf to produce a configure script. 1dnl Process this file with autoconf to produce a configure script.
2AC_PREREQ(2.59) 2AC_PREREQ(2.59)
3AC_INIT(monitoring-plugins,2.1.1) 3AC_INIT(monitoring-plugins,2.1.2)
4AC_CONFIG_SRCDIR(NPTest.pm) 4AC_CONFIG_SRCDIR(NPTest.pm)
5AC_CONFIG_FILES([gl/Makefile]) 5AC_CONFIG_FILES([gl/Makefile])
6AC_CONFIG_AUX_DIR(build-aux) 6AC_CONFIG_AUX_DIR(build-aux)
@@ -156,12 +156,6 @@ AC_CHECK_LIB(socket,socket,SOCKETLIBS="$SOCKETLIBS -lsocket")
156AC_CHECK_LIB(resolv,main,SOCKETLIBS="$SOCKETLIBS -lresolv") 156AC_CHECK_LIB(resolv,main,SOCKETLIBS="$SOCKETLIBS -lresolv")
157AC_SUBST(SOCKETLIBS) 157AC_SUBST(SOCKETLIBS)
158 158
159dnl Check for POSIX thread libraries
160AC_CHECK_HEADERS(pthread.h)
161AC_CHECK_LIB(pthread,pthread_create,THREADLIBS="-lpthread",
162 AC_CHECK_LIB(pthread,pthread_create,THREADLIBS="-lpthread -lrt",-lrt))
163AC_SUBST(THREADLIBS)
164
165dnl 159dnl
166dnl check for math-related functions needing -lm 160dnl check for math-related functions needing -lm
167AC_CHECK_HEADERS(math.h) 161AC_CHECK_HEADERS(math.h)
diff --git a/doc/RELEASING b/doc/RELEASING
index eee53d7b..30c81ccf 100644
--- a/doc/RELEASING
+++ b/doc/RELEASING
@@ -19,15 +19,15 @@ git push origin master
19git push origin v2.1.1 19git push origin v2.1.1
20 20
21*** Checkout new version 21*** Checkout new version
22rm -fr /tmp/monitoringlug 22rm -fr /tmp/monitoringplug
23# If you need to checkout the tag, don't forget to "checkout master" later to 23# If you need to checkout the tag, don't forget to "checkout master" later to
24# get back to your development branch: 24# get back to your development branch:
25git checkout tags/v2.1.1 25git checkout tags/v2.1.1
26# Beware: the trailing slash of --prefix is REQUIRED 26# Beware: the trailing slash of --prefix is REQUIRED
27git checkout-index --prefix=/tmp/monitoringlug/ -a 27git checkout-index --prefix=/tmp/monitoringplug/ -a
28 28
29*** Build the tarball 29*** Build the tarball
30cd /tmp/monitoringlug 30cd /tmp/monitoringplug
31tools/setup 31tools/setup
32./configure 32./configure
33make dist 33make dist
diff --git a/doc/developer-guidelines.sgml b/doc/developer-guidelines.sgml
index d9340285..6f31f365 100644
--- a/doc/developer-guidelines.sgml
+++ b/doc/developer-guidelines.sgml
@@ -194,12 +194,13 @@
194 <row> 194 <row>
195 <entry align="center"><para>3</para></entry> 195 <entry align="center"><para>3</para></entry>
196 <entry valign="middle"><para>Unknown</para></entry> 196 <entry valign="middle"><para>Unknown</para></entry>
197 <entry><para>Invalid command line arguments were supplied to the 197 <entry><para>Invalid command line arguments were supplied to the
198 plugin or low-level failures internal to the plugin (such as unable to fork, 198 plugin or low-level failures internal to the plugin (such as unable to fork,
199 or open a tcp socket) that prevent it from performing the specified 199 or open a tcp socket) that prevent it from performing the specified
200 operation. Higher-level errors (such as name resolution errors, 200 operation. Higher-level errors (such as name resolution errors,
201 socket timeouts, etc) are outside of the control of plugins and should 201 socket timeouts, etc) are outside of the control of plugins and should
202 generally NOT be reported as UNKNOWN states. 202 generally NOT be reported as UNKNOWN states.
203 </para><para>The --help or --version output should also result in Unknown state.
203 </para></entry> 204 </para></entry>
204 </row> 205 </row>
205 </tbody> 206 </tbody>
@@ -610,6 +611,9 @@
610 <para>The option -v or --verbose should be present in all plugins. 611 <para>The option -v or --verbose should be present in all plugins.
611 The user should be allowed to specify -v multiple times to increase 612 The user should be allowed to specify -v multiple times to increase
612 the verbosity level, as described in <xref linkend="verboselevels">.</para> 613 the verbosity level, as described in <xref linkend="verboselevels">.</para>
614
615 <para>The exit code for version information or help should be UNKNOWN
616 (3).</para>
613 </section> 617 </section>
614 618
615 <section> 619 <section>
diff --git a/gl/Makefile.am b/gl/Makefile.am
index 54abb4c7..15135c8b 100644
--- a/gl/Makefile.am
+++ b/gl/Makefile.am
@@ -21,7 +21,7 @@
21# the same distribution terms as the rest of that program. 21# the same distribution terms as the rest of that program.
22# 22#
23# Generated by gnulib-tool. 23# Generated by gnulib-tool.
24# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files base64 crypto/sha1 dirname environ floorf fsusage getaddrinfo gethostname getloadavg getopt-gnu gettext idpriv-droptemp mountlist regex setenv strcase strsep timegm unsetenv vasprintf vsnprintf 24# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files base64 crypto/sha1 dirname environ floorf fsusage getaddrinfo gethostname getloadavg getopt-gnu gettext idpriv-droptemp mountlist regex setenv strcase strcasestr strsep timegm unsetenv vasprintf vsnprintf
25 25
26AUTOMAKE_OPTIONS = 1.9.6 gnits subdir-objects 26AUTOMAKE_OPTIONS = 1.9.6 gnits subdir-objects
27 27
@@ -1553,6 +1553,15 @@ EXTRA_libgnu_a_SOURCES += strcasecmp.c strncasecmp.c
1553 1553
1554## end gnulib module strcase 1554## end gnulib module strcase
1555 1555
1556## begin gnulib module strcasestr-simple
1557
1558
1559EXTRA_DIST += str-two-way.h strcasestr.c
1560
1561EXTRA_libgnu_a_SOURCES += strcasestr.c
1562
1563## end gnulib module strcasestr-simple
1564
1556## begin gnulib module streq 1565## begin gnulib module streq
1557 1566
1558 1567
diff --git a/gl/m4/gnulib-cache.m4 b/gl/m4/gnulib-cache.m4
index d6fca2a3..90ad4aaa 100644
--- a/gl/m4/gnulib-cache.m4
+++ b/gl/m4/gnulib-cache.m4
@@ -27,7 +27,7 @@
27 27
28 28
29# Specification in the form of a command-line invocation: 29# Specification in the form of a command-line invocation:
30# gnulib-tool --import --dir=. --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files base64 crypto/sha1 dirname environ floorf fsusage getaddrinfo gethostname getloadavg getopt-gnu gettext idpriv-droptemp mountlist regex setenv strcase strsep timegm unsetenv vasprintf vsnprintf 30# gnulib-tool --import --dir=. --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files base64 crypto/sha1 dirname environ floorf fsusage getaddrinfo gethostname getloadavg getopt-gnu gettext idpriv-droptemp mountlist regex setenv strcase strcasestr strsep timegm unsetenv vasprintf vsnprintf
31 31
32# Specification in the form of a few gnulib-tool.m4 macro invocations: 32# Specification in the form of a few gnulib-tool.m4 macro invocations:
33gl_LOCAL_DIR([]) 33gl_LOCAL_DIR([])
@@ -48,6 +48,7 @@ gl_MODULES([
48 regex 48 regex
49 setenv 49 setenv
50 strcase 50 strcase
51 strcasestr
51 strsep 52 strsep
52 timegm 53 timegm
53 unsetenv 54 unsetenv
diff --git a/gl/m4/gnulib-comp.m4 b/gl/m4/gnulib-comp.m4
index 67a81566..9a4f5027 100644
--- a/gl/m4/gnulib-comp.m4
+++ b/gl/m4/gnulib-comp.m4
@@ -121,6 +121,8 @@ AC_DEFUN([gl_EARLY],
121 # Code from module stdio: 121 # Code from module stdio:
122 # Code from module stdlib: 122 # Code from module stdlib:
123 # Code from module strcase: 123 # Code from module strcase:
124 # Code from module strcasestr:
125 # Code from module strcasestr-simple:
124 # Code from module streq: 126 # Code from module streq:
125 # Code from module strerror: 127 # Code from module strerror:
126 # Code from module strerror-override: 128 # Code from module strerror-override:
@@ -390,6 +392,17 @@ AC_DEFUN([gl_INIT],
390 AC_LIBOBJ([strncasecmp]) 392 AC_LIBOBJ([strncasecmp])
391 gl_PREREQ_STRNCASECMP 393 gl_PREREQ_STRNCASECMP
392 fi 394 fi
395 gl_FUNC_STRCASESTR
396 if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then
397 AC_LIBOBJ([strcasestr])
398 gl_PREREQ_STRCASESTR
399 fi
400 gl_FUNC_STRCASESTR_SIMPLE
401 if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then
402 AC_LIBOBJ([strcasestr])
403 gl_PREREQ_STRCASESTR
404 fi
405 gl_STRING_MODULE_INDICATOR([strcasestr])
393 gl_FUNC_STRERROR 406 gl_FUNC_STRERROR
394 if test $REPLACE_STRERROR = 1; then 407 if test $REPLACE_STRERROR = 1; then
395 AC_LIBOBJ([strerror]) 408 AC_LIBOBJ([strerror])
@@ -723,6 +736,7 @@ AC_DEFUN([gl_FILE_LIST], [
723 lib/stdlib.in.h 736 lib/stdlib.in.h
724 lib/str-two-way.h 737 lib/str-two-way.h
725 lib/strcasecmp.c 738 lib/strcasecmp.c
739 lib/strcasestr.c
726 lib/streq.h 740 lib/streq.h
727 lib/strerror-override.c 741 lib/strerror-override.c
728 lib/strerror-override.h 742 lib/strerror-override.h
@@ -866,6 +880,7 @@ AC_DEFUN([gl_FILE_LIST], [
866 m4/stdio_h.m4 880 m4/stdio_h.m4
867 m4/stdlib_h.m4 881 m4/stdlib_h.m4
868 m4/strcase.m4 882 m4/strcase.m4
883 m4/strcasestr.m4
869 m4/strerror.m4 884 m4/strerror.m4
870 m4/string_h.m4 885 m4/string_h.m4
871 m4/strings_h.m4 886 m4/strings_h.m4
diff --git a/gl/m4/strcasestr.m4 b/gl/m4/strcasestr.m4
new file mode 100644
index 00000000..8681a6a4
--- /dev/null
+++ b/gl/m4/strcasestr.m4
@@ -0,0 +1,142 @@
1# strcasestr.m4 serial 21
2dnl Copyright (C) 2005, 2007-2013 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7dnl Check that strcasestr is present and works.
8AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
9[
10 AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
11
12 dnl Persuade glibc <string.h> to declare strcasestr().
13 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
14
15 AC_REQUIRE([gl_FUNC_MEMCHR])
16 AC_CHECK_FUNCS([strcasestr])
17 if test $ac_cv_func_strcasestr = no; then
18 HAVE_STRCASESTR=0
19 else
20 if test "$gl_cv_func_memchr_works" != yes; then
21 REPLACE_STRCASESTR=1
22 else
23 dnl Detect http://sourceware.org/bugzilla/show_bug.cgi?id=12092.
24 AC_CACHE_CHECK([whether strcasestr works],
25 [gl_cv_func_strcasestr_works_always],
26 [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
27#include <string.h> /* for strcasestr */
28#define P "_EF_BF_BD"
29#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
30#define NEEDLE P P P P P
31]], [[return !!strcasestr (HAYSTACK, NEEDLE);
32 ]])],
33 [gl_cv_func_strcasestr_works_always=yes],
34 [gl_cv_func_strcasestr_works_always=no],
35 [dnl glibc 2.12 and cygwin 1.7.7 have a known bug. uClibc is not
36 dnl affected, since it uses different source code for strcasestr
37 dnl than glibc.
38 dnl Assume that it works on all other platforms, even if it is not
39 dnl linear.
40 AC_EGREP_CPP([Lucky user],
41 [
42#ifdef __GNU_LIBRARY__
43 #include <features.h>
44 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
45 || defined __UCLIBC__
46 Lucky user
47 #endif
48#elif defined __CYGWIN__
49 #include <cygwin/version.h>
50 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
51 Lucky user
52 #endif
53#else
54 Lucky user
55#endif
56 ],
57 [gl_cv_func_strcasestr_works_always="guessing yes"],
58 [gl_cv_func_strcasestr_works_always="guessing no"])
59 ])
60 ])
61 case "$gl_cv_func_strcasestr_works_always" in
62 *yes) ;;
63 *)
64 REPLACE_STRCASESTR=1
65 ;;
66 esac
67 fi
68 fi
69]) # gl_FUNC_STRCASESTR_SIMPLE
70
71dnl Additionally, check that strcasestr is efficient.
72AC_DEFUN([gl_FUNC_STRCASESTR],
73[
74 AC_REQUIRE([gl_FUNC_STRCASESTR_SIMPLE])
75 if test $HAVE_STRCASESTR = 1 && test $REPLACE_STRCASESTR = 0; then
76 AC_CACHE_CHECK([whether strcasestr works in linear time],
77 [gl_cv_func_strcasestr_linear],
78 [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
79#include <signal.h> /* for signal */
80#include <string.h> /* for strcasestr */
81#include <stdlib.h> /* for malloc */
82#include <unistd.h> /* for alarm */
83static void quit (int sig) { exit (sig + 128); }
84]], [[
85 int result = 0;
86 size_t m = 1000000;
87 char *haystack = (char *) malloc (2 * m + 2);
88 char *needle = (char *) malloc (m + 2);
89 /* Failure to compile this test due to missing alarm is okay,
90 since all such platforms (mingw) also lack strcasestr. */
91 signal (SIGALRM, quit);
92 alarm (5);
93 /* Check for quadratic performance. */
94 if (haystack && needle)
95 {
96 memset (haystack, 'A', 2 * m);
97 haystack[2 * m] = 'B';
98 haystack[2 * m + 1] = 0;
99 memset (needle, 'A', m);
100 needle[m] = 'B';
101 needle[m + 1] = 0;
102 if (!strcasestr (haystack, needle))
103 result |= 1;
104 }
105 return result;
106 ]])],
107 [gl_cv_func_strcasestr_linear=yes], [gl_cv_func_strcasestr_linear=no],
108 [dnl Only glibc > 2.12 and cygwin > 1.7.7 are known to have a
109 dnl strcasestr that works in linear time.
110 AC_EGREP_CPP([Lucky user],
111 [
112#include <features.h>
113#ifdef __GNU_LIBRARY__
114 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
115 && !defined __UCLIBC__
116 Lucky user
117 #endif
118#endif
119#ifdef __CYGWIN__
120 #include <cygwin/version.h>
121 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
122 Lucky user
123 #endif
124#endif
125 ],
126 [gl_cv_func_strcasestr_linear="guessing yes"],
127 [gl_cv_func_strcasestr_linear="guessing no"])
128 ])
129 ])
130 case "$gl_cv_func_strcasestr_linear" in
131 *yes) ;;
132 *)
133 REPLACE_STRCASESTR=1
134 ;;
135 esac
136 fi
137]) # gl_FUNC_STRCASESTR
138
139# Prerequisites of lib/strcasestr.c.
140AC_DEFUN([gl_PREREQ_STRCASESTR], [
141 :
142])
diff --git a/gl/strcasestr.c b/gl/strcasestr.c
new file mode 100644
index 00000000..53474a45
--- /dev/null
+++ b/gl/strcasestr.c
@@ -0,0 +1,82 @@
1/* Case-insensitive searching in a string.
2 Copyright (C) 2005-2013 Free Software Foundation, Inc.
3 Written by Bruno Haible <bruno@clisp.org>, 2005.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
8 any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, see <http://www.gnu.org/licenses/>. */
17
18#include <config.h>
19
20/* Specification. */
21#include <string.h>
22
23#include <ctype.h>
24#include <stdbool.h>
25#include <strings.h>
26
27#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
28
29/* Two-Way algorithm. */
30#define RETURN_TYPE char *
31#define AVAILABLE(h, h_l, j, n_l) \
32 (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
33 && ((h_l) = (j) + (n_l)))
34#define CANON_ELEMENT(c) TOLOWER (c)
35#define CMP_FUNC(p1, p2, l) \
36 strncasecmp ((const char *) (p1), (const char *) (p2), l)
37#include "str-two-way.h"
38
39/* Find the first occurrence of NEEDLE in HAYSTACK, using
40 case-insensitive comparison. This function gives unspecified
41 results in multibyte locales. */
42char *
43strcasestr (const char *haystack_start, const char *needle_start)
44{
45 const char *haystack = haystack_start;
46 const char *needle = needle_start;
47 size_t needle_len; /* Length of NEEDLE. */
48 size_t haystack_len; /* Known minimum length of HAYSTACK. */
49 bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
50
51 /* Determine length of NEEDLE, and in the process, make sure
52 HAYSTACK is at least as long (no point processing all of a long
53 NEEDLE if HAYSTACK is too short). */
54 while (*haystack && *needle)
55 {
56 ok &= (TOLOWER ((unsigned char) *haystack)
57 == TOLOWER ((unsigned char) *needle));
58 haystack++;
59 needle++;
60 }
61 if (*needle)
62 return NULL;
63 if (ok)
64 return (char *) haystack_start;
65 needle_len = needle - needle_start;
66 haystack = haystack_start + 1;
67 haystack_len = needle_len - 1;
68
69 /* Perform the search. Abstract memory is considered to be an array
70 of 'unsigned char' values, not an array of 'char' values. See
71 ISO C 99 section 6.2.6.1. */
72 if (needle_len < LONG_NEEDLE_THRESHOLD)
73 return two_way_short_needle ((const unsigned char *) haystack,
74 haystack_len,
75 (const unsigned char *) needle_start,
76 needle_len);
77 return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
78 (const unsigned char *) needle_start,
79 needle_len);
80}
81
82#undef LONG_NEEDLE_THRESHOLD
diff --git a/perlmods/Monitoring-Plugin-0.37.tar.gz b/perlmods/Monitoring-Plugin-0.37.tar.gz
deleted file mode 100644
index bb6fe69e..00000000
--- a/perlmods/Monitoring-Plugin-0.37.tar.gz
+++ /dev/null
Binary files differ
diff --git a/perlmods/Monitoring-Plugin-0.39.tar.gz b/perlmods/Monitoring-Plugin-0.39.tar.gz
new file mode 100644
index 00000000..7a35d9e7
--- /dev/null
+++ b/perlmods/Monitoring-Plugin-0.39.tar.gz
Binary files differ
diff --git a/plugins-root/check_dhcp.c b/plugins-root/check_dhcp.c
index b874c555..88b7ca10 100644
--- a/plugins-root/check_dhcp.c
+++ b/plugins-root/check_dhcp.c
@@ -229,7 +229,7 @@ struct in_addr requested_address;
229 229
230int process_arguments(int, char **); 230int process_arguments(int, char **);
231int call_getopt(int, char **); 231int call_getopt(int, char **);
232int validate_arguments(void); 232int validate_arguments(int, int);
233void print_usage(void); 233void print_usage(void);
234void print_help(void); 234void print_help(void);
235 235
@@ -463,10 +463,9 @@ int send_dhcp_discover(int sock){
463 discover_packet.hlen=ETHERNET_HARDWARE_ADDRESS_LENGTH; 463 discover_packet.hlen=ETHERNET_HARDWARE_ADDRESS_LENGTH;
464 464
465 /* 465 /*
466 * transaction ID is supposed to be random. We won't use the address so 466 * transaction ID is supposed to be random.
467 * we don't care about high entropy here. time(2) is good enough.
468 */ 467 */
469 srand(time(NULL)); 468 srand(time(NULL)^getpid());
470 packet_xid=random(); 469 packet_xid=random();
471 discover_packet.xid=htonl(packet_xid); 470 discover_packet.xid=htonl(packet_xid);
472 471
@@ -692,17 +691,11 @@ int receive_dhcp_packet(void *buffer, int buffer_size, int sock, int timeout, st
692 } 691 }
693 692
694 else{ 693 else{
695
696 /* why do we need to peek first? i don't know, its a hack. without it, the source address of the first packet received was
697 not being interpreted correctly. sigh... */
698 bzero(&source_address,sizeof(source_address)); 694 bzero(&source_address,sizeof(source_address));
699 address_size=sizeof(source_address); 695 address_size=sizeof(source_address);
700 recv_result=recvfrom(sock,(char *)buffer,buffer_size,MSG_PEEK,(struct sockaddr *)&source_address,&address_size); 696 recv_result=recvfrom(sock,(char *)buffer,buffer_size,MSG_PEEK,(struct sockaddr *)&source_address,&address_size);
701 if(verbose) 697 if(verbose)
702 printf("recv_result_1: %d\n",recv_result); 698 printf("recv_result: %d\n",recv_result);
703 recv_result=recvfrom(sock,(char *)buffer,buffer_size,0,(struct sockaddr *)&source_address,&address_size);
704 if(verbose)
705 printf("recv_result_2: %d\n",recv_result);
706 699
707 if(recv_result==-1){ 700 if(recv_result==-1){
708 if(verbose){ 701 if(verbose){
@@ -1059,29 +1052,19 @@ int get_results(void){
1059 1052
1060/* process command-line arguments */ 1053/* process command-line arguments */
1061int process_arguments(int argc, char **argv){ 1054int process_arguments(int argc, char **argv){
1062 int c; 1055 int arg_index;
1063 1056
1064 if(argc<1) 1057 if(argc<1)
1065 return ERROR; 1058 return ERROR;
1066 1059
1067 c=0; 1060 arg_index = call_getopt(argc,argv);
1068 while((c+=(call_getopt(argc-c,&argv[c])))<argc){ 1061 return validate_arguments(argc,arg_index);
1069
1070 /*
1071 if(is_option(argv[c]))
1072 continue;
1073 */
1074 }
1075
1076 return validate_arguments();
1077 } 1062 }
1078 1063
1079 1064
1080 1065
1081int call_getopt(int argc, char **argv){ 1066int call_getopt(int argc, char **argv){
1082 int c=0; 1067 extern int optind;
1083 int i=0;
1084
1085 int option_index = 0; 1068 int option_index = 0;
1086 static struct option long_options[] = 1069 static struct option long_options[] =
1087 { 1070 {
@@ -1098,25 +1081,14 @@ int call_getopt(int argc, char **argv){
1098 }; 1081 };
1099 1082
1100 while(1){ 1083 while(1){
1101 c=getopt_long(argc,argv,"+hVvt:s:r:t:i:m:u",long_options,&option_index); 1084 int c=0;
1102 1085
1103 i++; 1086 c=getopt_long(argc,argv,"+hVvt:s:r:t:i:m:u",long_options,&option_index);
1104 1087
1105 if(c==-1||c==EOF||c==1) 1088 if(c==-1||c==EOF||c==1)
1106 break; 1089 break;
1107 1090
1108 switch(c){ 1091 switch(c){
1109 case 'w':
1110 case 'r':
1111 case 't':
1112 case 'i':
1113 i++;
1114 break;
1115 default:
1116 break;
1117 }
1118
1119 switch(c){
1120 1092
1121 case 's': /* DHCP server address */ 1093 case 's': /* DHCP server address */
1122 resolve_host(optarg,&dhcp_ip); 1094 resolve_host(optarg,&dhcp_ip);
@@ -1163,11 +1135,11 @@ int call_getopt(int argc, char **argv){
1163 1135
1164 case 'V': /* version */ 1136 case 'V': /* version */
1165 print_revision(progname, NP_VERSION); 1137 print_revision(progname, NP_VERSION);
1166 exit(STATE_OK); 1138 exit(STATE_UNKNOWN);
1167 1139
1168 case 'h': /* help */ 1140 case 'h': /* help */
1169 print_help(); 1141 print_help();
1170 exit(STATE_OK); 1142 exit(STATE_UNKNOWN);
1171 1143
1172 case 'v': /* verbose */ 1144 case 'v': /* verbose */
1173 verbose=1; 1145 verbose=1;
@@ -1181,12 +1153,14 @@ int call_getopt(int argc, char **argv){
1181 break; 1153 break;
1182 } 1154 }
1183 } 1155 }
1184 1156 return optind;
1185 return i;
1186 } 1157 }
1187 1158
1188 1159
1189int validate_arguments(void){ 1160int validate_arguments(int argc, int arg_index){
1161
1162 if(argc-optind > 0)
1163 usage(_("Got unexpected non-option argument"));
1190 1164
1191 return OK; 1165 return OK;
1192 } 1166 }
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
index 3982def9..9ed12ba1 100644
--- a/plugins-root/check_icmp.c
+++ b/plugins-root/check_icmp.c
@@ -526,10 +526,10 @@ main(int argc, char **argv)
526 break; 526 break;
527 case 'V': /* version */ 527 case 'V': /* version */
528 print_revision (progname, NP_VERSION); 528 print_revision (progname, NP_VERSION);
529 exit (STATE_OK); 529 exit (STATE_UNKNOWN);
530 case 'h': /* help */ 530 case 'h': /* help */
531 print_help (); 531 print_help ();
532 exit (STATE_OK); 532 exit (STATE_UNKNOWN);
533 } 533 }
534 } 534 }
535 } 535 }
@@ -880,7 +880,12 @@ send_icmp_ping(int sock, struct rta_host *host)
880 hdr.msg_iov = &iov; 880 hdr.msg_iov = &iov;
881 hdr.msg_iovlen = 1; 881 hdr.msg_iovlen = 1;
882 882
883/* MSG_CONFIRM is a linux thing and only available on linux kernels >= 2.3.15, see send(2) */
884#ifdef MSG_CONFIRM
883 len = sendmsg(sock, &hdr, MSG_CONFIRM); 885 len = sendmsg(sock, &hdr, MSG_CONFIRM);
886#else
887 len = sendmsg(sock, &hdr, 0);
888#endif
884 889
885 if(len < 0 || (unsigned int)len != icmp_pkt_size) { 890 if(len < 0 || (unsigned int)len != icmp_pkt_size) {
886 if(debug) printf("Failed to send ping to %s\n", 891 if(debug) printf("Failed to send ping to %s\n",
diff --git a/plugins-root/pst3.c b/plugins-root/pst3.c
index ee9d108d..c3589f0a 100644
--- a/plugins-root/pst3.c
+++ b/plugins-root/pst3.c
@@ -139,8 +139,10 @@ try_again:
139 if((ps_fd = open(ps_name, O_RDONLY)) == -1) 139 if((ps_fd = open(ps_name, O_RDONLY)) == -1)
140 continue; 140 continue;
141 141
142 if((as_fd = open(as_name, O_RDONLY)) == -1) 142 if((as_fd = open(as_name, O_RDONLY)) == -1) {
143 close(ps_fd);
143 continue; 144 continue;
145 }
144 146
145 if(read(ps_fd, &psinfo, sizeof(psinfo)) != sizeof(psinfo)) { 147 if(read(ps_fd, &psinfo, sizeof(psinfo)) != sizeof(psinfo)) {
146 int err = errno; 148 int err = errno;
diff --git a/plugins-scripts/Makefile.am b/plugins-scripts/Makefile.am
index 794a34f8..ea65aed1 100644
--- a/plugins-scripts/Makefile.am
+++ b/plugins-scripts/Makefile.am
@@ -36,6 +36,8 @@ TESTS = @SCRIPT_TEST@
36test: 36test:
37 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl 37 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl
38 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl t/utils.t # utils.t is excluded from above, so manually ask to test 38 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl t/utils.t # utils.t is excluded from above, so manually ask to test
39 for SCRIPT in *.pl; do perl -wc $$SCRIPT || exit 1; done
40 set -e; for SCRIPT in *.sh; do sh -n $$SCRIPT || exit 1; done
39 41
40test-debug: 42test-debug:
41 NPTEST_DEBUG=1 HARNESS_VERBOSE=1 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl 43 NPTEST_DEBUG=1 HARNESS_VERBOSE=1 perl -I $(top_builddir) -I $(top_srcdir) ../test.pl
diff --git a/plugins-scripts/check_breeze.pl b/plugins-scripts/check_breeze.pl
index 1a3aceba..05b99203 100755
--- a/plugins-scripts/check_breeze.pl
+++ b/plugins-scripts/check_breeze.pl
@@ -6,7 +6,6 @@ use Getopt::Long;
6use vars qw($opt_V $opt_h $opt_w $opt_c $opt_H $opt_C $PROGNAME); 6use vars qw($opt_V $opt_h $opt_w $opt_c $opt_H $opt_C $PROGNAME);
7use FindBin; 7use FindBin;
8use lib "$FindBin::Bin"; 8use lib "$FindBin::Bin";
9use lib '@libexecdir@';
10use utils qw(%ERRORS &print_revision &support &usage); 9use utils qw(%ERRORS &print_revision &support &usage);
11 10
12$PROGNAME = "check_breeze"; 11$PROGNAME = "check_breeze";
@@ -29,10 +28,10 @@ GetOptions
29 28
30if ($opt_V) { 29if ($opt_V) {
31 print_revision($PROGNAME,'@NP_VERSION@'); 30 print_revision($PROGNAME,'@NP_VERSION@');
32 exit $ERRORS{'OK'}; 31 exit $ERRORS{'UNKNOWN'};
33} 32}
34 33
35if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 34if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
36 35
37($opt_H) || usage("Host name/address not specified\n"); 36($opt_H) || usage("Host name/address not specified\n");
38my $host = $1 if ($opt_H =~ /([-.A-Za-z0-9]+)/); 37my $host = $1 if ($opt_H =~ /([-.A-Za-z0-9]+)/);
diff --git a/plugins-scripts/check_disk_smb.pl b/plugins-scripts/check_disk_smb.pl
index 4805434f..98992268 100755
--- a/plugins-scripts/check_disk_smb.pl
+++ b/plugins-scripts/check_disk_smb.pl
@@ -26,7 +26,6 @@ use vars qw($opt_P $opt_V $opt_h $opt_H $opt_s $opt_W $opt_u $opt_p $opt_w $opt_
26use vars qw($PROGNAME); 26use vars qw($PROGNAME);
27use FindBin; 27use FindBin;
28use lib "$FindBin::Bin"; 28use lib "$FindBin::Bin";
29use lib '@libexecdir@';
30use utils qw($TIMEOUT %ERRORS &print_revision &support &usage); 29use utils qw($TIMEOUT %ERRORS &print_revision &support &usage);
31 30
32sub print_help (); 31sub print_help ();
@@ -55,10 +54,10 @@ GetOptions
55 54
56if ($opt_V) { 55if ($opt_V) {
57 print_revision($PROGNAME,'@NP_VERSION@'); #' 56 print_revision($PROGNAME,'@NP_VERSION@'); #'
58 exit $ERRORS{'OK'}; 57 exit $ERRORS{'UNKNOWN'};
59} 58}
60 59
61if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 60if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
62 61
63my $smbclient = $utils::PATH_TO_SMBCLIENT; 62my $smbclient = $utils::PATH_TO_SMBCLIENT;
64$smbclient || usage("check requires smbclient, smbclient not set\n"); 63$smbclient || usage("check requires smbclient, smbclient not set\n");
diff --git a/plugins-scripts/check_file_age.pl b/plugins-scripts/check_file_age.pl
index 4415fdf4..56b8e97c 100755
--- a/plugins-scripts/check_file_age.pl
+++ b/plugins-scripts/check_file_age.pl
@@ -27,7 +27,6 @@ use File::stat;
27use vars qw($PROGNAME); 27use vars qw($PROGNAME);
28use FindBin; 28use FindBin;
29use lib "$FindBin::Bin"; 29use lib "$FindBin::Bin";
30use lib '@libexecdir@';
31use utils qw (%ERRORS &print_revision &support); 30use utils qw (%ERRORS &print_revision &support);
32 31
33sub print_help (); 32sub print_help ();
@@ -61,12 +60,12 @@ GetOptions(
61 60
62if ($opt_V) { 61if ($opt_V) {
63 print_revision($PROGNAME, '@NP_VERSION@'); 62 print_revision($PROGNAME, '@NP_VERSION@');
64 exit $ERRORS{'OK'}; 63 exit $ERRORS{'UNKNOWN'};
65} 64}
66 65
67if ($opt_h) { 66if ($opt_h) {
68 print_help(); 67 print_help();
69 exit $ERRORS{'OK'}; 68 exit $ERRORS{'UNKNOWN'};
70} 69}
71 70
72$opt_f = shift unless ($opt_f); 71$opt_f = shift unless ($opt_f);
diff --git a/plugins-scripts/check_flexlm.pl b/plugins-scripts/check_flexlm.pl
index 5f3ed598..e3fe296f 100755
--- a/plugins-scripts/check_flexlm.pl
+++ b/plugins-scripts/check_flexlm.pl
@@ -37,7 +37,6 @@ use Getopt::Long;
37use vars qw($opt_V $opt_h $opt_F $opt_t $verbose $PROGNAME); 37use vars qw($opt_V $opt_h $opt_F $opt_t $verbose $PROGNAME);
38use FindBin; 38use FindBin;
39use lib "$FindBin::Bin"; 39use lib "$FindBin::Bin";
40use lib '@libexecdir@';
41use utils qw(%ERRORS &print_revision &support &usage); 40use utils qw(%ERRORS &print_revision &support &usage);
42 41
43$PROGNAME="check_flexlm"; 42$PROGNAME="check_flexlm";
@@ -59,7 +58,7 @@ GetOptions
59 58
60if ($opt_V) { 59if ($opt_V) {
61 print_revision($PROGNAME,'@NP_VERSION@'); 60 print_revision($PROGNAME,'@NP_VERSION@');
62 exit $ERRORS{'OK'}; 61 exit $ERRORS{'UNKNOWN'};
63} 62}
64 63
65unless (defined $opt_t) { 64unless (defined $opt_t) {
@@ -67,7 +66,7 @@ unless (defined $opt_t) {
67} 66}
68 67
69 68
70if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 69if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
71 70
72unless (defined $opt_F) { 71unless (defined $opt_F) {
73 print "Missing license.dat file\n"; 72 print "Missing license.dat file\n";
diff --git a/plugins-scripts/check_ifoperstatus.pl b/plugins-scripts/check_ifoperstatus.pl
index cf2c7b58..3eed4bcb 100755
--- a/plugins-scripts/check_ifoperstatus.pl
+++ b/plugins-scripts/check_ifoperstatus.pl
@@ -37,7 +37,6 @@ use POSIX;
37use strict; 37use strict;
38use FindBin; 38use FindBin;
39use lib "$FindBin::Bin"; 39use lib "$FindBin::Bin";
40use lib '@libexecdir@';
41use utils qw($TIMEOUT %ERRORS &print_revision &support); 40use utils qw($TIMEOUT %ERRORS &print_revision &support);
42 41
43use Net::SNMP; 42use Net::SNMP;
@@ -368,17 +367,17 @@ sub process_arguments() {
368 367
369 if ($status == 0){ 368 if ($status == 0){
370 print_help(); 369 print_help();
371 exit $ERRORS{'OK'}; 370 exit $ERRORS{'UNKNOWN'};
372 } 371 }
373 372
374 if ($opt_V) { 373 if ($opt_V) {
375 print_revision($PROGNAME,'@NP_VERSION@'); 374 print_revision($PROGNAME,'@NP_VERSION@');
376 exit $ERRORS{'OK'}; 375 exit $ERRORS{'UNKNOWN'};
377 } 376 }
378 377
379 if ($opt_h) { 378 if ($opt_h) {
380 print_help(); 379 print_help();
381 exit $ERRORS{'OK'}; 380 exit $ERRORS{'UNKNOWN'};
382 } 381 }
383 382
384 if (! utils::is_hostname($hostname)){ 383 if (! utils::is_hostname($hostname)){
diff --git a/plugins-scripts/check_ifstatus.pl b/plugins-scripts/check_ifstatus.pl
index 6ec71d14..9f2f7c31 100755
--- a/plugins-scripts/check_ifstatus.pl
+++ b/plugins-scripts/check_ifstatus.pl
@@ -35,7 +35,6 @@ use POSIX;
35use strict; 35use strict;
36use FindBin; 36use FindBin;
37use lib "$FindBin::Bin"; 37use lib "$FindBin::Bin";
38use lib '@libexecdir@';
39use utils qw($TIMEOUT %ERRORS &print_revision &support); 38use utils qw($TIMEOUT %ERRORS &print_revision &support);
40 39
41use Net::SNMP; 40use Net::SNMP;
@@ -120,7 +119,7 @@ $status = process_arguments();
120if ($status != 0) 119if ($status != 0)
121{ 120{
122 print_help() ; 121 print_help() ;
123 exit $ERRORS{'OK'}; 122 exit $ERRORS{'UNKNOWN'};
124} 123}
125 124
126 125
@@ -314,17 +313,17 @@ sub process_arguments() {
314 313
315 if ($status == 0){ 314 if ($status == 0){
316 print_help(); 315 print_help();
317 exit $ERRORS{'OK'}; 316 exit $ERRORS{'UNKNOWN'};
318 } 317 }
319 318
320 if ($opt_V) { 319 if ($opt_V) {
321 print_revision($PROGNAME,'@NP_VERSION@'); 320 print_revision($PROGNAME,'@NP_VERSION@');
322 exit $ERRORS{'OK'}; 321 exit $ERRORS{'UNKNOWN'};
323 } 322 }
324 323
325 if ($opt_h) { 324 if ($opt_h) {
326 print_help(); 325 print_help();
327 exit $ERRORS{'OK'}; 326 exit $ERRORS{'UNKNOWN'};
328 } 327 }
329 328
330 unless (defined $timeout) { 329 unless (defined $timeout) {
diff --git a/plugins-scripts/check_ircd.pl b/plugins-scripts/check_ircd.pl
index 6d40cf5a..22d21c2e 100755
--- a/plugins-scripts/check_ircd.pl
+++ b/plugins-scripts/check_ircd.pl
@@ -51,7 +51,6 @@ use vars qw($opt_V $opt_h $opt_t $opt_p $opt_H $opt_w $opt_c $verbose);
51use vars qw($PROGNAME); 51use vars qw($PROGNAME);
52use FindBin; 52use FindBin;
53use lib "$FindBin::Bin"; 53use lib "$FindBin::Bin";
54use lib '@libexecdir@';
55use utils qw($TIMEOUT %ERRORS &print_revision &support &usage); 54use utils qw($TIMEOUT %ERRORS &print_revision &support &usage);
56 55
57# ----------------------------------------------------[ Function Prototypes ]-- 56# ----------------------------------------------------[ Function Prototypes ]--
@@ -182,10 +181,10 @@ MAIN:
182 181
183 if ($opt_V) { 182 if ($opt_V) {
184 print_revision($PROGNAME,'@NP_VERSION@'); 183 print_revision($PROGNAME,'@NP_VERSION@');
185 exit $ERRORS{'OK'}; 184 exit $ERRORS{'UNKNOWN'};
186 } 185 }
187 186
188 if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 187 if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
189 188
190 ($opt_H) || ($opt_H = shift @ARGV) || usage("Host name/address not specified\n"); 189 ($opt_H) || ($opt_H = shift @ARGV) || usage("Host name/address not specified\n");
191 my $remotehost = $1 if ($opt_H =~ /([-.A-Za-z0-9]+)/); 190 my $remotehost = $1 if ($opt_H =~ /([-.A-Za-z0-9]+)/);
diff --git a/plugins-scripts/check_mailq.pl b/plugins-scripts/check_mailq.pl
index 417c4bf7..32f498d3 100755
--- a/plugins-scripts/check_mailq.pl
+++ b/plugins-scripts/check_mailq.pl
@@ -33,7 +33,6 @@ use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c $opt_t $opt_s
33 %srcdomains %dstdomains); 33 %srcdomains %dstdomains);
34use FindBin; 34use FindBin;
35use lib "$FindBin::Bin"; 35use lib "$FindBin::Bin";
36use lib '@libexecdir@';
37use utils qw(%ERRORS &print_revision &support &usage ); 36use utils qw(%ERRORS &print_revision &support &usage );
38 37
39my ($sudo); 38my ($sudo);
@@ -574,12 +573,12 @@ sub process_arguments(){
574 573
575 if ($opt_V) { 574 if ($opt_V) {
576 print_revision($PROGNAME,'@NP_VERSION@'); 575 print_revision($PROGNAME,'@NP_VERSION@');
577 exit $ERRORS{'OK'}; 576 exit $ERRORS{'UNKNOWN'};
578 } 577 }
579 578
580 if ($opt_h) { 579 if ($opt_h) {
581 print_help(); 580 print_help();
582 exit $ERRORS{'OK'}; 581 exit $ERRORS{'UNKNOWN'};
583 } 582 }
584 583
585 if (defined $opt_v ){ 584 if (defined $opt_v ){
diff --git a/plugins-scripts/check_mssql.pl b/plugins-scripts/check_mssql.pl
index 1f387884..fb3952d4 100755
--- a/plugins-scripts/check_mssql.pl
+++ b/plugins-scripts/check_mssql.pl
@@ -31,7 +31,6 @@ use DBD::Sybase;
31use Getopt::Long; 31use Getopt::Long;
32use FindBin; 32use FindBin;
33use lib "$FindBin::Bin"; 33use lib "$FindBin::Bin";
34use lib '@libexecdir@';
35use utils qw($TIMEOUT %ERRORS &print_revision &support); 34use utils qw($TIMEOUT %ERRORS &print_revision &support);
36use strict; 35use strict;
37 36
@@ -131,7 +130,7 @@ sub process_arguments {
131 130
132 if (defined $opt_V) { 131 if (defined $opt_V) {
133 print_revision($PROGNAME,'@NP_VERSION@'); 132 print_revision($PROGNAME,'@NP_VERSION@');
134 exit $ERRORS{'OK'}; 133 exit $ERRORS{'UNKNOWN'};
135 } 134 }
136 135
137 syntax("Help:") if ($help); 136 syntax("Help:") if ($help);
diff --git a/plugins-scripts/check_netdns.pl b/plugins-scripts/check_netdns.pl
index 59c81a90..38538e56 100755
--- a/plugins-scripts/check_netdns.pl
+++ b/plugins-scripts/check_netdns.pl
@@ -29,10 +29,12 @@ use Getopt::Long;
29use Net::DNS; 29use Net::DNS;
30use FindBin; 30use FindBin;
31use lib "$FindBin::Bin"; 31use lib "$FindBin::Bin";
32use lib '@libexecdir@'; 32use utils;
33use utils ;
34 33
35my $PROGNAME = "check_netdns"; 34my $PROGNAME = "check_netdns";
35sub print_help ();
36sub print_version();
37sub print_usage ();
36 38
37$ENV{'PATH'}='@TRUSTED_PATH@'; 39$ENV{'PATH'}='@TRUSTED_PATH@';
38$ENV{'BASH_ENV'}=''; 40$ENV{'BASH_ENV'}='';
@@ -44,12 +46,12 @@ GetOptions("V" => $opt_V, "version" => $opt_V,
44 "t=i" => $opt_t, "timeout=i" => $opt_t, 46 "t=i" => $opt_t, "timeout=i" => $opt_t,
45 "s=s" => $opt_s, "server=s" => $opt_s, 47 "s=s" => $opt_s, "server=s" => $opt_s,
46 "H=s" => $opt_H, "hostname=s" => $opt_H); 48 "H=s" => $opt_H, "hostname=s" => $opt_H);
47 49
48# -h means display verbose help screen 50# -h means display verbose help screen
49if($opt_h){ print_help(); exit 0; } 51if($opt_h){ print_help(); exit 3; }
50 52
51# -V means display version number 53# -V means display version number
52if ($opt_V) { print_version(); exit 0; } 54if ($opt_V) { print_version(); exit 3; }
53 55
54# -H means host name 56# -H means host name
55$opt_H = shift unless ($opt_H); 57$opt_H = shift unless ($opt_H);
@@ -71,7 +73,7 @@ if ($opt_s) {
71 $server = $1; 73 $server = $1;
72 } else { 74 } else {
73 print "$opt_s is not a valid host name"; 75 print "$opt_s is not a valid host name";
74 exit -1; 76 exit 3;
75 } 77 }
76} 78}
77 79
diff --git a/plugins-scripts/check_ntp.pl b/plugins-scripts/check_ntp.pl
deleted file mode 100755
index 13da939c..00000000
--- a/plugins-scripts/check_ntp.pl
+++ /dev/null
@@ -1,471 +0,0 @@
1#!@PERL@ -w
2#
3# (c)1999 Ian Cass, Knowledge Matters Ltd.
4# Read the GNU copyright stuff for all the legalese
5#
6# Check NTP time servers plugin. This plugin requires the ntpdate utility to
7# be installed on the system, however since it's part of the ntp suite, you
8# should already have it installed.
9#
10#
11# Nothing clever done in this program - its a very simple bare basics hack to
12# get the job done.
13#
14# Things to do...
15# check @words[9] for time differences greater than +/- x secs & return a
16# warning.
17#
18# (c) 1999 Mark Jewiss, Knowledge Matters Limited
19# 22-9-1999, 12:45
20#
21# Modified script to accept 2 parameters or set defaults.
22# Now issues warning or critical alert is time difference is greater than the
23# time passed.
24#
25# These changes have not been tested completely due to the unavailability of a
26# server with the incorrect time.
27#
28# (c) 1999 Bo Kersey, VirCIO - Managed Server Solutions <bo@vircio.com>
29# 22-10-99, 12:17
30#
31# Modified the script to give useage if no parameters are input.
32#
33# Modified the script to check for negative as well as positive
34# time differences.
35#
36# Modified the script to work with ntpdate 3-5.93e Wed Apr 14 20:23:03 EDT 1999
37#
38# Modified the script to work with ntpdate's that return adjust or offset...
39#
40#
41# Script modified 2000 June 01 by William Pietri <william@bianca.com>
42#
43# Modified script to handle weird cases:
44# o NTP server doesn't respond (e.g., has died)
45# o Server has correct time but isn't suitable synchronization
46# source. This happens while starting up and if contact
47# with master has been lost.
48#
49# Modifed to run under Embedded Perl (sghosh@users.sf.net)
50# - combined logic some blocks together..
51#
52# Added ntpdate check for stratum 16 desynch peer (James Fidell) Feb 03, 2003
53#
54# ntpdate - offset is in seconds
55# changed ntpdc to ntpq - jitter/dispersion is in milliseconds
56#
57# Patch for for regex for stratum1 refid.
58
59require 5.004;
60use POSIX;
61use strict;
62use Getopt::Long;
63use vars qw($opt_V $opt_h $opt_H $opt_t $opt_w $opt_c $opt_O $opt_j $opt_k $verbose $PROGNAME $def_jitter $ipv4 $ipv6);
64use lib utils.pm;
65use utils qw($TIMEOUT %ERRORS &print_revision &support);
66
67$PROGNAME="check_ntp";
68
69sub print_help ();
70sub print_usage ();
71
72$ENV{'PATH'}='@TRUSTED_PATH@';
73$ENV{'BASH_ENV'}='';
74$ENV{'ENV'}='';
75
76# defaults in sec
77my $DEFAULT_OFFSET_WARN = 60; # 1 minute
78my $DEFAULT_OFFSET_CRIT = 120; # 2 minutes
79# default in millisec
80my $DEFAULT_JITTER_WARN = 5000; # 5 sec
81my $DEFAULT_JITTER_CRIT = 10000; # 10 sec
82
83Getopt::Long::Configure('bundling');
84GetOptions
85 ("V" => \$opt_V, "version" => \$opt_V,
86 "h" => \$opt_h, "help" => \$opt_h,
87 "v" => \$verbose, "verbose" => \$verbose,
88 "4" => \$ipv4, "use-ipv4" => \$ipv4,
89 "6" => \$ipv6, "use-ipv6" => \$ipv6,
90 "w=f" => \$opt_w, "warning=f" => \$opt_w, # offset|adjust warning if above this number
91 "c=f" => \$opt_c, "critical=f" => \$opt_c, # offset|adjust critical if above this number
92 "O" => \$opt_O, "zero-offset" => \$opt_O, # zero-offset bad
93 "j=s" => \$opt_j, "jwarn=i" => \$opt_j, # jitter warning if above this number
94 "k=s" => \$opt_k, "jcrit=i" => \$opt_k, # jitter critical if above this number
95 "t=s" => \$opt_t, "timeout=i" => \$opt_t,
96 "H=s" => \$opt_H, "hostname=s" => \$opt_H);
97
98if ($opt_V) {
99 print_revision($PROGNAME,'@NP_VERSION@');
100 exit $ERRORS{'OK'};
101}
102
103if ($opt_h) {
104 print_help();
105 exit $ERRORS{'OK'};
106}
107
108# jitter test params specified
109if (defined $opt_j || defined $opt_k ) {
110 $def_jitter = 1;
111}
112
113$opt_H = shift unless ($opt_H);
114my $host = $1 if ($opt_H && $opt_H =~ m/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[a-zA-Z][-a-zA-Z0-9]+(\.[a-zA-Z][-a-zA-Z0-9]+)*)$/);
115unless ($host) {
116 print "No target host specified\n";
117 print_usage();
118 exit $ERRORS{'UNKNOWN'};
119}
120
121my ($timeout, $owarn, $ocrit, $jwarn, $jcrit);
122
123$timeout = $TIMEOUT;
124($opt_t) && ($opt_t =~ /^([0-9]+)$/) && ($timeout = $1);
125
126$owarn = $DEFAULT_OFFSET_WARN;
127($opt_w) && ($opt_w =~ /^([0-9.]+)$/) && ($owarn = $1);
128
129$ocrit = $DEFAULT_OFFSET_CRIT;
130($opt_c) && ($opt_c =~ /^([0-9.]+)$/) && ($ocrit = $1);
131
132$jwarn = $DEFAULT_JITTER_WARN;
133($opt_j) && ($opt_j =~ /^([0-9]+)$/) && ($jwarn = $1);
134
135$jcrit = $DEFAULT_JITTER_CRIT;
136($opt_k) && ($opt_k =~ /^([0-9]+)$/) && ($jcrit = $1);
137
138if ($ocrit < $owarn ) {
139 print "Critical offset should be larger than warning offset\n";
140 print_usage();
141 exit $ERRORS{"UNKNOWN"};
142}
143
144if ($def_jitter) {
145 if ($opt_k < $opt_j) {
146 print "Critical jitter should be larger than warning jitter\n";
147 print_usage();
148 exit $ERRORS{'UNKNOWN'};
149 }
150}
151
152
153my $stratum = -1;
154my $ignoreret = 0;
155my $answer = undef;
156my $offset = undef;
157my $jitter = undef;
158my $syspeer = undef;
159my $candidate = 0;
160my @candidates;
161my $msg; # first line of output to print if format is invalid
162
163my $state = $ERRORS{'UNKNOWN'};
164my $ntpdate_error = $ERRORS{'UNKNOWN'};
165my $jitter_error = $ERRORS{'UNKNOWN'};
166
167# some systems don't have a proper ntpq (migrated from ntpdc)
168my $have_ntpq = undef;
169if ($utils::PATH_TO_NTPQ && -x $utils::PATH_TO_NTPQ ) {
170 $have_ntpq = 1;
171}else{
172 $have_ntpq = 0;
173}
174
175# Just in case of problems, let's not hang Nagios
176$SIG{'ALRM'} = sub {
177 print ("ERROR: No response from ntp server (alarm)\n");
178 exit $ERRORS{"UNKNOWN"};
179};
180alarm($timeout);
181
182# Determine protocol to be used for ntpdate and ntpq
183my $ntpdate = $utils::PATH_TO_NTPDATE;
184my $ntpq = $utils::PATH_TO_NTPQ;
185if ($ipv4) {
186 $ntpdate .= " -4";
187 $ntpq .= " -4";
188}
189elsif ($ipv6) {
190 $ntpdate .= " -6";
191 $ntpq .= " -6";
192}
193# else don't use any flags
194
195###
196###
197### First, check ntpdate
198###
199###
200
201if (!open (NTPDATE, $ntpdate . " -q $host 2>&1 |")) {
202 print "Could not open $ntpdate: $!\n";
203 exit $ERRORS{"UNKNOWN"};
204}
205
206my $out;
207while (<NTPDATE>) {
208 #print if ($verbose); # noop
209 $msg = $_ unless ($msg);
210 $out .= "$_ ";
211
212 if (/stratum\s(\d+)/) {
213 $stratum = $1;
214 }
215
216 if (/(offset|adjust)\s+([-.\d]+)/i) {
217 $offset = $2;
218
219 # An offset of 0.000000 with an error is probably bogus. Actually,
220 # it's probably always bogus, but let's be paranoid here.
221 # Has been reported that 0.0000 happens in a production environment
222 # on Solaris 8 so this check should be taken out - SF tracker 1150777
223 if (defined $opt_O ) {
224 if ($offset == 0) { undef $offset;}
225 }
226
227 $ntpdate_error = defined ($offset) ? $ERRORS{"OK"} : $ERRORS{"CRITICAL"};
228 print "ntperr = $ntpdate_error \n" if $verbose;
229
230 }
231
232 if (/no server suitable for synchronization found/) {
233 if ($stratum == 16) {
234 $ntpdate_error = $ERRORS{"WARNING"};
235 $msg = "Desynchronized peer server found";
236 $ignoreret=1;
237 }
238 else {
239 $ntpdate_error = $ERRORS{"CRITICAL"};
240 $msg = "No suitable peer server found - ";
241 }
242 }
243
244}
245$out =~ s/\n//g;
246close (NTPDATE) ||
247 die $! ? "$out - Error closing $ntpdate pipe: $!"
248 : "$out - Exit status: $? from $ntpdate\n";
249
250# declare an error if we also get a non-zero return code from ntpdate
251# unless already set to critical
252if ( $? && !$ignoreret ) {
253 print "stderr = $? : $! \n" if $verbose;
254 $ntpdate_error = $ntpdate_error == $ERRORS{"CRITICAL"} ? $ERRORS{"CRITICAL"} : $ERRORS{"UNKNOWN"} ;
255 print "ntperr = $ntpdate_error : $!\n" if $verbose;
256}
257
258###
259###
260### Then scan xntpq/ntpq if it exists
261### and look in the 11th column for jitter
262###
263# Field 1: Tally Code ( Space, 'x','.','-','+','#','*','o')
264# Only match for '*' which implies sys.peer
265# or 'o' which implies pps.peer
266# If both exist, the last one is picked.
267# Field 2: address of the remote peer
268# Field 3: Refid of the clock (0.0.0.0 if unknown, WWWV/PPS/GPS/ACTS/USNO/PCS/... if Stratum1)
269# Field 4: stratum (0-15)
270# Field 5: Type of the peer: local (l), unicast (u), multicast (m)
271# broadcast (b); not sure about multicast/broadcast
272# Field 6: last packet receive (in seconds)
273# Field 7: polling interval
274# Field 8: reachability resgister (octal)
275# Field 9: delay
276# Field 10: offset
277# Field 11: dispersion/jitter
278#
279# According to bug 773588 Some solaris xntpd implementations seemto match on
280# "#" even though the docs say it exceeds maximum distance. Providing patch
281# here which will generate a warining.
282
283if ($have_ntpq) {
284
285 if ( open(NTPQ, $ntpq . " -np $host 2>&1 |") ) {
286 while (<NTPQ>) {
287 print $_ if ($verbose);
288 if ( /timed out/ ){
289 $have_ntpq = 0 ;
290 last ;
291 }
292 # number of candidates on <host> for sys.peer
293 if (/^(\*|\+|\#|o])/) {
294 ++$candidate;
295 push (@candidates, $_);
296 print "Candidate count= $candidate\n" if ($verbose);
297 }
298
299 # match sys.peer or pps.peer
300 if (/^(\*|o)(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/) {
301 $syspeer = $2;
302 $stratum = $4;
303 $jitter = $11;
304 print "match $_ \n" if $verbose;
305 if ($jitter > $jcrit) {
306 print "Jitter_crit = $11 :$jcrit\n" if ($verbose);
307 $jitter_error = $ERRORS{'CRITICAL'};
308 } elsif ($jitter > $jwarn ) {
309 print "Jitter_warn = $11 :$jwarn\n" if ($verbose);
310 $jitter_error = $ERRORS{'WARNING'};
311 } else {
312 $jitter_error = $ERRORS{'OK'};
313 }
314 } else {
315 print "No match!\n" if $verbose;
316 $jitter = '(not parsed)';
317 }
318
319 }
320 close NTPQ ||
321 die $! ? "Error closing $ntpq pipe: $!"
322 : "Exit status: $? from $ntpq\n";
323
324 # if we did not match sys.peer or pps.peer but matched # candidates only
325 # generate a warning
326 # based on bug id 773588
327 unless (defined $syspeer) {
328 if ($#candidates >=0) {
329 foreach my $c (@candidates) {
330 $c =~ /^(#)([-0-9.\s]+)\s+([-0-9A-Za-z_().]+)\s+([-0-9.]+)\s+([lumb-]+)\s+([-0-9m.]+)\s+([-0-9.]+)\s+([-0-9.]+)\s+([-0-9.]+)\s+([-0-9.]+)\s+([-0-9.]+)/;
331 $syspeer = $2;
332 $stratum = $4;
333 $jitter = $11;
334 print "candidate match $c \n" if $verbose;
335 if ($jitter > $jcrit) {
336 print "Candidate match - Jitter_crit = $11 :$jcrit\n" if ($verbose);
337 $jitter_error = $ERRORS{'CRITICAL'};
338 }elsif ($jitter > $jwarn ) {
339 print "Candidate match - Jitter_warn = $11 :$jwarn \n" if ($verbose);
340 $jitter_error = $ERRORS{'WARNING'};
341 } else {
342 $jitter_error = $ERRORS{'WARNING'};
343 }
344 }
345
346 }
347 }
348 }
349}
350
351
352if ($ntpdate_error != $ERRORS{'OK'}) {
353 $state = $ntpdate_error;
354 if ($ntpdate_error == $ERRORS{'WARNING'} ) {
355 $answer = $msg;
356 }
357 else {
358 $answer = $msg . "Server for ntp probably down";
359 }
360
361 if (defined($offset) && abs($offset) > $ocrit) {
362 $state = $ERRORS{'CRITICAL'};
363 $answer = "Server Error and offset $offset sec > +/- $ocrit sec";
364 } elsif (defined($offset) && abs($offset) > $owarn) {
365 $answer = "Server error and offset $offset sec > +/- $owarn sec";
366 } elsif (defined($jitter) && abs($jitter) > $jcrit) {
367 $answer = "Server error and jitter $jitter msec > +/- $jcrit msec";
368 } elsif (defined($jitter) && abs($jitter) > $jwarn) {
369 $answer = "Server error and jitter $jitter msec > +/- $jwarn msec";
370 }
371
372} elsif ($have_ntpq && $jitter_error != $ERRORS{'OK'}) {
373 $state = $jitter_error;
374 $answer = "Jitter $jitter too high";
375 if (defined($offset) && abs($offset) > $ocrit) {
376 $state = $ERRORS{'CRITICAL'};
377 $answer = "Jitter error and offset $offset sec > +/- $ocrit sec";
378 } elsif (defined($offset) && abs($offset) > $owarn) {
379 $answer = "Jitter error and offset $offset sec > +/- $owarn sec";
380 } elsif (defined($jitter) && abs($jitter) > $jcrit) {
381 $answer = "Jitter error and jitter $jitter msec > +/- $jcrit msec";
382 } elsif (defined($jitter) && abs($jitter) > $jwarn) {
383 $answer = "Jitter error and jitter $jitter msec > +/- $jwarn msec";
384 }
385
386} elsif( !$have_ntpq ) { # no errors from ntpdate and no ntpq or ntpq timed out
387 if (abs($offset) > $ocrit) {
388 $state = $ERRORS{'CRITICAL'};
389 $answer = "Offset $offset sec > +/- $ocrit sec";
390 } elsif (abs($offset) > $owarn) {
391 $state = $ERRORS{'WARNING'};
392 $answer = "Offset $offset sec > +/- $owarn sec";
393 } elsif (( abs($offset) > $owarn) && $def_jitter ) {
394 $state = $ERRORS{'WARNING'};
395 $answer = "Offset $offset sec > +/- $owarn sec, ntpq timed out";
396 } elsif ( $def_jitter ) {
397 $state = $ERRORS{'WARNING'};
398 $answer = "Offset $offset secs, ntpq timed out";
399 } else{
400 $state = $ERRORS{'OK'};
401 $answer = "Offset $offset secs";
402 }
403
404
405
406} else { # no errors from ntpdate or ntpq
407 if (abs($offset) > $ocrit) {
408 $state = $ERRORS{'CRITICAL'};
409 $answer = "Offset $offset sec > +/- $ocrit sec, jitter $jitter msec";
410 } elsif (abs($jitter) > $jcrit ) {
411 $state = $ERRORS{'CRITICAL'};
412 $answer = "Jitter $jitter msec> +/- $jcrit msec, offset $offset sec";
413 } elsif (abs($offset) > $owarn) {
414 $state = $ERRORS{'WARNING'};
415 $answer = "Offset $offset sec > +/- $owarn sec, jitter $jitter msec";
416 } elsif (abs($jitter) > $jwarn ) {
417 $state = $ERRORS{'WARNING'};
418 $answer = "Jitter $jitter msec> +/- $jwarn msec, offset $offset sec";
419
420 } else {
421 $state = $ERRORS{'OK'};
422 $answer = "Offset $offset secs, jitter $jitter msec, peer is stratum $stratum";
423 }
424
425}
426
427foreach my $key (keys %ERRORS) {
428 if ($state==$ERRORS{$key}) {
429# print ("NTP $key: $answer");
430 print ("NTP $key: $answer|offset=$offset, jitter=" . $jitter/1000 . ",peer_stratum=$stratum\n");
431 last;
432 }
433}
434exit $state;
435
436
437####
438#### subs
439
440sub print_usage () {
441 print "Usage: $PROGNAME -H <host> [-46] [-O] [-w <warn>] [-c <crit>] [-j <warn>] [-k <crit>] [-v verbose]\n";
442}
443
444sub print_help () {
445 print_revision($PROGNAME,'@NP_VERSION@');
446 print "Copyright (c) 2003 Bo Kersey/Karl DeBisschop\n";
447 print "\n";
448 print_usage();
449 print "
450Checks the local timestamp offset versus <host> with ntpdate
451Checks the jitter/dispersion of clock signal between <host> and its sys.peer with ntpq\n
452-O (--zero-offset)
453 A zero offset on \"ntpdate\" will generate a CRITICAL.\n
454-w (--warning)
455 Clock offset in seconds at which a warning message will be generated.\n Defaults to $DEFAULT_OFFSET_WARN.
456-c (--critical)
457 Clock offset in seconds at which a critical message will be generated.\n Defaults to $DEFAULT_OFFSET_CRIT.
458-j (--jwarn)
459 Clock jitter in milliseconds at which a warning message will be generated.\n Defaults to $DEFAULT_JITTER_WARN.
460-k (--jcrit)
461 Clock jitter in milliseconds at which a critical message will be generated.\n Defaults to $DEFAULT_JITTER_CRIT.
462
463 If jitter/dispersion is specified with -j or -k and ntpq times out, then a
464 warning is returned.\n
465-4 (--use-ipv4)
466 Use IPv4 connection
467-6 (--use-ipv6)
468 Use IPv6 connection
469\n";
470support();
471}
diff --git a/plugins-scripts/check_rpc.pl b/plugins-scripts/check_rpc.pl
index b1c61471..47d6e49e 100755
--- a/plugins-scripts/check_rpc.pl
+++ b/plugins-scripts/check_rpc.pl
@@ -22,7 +22,6 @@
22use strict; 22use strict;
23use FindBin; 23use FindBin;
24use lib "$FindBin::Bin"; 24use lib "$FindBin::Bin";
25use lib '@libexecdir@';
26use utils qw($TIMEOUT %ERRORS &print_revision &support); 25use utils qw($TIMEOUT %ERRORS &print_revision &support);
27use vars qw($PROGNAME); 26use vars qw($PROGNAME);
28my ($verbose,@proto,%prognum,$host,$response,$prognum,$port,$cmd,$progver,$state); 27my ($verbose,@proto,%prognum,$host,$response,$prognum,$port,$cmd,$progver,$state);
@@ -64,12 +63,12 @@ GetOptions(
64); 63);
65 64
66# -h means display verbose help screen 65# -h means display verbose help screen
67if ($opt_h) { print_help(); exit $ERRORS{'OK'}; } 66if ($opt_h) { print_help(); exit $ERRORS{'UNKNOWN'}; }
68 67
69# -V means display version number 68# -V means display version number
70if ($opt_V) { 69if ($opt_V) {
71 print_revision($PROGNAME,'@NP_VERSION@'); 70 print_revision($PROGNAME,'@NP_VERSION@');
72 exit $ERRORS{'OK'}; 71 exit $ERRORS{'UNKNOWN'};
73} 72}
74 73
75# Hash containing all RPC program names and numbers 74# Hash containing all RPC program names and numbers
diff --git a/plugins-scripts/check_wave.pl b/plugins-scripts/check_wave.pl
index ee0fda4d..41e15f50 100755
--- a/plugins-scripts/check_wave.pl
+++ b/plugins-scripts/check_wave.pl
@@ -5,7 +5,6 @@
5use strict; 5use strict;
6use FindBin; 6use FindBin;
7use lib "$FindBin::Bin"; 7use lib "$FindBin::Bin";
8use lib '@libexecdir@';
9use utils qw($TIMEOUT %ERRORS &print_revision &support); 8use utils qw($TIMEOUT %ERRORS &print_revision &support);
10use vars qw($PROGNAME); 9use vars qw($PROGNAME);
11use Getopt::Long; 10use Getopt::Long;
@@ -32,12 +31,12 @@ GetOptions
32 31
33if ($opt_V) { 32if ($opt_V) {
34 print_revision($PROGNAME,'@NP_VERSION@'); #' 33 print_revision($PROGNAME,'@NP_VERSION@'); #'
35 exit $ERRORS{'OK'}; 34 exit $ERRORS{'UNKNOWN'};
36} 35}
37 36
38if ($opt_h) { 37if ($opt_h) {
39 print_help(); 38 print_help();
40 exit $ERRORS{'OK'}; 39 exit $ERRORS{'UNKNOWN'};
41} 40}
42 41
43$opt_H = shift unless ($opt_H); 42$opt_H = shift unless ($opt_H);
diff --git a/plugins-scripts/t/check_rpc.t b/plugins-scripts/t/check_rpc.t
index be8ae2f7..c58f7bf7 100644
--- a/plugins-scripts/t/check_rpc.t
+++ b/plugins-scripts/t/check_rpc.t
@@ -15,7 +15,7 @@ my $successOutput = '/^check_rpc/';
15 15
16my $t; 16my $t;
17 17
18$t += checkCmd( "./check_rpc -V", 0, $successOutput ); 18$t += checkCmd( "./check_rpc -V", 3, $successOutput );
19 19
20exit(0) if defined($Test::Harness::VERSION); 20exit(0) if defined($Test::Harness::VERSION);
21exit($tests - $t); 21exit($tests - $t);
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 41906c53..0ddf9bd1 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -71,7 +71,7 @@ check_apt_LDADD = $(BASEOBJS)
71check_cluster_LDADD = $(BASEOBJS) 71check_cluster_LDADD = $(BASEOBJS)
72check_dbi_LDADD = $(NETLIBS) $(DBILIBS) 72check_dbi_LDADD = $(NETLIBS) $(DBILIBS)
73check_dig_LDADD = $(NETLIBS) 73check_dig_LDADD = $(NETLIBS)
74check_disk_LDADD = $(BASEOBJS) $(THREADLIBS) 74check_disk_LDADD = $(BASEOBJS)
75check_dns_LDADD = $(NETLIBS) 75check_dns_LDADD = $(NETLIBS)
76check_dummy_LDADD = $(BASEOBJS) 76check_dummy_LDADD = $(BASEOBJS)
77check_fping_LDADD = $(NETLIBS) 77check_fping_LDADD = $(NETLIBS)
diff --git a/plugins/check_apt.c b/plugins/check_apt.c
index 8747f904..a639a411 100644
--- a/plugins/check_apt.c
+++ b/plugins/check_apt.c
@@ -160,10 +160,10 @@ int process_arguments (int argc, char **argv) {
160 switch(c) { 160 switch(c) {
161 case 'h': 161 case 'h':
162 print_help(); 162 print_help();
163 exit(STATE_OK); 163 exit(STATE_UNKNOWN);
164 case 'V': 164 case 'V':
165 print_revision(progname, NP_VERSION); 165 print_revision(progname, NP_VERSION);
166 exit(STATE_OK); 166 exit(STATE_UNKNOWN);
167 case 'v': 167 case 'v':
168 verbose++; 168 verbose++;
169 break; 169 break;
diff --git a/plugins/check_by_ssh.c b/plugins/check_by_ssh.c
index a877f888..13d8bc3b 100644
--- a/plugins/check_by_ssh.c
+++ b/plugins/check_by_ssh.c
@@ -100,6 +100,13 @@ main (int argc, char **argv)
100 100
101 result = cmd_run_array (commargv, &chld_out, &chld_err, 0); 101 result = cmd_run_array (commargv, &chld_out, &chld_err, 0);
102 102
103 if (verbose) {
104 for(i = 0; i < chld_out.lines; i++)
105 printf("stdout: %s\n", chld_out.line[i]);
106 for(i = 0; i < chld_err.lines; i++)
107 printf("stderr: %s\n", chld_err.line[i]);
108 }
109
103 if (skip_stdout == -1) /* --skip-stdout specified without argument */ 110 if (skip_stdout == -1) /* --skip-stdout specified without argument */
104 skip_stdout = chld_out.lines; 111 skip_stdout = chld_out.lines;
105 if (skip_stderr == -1) /* --skip-stderr specified without argument */ 112 if (skip_stderr == -1) /* --skip-stderr specified without argument */
@@ -209,10 +216,10 @@ process_arguments (int argc, char **argv)
209 switch (c) { 216 switch (c) {
210 case 'V': /* version */ 217 case 'V': /* version */
211 print_revision (progname, NP_VERSION); 218 print_revision (progname, NP_VERSION);
212 exit (STATE_OK); 219 exit (STATE_UNKNOWN);
213 case 'h': /* help */ 220 case 'h': /* help */
214 print_help (); 221 print_help ();
215 exit (STATE_OK); 222 exit (STATE_UNKNOWN);
216 case 'v': /* help */ 223 case 'v': /* help */
217 verbose = TRUE; 224 verbose = TRUE;
218 break; 225 break;
diff --git a/plugins/check_cluster.c b/plugins/check_cluster.c
index cf699e1f..b86e501d 100644
--- a/plugins/check_cluster.c
+++ b/plugins/check_cluster.c
@@ -200,7 +200,7 @@ int process_arguments(int argc, char **argv){
200 200
201 case 'V': /* version */ 201 case 'V': /* version */
202 print_revision (progname, NP_VERSION); 202 print_revision (progname, NP_VERSION);
203 exit (STATE_OK); 203 exit (STATE_UNKNOWN);
204 break; 204 break;
205 205
206 case 'H': /* help */ 206 case 'H': /* help */
diff --git a/plugins/check_dbi.c b/plugins/check_dbi.c
index a3d033f4..826eb8d9 100644
--- a/plugins/check_dbi.c
+++ b/plugins/check_dbi.c
@@ -368,10 +368,10 @@ process_arguments (int argc, char **argv)
368 usage5 (); 368 usage5 ();
369 case 'h': /* help */ 369 case 'h': /* help */
370 print_help (); 370 print_help ();
371 exit (STATE_OK); 371 exit (STATE_UNKNOWN);
372 case 'V': /* version */ 372 case 'V': /* version */
373 print_revision (progname, NP_VERSION); 373 print_revision (progname, NP_VERSION);
374 exit (STATE_OK); 374 exit (STATE_UNKNOWN);
375 375
376 case 'c': /* critical range */ 376 case 'c': /* critical range */
377 critical_range = optarg; 377 critical_range = optarg;
diff --git a/plugins/check_dig.c b/plugins/check_dig.c
index d899b119..473d4b97 100644
--- a/plugins/check_dig.c
+++ b/plugins/check_dig.c
@@ -125,7 +125,7 @@ main (int argc, char **argv)
125 if (verbose) 125 if (verbose)
126 printf ("%s\n", chld_out.line[i]); 126 printf ("%s\n", chld_out.line[i]);
127 127
128 if (strstr (chld_out.line[i], (expected_address == NULL ? query_address : expected_address)) != NULL) { 128 if (strcasestr (chld_out.line[i], (expected_address == NULL ? query_address : expected_address)) != NULL) {
129 msg = chld_out.line[i]; 129 msg = chld_out.line[i];
130 result = STATE_OK; 130 result = STATE_OK;
131 131
@@ -223,10 +223,10 @@ process_arguments (int argc, char **argv)
223 switch (c) { 223 switch (c) {
224 case 'h': /* help */ 224 case 'h': /* help */
225 print_help (); 225 print_help ();
226 exit (STATE_OK); 226 exit (STATE_UNKNOWN);
227 case 'V': /* version */ 227 case 'V': /* version */
228 print_revision (progname, NP_VERSION); 228 print_revision (progname, NP_VERSION);
229 exit (STATE_OK); 229 exit (STATE_UNKNOWN);
230 case 'H': /* hostname */ 230 case 'H': /* hostname */
231 host_or_die(optarg); 231 host_or_die(optarg);
232 dns_server = optarg; 232 dns_server = optarg;
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index eb573f5f..e73a0083 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -51,9 +51,6 @@ const char *email = "devel@monitoring-plugins.org";
51# include <limits.h> 51# include <limits.h>
52#endif 52#endif
53#include "regex.h" 53#include "regex.h"
54#if HAVE_PTHREAD_H
55# include <pthread.h>
56#endif
57 54
58#ifdef __CYGWIN__ 55#ifdef __CYGWIN__
59# include <windows.h> 56# include <windows.h>
@@ -61,9 +58,6 @@ const char *email = "devel@monitoring-plugins.org";
61# define ERROR -1 58# define ERROR -1
62#endif 59#endif
63 60
64/* If nonzero, show inode information. */
65static int inode_format = 1;
66
67/* If nonzero, show even filesystems with zero size or 61/* If nonzero, show even filesystems with zero size or
68 uninteresting types. */ 62 uninteresting types. */
69static int show_all_fs = 1; 63static int show_all_fs = 1;
@@ -133,7 +127,6 @@ void print_help (void);
133void print_usage (void); 127void print_usage (void);
134double calculate_percent(uintmax_t, uintmax_t); 128double calculate_percent(uintmax_t, uintmax_t);
135void stat_path (struct parameter_list *p); 129void stat_path (struct parameter_list *p);
136void *do_stat_path (void *p);
137void get_stats (struct parameter_list *p, struct fs_usage *fsp); 130void get_stats (struct parameter_list *p, struct fs_usage *fsp);
138void get_path_stats (struct parameter_list *p, struct fs_usage *fsp); 131void get_path_stats (struct parameter_list *p, struct fs_usage *fsp);
139 132
@@ -182,7 +175,7 @@ main (int argc, char **argv)
182 int temp_result; 175 int temp_result;
183 176
184 struct mount_entry *me; 177 struct mount_entry *me;
185 struct fs_usage fsp, tmpfsp; 178 struct fs_usage fsp;
186 struct parameter_list *temp_list, *path; 179 struct parameter_list *temp_list, *path;
187 180
188#ifdef __CYGWIN__ 181#ifdef __CYGWIN__
@@ -427,9 +420,7 @@ process_arguments (int argc, char **argv)
427 int c, err; 420 int c, err;
428 struct parameter_list *se; 421 struct parameter_list *se;
429 struct parameter_list *temp_list = NULL, *previous = NULL; 422 struct parameter_list *temp_list = NULL, *previous = NULL;
430 struct parameter_list *temp_path_select_list = NULL; 423 struct mount_entry *me;
431 struct mount_entry *me, *temp_me;
432 int result = OK;
433 regex_t re; 424 regex_t re;
434 int cflags = REG_NOSUB | REG_EXTENDED; 425 int cflags = REG_NOSUB | REG_EXTENDED;
435 int default_cflags = cflags; 426 int default_cflags = cflags;
@@ -766,10 +757,10 @@ process_arguments (int argc, char **argv)
766 break; 757 break;
767 case 'V': /* version */ 758 case 'V': /* version */
768 print_revision (progname, NP_VERSION); 759 print_revision (progname, NP_VERSION);
769 exit (STATE_OK); 760 exit (STATE_UNKNOWN);
770 case 'h': /* help */ 761 case 'h': /* help */
771 print_help (); 762 print_help ();
772 exit (STATE_OK); 763 exit (STATE_UNKNOWN);
773 case '?': /* help */ 764 case '?': /* help */
774 usage (_("Unknown argument")); 765 usage (_("Unknown argument"));
775 } 766 }
@@ -972,44 +963,6 @@ print_usage (void)
972void 963void
973stat_path (struct parameter_list *p) 964stat_path (struct parameter_list *p)
974{ 965{
975#ifdef HAVE_PTHREAD_H
976 pthread_t stat_thread;
977 int statdone = 0;
978 int timer = timeout_interval;
979 struct timespec req, rem;
980
981 req.tv_sec = 0;
982 pthread_create(&stat_thread, NULL, do_stat_path, p);
983 while (timer-- > 0) {
984 req.tv_nsec = 10000000;
985 nanosleep(&req, &rem);
986 if (pthread_kill(stat_thread, 0)) {
987 statdone = 1;
988 break;
989 } else {
990 req.tv_nsec = 990000000;
991 nanosleep(&req, &rem);
992 }
993 }
994 if (statdone == 1) {
995 pthread_join(stat_thread, NULL);
996 } else {
997 pthread_detach(stat_thread);
998 if (verbose >= 3)
999 printf("stat did not return within %ds on %s\n", timeout_interval, p->name);
1000 printf("DISK %s - ", _("CRITICAL"));
1001 die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("hangs"), _("Timeout"));
1002 }
1003#else
1004 do_stat_path(p);
1005#endif
1006}
1007
1008void *
1009do_stat_path (void *in)
1010{
1011 struct parameter_list *p = in;
1012
1013 /* Stat entry to check that dir exists and is accessible */ 966 /* Stat entry to check that dir exists and is accessible */
1014 if (verbose >= 3) 967 if (verbose >= 3)
1015 printf("calling stat on %s\n", p->name); 968 printf("calling stat on %s\n", p->name);
@@ -1019,7 +972,6 @@ do_stat_path (void *in)
1019 printf("DISK %s - ", _("CRITICAL")); 972 printf("DISK %s - ", _("CRITICAL"));
1020 die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno)); 973 die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno));
1021 } 974 }
1022 return NULL;
1023} 975}
1024 976
1025 977
diff --git a/plugins/check_dns.c b/plugins/check_dns.c
index 22121226..54ce7d16 100644
--- a/plugins/check_dns.c
+++ b/plugins/check_dns.c
@@ -81,7 +81,6 @@ main (int argc, char **argv)
81 double elapsed_time; 81 double elapsed_time;
82 long microsec; 82 long microsec;
83 struct timeval tv; 83 struct timeval tv;
84 int multi_address;
85 int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ 84 int parse_address = FALSE; /* This flag scans for Address: but only after Name: */
86 output chld_out, chld_err; 85 output chld_out, chld_err;
87 size_t i; 86 size_t i;
@@ -127,7 +126,7 @@ main (int argc, char **argv)
127 if (verbose) 126 if (verbose)
128 puts(chld_out.line[i]); 127 puts(chld_out.line[i]);
129 128
130 if (strstr (chld_out.line[i], ".in-addr.arpa")) { 129 if (strcasestr (chld_out.line[i], ".in-addr.arpa")) {
131 if ((temp_buffer = strstr (chld_out.line[i], "name = "))) 130 if ((temp_buffer = strstr (chld_out.line[i], "name = ")))
132 addresses[n_addresses++] = strdup (temp_buffer + 7); 131 addresses[n_addresses++] = strdup (temp_buffer + 7);
133 else { 132 else {
@@ -249,11 +248,6 @@ main (int argc, char **argv)
249 elapsed_time = (double)microsec / 1.0e6; 248 elapsed_time = (double)microsec / 1.0e6;
250 249
251 if (result == STATE_OK) { 250 if (result == STATE_OK) {
252 if (strchr (address, ',') == NULL)
253 multi_address = FALSE;
254 else
255 multi_address = TRUE;
256
257 result = get_status(elapsed_time, time_thresholds); 251 result = get_status(elapsed_time, time_thresholds);
258 if (result == STATE_OK) { 252 if (result == STATE_OK) {
259 printf ("DNS %s: ", _("OK")); 253 printf ("DNS %s: ", _("OK"));
@@ -395,10 +389,10 @@ process_arguments (int argc, char **argv)
395 switch (c) { 389 switch (c) {
396 case 'h': /* help */ 390 case 'h': /* help */
397 print_help (); 391 print_help ();
398 exit (STATE_OK); 392 exit (STATE_UNKNOWN);
399 case 'V': /* version */ 393 case 'V': /* version */
400 print_revision (progname, NP_VERSION); 394 print_revision (progname, NP_VERSION);
401 exit (STATE_OK); 395 exit (STATE_UNKNOWN);
402 case 'v': /* version */ 396 case 'v': /* version */
403 verbose = TRUE; 397 verbose = TRUE;
404 break; 398 break;
diff --git a/plugins/check_dummy.c b/plugins/check_dummy.c
index 3ed68717..212a1344 100644
--- a/plugins/check_dummy.c
+++ b/plugins/check_dummy.c
@@ -52,11 +52,11 @@ main (int argc, char **argv)
52 usage4 (_("Could not parse arguments")); 52 usage4 (_("Could not parse arguments"));
53 else if (strcmp (argv[1], "-V") == 0 || strcmp (argv[1], "--version") == 0) { 53 else if (strcmp (argv[1], "-V") == 0 || strcmp (argv[1], "--version") == 0) {
54 print_revision (progname, NP_VERSION); 54 print_revision (progname, NP_VERSION);
55 exit (STATE_OK); 55 exit (STATE_UNKNOWN);
56 } 56 }
57 else if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "--help") == 0) { 57 else if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "--help") == 0) {
58 print_help (); 58 print_help ();
59 exit (STATE_OK); 59 exit (STATE_UNKNOWN);
60 } 60 }
61 else if (!is_integer (argv[1])) 61 else if (!is_integer (argv[1]))
62 usage4 (_("Arguments to check_dummy must be an integer")); 62 usage4 (_("Arguments to check_dummy must be an integer"));
diff --git a/plugins/check_fping.c b/plugins/check_fping.c
index 46046b4f..da1ce1a6 100644
--- a/plugins/check_fping.c
+++ b/plugins/check_fping.c
@@ -105,7 +105,7 @@ main (int argc, char **argv)
105 xasprintf(&option_string, "%s-I %s ", option_string, sourceif); 105 xasprintf(&option_string, "%s-I %s ", option_string, sourceif);
106 106
107#ifdef PATH_TO_FPING6 107#ifdef PATH_TO_FPING6
108 if (address_family == AF_INET6) 108 if (address_family != AF_INET && is_inet6_addr(server))
109 fping_prog = strdup(PATH_TO_FPING6); 109 fping_prog = strdup(PATH_TO_FPING6);
110 else 110 else
111 fping_prog = strdup(PATH_TO_FPING); 111 fping_prog = strdup(PATH_TO_FPING);
@@ -314,10 +314,10 @@ process_arguments (int argc, char **argv)
314 usage5 (); 314 usage5 ();
315 case 'h': /* help */ 315 case 'h': /* help */
316 print_help (); 316 print_help ();
317 exit (STATE_OK); 317 exit (STATE_UNKNOWN);
318 case 'V': /* version */ 318 case 'V': /* version */
319 print_revision (progname, NP_VERSION); 319 print_revision (progname, NP_VERSION);
320 exit (STATE_OK); 320 exit (STATE_UNKNOWN);
321 case 'v': /* verbose mode */ 321 case 'v': /* verbose mode */
322 verbose = TRUE; 322 verbose = TRUE;
323 break; 323 break;
diff --git a/plugins/check_game.c b/plugins/check_game.c
index 29e59e2f..709dae1b 100644
--- a/plugins/check_game.c
+++ b/plugins/check_game.c
@@ -196,10 +196,10 @@ process_arguments (int argc, char **argv)
196 switch (c) { 196 switch (c) {
197 case 'h': /* help */ 197 case 'h': /* help */
198 print_help (); 198 print_help ();
199 exit (STATE_OK); 199 exit (STATE_UNKNOWN);
200 case 'V': /* version */ 200 case 'V': /* version */
201 print_revision (progname, NP_VERSION); 201 print_revision (progname, NP_VERSION);
202 exit (STATE_OK); 202 exit (STATE_UNKNOWN);
203 case 'v': /* version */ 203 case 'v': /* version */
204 verbose = TRUE; 204 verbose = TRUE;
205 break; 205 break;
diff --git a/plugins/check_hpjd.c b/plugins/check_hpjd.c
index 5fe06984..f159f5a2 100644
--- a/plugins/check_hpjd.c
+++ b/plugins/check_hpjd.c
@@ -350,10 +350,10 @@ process_arguments (int argc, char **argv)
350 break; 350 break;
351 case 'V': /* version */ 351 case 'V': /* version */
352 print_revision (progname, NP_VERSION); 352 print_revision (progname, NP_VERSION);
353 exit (STATE_OK); 353 exit (STATE_UNKNOWN);
354 case 'h': /* help */ 354 case 'h': /* help */
355 print_help (); 355 print_help ();
356 exit (STATE_OK); 356 exit (STATE_UNKNOWN);
357 case '?': /* help */ 357 case '?': /* help */
358 usage5 (); 358 usage5 ();
359 } 359 }
diff --git a/plugins/check_http.c b/plugins/check_http.c
index 51679975..2038f4a1 100644
--- a/plugins/check_http.c
+++ b/plugins/check_http.c
@@ -267,11 +267,11 @@ process_arguments (int argc, char **argv)
267 break; 267 break;
268 case 'h': /* help */ 268 case 'h': /* help */
269 print_help (); 269 print_help ();
270 exit (STATE_OK); 270 exit (STATE_UNKNOWN);
271 break; 271 break;
272 case 'V': /* version */ 272 case 'V': /* version */
273 print_revision (progname, NP_VERSION); 273 print_revision (progname, NP_VERSION);
274 exit (STATE_OK); 274 exit (STATE_UNKNOWN);
275 break; 275 break;
276 case 't': /* timeout period */ 276 case 't': /* timeout period */
277 if (!is_intnonneg (optarg)) 277 if (!is_intnonneg (optarg))
@@ -343,9 +343,20 @@ process_arguments (int argc, char **argv)
343 parameters, like -S and -C combinations */ 343 parameters, like -S and -C combinations */
344 use_ssl = TRUE; 344 use_ssl = TRUE;
345 if (c=='S' && optarg != NULL) { 345 if (c=='S' && optarg != NULL) {
346 ssl_version = atoi(optarg); 346 int got_plus = strchr(optarg, '+') != NULL;
347 if (ssl_version < 1 || ssl_version > 3) 347
348 usage4 (_("Invalid option - Valid values for SSL Version are 1 (TLSv1), 2 (SSLv2) or 3 (SSLv3)")); 348 if (!strncmp (optarg, "1.2", 3))
349 ssl_version = got_plus ? MP_TLSv1_2_OR_NEWER : MP_TLSv1_2;
350 else if (!strncmp (optarg, "1.1", 3))
351 ssl_version = got_plus ? MP_TLSv1_1_OR_NEWER : MP_TLSv1_1;
352 else if (optarg[0] == '1')
353 ssl_version = got_plus ? MP_TLSv1_OR_NEWER : MP_TLSv1;
354 else if (optarg[0] == '3')
355 ssl_version = got_plus ? MP_SSLv3_OR_NEWER : MP_SSLv3;
356 else if (optarg[0] == '2')
357 ssl_version = got_plus ? MP_SSLv2_OR_NEWER : MP_SSLv2;
358 else
359 usage4 (_("Invalid option - Valid SSL/TLS versions: 2, 3, 1, 1.1, 1.2 (with optional '+' suffix)"));
349 } 360 }
350 if (specify_port == FALSE) 361 if (specify_port == FALSE)
351 server_port = HTTPS_PORT; 362 server_port = HTTPS_PORT;
@@ -869,17 +880,42 @@ check_http (void)
869 double elapsed_time_transfer = 0.0; 880 double elapsed_time_transfer = 0.0;
870 int page_len = 0; 881 int page_len = 0;
871 int result = STATE_OK; 882 int result = STATE_OK;
883 char *force_host_header = NULL;
872 884
873 /* try to connect to the host at the given port number */ 885 /* try to connect to the host at the given port number */
874 gettimeofday (&tv_temp, NULL); 886 gettimeofday (&tv_temp, NULL);
875 if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK) 887 if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK)
876 die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n")); 888 die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n"));
877 microsec_connect = deltime (tv_temp); 889 microsec_connect = deltime (tv_temp);
890
891 /* if we are called with the -I option, the -j method is CONNECT and */
892 /* we received -S for SSL, then we tunnel the request through a proxy*/
893 /* @20100414, public[at]frank4dd.com, http://www.frank4dd.com/howto */
894
895 if ( server_address != NULL && strcmp(http_method, "CONNECT") == 0
896 && host_name != NULL && use_ssl == TRUE) {
897
898 if (verbose) printf ("Entering CONNECT tunnel mode with proxy %s:%d to dst %s:%d\n", server_address, server_port, host_name, HTTPS_PORT);
899 asprintf (&buf, "%s %s:%d HTTP/1.1\r\n%s\r\n", http_method, host_name, HTTPS_PORT, user_agent);
900 asprintf (&buf, "%sProxy-Connection: keep-alive\r\n", buf);
901 asprintf (&buf, "%sHost: %s\r\n", buf, host_name);
902 /* we finished our request, send empty line with CRLF */
903 asprintf (&buf, "%s%s", buf, CRLF);
904 if (verbose) printf ("%s\n", buf);
905 send(sd, buf, strlen (buf), 0);
906 buf[0]='\0';
907
908 if (verbose) printf ("Receive response from proxy\n");
909 read (sd, buffer, MAX_INPUT_BUFFER-1);
910 if (verbose) printf ("%s", buffer);
911 /* Here we should check if we got HTTP/1.1 200 Connection established */
912 }
878#ifdef HAVE_SSL 913#ifdef HAVE_SSL
879 elapsed_time_connect = (double)microsec_connect / 1.0e6; 914 elapsed_time_connect = (double)microsec_connect / 1.0e6;
880 if (use_ssl == TRUE) { 915 if (use_ssl == TRUE) {
881 gettimeofday (&tv_temp, NULL); 916 gettimeofday (&tv_temp, NULL);
882 result = np_net_ssl_init_with_hostname_version_and_cert(sd, (use_sni ? host_name : NULL), ssl_version, client_cert, client_privkey); 917 result = np_net_ssl_init_with_hostname_version_and_cert(sd, (use_sni ? host_name : NULL), ssl_version, client_cert, client_privkey);
918 if (verbose) printf ("SSL initialized\n");
883 if (result != STATE_OK) 919 if (result != STATE_OK)
884 die (STATE_CRITICAL, NULL); 920 die (STATE_CRITICAL, NULL);
885 microsec_ssl = deltime (tv_temp); 921 microsec_ssl = deltime (tv_temp);
@@ -893,29 +929,51 @@ check_http (void)
893 } 929 }
894#endif /* HAVE_SSL */ 930#endif /* HAVE_SSL */
895 931
896 xasprintf (&buf, "%s %s %s\r\n%s\r\n", http_method, server_url, host_name ? "HTTP/1.1" : "HTTP/1.0", user_agent); 932 if ( server_address != NULL && strcmp(http_method, "CONNECT") == 0
933 && host_name != NULL && use_ssl == TRUE)
934 asprintf (&buf, "%s %s %s\r\n%s\r\n", "GET", server_url, host_name ? "HTTP/1.1" : "HTTP/1.0", user_agent);
935 else
936 asprintf (&buf, "%s %s %s\r\n%s\r\n", http_method, server_url, host_name ? "HTTP/1.1" : "HTTP/1.0", user_agent);
897 937
898 /* tell HTTP/1.1 servers not to keep the connection alive */ 938 /* tell HTTP/1.1 servers not to keep the connection alive */
899 xasprintf (&buf, "%sConnection: close\r\n", buf); 939 xasprintf (&buf, "%sConnection: close\r\n", buf);
900 940
941 /* check if Host header is explicitly set in options */
942 if (http_opt_headers_count) {
943 for (i = 0; i < http_opt_headers_count ; i++) {
944 if (strncmp(http_opt_headers[i], "Host:", 5) == 0) {
945 force_host_header = http_opt_headers[i];
946 }
947 }
948 }
949
901 /* optionally send the host header info */ 950 /* optionally send the host header info */
902 if (host_name) { 951 if (host_name) {
903 /* 952 if (force_host_header) {
904 * Specify the port only if we're using a non-default port (see RFC 2616, 953 xasprintf (&buf, "%s%s\r\n", buf, force_host_header);
905 * 14.23). Some server applications/configurations cause trouble if the 954 }
906 * (default) port is explicitly specified in the "Host:" header line. 955 else {
907 */ 956 /*
908 if ((use_ssl == FALSE && server_port == HTTP_PORT) || 957 * Specify the port only if we're using a non-default port (see RFC 2616,
909 (use_ssl == TRUE && server_port == HTTPS_PORT)) 958 * 14.23). Some server applications/configurations cause trouble if the
910 xasprintf (&buf, "%sHost: %s\r\n", buf, host_name); 959 * (default) port is explicitly specified in the "Host:" header line.
911 else 960 */
912 xasprintf (&buf, "%sHost: %s:%d\r\n", buf, host_name, server_port); 961 if ((use_ssl == FALSE && server_port == HTTP_PORT) ||
962 (use_ssl == TRUE && server_port == HTTPS_PORT) ||
963 (server_address != NULL && strcmp(http_method, "CONNECT") == 0
964 && host_name != NULL && use_ssl == TRUE))
965 xasprintf (&buf, "%sHost: %s\r\n", buf, host_name);
966 else
967 xasprintf (&buf, "%sHost: %s:%d\r\n", buf, host_name, server_port);
968 }
913 } 969 }
914 970
915 /* optionally send any other header tag */ 971 /* optionally send any other header tag */
916 if (http_opt_headers_count) { 972 if (http_opt_headers_count) {
917 for (i = 0; i < http_opt_headers_count ; i++) { 973 for (i = 0; i < http_opt_headers_count ; i++) {
918 xasprintf (&buf, "%s%s\r\n", buf, http_opt_headers[i]); 974 if (force_host_header != http_opt_headers[i]) {
975 xasprintf (&buf, "%s%s\r\n", buf, http_opt_headers[i]);
976 }
919 } 977 }
920 /* This cannot be free'd here because a redirection will then try to access this and segfault */ 978 /* This cannot be free'd here because a redirection will then try to access this and segfault */
921 /* Covered in a testcase in tests/check_http.t */ 979 /* Covered in a testcase in tests/check_http.t */
@@ -1467,9 +1525,10 @@ print_help (void)
1467 printf (UT_IPv46); 1525 printf (UT_IPv46);
1468 1526
1469#ifdef HAVE_SSL 1527#ifdef HAVE_SSL
1470 printf (" %s\n", "-S, --ssl=VERSION"); 1528 printf (" %s\n", "-S, --ssl=VERSION[+]");
1471 printf (" %s\n", _("Connect via SSL. Port defaults to 443. VERSION is optional, and prevents")); 1529 printf (" %s\n", _("Connect via SSL. Port defaults to 443. VERSION is optional, and prevents"));
1472 printf (" %s\n", _("auto-negotiation (1 = TLSv1, 2 = SSLv2, 3 = SSLv3).")); 1530 printf (" %s\n", _("auto-negotiation (2 = SSLv2, 3 = SSLv3, 1 = TLSv1, 1.1 = TLSv1.1,"));
1531 printf (" %s\n", _("1.2 = TLSv1.2). With a '+' suffix, newer versions are also accepted."));
1473 printf (" %s\n", "--sni"); 1532 printf (" %s\n", "--sni");
1474 printf (" %s\n", _("Enable SSL/TLS hostname extension support (SNI)")); 1533 printf (" %s\n", _("Enable SSL/TLS hostname extension support (SNI)"));
1475 printf (" %s\n", "-C, --certificate=INTEGER[,INTEGER]"); 1534 printf (" %s\n", "-C, --certificate=INTEGER[,INTEGER]");
@@ -1496,7 +1555,7 @@ print_help (void)
1496 printf (" %s\n", _("URL to GET or POST (default: /)")); 1555 printf (" %s\n", _("URL to GET or POST (default: /)"));
1497 printf (" %s\n", "-P, --post=STRING"); 1556 printf (" %s\n", "-P, --post=STRING");
1498 printf (" %s\n", _("URL encoded http POST data")); 1557 printf (" %s\n", _("URL encoded http POST data"));
1499 printf (" %s\n", "-j, --method=STRING (for example: HEAD, OPTIONS, TRACE, PUT, DELETE)"); 1558 printf (" %s\n", "-j, --method=STRING (for example: HEAD, OPTIONS, TRACE, PUT, DELETE, CONNECT)");
1500 printf (" %s\n", _("Set HTTP method.")); 1559 printf (" %s\n", _("Set HTTP method."));
1501 printf (" %s\n", "-N, --no-body"); 1560 printf (" %s\n", "-N, --no-body");
1502 printf (" %s\n", _("Don't wait for document body: stop reading after headers.")); 1561 printf (" %s\n", _("Don't wait for document body: stop reading after headers."));
@@ -1570,7 +1629,7 @@ print_help (void)
1570 printf (" %s\n", _("When the certificate of 'www.verisign.com' is valid for more than 14 days,")); 1629 printf (" %s\n", _("When the certificate of 'www.verisign.com' is valid for more than 14 days,"));
1571 printf (" %s\n", _("a STATE_OK is returned. When the certificate is still valid, but for less than")); 1630 printf (" %s\n", _("a STATE_OK is returned. When the certificate is still valid, but for less than"));
1572 printf (" %s\n", _("14 days, a STATE_WARNING is returned. A STATE_CRITICAL will be returned when")); 1631 printf (" %s\n", _("14 days, a STATE_WARNING is returned. A STATE_CRITICAL will be returned when"));
1573 printf (" %s\n", _("the certificate is expired.")); 1632 printf (" %s\n\n", _("the certificate is expired."));
1574 printf ("\n"); 1633 printf ("\n");
1575 printf (" %s\n\n", "CHECK CERTIFICATE: check_http -H www.verisign.com -C 30,14"); 1634 printf (" %s\n\n", "CHECK CERTIFICATE: check_http -H www.verisign.com -C 30,14");
1576 printf (" %s\n", _("When the certificate of 'www.verisign.com' is valid for more than 30 days,")); 1635 printf (" %s\n", _("When the certificate of 'www.verisign.com' is valid for more than 30 days,"));
@@ -1578,6 +1637,13 @@ print_help (void)
1578 printf (" %s\n", _("30 days, but more than 14 days, a STATE_WARNING is returned.")); 1637 printf (" %s\n", _("30 days, but more than 14 days, a STATE_WARNING is returned."));
1579 printf (" %s\n", _("A STATE_CRITICAL will be returned when certificate expires in less than 14 days")); 1638 printf (" %s\n", _("A STATE_CRITICAL will be returned when certificate expires in less than 14 days"));
1580 1639
1640 printf (" %s\n\n", "CHECK SSL WEBSERVER CONTENT VIA PROXY USING HTTP 1.1 CONNECT: ");
1641 printf (" %s\n", _("check_http -I 192.168.100.35 -p 80 -u https://www.verisign.com/ -S -j CONNECT -H www.verisign.com "));
1642 printf (" %s\n", _("all these options are needed: -I <proxy> -p <proxy-port> -u <check-url> -S(sl) -j CONNECT -H <webserver>"));
1643 printf (" %s\n", _("a STATE_OK will be returned. When the server returns its content but exceeds"));
1644 printf (" %s\n", _("the 5-second threshold, a STATE_WARNING will be returned. When an error occurs,"));
1645 printf (" %s\n", _("a STATE_CRITICAL will be returned."));
1646
1581#endif 1647#endif
1582 1648
1583 printf (UT_SUPPORT); 1649 printf (UT_SUPPORT);
diff --git a/plugins/check_ide_smart.c b/plugins/check_ide_smart.c
index 47605e96..8d540ca1 100644
--- a/plugins/check_ide_smart.c
+++ b/plugins/check_ide_smart.c
@@ -234,10 +234,10 @@ main (int argc, char *argv[])
234 break; 234 break;
235 case 'h': 235 case 'h':
236 print_help (); 236 print_help ();
237 return STATE_OK; 237 return STATE_UNKNOWN;
238 case 'V': 238 case 'V':
239 print_revision (progname, NP_VERSION); 239 print_revision (progname, NP_VERSION);
240 return STATE_OK; 240 return STATE_UNKNOWN;
241 default: 241 default:
242 usage5 (); 242 usage5 ();
243 } 243 }
@@ -249,7 +249,7 @@ main (int argc, char *argv[])
249 249
250 if (!device) { 250 if (!device) {
251 print_help (); 251 print_help ();
252 return STATE_OK; 252 return STATE_UNKNOWN;
253 } 253 }
254 254
255 fd = open (device, OPEN_MODE); 255 fd = open (device, OPEN_MODE);
diff --git a/plugins/check_ldap.c b/plugins/check_ldap.c
index c371be97..66be4b46 100644
--- a/plugins/check_ldap.c
+++ b/plugins/check_ldap.c
@@ -1,29 +1,29 @@
1/***************************************************************************** 1/*****************************************************************************
2* 2*
3* Monitoring check_ldap plugin 3* Monitoring check_ldap plugin
4* 4*
5* License: GPL 5* License: GPL
6* Copyright (c) 2000-2008 Monitoring Plugins Development Team 6* Copyright (c) 2000-2008 Monitoring Plugins Development Team
7* 7*
8* Description: 8* Description:
9* 9*
10* This file contains the check_ldap plugin 10* This file contains the check_ldap 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* 26*
27*****************************************************************************/ 27*****************************************************************************/
28 28
29/* progname may be check_ldaps */ 29/* progname may be check_ldaps */
@@ -67,7 +67,10 @@ int ld_protocol = DEFAULT_PROTOCOL;
67#endif 67#endif
68double warn_time = UNDEFINED; 68double warn_time = UNDEFINED;
69double crit_time = UNDEFINED; 69double crit_time = UNDEFINED;
70thresholds *entries_thresholds = NULL;
70struct timeval tv; 71struct timeval tv;
72char* warn_entries = NULL;
73char* crit_entries = NULL;
71int starttls = FALSE; 74int starttls = FALSE;
72int ssl_on_connect = FALSE; 75int ssl_on_connect = FALSE;
73int verbose = 0; 76int verbose = 0;
@@ -94,6 +97,12 @@ main (int argc, char *argv[])
94 int tls; 97 int tls;
95 int version=3; 98 int version=3;
96 99
100 /* for entry counting */
101
102 LDAPMessage *next_entry;
103 int status_entries = STATE_OK;
104 int num_entries = 0;
105
97 setlocale (LC_ALL, ""); 106 setlocale (LC_ALL, "");
98 bindtextdomain (PACKAGE, LOCALEDIR); 107 bindtextdomain (PACKAGE, LOCALEDIR);
99 textdomain (PACKAGE); 108 textdomain (PACKAGE);
@@ -197,12 +206,14 @@ main (int argc, char *argv[])
197 } 206 }
198 207
199 /* do a search of all objectclasses in the base dn */ 208 /* do a search of all objectclasses in the base dn */
200 if (ldap_search_s (ld, ld_base, LDAP_SCOPE_BASE, ld_attr, NULL, 0, &result) 209 if (ldap_search_s (ld, ld_base, (crit_entries!=NULL || warn_entries!=NULL) ? LDAP_SCOPE_SUBTREE : LDAP_SCOPE_BASE, ld_attr, NULL, 0, &result)
201 != LDAP_SUCCESS) { 210 != LDAP_SUCCESS) {
202 if (verbose) 211 if (verbose)
203 ldap_perror(ld, "ldap_search"); 212 ldap_perror(ld, "ldap_search");
204 printf (_("Could not search/find objectclasses in %s\n"), ld_base); 213 printf (_("Could not search/find objectclasses in %s\n"), ld_base);
205 return STATE_CRITICAL; 214 return STATE_CRITICAL;
215 } else if (crit_entries!=NULL || warn_entries!=NULL) {
216 num_entries = ldap_count_entries(ld, result);
206 } 217 }
207 218
208 /* unbind from the ldap server */ 219 /* unbind from the ldap server */
@@ -223,14 +234,42 @@ main (int argc, char *argv[])
223 else 234 else
224 status = STATE_OK; 235 status = STATE_OK;
225 236
237 if(entries_thresholds != NULL) {
238 if (verbose) {
239 printf ("entries found: %d\n", num_entries);
240 print_thresholds("entry threasholds", entries_thresholds);
241 }
242 status_entries = get_status(num_entries, entries_thresholds);
243 if (status_entries == STATE_CRITICAL) {
244 status = STATE_CRITICAL;
245 } else if (status != STATE_CRITICAL) {
246 status = status_entries;
247 }
248 }
249
226 /* print out the result */ 250 /* print out the result */
227 printf (_("LDAP %s - %.3f seconds response time|%s\n"), 251 if (crit_entries!=NULL || warn_entries!=NULL) {
228 state_text (status), 252 printf (_("LDAP %s - found %d entries in %.3f seconds|%s %s\n"),
229 elapsed_time, 253 state_text (status),
230 fperfdata ("time", elapsed_time, "s", 254 num_entries,
231 (int)warn_time, warn_time, 255 elapsed_time,
232 (int)crit_time, crit_time, 256 fperfdata ("time", elapsed_time, "s",
233 TRUE, 0, FALSE, 0)); 257 (int)warn_time, warn_time,
258 (int)crit_time, crit_time,
259 TRUE, 0, FALSE, 0),
260 sperfdata ("entries", (double)num_entries, "",
261 warn_entries,
262 crit_entries,
263 TRUE, 0.0, FALSE, 0.0));
264 } else {
265 printf (_("LDAP %s - %.3f seconds response time|%s\n"),
266 state_text (status),
267 elapsed_time,
268 fperfdata ("time", elapsed_time, "s",
269 (int)warn_time, warn_time,
270 (int)crit_time, crit_time,
271 TRUE, 0, FALSE, 0));
272 }
234 273
235 return status; 274 return status;
236} 275}
@@ -263,6 +302,8 @@ process_arguments (int argc, char **argv)
263 {"port", required_argument, 0, 'p'}, 302 {"port", required_argument, 0, 'p'},
264 {"warn", required_argument, 0, 'w'}, 303 {"warn", required_argument, 0, 'w'},
265 {"crit", required_argument, 0, 'c'}, 304 {"crit", required_argument, 0, 'c'},
305 {"warn-entries", required_argument, 0, 'W'},
306 {"crit-entries", required_argument, 0, 'C'},
266 {"verbose", no_argument, 0, 'v'}, 307 {"verbose", no_argument, 0, 'v'},
267 {0, 0, 0, 0} 308 {0, 0, 0, 0}
268 }; 309 };
@@ -276,7 +317,7 @@ process_arguments (int argc, char **argv)
276 } 317 }
277 318
278 while (1) { 319 while (1) {
279 c = getopt_long (argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:", longopts, &option); 320 c = getopt_long (argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:C:W:", longopts, &option);
280 321
281 if (c == -1 || c == EOF) 322 if (c == -1 || c == EOF)
282 break; 323 break;
@@ -284,10 +325,10 @@ process_arguments (int argc, char **argv)
284 switch (c) { 325 switch (c) {
285 case 'h': /* help */ 326 case 'h': /* help */
286 print_help (); 327 print_help ();
287 exit (STATE_OK); 328 exit (STATE_UNKNOWN);
288 case 'V': /* version */ 329 case 'V': /* version */
289 print_revision (progname, NP_VERSION); 330 print_revision (progname, NP_VERSION);
290 exit (STATE_OK); 331 exit (STATE_UNKNOWN);
291 case 't': /* timeout period */ 332 case 't': /* timeout period */
292 if (!is_intnonneg (optarg)) 333 if (!is_intnonneg (optarg))
293 usage2 (_("Timeout interval must be a positive integer"), optarg); 334 usage2 (_("Timeout interval must be a positive integer"), optarg);
@@ -318,6 +359,12 @@ process_arguments (int argc, char **argv)
318 case 'c': 359 case 'c':
319 crit_time = strtod (optarg, NULL); 360 crit_time = strtod (optarg, NULL);
320 break; 361 break;
362 case 'W':
363 warn_entries = optarg;
364 break;
365 case 'C':
366 crit_entries = optarg;
367 break;
321#ifdef HAVE_LDAP_SET_OPTION 368#ifdef HAVE_LDAP_SET_OPTION
322 case '2': 369 case '2':
323 ld_protocol = 2; 370 ld_protocol = 2;
@@ -381,6 +428,10 @@ validate_arguments ()
381 if (ld_base==NULL) 428 if (ld_base==NULL)
382 usage4 (_("Please specify the LDAP base\n")); 429 usage4 (_("Please specify the LDAP base\n"));
383 430
431 if (crit_entries!=NULL || warn_entries!=NULL) {
432 set_thresholds(&entries_thresholds,
433 warn_entries, crit_entries);
434 }
384 return OK; 435 return OK;
385} 436}
386 437
@@ -430,6 +481,11 @@ print_help (void)
430 481
431 printf (UT_WARN_CRIT); 482 printf (UT_WARN_CRIT);
432 483
484 printf (" %s\n", "-W [--warn-entries]");
485 printf (" %s\n", _("Number of found entries to result in warning status"));
486 printf (" %s\n", "-C [--crit-entries]");
487 printf (" %s\n", _("Number of found entries to result in critical status"));
488
433 printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); 489 printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
434 490
435 printf (UT_VERBOSE); 491 printf (UT_VERBOSE);
@@ -441,6 +497,7 @@ print_help (void)
441 printf (" %s\n", _("'SSL on connect' will be used no matter how the plugin was called.")); 497 printf (" %s\n", _("'SSL on connect' will be used no matter how the plugin was called."));
442 printf (" %s\n", _("This detection is deprecated, please use 'check_ldap' with the '--starttls' or '--ssl' flags")); 498 printf (" %s\n", _("This detection is deprecated, please use 'check_ldap' with the '--starttls' or '--ssl' flags"));
443 printf (" %s\n", _("to define the behaviour explicitly instead.")); 499 printf (" %s\n", _("to define the behaviour explicitly instead."));
500 printf (" %s\n", _("The parameters --warn-entries and --crit-entries are optional."));
444 501
445 printf (UT_SUPPORT); 502 printf (UT_SUPPORT);
446} 503}
diff --git a/plugins/check_load.c b/plugins/check_load.c
index cde63e56..a96435f4 100644
--- a/plugins/check_load.c
+++ b/plugins/check_load.c
@@ -251,10 +251,10 @@ process_arguments (int argc, char **argv)
251 break; 251 break;
252 case 'V': /* version */ 252 case 'V': /* version */
253 print_revision (progname, NP_VERSION); 253 print_revision (progname, NP_VERSION);
254 exit (STATE_OK); 254 exit (STATE_UNKNOWN);
255 case 'h': /* help */ 255 case 'h': /* help */
256 print_help (); 256 print_help ();
257 exit (STATE_OK); 257 exit (STATE_UNKNOWN);
258 case '?': /* help */ 258 case '?': /* help */
259 usage5 (); 259 usage5 ();
260 } 260 }
diff --git a/plugins/check_mrtg.c b/plugins/check_mrtg.c
index cf3fe044..1fda5492 100644
--- a/plugins/check_mrtg.c
+++ b/plugins/check_mrtg.c
@@ -234,10 +234,10 @@ process_arguments (int argc, char **argv)
234 break; 234 break;
235 case 'V': /* version */ 235 case 'V': /* version */
236 print_revision (progname, NP_VERSION); 236 print_revision (progname, NP_VERSION);
237 exit (STATE_OK); 237 exit (STATE_UNKNOWN);
238 case 'h': /* help */ 238 case 'h': /* help */
239 print_help (); 239 print_help ();
240 exit (STATE_OK); 240 exit (STATE_UNKNOWN);
241 case '?': /* help */ 241 case '?': /* help */
242 usage5 (); 242 usage5 ();
243 } 243 }
diff --git a/plugins/check_mrtgtraf.c b/plugins/check_mrtgtraf.c
index 3b038cf1..eb66f622 100644
--- a/plugins/check_mrtgtraf.c
+++ b/plugins/check_mrtgtraf.c
@@ -270,10 +270,10 @@ process_arguments (int argc, char **argv)
270 break; 270 break;
271 case 'V': /* version */ 271 case 'V': /* version */
272 print_revision (progname, NP_VERSION); 272 print_revision (progname, NP_VERSION);
273 exit (STATE_OK); 273 exit (STATE_UNKNOWN);
274 case 'h': /* help */ 274 case 'h': /* help */
275 print_help (); 275 print_help ();
276 exit (STATE_OK); 276 exit (STATE_UNKNOWN);
277 case '?': /* help */ 277 case '?': /* help */
278 usage5 (); 278 usage5 ();
279 } 279 }
diff --git a/plugins/check_mysql.c b/plugins/check_mysql.c
index 216626bc..5773afd9 100644
--- a/plugins/check_mysql.c
+++ b/plugins/check_mysql.c
@@ -444,10 +444,10 @@ process_arguments (int argc, char **argv)
444 break; 444 break;
445 case 'V': /* version */ 445 case 'V': /* version */
446 print_revision (progname, NP_VERSION); 446 print_revision (progname, NP_VERSION);
447 exit (STATE_OK); 447 exit (STATE_UNKNOWN);
448 case 'h': /* help */ 448 case 'h': /* help */
449 print_help (); 449 print_help ();
450 exit (STATE_OK); 450 exit (STATE_UNKNOWN);
451 case 'v': 451 case 'v':
452 verbose++; 452 verbose++;
453 break; 453 break;
diff --git a/plugins/check_mysql_query.c b/plugins/check_mysql_query.c
index 71ab7768..49a14dd3 100644
--- a/plugins/check_mysql_query.c
+++ b/plugins/check_mysql_query.c
@@ -250,10 +250,10 @@ process_arguments (int argc, char **argv)
250 break; 250 break;
251 case 'V': /* version */ 251 case 'V': /* version */
252 print_revision (progname, NP_VERSION); 252 print_revision (progname, NP_VERSION);
253 exit (STATE_OK); 253 exit (STATE_UNKNOWN);
254 case 'h': /* help */ 254 case 'h': /* help */
255 print_help (); 255 print_help ();
256 exit (STATE_OK); 256 exit (STATE_UNKNOWN);
257 case 'q': 257 case 'q':
258 xasprintf(&sql_query, "%s", optarg); 258 xasprintf(&sql_query, "%s", optarg);
259 break; 259 break;
diff --git a/plugins/check_nagios.c b/plugins/check_nagios.c
index 791b6dbe..40d68f03 100644
--- a/plugins/check_nagios.c
+++ b/plugins/check_nagios.c
@@ -235,10 +235,10 @@ process_arguments (int argc, char **argv)
235 switch (c) { 235 switch (c) {
236 case 'h': /* help */ 236 case 'h': /* help */
237 print_help (); 237 print_help ();
238 exit (STATE_OK); 238 exit (STATE_UNKNOWN);
239 case 'V': /* version */ 239 case 'V': /* version */
240 print_revision (progname, NP_VERSION); 240 print_revision (progname, NP_VERSION);
241 exit (STATE_OK); 241 exit (STATE_UNKNOWN);
242 case 'F': /* status log */ 242 case 'F': /* status log */
243 status_log = optarg; 243 status_log = optarg;
244 break; 244 break;
diff --git a/plugins/check_nt.c b/plugins/check_nt.c
index f621b0a8..59c135db 100644
--- a/plugins/check_nt.c
+++ b/plugins/check_nt.c
@@ -553,10 +553,10 @@ int process_arguments(int argc, char **argv){
553 usage5 (); 553 usage5 ();
554 case 'h': /* help */ 554 case 'h': /* help */
555 print_help(); 555 print_help();
556 exit(STATE_OK); 556 exit(STATE_UNKNOWN);
557 case 'V': /* version */ 557 case 'V': /* version */
558 print_revision(progname, NP_VERSION); 558 print_revision(progname, NP_VERSION);
559 exit(STATE_OK); 559 exit(STATE_UNKNOWN);
560 case 'H': /* hostname */ 560 case 'H': /* hostname */
561 server_address = optarg; 561 server_address = optarg;
562 break; 562 break;
diff --git a/plugins/check_ntp.c b/plugins/check_ntp.c
index 74501711..5ac6c65b 100644
--- a/plugins/check_ntp.c
+++ b/plugins/check_ntp.c
@@ -689,11 +689,11 @@ int process_arguments(int argc, char **argv){
689 switch (c) { 689 switch (c) {
690 case 'h': 690 case 'h':
691 print_help(); 691 print_help();
692 exit(STATE_OK); 692 exit(STATE_UNKNOWN);
693 break; 693 break;
694 case 'V': 694 case 'V':
695 print_revision(progname, NP_VERSION); 695 print_revision(progname, NP_VERSION);
696 exit(STATE_OK); 696 exit(STATE_UNKNOWN);
697 break; 697 break;
698 case 'v': 698 case 'v':
699 verbose++; 699 verbose++;
diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c
index 44424af5..c656b0f5 100644
--- a/plugins/check_ntp_peer.c
+++ b/plugins/check_ntp_peer.c
@@ -448,11 +448,11 @@ int process_arguments(int argc, char **argv){
448 switch (c) { 448 switch (c) {
449 case 'h': 449 case 'h':
450 print_help(); 450 print_help();
451 exit(STATE_OK); 451 exit(STATE_UNKNOWN);
452 break; 452 break;
453 case 'V': 453 case 'V':
454 print_revision(progname, NP_VERSION); 454 print_revision(progname, NP_VERSION);
455 exit(STATE_OK); 455 exit(STATE_UNKNOWN);
456 break; 456 break;
457 case 'v': 457 case 'v':
458 verbose++; 458 verbose++;
diff --git a/plugins/check_ntp_time.c b/plugins/check_ntp_time.c
index e344f8b7..1cc8cbfb 100644
--- a/plugins/check_ntp_time.c
+++ b/plugins/check_ntp_time.c
@@ -244,7 +244,7 @@ void setup_request(ntp_message *p){
244 * this is done by filtering servers based on stratum, dispersion, and 244 * this is done by filtering servers based on stratum, dispersion, and
245 * finally round-trip delay. */ 245 * finally round-trip delay. */
246int best_offset_server(const ntp_server_results *slist, int nservers){ 246int best_offset_server(const ntp_server_results *slist, int nservers){
247 int i=0, cserver=0, best_server=-1; 247 int cserver=0, best_server=-1;
248 248
249 /* for each server */ 249 /* for each server */
250 for(cserver=0; cserver<nservers; cserver++){ 250 for(cserver=0; cserver<nservers; cserver++){
@@ -303,7 +303,7 @@ int best_offset_server(const ntp_server_results *slist, int nservers){
303 * we have to do it in a way that our lazy macros don't handle currently :( */ 303 * we have to do it in a way that our lazy macros don't handle currently :( */
304double offset_request(const char *host, int *status){ 304double offset_request(const char *host, int *status){
305 int i=0, j=0, ga_result=0, num_hosts=0, *socklist=NULL, respnum=0; 305 int i=0, j=0, ga_result=0, num_hosts=0, *socklist=NULL, respnum=0;
306 int servers_completed=0, one_written=0, one_read=0, servers_readable=0, best_index=-1; 306 int servers_completed=0, one_read=0, servers_readable=0, best_index=-1;
307 time_t now_time=0, start_ts=0; 307 time_t now_time=0, start_ts=0;
308 ntp_message *req=NULL; 308 ntp_message *req=NULL;
309 double avg_offset=0.; 309 double avg_offset=0.;
@@ -368,7 +368,6 @@ double offset_request(const char *host, int *status){
368 * been touched in the past second or so and is still lacking 368 * been touched in the past second or so and is still lacking
369 * some responses. For each of these servers, send a new request, 369 * some responses. For each of these servers, send a new request,
370 * and update the "waiting" timestamp with the current time. */ 370 * and update the "waiting" timestamp with the current time. */
371 one_written=0;
372 now_time=time(NULL); 371 now_time=time(NULL);
373 372
374 for(i=0; i<num_hosts; i++){ 373 for(i=0; i<num_hosts; i++){
@@ -378,7 +377,6 @@ double offset_request(const char *host, int *status){
378 setup_request(&req[i]); 377 setup_request(&req[i]);
379 write(socklist[i], &req[i], sizeof(ntp_message)); 378 write(socklist[i], &req[i], sizeof(ntp_message));
380 servers[i].waiting=now_time; 379 servers[i].waiting=now_time;
381 one_written=1;
382 break; 380 break;
383 } 381 }
384 } 382 }
@@ -477,11 +475,11 @@ int process_arguments(int argc, char **argv){
477 switch (c) { 475 switch (c) {
478 case 'h': 476 case 'h':
479 print_help(); 477 print_help();
480 exit(STATE_OK); 478 exit(STATE_UNKNOWN);
481 break; 479 break;
482 case 'V': 480 case 'V':
483 print_revision(progname, NP_VERSION); 481 print_revision(progname, NP_VERSION);
484 exit(STATE_OK); 482 exit(STATE_UNKNOWN);
485 break; 483 break;
486 case 'v': 484 case 'v':
487 verbose++; 485 verbose++;
diff --git a/plugins/check_nwstat.c b/plugins/check_nwstat.c
index 1a7bfa16..e7e8de05 100644
--- a/plugins/check_nwstat.c
+++ b/plugins/check_nwstat.c
@@ -1354,10 +1354,10 @@ int process_arguments(int argc, char **argv) {
1354 usage5 (); 1354 usage5 ();
1355 case 'h': /* help */ 1355 case 'h': /* help */
1356 print_help(); 1356 print_help();
1357 exit(STATE_OK); 1357 exit(STATE_UNKNOWN);
1358 case 'V': /* version */ 1358 case 'V': /* version */
1359 print_revision(progname, NP_VERSION); 1359 print_revision(progname, NP_VERSION);
1360 exit(STATE_OK); 1360 exit(STATE_UNKNOWN);
1361 case 'H': /* hostname */ 1361 case 'H': /* hostname */
1362 server_address=optarg; 1362 server_address=optarg;
1363 break; 1363 break;
diff --git a/plugins/check_overcr.c b/plugins/check_overcr.c
index af5eb9b9..9a4d25fa 100644
--- a/plugins/check_overcr.c
+++ b/plugins/check_overcr.c
@@ -340,10 +340,10 @@ process_arguments (int argc, char **argv)
340 usage5 (); 340 usage5 ();
341 case 'h': /* help */ 341 case 'h': /* help */
342 print_help (); 342 print_help ();
343 exit (STATE_OK); 343 exit (STATE_UNKNOWN);
344 case 'V': /* version */ 344 case 'V': /* version */
345 print_revision (progname, NP_VERSION); 345 print_revision (progname, NP_VERSION);
346 exit (STATE_OK); 346 exit (STATE_UNKNOWN);
347 case 'H': /* hostname */ 347 case 'H': /* hostname */
348 server_address = optarg; 348 server_address = optarg;
349 break; 349 break;
diff --git a/plugins/check_pgsql.c b/plugins/check_pgsql.c
index 9bad1ec5..2eb699e8 100644
--- a/plugins/check_pgsql.c
+++ b/plugins/check_pgsql.c
@@ -302,10 +302,10 @@ process_arguments (int argc, char **argv)
302 usage5 (); 302 usage5 ();
303 case 'h': /* help */ 303 case 'h': /* help */
304 print_help (); 304 print_help ();
305 exit (STATE_OK); 305 exit (STATE_UNKNOWN);
306 case 'V': /* version */ 306 case 'V': /* version */
307 print_revision (progname, NP_VERSION); 307 print_revision (progname, NP_VERSION);
308 exit (STATE_OK); 308 exit (STATE_UNKNOWN);
309 case 't': /* timeout period */ 309 case 't': /* timeout period */
310 if (!is_integer (optarg)) 310 if (!is_integer (optarg))
311 usage2 (_("Timeout interval must be a positive integer"), optarg); 311 usage2 (_("Timeout interval must be a positive integer"), optarg);
diff --git a/plugins/check_ping.c b/plugins/check_ping.c
index dbc5c3e4..423ecbe5 100644
--- a/plugins/check_ping.c
+++ b/plugins/check_ping.c
@@ -224,11 +224,11 @@ process_arguments (int argc, char **argv)
224 usage5 (); 224 usage5 ();
225 case 'h': /* help */ 225 case 'h': /* help */
226 print_help (); 226 print_help ();
227 exit (STATE_OK); 227 exit (STATE_UNKNOWN);
228 break; 228 break;
229 case 'V': /* version */ 229 case 'V': /* version */
230 print_revision (progname, NP_VERSION); 230 print_revision (progname, NP_VERSION);
231 exit (STATE_OK); 231 exit (STATE_UNKNOWN);
232 break; 232 break;
233 case 't': /* timeout period */ 233 case 't': /* timeout period */
234 timeout_interval = atoi (optarg); 234 timeout_interval = atoi (optarg);
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index 402aac53..4bcc56bc 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -428,10 +428,10 @@ process_arguments (int argc, char **argv)
428 usage5 (); 428 usage5 ();
429 case 'h': /* help */ 429 case 'h': /* help */
430 print_help (); 430 print_help ();
431 exit (STATE_OK); 431 exit (STATE_UNKNOWN);
432 case 'V': /* version */ 432 case 'V': /* version */
433 print_revision (progname, NP_VERSION); 433 print_revision (progname, NP_VERSION);
434 exit (STATE_OK); 434 exit (STATE_UNKNOWN);
435 case 't': /* timeout period */ 435 case 't': /* timeout period */
436 if (!is_integer (optarg)) 436 if (!is_integer (optarg))
437 usage2 (_("Timeout interval must be a positive integer"), optarg); 437 usage2 (_("Timeout interval must be a positive integer"), optarg);
diff --git a/plugins/check_radius.c b/plugins/check_radius.c
index b2943475..03cbb8b0 100644
--- a/plugins/check_radius.c
+++ b/plugins/check_radius.c
@@ -259,10 +259,10 @@ process_arguments (int argc, char **argv)
259 usage5 (); 259 usage5 ();
260 case 'h': /* help */ 260 case 'h': /* help */
261 print_help (); 261 print_help ();
262 exit (OK); 262 exit (STATE_UNKNOWN);
263 case 'V': /* version */ 263 case 'V': /* version */
264 print_revision (progname, NP_VERSION); 264 print_revision (progname, NP_VERSION);
265 exit (OK); 265 exit (STATE_UNKNOWN);
266 case 'v': /* verbose mode */ 266 case 'v': /* verbose mode */
267 verbose = TRUE; 267 verbose = TRUE;
268 break; 268 break;
diff --git a/plugins/check_real.c b/plugins/check_real.c
index 00bd4d20..6491e6e9 100644
--- a/plugins/check_real.c
+++ b/plugins/check_real.c
@@ -359,10 +359,10 @@ process_arguments (int argc, char **argv)
359 break; 359 break;
360 case 'V': /* version */ 360 case 'V': /* version */
361 print_revision (progname, NP_VERSION); 361 print_revision (progname, NP_VERSION);
362 exit (STATE_OK); 362 exit (STATE_UNKNOWN);
363 case 'h': /* help */ 363 case 'h': /* help */
364 print_help (); 364 print_help ();
365 exit (STATE_OK); 365 exit (STATE_UNKNOWN);
366 case '?': /* usage */ 366 case '?': /* usage */
367 usage5 (); 367 usage5 ();
368 } 368 }
diff --git a/plugins/check_smtp.c b/plugins/check_smtp.c
index 24304534..1996c6d3 100644
--- a/plugins/check_smtp.c
+++ b/plugins/check_smtp.c
@@ -231,7 +231,7 @@ main (int argc, char **argv)
231 send(sd, SMTP_STARTTLS, strlen(SMTP_STARTTLS), 0); 231 send(sd, SMTP_STARTTLS, strlen(SMTP_STARTTLS), 0);
232 232
233 recvlines(buffer, MAX_INPUT_BUFFER); /* wait for it */ 233 recvlines(buffer, MAX_INPUT_BUFFER); /* wait for it */
234 if (!strstr (buffer, server_expect)) { 234 if (!strstr (buffer, SMTP_EXPECT)) {
235 printf (_("Server does not support STARTTLS\n")); 235 printf (_("Server does not support STARTTLS\n"));
236 smtp_quit(); 236 smtp_quit();
237 return STATE_UNKNOWN; 237 return STATE_UNKNOWN;
@@ -276,6 +276,7 @@ main (int argc, char **argv)
276# ifdef USE_OPENSSL 276# ifdef USE_OPENSSL
277 if ( check_cert ) { 277 if ( check_cert ) {
278 result = np_net_ssl_check_cert(days_till_exp_warn, days_till_exp_crit); 278 result = np_net_ssl_check_cert(days_till_exp_warn, days_till_exp_crit);
279 smtp_quit();
279 my_close(); 280 my_close();
280 return result; 281 return result;
281 } 282 }
@@ -581,11 +582,6 @@ process_arguments (int argc, char **argv)
581 usage4 (_("Timeout interval must be a positive integer")); 582 usage4 (_("Timeout interval must be a positive integer"));
582 } 583 }
583 break; 584 break;
584 case 'S':
585 /* starttls */
586 use_ssl = TRUE;
587 use_ehlo = TRUE;
588 break;
589 case 'D': 585 case 'D':
590 /* Check SSL cert validity */ 586 /* Check SSL cert validity */
591#ifdef USE_OPENSSL 587#ifdef USE_OPENSSL
@@ -607,9 +603,14 @@ process_arguments (int argc, char **argv)
607 days_till_exp_warn = atoi (optarg); 603 days_till_exp_warn = atoi (optarg);
608 } 604 }
609 check_cert = TRUE; 605 check_cert = TRUE;
606 ignore_send_quit_failure = TRUE;
610#else 607#else
611 usage (_("SSL support not available - install OpenSSL and recompile")); 608 usage (_("SSL support not available - install OpenSSL and recompile"));
612#endif 609#endif
610 case 'S':
611 /* starttls */
612 use_ssl = TRUE;
613 use_ehlo = TRUE;
613 break; 614 break;
614 case '4': 615 case '4':
615 address_family = AF_INET; 616 address_family = AF_INET;
@@ -623,10 +624,10 @@ process_arguments (int argc, char **argv)
623 break; 624 break;
624 case 'V': /* version */ 625 case 'V': /* version */
625 print_revision (progname, NP_VERSION); 626 print_revision (progname, NP_VERSION);
626 exit (STATE_OK); 627 exit (STATE_UNKNOWN);
627 case 'h': /* help */ 628 case 'h': /* help */
628 print_help (); 629 print_help ();
629 exit (STATE_OK); 630 exit (STATE_UNKNOWN);
630 case '?': /* help */ 631 case '?': /* help */
631 usage5 (); 632 usage5 ();
632 } 633 }
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 9d966faa..da9638c4 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -41,7 +41,6 @@ const char *email = "devel@monitoring-plugins.org";
41#define DEFAULT_PORT "161" 41#define DEFAULT_PORT "161"
42#define DEFAULT_MIBLIST "ALL" 42#define DEFAULT_MIBLIST "ALL"
43#define DEFAULT_PROTOCOL "1" 43#define DEFAULT_PROTOCOL "1"
44#define DEFAULT_TIMEOUT 1
45#define DEFAULT_RETRIES 5 44#define DEFAULT_RETRIES 5
46#define DEFAULT_AUTH_PROTOCOL "MD5" 45#define DEFAULT_AUTH_PROTOCOL "MD5"
47#define DEFAULT_PRIV_PROTOCOL "DES" 46#define DEFAULT_PRIV_PROTOCOL "DES"
@@ -153,7 +152,7 @@ state_data *previous_state;
153double *previous_value; 152double *previous_value;
154size_t previous_size = OID_COUNT_STEP; 153size_t previous_size = OID_COUNT_STEP;
155int perf_labels = 1; 154int perf_labels = 1;
156 155char* ip_version = "";
157 156
158static char *fix_snmp_range(char *th) 157static char *fix_snmp_range(char *th)
159{ 158{
@@ -227,7 +226,7 @@ main (int argc, char **argv)
227 outbuff = strdup (""); 226 outbuff = strdup ("");
228 delimiter = strdup (" = "); 227 delimiter = strdup (" = ");
229 output_delim = strdup (DEFAULT_OUTPUT_DELIMITER); 228 output_delim = strdup (DEFAULT_OUTPUT_DELIMITER);
230 timeout_interval = DEFAULT_TIMEOUT; 229 timeout_interval = DEFAULT_SOCKET_TIMEOUT;
231 retries = DEFAULT_RETRIES; 230 retries = DEFAULT_RETRIES;
232 231
233 np_init( (char *) progname, argc, argv ); 232 np_init( (char *) progname, argc, argv );
@@ -418,6 +417,9 @@ main (int argc, char **argv)
418 else if (strstr (response, "INTEGER: ")) { 417 else if (strstr (response, "INTEGER: ")) {
419 show = strstr (response, "INTEGER: ") + 9; 418 show = strstr (response, "INTEGER: ") + 9;
420 } 419 }
420 else if (strstr (response, "OID: ")) {
421 show = strstr (response, "OID: ") + 5;
422 }
421 else if (strstr (response, "STRING: ")) { 423 else if (strstr (response, "STRING: ")) {
422 show = strstr (response, "STRING: ") + 8; 424 show = strstr (response, "STRING: ") + 8;
423 conv = "%.10g"; 425 conv = "%.10g";
@@ -678,6 +680,8 @@ process_arguments (int argc, char **argv)
678 {"offset", required_argument, 0, L_OFFSET}, 680 {"offset", required_argument, 0, L_OFFSET},
679 {"invert-search", no_argument, 0, L_INVERT_SEARCH}, 681 {"invert-search", no_argument, 0, L_INVERT_SEARCH},
680 {"perf-oids", no_argument, 0, 'O'}, 682 {"perf-oids", no_argument, 0, 'O'},
683 {"ipv4", no_argument, 0, '4'},
684 {"ipv6", no_argument, 0, '6'},
681 {0, 0, 0, 0} 685 {0, 0, 0, 0}
682 }; 686 };
683 687
@@ -695,7 +699,7 @@ process_arguments (int argc, char **argv)
695 } 699 }
696 700
697 while (1) { 701 while (1) {
698 c = getopt_long (argc, argv, "nhvVOt:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:N:L:U:a:x:A:X:", 702 c = getopt_long (argc, argv, "nhvVO46t:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:N:L:U:a:x:A:X:",
699 longopts, &option); 703 longopts, &option);
700 704
701 if (c == -1 || c == EOF) 705 if (c == -1 || c == EOF)
@@ -706,10 +710,10 @@ process_arguments (int argc, char **argv)
706 usage5 (); 710 usage5 ();
707 case 'h': /* help */ 711 case 'h': /* help */
708 print_help (); 712 print_help ();
709 exit (STATE_OK); 713 exit (STATE_UNKNOWN);
710 case 'V': /* version */ 714 case 'V': /* version */
711 print_revision (progname, NP_VERSION); 715 print_revision (progname, NP_VERSION);
712 exit (STATE_OK); 716 exit (STATE_UNKNOWN);
713 case 'v': /* verbose */ 717 case 'v': /* verbose */
714 verbose++; 718 verbose++;
715 break; 719 break;
@@ -920,6 +924,13 @@ process_arguments (int argc, char **argv)
920 case 'O': 924 case 'O':
921 perf_labels=0; 925 perf_labels=0;
922 break; 926 break;
927 case '4':
928 break;
929 case '6':
930 xasprintf(&ip_version, "udp6:");
931 if(verbose>2)
932 printf("IPv6 detected! Will pass \"udp6:\" to snmpget.\n");
933 break;
923 } 934 }
924 } 935 }
925 936
@@ -1125,6 +1136,7 @@ print_help (void)
1125 1136
1126 printf (UT_HELP_VRSN); 1137 printf (UT_HELP_VRSN);
1127 printf (UT_EXTRA_OPTS); 1138 printf (UT_EXTRA_OPTS);
1139 printf (UT_IPv46);
1128 1140
1129 printf (UT_HOST_PORT, 'p', DEFAULT_PORT); 1141 printf (UT_HOST_PORT, 'p', DEFAULT_PORT);
1130 1142
@@ -1243,5 +1255,5 @@ print_usage (void)
1243 printf ("[-C community] [-s string] [-r regex] [-R regexi] [-t timeout] [-e retries]\n"); 1255 printf ("[-C community] [-s string] [-r regex] [-R regexi] [-t timeout] [-e retries]\n");
1244 printf ("[-l label] [-u units] [-p port-number] [-d delimiter] [-D output-delimiter]\n"); 1256 printf ("[-l label] [-u units] [-p port-number] [-d delimiter] [-D output-delimiter]\n");
1245 printf ("[-m miblist] [-P snmp version] [-N context] [-L seclevel] [-U secname]\n"); 1257 printf ("[-m miblist] [-P snmp version] [-N context] [-L seclevel] [-U secname]\n");
1246 printf ("[-a authproto] [-A authpasswd] [-x privproto] [-X privpasswd]\n"); 1258 printf ("[-a authproto] [-A authpasswd] [-x privproto] [-X privpasswd] [-4|6]\n");
1247} 1259}
diff --git a/plugins/check_ssh.c b/plugins/check_ssh.c
index 3658965e..8ccbd5a7 100644
--- a/plugins/check_ssh.c
+++ b/plugins/check_ssh.c
@@ -128,10 +128,10 @@ process_arguments (int argc, char **argv)
128 usage5 (); 128 usage5 ();
129 case 'V': /* version */ 129 case 'V': /* version */
130 print_revision (progname, NP_VERSION); 130 print_revision (progname, NP_VERSION);
131 exit (STATE_OK); 131 exit (STATE_UNKNOWN);
132 case 'h': /* help */ 132 case 'h': /* help */
133 print_help (); 133 print_help ();
134 exit (STATE_OK); 134 exit (STATE_UNKNOWN);
135 case 'v': /* verbose */ 135 case 'v': /* verbose */
136 verbose = TRUE; 136 verbose = TRUE;
137 break; 137 break;
diff --git a/plugins/check_swap.c b/plugins/check_swap.c
index 25e0bacd..4d5a4071 100644
--- a/plugins/check_swap.c
+++ b/plugins/check_swap.c
@@ -470,10 +470,10 @@ process_arguments (int argc, char **argv)
470 break; 470 break;
471 case 'V': /* version */ 471 case 'V': /* version */
472 print_revision (progname, NP_VERSION); 472 print_revision (progname, NP_VERSION);
473 exit (STATE_OK); 473 exit (STATE_UNKNOWN);
474 case 'h': /* help */ 474 case 'h': /* help */
475 print_help (); 475 print_help ();
476 exit (STATE_OK); 476 exit (STATE_UNKNOWN);
477 case '?': /* error */ 477 case '?': /* error */
478 usage5 (); 478 usage5 ();
479 } 479 }
diff --git a/plugins/check_tcp.c b/plugins/check_tcp.c
index 63f9fd9c..6dc9aa96 100644
--- a/plugins/check_tcp.c
+++ b/plugins/check_tcp.c
@@ -237,7 +237,7 @@ main (int argc, char **argv)
237 gettimeofday (&tv, NULL); 237 gettimeofday (&tv, NULL);
238 238
239 result = np_net_connect (server_address, server_port, &sd, PROTOCOL); 239 result = np_net_connect (server_address, server_port, &sd, PROTOCOL);
240 if (result == STATE_CRITICAL) return STATE_CRITICAL; 240 if (result == STATE_CRITICAL) return econn_refuse_state;
241 241
242#ifdef HAVE_SSL 242#ifdef HAVE_SSL
243 if (flags & FLAG_SSL){ 243 if (flags & FLAG_SSL){
@@ -463,10 +463,10 @@ process_arguments (int argc, char **argv)
463 usage5 (); 463 usage5 ();
464 case 'h': /* help */ 464 case 'h': /* help */
465 print_help (); 465 print_help ();
466 exit (STATE_OK); 466 exit (STATE_UNKNOWN);
467 case 'V': /* version */ 467 case 'V': /* version */
468 print_revision (progname, NP_VERSION); 468 print_revision (progname, NP_VERSION);
469 exit (STATE_OK); 469 exit (STATE_UNKNOWN);
470 case 'v': /* verbose mode */ 470 case 'v': /* verbose mode */
471 flags |= FLAG_VERBOSE; 471 flags |= FLAG_VERBOSE;
472 match_flags |= NP_MATCH_VERBOSE; 472 match_flags |= NP_MATCH_VERBOSE;
@@ -577,7 +577,8 @@ process_arguments (int argc, char **argv)
577 if ((temp=strchr(optarg,','))!=NULL) { 577 if ((temp=strchr(optarg,','))!=NULL) {
578 *temp='\0'; 578 *temp='\0';
579 if (!is_intnonneg (optarg)) 579 if (!is_intnonneg (optarg))
580 usage2 (_("Invalid certificate expiration period"), optarg); days_till_exp_warn = atoi(optarg); 580 usage2 (_("Invalid certificate expiration period"), optarg);
581 days_till_exp_warn = atoi (optarg);
581 *temp=','; 582 *temp=',';
582 temp++; 583 temp++;
583 if (!is_intnonneg (temp)) 584 if (!is_intnonneg (temp))
diff --git a/plugins/check_time.c b/plugins/check_time.c
index 3943742a..baf8c591 100644
--- a/plugins/check_time.c
+++ b/plugins/check_time.c
@@ -231,10 +231,10 @@ process_arguments (int argc, char **argv)
231 usage5 (); 231 usage5 ();
232 case 'h': /* help */ 232 case 'h': /* help */
233 print_help (); 233 print_help ();
234 exit (STATE_OK); 234 exit (STATE_UNKNOWN);
235 case 'V': /* version */ 235 case 'V': /* version */
236 print_revision (progname, NP_VERSION); 236 print_revision (progname, NP_VERSION);
237 exit (STATE_OK); 237 exit (STATE_UNKNOWN);
238 case 'H': /* hostname */ 238 case 'H': /* hostname */
239 if (is_host (optarg) == FALSE) 239 if (is_host (optarg) == FALSE)
240 usage2 (_("Invalid hostname/address"), optarg); 240 usage2 (_("Invalid hostname/address"), optarg);
diff --git a/plugins/check_ups.c b/plugins/check_ups.c
index 099881d0..e9e56a51 100644
--- a/plugins/check_ups.c
+++ b/plugins/check_ups.c
@@ -242,8 +242,8 @@ main (int argc, char **argv)
242 } 242 }
243 xasprintf (&data, "%s %s", data, 243 xasprintf (&data, "%s %s", data,
244 perfdata ("battery", (long)ups_battery_percent, "%", 244 perfdata ("battery", (long)ups_battery_percent, "%",
245 check_warn, (long)(1000*warning_value), 245 check_warn, (long)(warning_value),
246 check_crit, (long)(1000*critical_value), 246 check_crit, (long)(critical_value),
247 TRUE, 0, TRUE, 100)); 247 TRUE, 0, TRUE, 100));
248 } else { 248 } else {
249 xasprintf (&data, "%s %s", data, 249 xasprintf (&data, "%s %s", data,
@@ -271,8 +271,8 @@ main (int argc, char **argv)
271 } 271 }
272 xasprintf (&data, "%s %s", data, 272 xasprintf (&data, "%s %s", data,
273 perfdata ("load", (long)ups_load_percent, "%", 273 perfdata ("load", (long)ups_load_percent, "%",
274 check_warn, (long)(1000*warning_value), 274 check_warn, (long)(warning_value),
275 check_crit, (long)(1000*critical_value), 275 check_crit, (long)(critical_value),
276 TRUE, 0, TRUE, 100)); 276 TRUE, 0, TRUE, 100));
277 } else { 277 } else {
278 xasprintf (&data, "%s %s", data, 278 xasprintf (&data, "%s %s", data,
@@ -308,8 +308,8 @@ main (int argc, char **argv)
308 } 308 }
309 xasprintf (&data, "%s %s", data, 309 xasprintf (&data, "%s %s", data,
310 perfdata ("temp", (long)ups_temperature, tunits, 310 perfdata ("temp", (long)ups_temperature, tunits,
311 check_warn, (long)(1000*warning_value), 311 check_warn, (long)(warning_value),
312 check_crit, (long)(1000*critical_value), 312 check_crit, (long)(critical_value),
313 TRUE, 0, FALSE, 0)); 313 TRUE, 0, FALSE, 0));
314 } else { 314 } else {
315 xasprintf (&data, "%s %s", data, 315 xasprintf (&data, "%s %s", data,
@@ -558,10 +558,10 @@ process_arguments (int argc, char **argv)
558 break; 558 break;
559 case 'V': /* version */ 559 case 'V': /* version */
560 print_revision (progname, NP_VERSION); 560 print_revision (progname, NP_VERSION);
561 exit (STATE_OK); 561 exit (STATE_UNKNOWN);
562 case 'h': /* help */ 562 case 'h': /* help */
563 print_help (); 563 print_help ();
564 exit (STATE_OK); 564 exit (STATE_UNKNOWN);
565 } 565 }
566 } 566 }
567 567
diff --git a/plugins/check_users.c b/plugins/check_users.c
index a009f20b..f6f4b362 100644
--- a/plugins/check_users.c
+++ b/plugins/check_users.c
@@ -54,15 +54,15 @@ int process_arguments (int, char **);
54void print_help (void); 54void print_help (void);
55void print_usage (void); 55void print_usage (void);
56 56
57int wusers = -1; 57char *warning_range = NULL;
58int cusers = -1; 58char *critical_range = NULL;
59thresholds *thlds = NULL;
59 60
60int 61int
61main (int argc, char **argv) 62main (int argc, char **argv)
62{ 63{
63 int users = -1; 64 int users = -1;
64 int result = STATE_UNKNOWN; 65 int result = STATE_UNKNOWN;
65 char *perf;
66#if HAVE_WTSAPI32_H 66#if HAVE_WTSAPI32_H
67 WTS_SESSION_INFO *wtsinfo; 67 WTS_SESSION_INFO *wtsinfo;
68 DWORD wtscount; 68 DWORD wtscount;
@@ -77,8 +77,6 @@ main (int argc, char **argv)
77 bindtextdomain (PACKAGE, LOCALEDIR); 77 bindtextdomain (PACKAGE, LOCALEDIR);
78 textdomain (PACKAGE); 78 textdomain (PACKAGE);
79 79
80 perf = strdup ("");
81
82 /* Parse extra opts if any */ 80 /* Parse extra opts if any */
83 argv = np_extra_opts (&argc, argv, progname); 81 argv = np_extra_opts (&argc, argv, progname);
84 82
@@ -160,23 +158,15 @@ main (int argc, char **argv)
160#endif 158#endif
161 159
162 /* check the user count against warning and critical thresholds */ 160 /* check the user count against warning and critical thresholds */
163 if (users > cusers) 161 result = get_status((double)users, thlds);
164 result = STATE_CRITICAL;
165 else if (users > wusers)
166 result = STATE_WARNING;
167 else if (users >= 0)
168 result = STATE_OK;
169 162
170 if (result == STATE_UNKNOWN) 163 if (result == STATE_UNKNOWN)
171 printf ("%s\n", _("Unable to read output")); 164 printf ("%s\n", _("Unable to read output"));
172 else { 165 else {
173 xasprintf (&perf, "%s", perfdata ("users", users, "", 166 printf (_("USERS %s - %d users currently logged in |%s\n"),
174 TRUE, wusers, 167 state_text(result), users,
175 TRUE, cusers, 168 sperfdata_int("users", users, "", warning_range,
176 TRUE, 0, 169 critical_range, TRUE, 0, FALSE, 0));
177 FALSE, 0));
178 printf (_("USERS %s - %d users currently logged in |%s\n"), state_text (result),
179 users, perf);
180 } 170 }
181 171
182 return result; 172 return result;
@@ -210,38 +200,32 @@ process_arguments (int argc, char **argv)
210 usage5 (); 200 usage5 ();
211 case 'h': /* help */ 201 case 'h': /* help */
212 print_help (); 202 print_help ();
213 exit (STATE_OK); 203 exit (STATE_UNKNOWN);
214 case 'V': /* version */ 204 case 'V': /* version */
215 print_revision (progname, NP_VERSION); 205 print_revision (progname, NP_VERSION);
216 exit (STATE_OK); 206 exit (STATE_UNKNOWN);
217 case 'c': /* critical */ 207 case 'c': /* critical */
218 if (!is_intnonneg (optarg)) 208 critical_range = optarg;
219 usage4 (_("Critical threshold must be a positive integer"));
220 else
221 cusers = atoi (optarg);
222 break; 209 break;
223 case 'w': /* warning */ 210 case 'w': /* warning */
224 if (!is_intnonneg (optarg)) 211 warning_range = optarg;
225 usage4 (_("Warning threshold must be a positive integer"));
226 else
227 wusers = atoi (optarg);
228 break; 212 break;
229 } 213 }
230 } 214 }
231 215
232 c = optind; 216 c = optind;
233 if (wusers == -1 && argc > c) { 217 if (warning_range == NULL && argc > c)
234 if (is_intnonneg (argv[c]) == FALSE) 218 warning_range = argv[c++];
235 usage4 (_("Warning threshold must be a positive integer")); 219 if (critical_range == NULL && argc > c)
236 else 220 critical_range = argv[c++];
237 wusers = atoi (argv[c++]); 221
238 } 222 /* this will abort in case of invalid ranges */
239 if (cusers == -1 && argc > c) { 223 set_thresholds (&thlds, warning_range, critical_range);
240 if (is_intnonneg (argv[c]) == FALSE) 224
241 usage4 (_("Warning threshold must be a positive integer")); 225 if (thlds->warning->end < 0)
242 else 226 usage4 (_("Warning threshold must be a positive integer"));
243 cusers = atoi (argv[c]); 227 if (thlds->critical->end < 0)
244 } 228 usage4 (_("Critical threshold must be a positive integer"));
245 229
246 return OK; 230 return OK;
247} 231}
diff --git a/plugins/negate.c b/plugins/negate.c
index beaed1ea..b320e356 100644
--- a/plugins/negate.c
+++ b/plugins/negate.c
@@ -59,8 +59,8 @@ static int state[4] = {
59int 59int
60main (int argc, char **argv) 60main (int argc, char **argv)
61{ 61{
62 int found = 0, result = STATE_UNKNOWN; 62 int result = STATE_UNKNOWN;
63 char *buf, *sub; 63 char *sub;
64 char **command_line; 64 char **command_line;
65 output chld_out, chld_err; 65 output chld_out, chld_err;
66 int i; 66 int i;
diff --git a/plugins/netutils.c b/plugins/netutils.c
index 83f8942f..705aaf09 100644
--- a/plugins/netutils.c
+++ b/plugins/netutils.c
@@ -161,6 +161,10 @@ process_request (const char *server_address, int server_port, int proto,
161int 161int
162np_net_connect (const char *host_name, int port, int *sd, int proto) 162np_net_connect (const char *host_name, int port, int *sd, int proto)
163{ 163{
164 /* send back STATE_UNKOWN if there's an error
165 send back STATE_OK if we connect
166 send back STATE_CRITICAL if we can't connect.
167 Let upstream figure out what to send to the user. */
164 struct addrinfo hints; 168 struct addrinfo hints;
165 struct addrinfo *r, *res; 169 struct addrinfo *r, *res;
166 struct sockaddr_un su; 170 struct sockaddr_un su;
@@ -250,16 +254,14 @@ np_net_connect (const char *host_name, int port, int *sd, int proto)
250 else if (was_refused) { 254 else if (was_refused) {
251 switch (econn_refuse_state) { /* a user-defined expected outcome */ 255 switch (econn_refuse_state) { /* a user-defined expected outcome */
252 case STATE_OK: 256 case STATE_OK:
253 case STATE_WARNING: /* user wants WARN or OK on refusal */ 257 case STATE_WARNING: /* user wants WARN or OK on refusal, or... */
254 return econn_refuse_state; 258 case STATE_CRITICAL: /* user did not set econn_refuse_state, or wanted critical */
255 break;
256 case STATE_CRITICAL: /* user did not set econn_refuse_state */
257 if (is_socket) 259 if (is_socket)
258 printf("connect to file socket %s: %s\n", host_name, strerror(errno)); 260 printf("connect to file socket %s: %s\n", host_name, strerror(errno));
259 else 261 else
260 printf("connect to address %s and port %d: %s\n", 262 printf("connect to address %s and port %d: %s\n",
261 host_name, port, strerror(errno)); 263 host_name, port, strerror(errno));
262 return econn_refuse_state; 264 return STATE_CRITICAL;
263 break; 265 break;
264 default: /* it's a logic error if we do not end up in STATE_(OK|WARNING|CRITICAL) */ 266 default: /* it's a logic error if we do not end up in STATE_(OK|WARNING|CRITICAL) */
265 return STATE_UNKNOWN; 267 return STATE_UNKNOWN;
diff --git a/plugins/netutils.h b/plugins/netutils.h
index c6fce901..2766029e 100644
--- a/plugins/netutils.h
+++ b/plugins/netutils.h
@@ -91,6 +91,16 @@ RETSIGTYPE socket_timeout_alarm_handler (int) __attribute__((noreturn));
91 91
92/* SSL-Related functionality */ 92/* SSL-Related functionality */
93#ifdef HAVE_SSL 93#ifdef HAVE_SSL
94# define MP_SSLv2 1
95# define MP_SSLv3 2
96# define MP_TLSv1 3
97# define MP_TLSv1_1 4
98# define MP_TLSv1_2 5
99# define MP_SSLv2_OR_NEWER 6
100# define MP_SSLv3_OR_NEWER 7
101# define MP_TLSv1_OR_NEWER 8
102# define MP_TLSv1_1_OR_NEWER 9
103# define MP_TLSv1_2_OR_NEWER 10
94/* maybe this could be merged with the above np_net_connect, via some flags */ 104/* maybe this could be merged with the above np_net_connect, via some flags */
95int np_net_ssl_init(int sd); 105int np_net_ssl_init(int sd);
96int np_net_ssl_init_with_hostname(int sd, char *host_name); 106int np_net_ssl_init_with_hostname(int sd, char *host_name);
diff --git a/plugins/sslutils.c b/plugins/sslutils.c
index d0ae4741..b412ef3d 100644
--- a/plugins/sslutils.c
+++ b/plugins/sslutils.c
@@ -49,28 +49,78 @@ int np_net_ssl_init_with_hostname_and_version(int sd, char *host_name, int versi
49 49
50int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int version, char *cert, char *privkey) { 50int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int version, char *cert, char *privkey) {
51 SSL_METHOD *method = NULL; 51 SSL_METHOD *method = NULL;
52 long options = 0;
52 53
53 switch (version) { 54 switch (version) {
54 case 0: /* Deafult to auto negotiation */ 55 case MP_SSLv2: /* SSLv2 protocol */
55 method = SSLv23_client_method();
56 break;
57 case 1: /* TLSv1 protocol */
58 method = TLSv1_client_method();
59 break;
60 case 2: /* SSLv2 protocol */
61#if defined(USE_GNUTLS) || defined(OPENSSL_NO_SSL2) 56#if defined(USE_GNUTLS) || defined(OPENSSL_NO_SSL2)
62 printf(("%s\n", _("CRITICAL - SSL protocol version 2 is not supported by your SSL library."))); 57 printf("%s\n", _("UNKNOWN - SSL protocol version 2 is not supported by your SSL library."));
63 return STATE_CRITICAL; 58 return STATE_UNKNOWN;
64#else 59#else
65 method = SSLv2_client_method(); 60 method = SSLv2_client_method();
66#endif
67 break; 61 break;
68 case 3: /* SSLv3 protocol */ 62#endif
63 case MP_SSLv3: /* SSLv3 protocol */
64#if defined(OPENSSL_NO_SSL3)
65 printf("%s\n", _("UNKNOWN - SSL protocol version 3 is not supported by your SSL library."));
66 return STATE_UNKNOWN;
67#else
69 method = SSLv3_client_method(); 68 method = SSLv3_client_method();
70 break; 69 break;
71 default: /* Unsupported */ 70#endif
72 printf("%s\n", _("CRITICAL - Unsupported SSL protocol version.")); 71 case MP_TLSv1: /* TLSv1 protocol */
73 return STATE_CRITICAL; 72#if defined(OPENSSL_NO_TLS1)
73 printf("%s\n", _("UNKNOWN - TLS protocol version 1 is not supported by your SSL library."));
74 return STATE_UNKNOWN;
75#else
76 method = TLSv1_client_method();
77 break;
78#endif
79 case MP_TLSv1_1: /* TLSv1.1 protocol */
80#if !defined(SSL_OP_NO_TLSv1_1)
81 printf("%s\n", _("UNKNOWN - TLS protocol version 1.1 is not supported by your SSL library."));
82 return STATE_UNKNOWN;
83#else
84 method = TLSv1_1_client_method();
85 break;
86#endif
87 case MP_TLSv1_2: /* TLSv1.2 protocol */
88#if !defined(SSL_OP_NO_TLSv1_2)
89 printf("%s\n", _("UNKNOWN - TLS protocol version 1.2 is not supported by your SSL library."));
90 return STATE_UNKNOWN;
91#else
92 method = TLSv1_2_client_method();
93 break;
94#endif
95 case MP_TLSv1_2_OR_NEWER:
96#if !defined(SSL_OP_NO_TLSv1_1)
97 printf("%s\n", _("UNKNOWN - Disabling TLSv1.1 is not supported by your SSL library."));
98 return STATE_UNKNOWN;
99#else
100 options |= SSL_OP_NO_TLSv1_1;
101#endif
102 /* FALLTHROUGH */
103 case MP_TLSv1_1_OR_NEWER:
104#if !defined(SSL_OP_NO_TLSv1)
105 printf("%s\n", _("UNKNOWN - Disabling TLSv1 is not supported by your SSL library."));
106 return STATE_UNKNOWN;
107#else
108 options |= SSL_OP_NO_TLSv1;
109#endif
110 /* FALLTHROUGH */
111 case MP_TLSv1_OR_NEWER:
112#if defined(SSL_OP_NO_SSLv3)
113 options |= SSL_OP_NO_SSLv3;
114#endif
115 /* FALLTHROUGH */
116 case MP_SSLv3_OR_NEWER:
117#if defined(SSL_OP_NO_SSLv2)
118 options |= SSL_OP_NO_SSLv2;
119#endif
120 case MP_SSLv2_OR_NEWER:
121 /* FALLTHROUGH */
122 default: /* Default to auto negotiation */
123 method = SSLv23_client_method();
74 } 124 }
75 if (!initialized) { 125 if (!initialized) {
76 /* Initialize SSL context */ 126 /* Initialize SSL context */
@@ -94,8 +144,9 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
94#endif 144#endif
95 } 145 }
96#ifdef SSL_OP_NO_TICKET 146#ifdef SSL_OP_NO_TICKET
97 SSL_CTX_set_options(c, SSL_OP_NO_TICKET); 147 options |= SSL_OP_NO_TICKET;
98#endif 148#endif
149 SSL_CTX_set_options(c, options);
99 SSL_CTX_set_mode(c, SSL_MODE_AUTO_RETRY); 150 SSL_CTX_set_mode(c, SSL_MODE_AUTO_RETRY);
100 if ((s = SSL_new(c)) != NULL) { 151 if ((s = SSL_new(c)) != NULL) {
101#ifdef SSL_set_tlsext_host_name 152#ifdef SSL_set_tlsext_host_name
@@ -144,7 +195,10 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
144# ifdef USE_OPENSSL 195# ifdef USE_OPENSSL
145 X509 *certificate=NULL; 196 X509 *certificate=NULL;
146 X509_NAME *subj=NULL; 197 X509_NAME *subj=NULL;
198 char timestamp[50] = "";
147 char cn[MAX_CN_LENGTH]= ""; 199 char cn[MAX_CN_LENGTH]= "";
200 char *tz;
201
148 int cnlen =-1; 202 int cnlen =-1;
149 int status=STATE_UNKNOWN; 203 int status=STATE_UNKNOWN;
150 204
@@ -153,7 +207,7 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
153 struct tm stamp; 207 struct tm stamp;
154 float time_left; 208 float time_left;
155 int days_left; 209 int days_left;
156 char timestamp[50] = ""; 210 int time_remaining;
157 time_t tm_t; 211 time_t tm_t;
158 212
159 certificate=SSL_get_peer_certificate(s); 213 certificate=SSL_get_peer_certificate(s);
@@ -207,32 +261,55 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
207 (tm->data[6 + offset] - '0') * 10 + (tm->data[7 + offset] - '0'); 261 (tm->data[6 + offset] - '0') * 10 + (tm->data[7 + offset] - '0');
208 stamp.tm_min = 262 stamp.tm_min =
209 (tm->data[8 + offset] - '0') * 10 + (tm->data[9 + offset] - '0'); 263 (tm->data[8 + offset] - '0') * 10 + (tm->data[9 + offset] - '0');
210 stamp.tm_sec = 0; 264 stamp.tm_sec =
265 (tm->data[10 + offset] - '0') * 10 + (tm->data[11 + offset] - '0');
211 stamp.tm_isdst = -1; 266 stamp.tm_isdst = -1;
212 267
213 time_left = difftime(timegm(&stamp), time(NULL)); 268 tm_t = timegm(&stamp);
269 time_left = difftime(tm_t, time(NULL));
214 days_left = time_left / 86400; 270 days_left = time_left / 86400;
215 tm_t = mktime (&stamp); 271 tz = getenv("TZ");
216 strftime(timestamp, 50, "%c", localtime(&tm_t)); 272 setenv("TZ", "GMT", 1);
273 tzset();
274 strftime(timestamp, 50, "%c %z", localtime(&tm_t));
275 if (tz)
276 setenv("TZ", tz, 1);
277 else
278 unsetenv("TZ");
279 tzset();
217 280
218 if (days_left > 0 && days_left <= days_till_exp_warn) { 281 if (days_left > 0 && days_left <= days_till_exp_warn) {
219 printf (_("%s - Certificate '%s' expires in %d day(s) (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, days_left, timestamp); 282 printf (_("%s - Certificate '%s' expires in %d day(s) (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, days_left, timestamp);
220 if (days_left > days_till_exp_crit) 283 if (days_left > days_till_exp_crit)
221 return STATE_WARNING; 284 status = STATE_WARNING;
222 else 285 else
223 return STATE_CRITICAL; 286 status = STATE_CRITICAL;
287 } else if (days_left == 0 && time_left > 0) {
288 if (time_left >= 3600)
289 time_remaining = (int) time_left / 3600;
290 else
291 time_remaining = (int) time_left / 60;
292
293 printf (_("%s - Certificate '%s' expires in %u %s (%s)\n"),
294 (days_left>days_till_exp_crit) ? "WARNING" : "CRITICAL", cn, time_remaining,
295 time_left >= 3600 ? "hours" : "minutes", timestamp);
296
297 if ( days_left > days_till_exp_crit)
298 status = STATE_WARNING;
299 else
300 status = STATE_CRITICAL;
224 } else if (time_left < 0) { 301 } else if (time_left < 0) {
225 printf(_("CRITICAL - Certificate '%s' expired on %s.\n"), cn, timestamp); 302 printf(_("CRITICAL - Certificate '%s' expired on %s.\n"), cn, timestamp);
226 status=STATE_CRITICAL; 303 status=STATE_CRITICAL;
227 } else if (days_left == 0) { 304 } else if (days_left == 0) {
228 printf (_("%s - Certificate '%s' expires today (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, timestamp); 305 printf (_("%s - Certificate '%s' just expired (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, timestamp);
229 if (days_left > days_till_exp_crit) 306 if (days_left > days_till_exp_crit)
230 return STATE_WARNING; 307 status = STATE_WARNING;
231 else 308 else
232 return STATE_CRITICAL; 309 status = STATE_CRITICAL;
233 } else { 310 } else {
234 printf(_("OK - Certificate '%s' will expire on %s.\n"), cn, timestamp); 311 printf(_("OK - Certificate '%s' will expire on %s.\n"), cn, timestamp);
235 status=STATE_OK; 312 status = STATE_OK;
236 } 313 }
237 X509_free(certificate); 314 X509_free(certificate);
238 return status; 315 return status;
diff --git a/plugins/t/NPTest.cache.travis b/plugins/t/NPTest.cache.travis
index 4ebfb90e..fe8aabdb 100644
--- a/plugins/t/NPTest.cache.travis
+++ b/plugins/t/NPTest.cache.travis
@@ -17,13 +17,15 @@
17 'NP_HOST_HPJD_PORT_INVALID' => '161', 17 'NP_HOST_HPJD_PORT_INVALID' => '161',
18 'NP_HOST_HPJD_PORT_VALID' => '', 18 'NP_HOST_HPJD_PORT_VALID' => '',
19 'NP_HOST_TCP_HTTP' => 'localhost', 19 'NP_HOST_TCP_HTTP' => 'localhost',
20 'NP_HOST_TCP_HTTP2' => 'labs.consol.de', 20 'NP_HOST_TCP_HTTP2' => 'test.monitoring-plugins.org',
21 'NP_HOST_TCP_IMAP' => 'imap.web.de', 21 'NP_HOST_TCP_IMAP' => 'imap.web.de',
22 'NP_HOST_TCP_LDAP' => 'localhost',
22 'NP_HOST_TCP_POP' => 'pop.web.de', 23 'NP_HOST_TCP_POP' => 'pop.web.de',
23 'NP_HOST_TCP_SMTP' => 'localhost', 24 'NP_HOST_TCP_SMTP' => 'localhost',
24 'NP_HOST_TCP_SMTP_NOTLS' => '', 25 'NP_HOST_TCP_SMTP_NOTLS' => '',
25 'NP_HOST_TCP_SMTP_TLS' => '', 26 'NP_HOST_TCP_SMTP_TLS' => '',
26 'NP_INTERNET_ACCESS' => 'yes', 27 'NP_INTERNET_ACCESS' => 'yes',
28 'NP_LDAP_BASE_DN' => 'cn=admin,dc=nodomain',
27 'NP_MOUNTPOINT2_VALID' => '', 29 'NP_MOUNTPOINT2_VALID' => '',
28 'NP_MOUNTPOINT_VALID' => '/', 30 'NP_MOUNTPOINT_VALID' => '/',
29 'NP_MYSQL_SERVER' => 'localhost', 31 'NP_MYSQL_SERVER' => 'localhost',
diff --git a/plugins/t/check_http.t b/plugins/t/check_http.t
index 2539a289..f514ca6f 100644
--- a/plugins/t/check_http.t
+++ b/plugins/t/check_http.t
@@ -6,9 +6,10 @@
6 6
7use strict; 7use strict;
8use Test::More; 8use Test::More;
9use POSIX qw/mktime strftime/;
9use NPTest; 10use NPTest;
10 11
11plan tests => 30; 12plan tests => 42;
12 13
13my $successOutput = '/OK.*HTTP.*second/'; 14my $successOutput = '/OK.*HTTP.*second/';
14 15
@@ -34,6 +35,8 @@ my $host_tcp_http2 = getTestParameter( "NP_HOST_TCP_HTTP2",
34 "A host providing an index page containing the string 'monitoring'", 35 "A host providing an index page containing the string 'monitoring'",
35 "test.monitoring-plugins.org" ); 36 "test.monitoring-plugins.org" );
36 37
38my $faketime = -x '/usr/bin/faketime' ? 1 : 0;
39
37 40
38$res = NPTest->testCmd( 41$res = NPTest->testCmd(
39 "./check_http $host_tcp_http -wt 300 -ct 600" 42 "./check_http $host_tcp_http -wt 300 -ct 600"
@@ -47,10 +50,10 @@ $res = NPTest->testCmd(
47like( $res->output, '/bob:there\r\ncarl:frown\r\n/', "Got headers with multiple -k options" ); 50like( $res->output, '/bob:there\r\ncarl:frown\r\n/', "Got headers with multiple -k options" );
48 51
49$res = NPTest->testCmd( 52$res = NPTest->testCmd(
50 "./check_http $host_nonresponsive -wt 1 -ct 2" 53 "./check_http $host_nonresponsive -wt 1 -ct 2 -t 3"
51 ); 54 );
52cmp_ok( $res->return_code, '==', 2, "Webserver $host_nonresponsive not responding" ); 55cmp_ok( $res->return_code, '==', 2, "Webserver $host_nonresponsive not responding" );
53cmp_ok( $res->output, 'eq', "CRITICAL - Socket timeout after 10 seconds", "Output OK"); 56cmp_ok( $res->output, 'eq', "CRITICAL - Socket timeout after 3 seconds", "Output OK");
54 57
55$res = NPTest->testCmd( 58$res = NPTest->testCmd(
56 "./check_http $hostname_invalid -wt 1 -ct 2" 59 "./check_http $hostname_invalid -wt 1 -ct 2"
@@ -112,12 +115,46 @@ SKIP: {
112 $res = NPTest->testCmd( "./check_http www.verisign.com -C 1" ); 115 $res = NPTest->testCmd( "./check_http www.verisign.com -C 1" );
113 cmp_ok( $res->output, 'eq', $saved_cert_output, "Old syntax for cert checking still works"); 116 cmp_ok( $res->output, 'eq', $saved_cert_output, "Old syntax for cert checking still works");
114 117
118 # run some certificate checks with faketime
119 SKIP: {
120 skip "No faketime binary found", 12 if !$faketime;
121 $res = NPTest->testCmd("LC_TIME=C TZ=UTC ./check_http -C 1 www.verisign.com");
122 like($res->output, qr/OK - Certificate 'www.verisign.com' will expire on/, "Catch cert output");
123 is( $res->return_code, 0, "Catch cert output exit code" );
124 my($mon,$day,$hour,$min,$sec,$year) = ($res->output =~ /(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/);
125 if(!defined $year) {
126 die("parsing date failed from: ".$res->output);
127 }
128 my $months = {'Jan' => 0, 'Feb' => 1, 'Mar' => 2, 'Apr' => 3, 'May' => 4, 'Jun' => 5, 'Jul' => 6, 'Aug' => 7, 'Sep' => 8, 'Oct' => 9, 'Nov' => 10, 'Dec' => 11};
129 my $ts = mktime($sec, $min, $hour, $day, $months->{$mon}, $year-1900);
130 my $time = strftime("%Y-%m-%d %H:%M:%S", localtime($ts));
131 $res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts))."' ./check_http -C 1 www.verisign.com");
132 like($res->output, qr/CRITICAL - Certificate 'www.verisign.com' just expired/, "Output on expire date");
133 is( $res->return_code, 2, "Output on expire date" );
134
135 $res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts-1))."' ./check_http -C 1 www.verisign.com");
136 like($res->output, qr/CRITICAL - Certificate 'www.verisign.com' expires in 0 minutes/, "cert expires in 1 second output");
137 is( $res->return_code, 2, "cert expires in 1 second exit code" );
138
139 $res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts-120))."' ./check_http -C 1 www.verisign.com");
140 like($res->output, qr/CRITICAL - Certificate 'www.verisign.com' expires in 2 minutes/, "cert expires in 2 minutes output");
141 is( $res->return_code, 2, "cert expires in 2 minutes exit code" );
142
143 $res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts-7200))."' ./check_http -C 1 www.verisign.com");
144 like($res->output, qr/CRITICAL - Certificate 'www.verisign.com' expires in 2 hours/, "cert expires in 2 hours output");
145 is( $res->return_code, 2, "cert expires in 2 hours exit code" );
146
147 $res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts+1))."' ./check_http -C 1 www.verisign.com");
148 like($res->output, qr/CRITICAL - Certificate 'www.verisign.com' expired on/, "Certificate expired output");
149 is( $res->return_code, 2, "Certificate expired exit code" );
150 };
151
115 $res = NPTest->testCmd( "./check_http --ssl www.verisign.com -E" ); 152 $res = NPTest->testCmd( "./check_http --ssl www.verisign.com -E" );
116 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' ); 153 like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
117 like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' ); 154 like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' );
118 155
119 $res = NPTest->testCmd( 156 $res = NPTest->testCmd(
120 "./check_http --ssl www.e-paycobalt.com" 157 "./check_http --ssl -H www.e-paycobalt.com"
121 ); 158 );
122 cmp_ok( $res->return_code, "==", 0, "Can read https for www.e-paycobalt.com (uses AES certificate)" ); 159 cmp_ok( $res->return_code, "==", 0, "Can read https for www.e-paycobalt.com (uses AES certificate)" );
123 160
diff --git a/plugins/t/check_ldap.t b/plugins/t/check_ldap.t
new file mode 100644
index 00000000..b8944d4b
--- /dev/null
+++ b/plugins/t/check_ldap.t
@@ -0,0 +1,80 @@
1#!/usr/bin/env perl -I ..
2#
3# Lightweight Directory Access Protocol (LDAP) Test via check_ldap
4#
5#
6
7use strict;
8use warnings;
9use Test::More;
10use NPTest;
11
12my $host_tcp_ldap = getTestParameter("NP_HOST_TCP_LDAP",
13 "A host providing the LDAP Service",
14 "localhost" );
15
16my $ldap_base_dn = getTestParameter("NP_LDAP_BASE_DN",
17 "A base dn for the LDAP Service",
18 "cn=admin" );
19
20my $host_nonresponsive = getTestParameter("host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1",
21 "The hostname of system not responsive to network requests" );
22
23my $hostname_invalid = getTestParameter("hostname_invalid", "NP_HOSTNAME_INVALID", "nosuchhost",
24 "An invalid (not known to DNS) hostname" );
25
26my($result, $cmd);
27my $command = './check_ldap';
28
29plan tests => 16;
30
31SKIP: {
32 skip "NP_HOST_NONRESPONSIVE not set", 2 if ! $host_nonresponsive;
33
34 $result = NPTest->testCmd("$command -H $host_nonresponsive -b ou=blah -t 2 -w 1 -c 1");
35 is( $result->return_code, 2, "$command -H $host_nonresponsive -b ou=blah -t 5 -w 2 -c 3" );
36 is( $result->output, 'CRITICAL - Socket timeout after 2 seconds', "output ok" );
37};
38
39SKIP: {
40 skip "NP_HOSTNAME_INVALID not set", 2 if ! $hostname_invalid;
41
42 $result = NPTest->testCmd("$command -H $hostname_invalid -b ou=blah -t 5");
43 is( $result->return_code, 2, "$command -H $hostname_invalid -b ou=blah -t 5" );
44 is( $result->output, 'Could not bind to the LDAP server', "output ok" );
45};
46
47SKIP: {
48 skip "NP_HOST_TCP_LDAP not set", 12 if ! $host_tcp_ldap;
49 skip "NP_LDAP_BASE_DN not set", 12 if ! $ldap_base_dn;
50
51 $cmd = "$command -H $host_tcp_ldap -b $ldap_base_dn -t 5 -w 2 -c 3 -3";
52 $result = NPTest->testCmd($cmd);
53 is( $result->return_code, 0, $cmd );
54 like( $result->output, '/^LDAP OK - \d+.\d+ seconds response time\|time=\d+\.\d+s;2\.0+;3\.0+;0\.0+$/', "output ok" );
55
56 $cmd = "$command -H $host_tcp_ldap -b $ldap_base_dn -t 5 -w 2 -c 3 -3 -W 10000000 -C 10000001";
57 $result = NPTest->testCmd($cmd);
58 is( $result->return_code, 0, $cmd );
59 like( $result->output, '/^LDAP OK - found \d+ entries in \d+\.\d+ seconds\|time=\d\.\d+s;2\.0+;3\.0+;0\.0+ entries=\d+\.0+;10000000;10000001;0\.0+$/', "output ok" );
60
61 $cmd = "$command -H $host_tcp_ldap -b $ldap_base_dn -t 5 -w 2 -c 3 -3 -W 10000000: -C 10000001:";
62 $result = NPTest->testCmd($cmd);
63 is( $result->return_code, 2, $cmd );
64 like( $result->output, '/^LDAP CRITICAL - found \d+ entries in \d+\.\d+ seconds\|time=\d\.\d+s;2\.0+;3\.0+;0\.0+ entries=\d+\.0+;10000000:;10000001:;0\.0+$/', "output ok" );
65
66 $cmd = "$command -H $host_tcp_ldap -b $ldap_base_dn -t 5 -w 2 -c 3 -3 -W 0 -C 0";
67 $result = NPTest->testCmd($cmd);
68 is( $result->return_code, 2, $cmd );
69 like( $result->output, '/^LDAP CRITICAL - found \d+ entries in \d+\.\d+ seconds\|time=\d\.\d+s;2\.0+;3\.0+;0\.0+ entries=\d+\.0+;0;0;0\.0+$/', "output ok" );
70
71 $cmd = "$command -H $host_tcp_ldap -b $ldap_base_dn -t 5 -w 2 -c 3 -3 -W 10000000: -C 10000001";
72 $result = NPTest->testCmd($cmd);
73 is( $result->return_code, 1, $cmd );
74 like( $result->output, '/^LDAP WARNING - found \d+ entries in \d+\.\d+ seconds\|time=\d\.\d+s;2\.0+;3\.0+;0\.0+ entries=\d+\.0+;10000000:;10000001;0\.0+$/', "output ok" );
75
76 $cmd = "$command -H $host_tcp_ldap -b $ldap_base_dn -t 5 -w 2 -c 3 -3 -C 10000001";
77 $result = NPTest->testCmd($cmd);
78 is( $result->return_code, 0, $cmd );
79 like( $result->output, '/^LDAP OK - found \d+ entries in \d+\.\d+ seconds\|time=\d\.\d+s;2\.0+;3\.0+;0\.0+ entries=\d+\.0+;;10000001;0\.0+$/', "output ok" );
80};
diff --git a/plugins/t/check_snmp.t b/plugins/t/check_snmp.t
index 2d6c44a7..aefd872a 100644
--- a/plugins/t/check_snmp.t
+++ b/plugins/t/check_snmp.t
@@ -166,8 +166,8 @@ SKIP: {
166SKIP: { 166SKIP: {
167 skip "no non responsive host defined", 2 if ( ! $host_nonresponsive ); 167 skip "no non responsive host defined", 2 if ( ! $host_nonresponsive );
168 $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:"); 168 $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
169 cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); 169 cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL with non responsive host" );
170 like($res->output, '/External command error: Timeout: No Response from /', "String matches timeout problem"); 170 like($res->output, '/Plugin timed out while executing system call/', "String matches timeout problem");
171} 171}
172 172
173SKIP: { 173SKIP: {
diff --git a/plugins/t/check_users.t b/plugins/t/check_users.t
index 39044bb5..088f3b52 100644
--- a/plugins/t/check_users.t
+++ b/plugins/t/check_users.t
@@ -13,7 +13,7 @@ use Test;
13use NPTest; 13use NPTest;
14 14
15use vars qw($tests); 15use vars qw($tests);
16BEGIN {$tests = 4; plan tests => $tests} 16BEGIN {$tests = 8; plan tests => $tests}
17 17
18my $successOutput = '/^USERS OK - [0-9]+ users currently logged in/'; 18my $successOutput = '/^USERS OK - [0-9]+ users currently logged in/';
19my $failureOutput = '/^USERS CRITICAL - [0-9]+ users currently logged in/'; 19my $failureOutput = '/^USERS CRITICAL - [0-9]+ users currently logged in/';
@@ -22,6 +22,8 @@ my $t;
22 22
23$t += checkCmd( "./check_users 1000 1000", 0, $successOutput ); 23$t += checkCmd( "./check_users 1000 1000", 0, $successOutput );
24$t += checkCmd( "./check_users 0 0", 2, $failureOutput ); 24$t += checkCmd( "./check_users 0 0", 2, $failureOutput );
25$t += checkCmd( "./check_users -w 0:1000 -c 0:1000", 0, $successOutput );
26$t += checkCmd( "./check_users -w 0:0 -c 0:0", 2, $failureOutput );
25 27
26exit(0) if defined($Test::Harness::VERSION); 28exit(0) if defined($Test::Harness::VERSION);
27exit($tests - $t); 29exit($tests - $t);
diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t
index d93a0ecf..5984d489 100755
--- a/plugins/tests/check_http.t
+++ b/plugins/tests/check_http.t
@@ -186,21 +186,21 @@ SKIP: {
186 186
187 $result = NPTest->testCmd( "$command -p $port_https -S -C 14" ); 187 $result = NPTest->testCmd( "$command -p $port_https -S -C 14" );
188 is( $result->return_code, 0, "$command -p $port_https -S -C 14" ); 188 is( $result->return_code, 0, "$command -p $port_https -S -C 14" );
189 is( $result->output, 'OK - Certificate \'Ton Voon\' will expire on Sun Mar 3 21:41:00 2019.', "output ok" ); 189 is( $result->output, 'OK - Certificate \'Ton Voon\' will expire on Sun Mar 3 21:41:28 2019 +0000.', "output ok" );
190 190
191 $result = NPTest->testCmd( "$command -p $port_https -S -C 14000" ); 191 $result = NPTest->testCmd( "$command -p $port_https -S -C 14000" );
192 is( $result->return_code, 1, "$command -p $port_https -S -C 14000" ); 192 is( $result->return_code, 1, "$command -p $port_https -S -C 14000" );
193 like( $result->output, '/WARNING - Certificate \'Ton Voon\' expires in \d+ day\(s\) \(Sun Mar 3 21:41:00 2019\)./', "output ok" ); 193 like( $result->output, '/WARNING - Certificate \'Ton Voon\' expires in \d+ day\(s\) \(Sun Mar 3 21:41:28 2019 \+0000\)./', "output ok" );
194 194
195 # Expired cert tests 195 # Expired cert tests
196 $result = NPTest->testCmd( "$command -p $port_https -S -C 13960,14000" ); 196 $result = NPTest->testCmd( "$command -p $port_https -S -C 13960,14000" );
197 is( $result->return_code, 2, "$command -p $port_https -S -C 13960,14000" ); 197 is( $result->return_code, 2, "$command -p $port_https -S -C 13960,14000" );
198 like( $result->output, '/CRITICAL - Certificate \'Ton Voon\' expires in \d+ day\(s\) \(Sun Mar 3 21:41:00 2019\)./', "output ok" ); 198 like( $result->output, '/CRITICAL - Certificate \'Ton Voon\' expires in \d+ day\(s\) \(Sun Mar 3 21:41:28 2019 \+0000\)./', "output ok" );
199 199
200 $result = NPTest->testCmd( "$command -p $port_https_expired -S -C 7" ); 200 $result = NPTest->testCmd( "$command -p $port_https_expired -S -C 7" );
201 is( $result->return_code, 2, "$command -p $port_https_expired -S -C 7" ); 201 is( $result->return_code, 2, "$command -p $port_https_expired -S -C 7" );
202 is( $result->output, 202 is( $result->output,
203 'CRITICAL - Certificate \'Ton Voon\' expired on Thu Mar 5 00:13:00 2009.', 203 'CRITICAL - Certificate \'Ton Voon\' expired on Thu Mar 5 00:13:16 2009 +0000.',
204 "output ok" ); 204 "output ok" );
205 205
206} 206}
diff --git a/plugins/tests/check_snmp.t b/plugins/tests/check_snmp.t
index 2fd033d2..73a68b20 100755
--- a/plugins/tests/check_snmp.t
+++ b/plugins/tests/check_snmp.t
@@ -128,7 +128,7 @@ sleep 1;
128 128
129$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.10 --rate -w 600" ); 129$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.10 --rate -w 600" );
130is($res->return_code, 1, "WARNING - due to going above rate calculation" ); 130is($res->return_code, 1, "WARNING - due to going above rate calculation" );
131is($res->output, "SNMP RATE WARNING - *666* | iso.3.6.1.4.1.8072.3.2.67.10=666 "); 131is($res->output, "SNMP RATE WARNING - *666* | iso.3.6.1.4.1.8072.3.2.67.10=666;600 ");
132 132
133$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.10 --rate -w 600" ); 133$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.10 --rate -w 600" );
134is($res->return_code, 3, "UNKNOWN - basically the divide by zero error" ); 134is($res->return_code, 3, "UNKNOWN - basically the divide by zero error" );
@@ -209,7 +209,7 @@ is($res->output, 'SNMP OK - "stringtests" | ', "OK as inverted string no match"
209 209
210$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.12 -w 4:5" ); 210$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.12 -w 4:5" );
211is($res->return_code, 1, "Numeric in string test" ); 211is($res->return_code, 1, "Numeric in string test" );
212is($res->output, 'SNMP WARNING - *3.5* | iso.3.6.1.4.1.8072.3.2.67.12=3.5 ', "WARNING threshold checks for string masquerading as number" ); 212is($res->output, 'SNMP WARNING - *3.5* | iso.3.6.1.4.1.8072.3.2.67.12=3.5;4:5 ', "WARNING threshold checks for string masquerading as number" );
213 213
214$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.13" ); 214$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.13" );
215is($res->return_code, 0, "Not really numeric test" ); 215is($res->return_code, 0, "Not really numeric test" );
@@ -225,29 +225,29 @@ is($res->output, 'SNMP OK - "CUSTOM CHECK OK: foo is 12345" | ', "String check w
225 225
226$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.16 -w -2: -c -3:" ); 226$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.16 -w -2: -c -3:" );
227is($res->return_code, 0, "Negative integer check OK" ); 227is($res->return_code, 0, "Negative integer check OK" );
228is($res->output, 'SNMP OK - -2 | iso.3.6.1.4.1.8072.3.2.67.16=-2 ', "Negative integer check OK output" ); 228is($res->output, 'SNMP OK - -2 | iso.3.6.1.4.1.8072.3.2.67.16=-2;-2:;-3: ', "Negative integer check OK output" );
229 229
230$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.16 -w -2: -c -3:" ); 230$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.16 -w -2: -c -3:" );
231is($res->return_code, 1, "Negative integer check WARNING" ); 231is($res->return_code, 1, "Negative integer check WARNING" );
232is($res->output, 'SNMP WARNING - *-3* | iso.3.6.1.4.1.8072.3.2.67.16=-3 ', "Negative integer check WARNING output" ); 232is($res->output, 'SNMP WARNING - *-3* | iso.3.6.1.4.1.8072.3.2.67.16=-3;-2:;-3: ', "Negative integer check WARNING output" );
233 233
234$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.16 -w -2: -c -3:" ); 234$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.16 -w -2: -c -3:" );
235is($res->return_code, 2, "Negative integer check CRITICAL" ); 235is($res->return_code, 2, "Negative integer check CRITICAL" );
236is($res->output, 'SNMP CRITICAL - *-4* | iso.3.6.1.4.1.8072.3.2.67.16=-4 ', "Negative integer check CRITICAL output" ); 236is($res->output, 'SNMP CRITICAL - *-4* | iso.3.6.1.4.1.8072.3.2.67.16=-4;-2:;-3: ', "Negative integer check CRITICAL output" );
237 237
238$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.17 -w -3: -c -6:" ); 238$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.17 -w -3: -c -6:" );
239is($res->return_code, 1, "Negative integer as string, WARNING" ); 239is($res->return_code, 1, "Negative integer as string, WARNING" );
240is($res->output, 'SNMP WARNING - *-4* | iso.3.6.1.4.1.8072.3.2.67.17=-4 ', "Negative integer as string, WARNING output" ); 240is($res->output, 'SNMP WARNING - *-4* | iso.3.6.1.4.1.8072.3.2.67.17=-4;-3:;-6: ', "Negative integer as string, WARNING output" );
241 241
242$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.17 -w -2: -c -3:" ); 242$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.17 -w -2: -c -3:" );
243is($res->return_code, 2, "Negative integer as string, CRITICAL" ); 243is($res->return_code, 2, "Negative integer as string, CRITICAL" );
244is($res->output, 'SNMP CRITICAL - *-4* | iso.3.6.1.4.1.8072.3.2.67.17=-4 ', "Negative integer as string, CRITICAL output" ); 244is($res->output, 'SNMP CRITICAL - *-4* | iso.3.6.1.4.1.8072.3.2.67.17=-4;-2:;-3: ', "Negative integer as string, CRITICAL output" );
245 245
246$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.18 -c ~:-6.5" ); 246$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.18 -c '~:-6.5'" );
247is($res->return_code, 0, "Negative float OK" ); 247is($res->return_code, 0, "Negative float OK" );
248is($res->output, 'SNMP OK - -6.6 | iso.3.6.1.4.1.8072.3.2.67.18=-6.6 ', "Negative float OK output" ); 248is($res->output, 'SNMP OK - -6.6 | iso.3.6.1.4.1.8072.3.2.67.18=-6.6;;~:-6.5 ', "Negative float OK output" );
249 249
250$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.18 -w ~:-6.65 -c ~:-6.55" ); 250$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.18 -w '~:-6.65' -c '~:-6.55'" );
251is($res->return_code, 1, "Negative float WARNING" ); 251is($res->return_code, 1, "Negative float WARNING" );
252is($res->output, 'SNMP WARNING - *-6.6* | iso.3.6.1.4.1.8072.3.2.67.18=-6.6 ', "Negative float WARNING output" ); 252is($res->output, 'SNMP WARNING - *-6.6* | iso.3.6.1.4.1.8072.3.2.67.18=-6.6;~:-6.65;~:-6.55 ', "Negative float WARNING output" );
253 253
diff --git a/plugins/utils.c b/plugins/utils.c
index 58b153d8..231af92b 100644
--- a/plugins/utils.c
+++ b/plugins/utils.c
@@ -144,8 +144,6 @@ usage5 (void)
144void 144void
145print_revision (const char *command_name, const char *revision) 145print_revision (const char *command_name, const char *revision)
146{ 146{
147 char plugin_revision[STRLEN];
148
149 printf ("%s v%s (%s %s)\n", 147 printf ("%s v%s (%s %s)\n",
150 command_name, revision, PACKAGE, VERSION); 148 command_name, revision, PACKAGE, VERSION);
151} 149}
@@ -630,3 +628,84 @@ char *fperfdata (const char *label,
630 628
631 return data; 629 return data;
632} 630}
631
632char *sperfdata (const char *label,
633 double val,
634 const char *uom,
635 char *warn,
636 char *crit,
637 int minp,
638 double minv,
639 int maxp,
640 double maxv)
641{
642 char *data = NULL;
643 if (strpbrk (label, "'= "))
644 xasprintf (&data, "'%s'=", label);
645 else
646 xasprintf (&data, "%s=", label);
647
648 xasprintf (&data, "%s%f", data, val);
649 xasprintf (&data, "%s%s;", data, uom);
650
651 if (warn!=NULL)
652 xasprintf (&data, "%s%s", data, warn);
653
654 xasprintf (&data, "%s;", data);
655
656 if (crit!=NULL)
657 xasprintf (&data, "%s%s", data, crit);
658
659 xasprintf (&data, "%s;", data);
660
661 if (minp)
662 xasprintf (&data, "%s%f", data, minv);
663
664 if (maxp) {
665 xasprintf (&data, "%s;", data);
666 xasprintf (&data, "%s%f", data, maxv);
667 }
668
669 return data;
670}
671
672char *sperfdata_int (const char *label,
673 int val,
674 const char *uom,
675 char *warn,
676 char *crit,
677 int minp,
678 int minv,
679 int maxp,
680 int maxv)
681{
682 char *data = NULL;
683 if (strpbrk (label, "'= "))
684 xasprintf (&data, "'%s'=", label);
685 else
686 xasprintf (&data, "%s=", label);
687
688 xasprintf (&data, "%s%d", data, val);
689 xasprintf (&data, "%s%s;", data, uom);
690
691 if (warn!=NULL)
692 xasprintf (&data, "%s%s", data, warn);
693
694 xasprintf (&data, "%s;", data);
695
696 if (crit!=NULL)
697 xasprintf (&data, "%s%s", data, crit);
698
699 xasprintf (&data, "%s;", data);
700
701 if (minp)
702 xasprintf (&data, "%s%d", data, minv);
703
704 if (maxp) {
705 xasprintf (&data, "%s;", data);
706 xasprintf (&data, "%s%d", data, maxv);
707 }
708
709 return data;
710}
711
diff --git a/plugins/utils.h b/plugins/utils.h
index 4c4aaccc..a436e1ca 100644
--- a/plugins/utils.h
+++ b/plugins/utils.h
@@ -94,29 +94,17 @@ const char *state_text (int);
94#define max(a,b) (((a)>(b))?(a):(b)) 94#define max(a,b) (((a)>(b))?(a):(b))
95#define min(a,b) (((a)<(b))?(a):(b)) 95#define min(a,b) (((a)<(b))?(a):(b))
96 96
97char *perfdata (const char *, 97char *perfdata (const char *, long int, const char *, int, long int,
98 long int, 98 int, long int, int, long int, int, long int);
99 const char *, 99
100 int, 100char *fperfdata (const char *, double, const char *, int, double,
101 long int, 101 int, double, int, double, int, double);
102 int, 102
103 long int, 103char *sperfdata (const char *, double, const char *, char *, char *,
104 int, 104 int, double, int, double);
105 long int, 105
106 int, 106char *sperfdata_int (const char *, int, const char *, char *, char *,
107 long int); 107 int, int, int, int);
108
109char *fperfdata (const char *,
110 double,
111 const char *,
112 int,
113 double,
114 int,
115 double,
116 int,
117 double,
118 int,
119 double);
120 108
121/* The idea here is that, although not every plugin will use all of these, 109/* The idea here is that, although not every plugin will use all of these,
122 most will or should. Therefore, for consistency, these very common 110 most will or should. Therefore, for consistency, these very common