summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml2
-rw-r--r--NEWS6
-rw-r--r--THANKS.in1
-rw-r--r--doc/developer-guidelines.sgml9
-rw-r--r--plugins-root/check_dhcp.c4
-rw-r--r--plugins-root/check_icmp.c4
-rw-r--r--plugins-scripts/Makefile.am2
-rwxr-xr-xplugins-scripts/check_breeze.pl4
-rwxr-xr-xplugins-scripts/check_disk_smb.pl4
-rwxr-xr-xplugins-scripts/check_file_age.pl4
-rwxr-xr-xplugins-scripts/check_flexlm.pl4
-rwxr-xr-xplugins-scripts/check_ifoperstatus.pl6
-rwxr-xr-xplugins-scripts/check_ifstatus.pl8
-rwxr-xr-xplugins-scripts/check_ircd.pl4
-rwxr-xr-xplugins-scripts/check_mailq.pl4
-rwxr-xr-xplugins-scripts/check_mssql.pl2
-rwxr-xr-xplugins-scripts/check_netdns.pl11
-rwxr-xr-xplugins-scripts/check_ntp.pl471
-rwxr-xr-xplugins-scripts/check_rpc.pl4
-rwxr-xr-xplugins-scripts/check_wave.pl4
-rw-r--r--plugins-scripts/t/check_rpc.t2
-rw-r--r--plugins/check_apt.c4
-rw-r--r--plugins/check_by_ssh.c4
-rw-r--r--plugins/check_cluster.c2
-rw-r--r--plugins/check_dbi.c4
-rw-r--r--plugins/check_dig.c4
-rw-r--r--plugins/check_disk.c4
-rw-r--r--plugins/check_dns.c4
-rw-r--r--plugins/check_dummy.c4
-rw-r--r--plugins/check_fping.c4
-rw-r--r--plugins/check_game.c4
-rw-r--r--plugins/check_hpjd.c4
-rw-r--r--plugins/check_http.c86
-rw-r--r--plugins/check_ide_smart.c6
-rw-r--r--plugins/check_ldap.c4
-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.c4
-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.c4
-rw-r--r--plugins/check_snmp.c4
-rw-r--r--plugins/check_ssh.c4
-rw-r--r--plugins/check_swap.c4
-rw-r--r--plugins/check_tcp.c6
-rw-r--r--plugins/check_time.c4
-rw-r--r--plugins/check_ups.c4
-rw-r--r--plugins/check_users.c4
-rw-r--r--plugins/netutils.c12
-rw-r--r--plugins/sslutils.c33
-rw-r--r--plugins/t/check_http.t43
-rwxr-xr-xplugins/tests/check_http.t8
-rw-r--r--plugins/utils.c2
65 files changed, 276 insertions, 622 deletions
diff --git a/.travis.yml b/.travis.yml
index 11cc061..6af1fee 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,8 +11,10 @@ install:
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 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
12 - sudo apt-get install -qq --no-install-recommends libdbi0-dev libdbd-sqlite3 libssl-dev dnsutils snmp-mibs-downloader libsnmp-perl snmpd 12 - 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 13 - sudo apt-get install -qq --no-install-recommends fping snmp netcat smbclient fping pure-ftpd apache2 postfix libhttp-daemon-ssl-perl
14 - sudo apt-get install -qq --no-install-recommends libdbd-sybase-perl libnet-dns-perl
14 - sudo apt-get install -qq --no-install-recommends slapd ldap-utils 15 - sudo apt-get install -qq --no-install-recommends slapd ldap-utils
15 - sudo apt-get install -qq --no-install-recommends autoconf automake 16 - sudo apt-get install -qq --no-install-recommends autoconf automake
17 - sudo apt-get install -qq --no-install-recommends faketime
16 18
17before_script: 19before_script:
18 - tools/setup 20 - tools/setup
diff --git a/NEWS b/NEWS
index 4adc8f8..a489ee2 100644
--- a/NEWS
+++ b/NEWS
@@ -22,7 +22,11 @@ This file documents the major additions and syntax changes between releases.
22 WARNINGS 22 WARNINGS
23 The format of the performance data emitted by check_mrtgtraf has been 23 The format of the performance data emitted by check_mrtgtraf has been
24 changed to comply with the development guidelines 24 changed to comply with the development guidelines
25 check_ssh not returns CRITICAL for protocal/version errors 25 check_ssh now returns CRITICAL for protocol/version errors
26 If a plugin is invoked with -h/--help or -V/--version, the exit status
27 is now UNKNOWN
28 The superseded check_ntp.pl was removed, please use check_ntp_peer or
29 check_ntp_time instead
26 30
272.1.1 2nd December 2014 312.1.1 2nd December 2014
28 FIXES 32 FIXES
diff --git a/THANKS.in b/THANKS.in
index 9a9ca3f..59c90fe 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -335,3 +335,4 @@ Jonas Genannt
335Nick Peelman 335Nick Peelman
336Sebastian Herbszt 336Sebastian Herbszt
337Christopher Schultz 337Christopher Schultz
338Matthias Hähnel
diff --git a/doc/developer-guidelines.sgml b/doc/developer-guidelines.sgml
index d934028..228d3fa 100644
--- a/doc/developer-guidelines.sgml
+++ b/doc/developer-guidelines.sgml
@@ -194,13 +194,15 @@
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></entry> 203 </para>
204 <para>The --help or --version output should also result in Unknown state.</para>
205 </entry>
204 </row> 206 </row>
205 </tbody> 207 </tbody>
206 </tgroup> 208 </tgroup>
@@ -610,6 +612,9 @@
610 <para>The option -v or --verbose should be present in all plugins. 612 <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 613 The user should be allowed to specify -v multiple times to increase
612 the verbosity level, as described in <xref linkend="verboselevels">.</para> 614 the verbosity level, as described in <xref linkend="verboselevels">.</para>
615
616 The exit code for version information or help should be UNKNOWN
617 (3).</para>
613 </section> 618 </section>
614 619
615 <section> 620 <section>
diff --git a/plugins-root/check_dhcp.c b/plugins-root/check_dhcp.c
index b874c55..3723e61 100644
--- a/plugins-root/check_dhcp.c
+++ b/plugins-root/check_dhcp.c
@@ -1163,11 +1163,11 @@ int call_getopt(int argc, char **argv){
1163 1163
1164 case 'V': /* version */ 1164 case 'V': /* version */
1165 print_revision(progname, NP_VERSION); 1165 print_revision(progname, NP_VERSION);
1166 exit(STATE_OK); 1166 exit(STATE_UNKNOWN);
1167 1167
1168 case 'h': /* help */ 1168 case 'h': /* help */
1169 print_help(); 1169 print_help();
1170 exit(STATE_OK); 1170 exit(STATE_UNKNOWN);
1171 1171
1172 case 'v': /* verbose */ 1172 case 'v': /* verbose */
1173 verbose=1; 1173 verbose=1;
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
index f420837..9ed12ba 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 }
diff --git a/plugins-scripts/Makefile.am b/plugins-scripts/Makefile.am
index 794a34f..ea65aed 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 12a60ee..05b9920 100755
--- a/plugins-scripts/check_breeze.pl
+++ b/plugins-scripts/check_breeze.pl
@@ -28,10 +28,10 @@ GetOptions
28 28
29if ($opt_V) { 29if ($opt_V) {
30 print_revision($PROGNAME,'@NP_VERSION@'); 30 print_revision($PROGNAME,'@NP_VERSION@');
31 exit $ERRORS{'OK'}; 31 exit $ERRORS{'UNKNOWN'};
32} 32}
33 33
34if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 34if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
35 35
36($opt_H) || usage("Host name/address not specified\n"); 36($opt_H) || usage("Host name/address not specified\n");
37my $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 99948a4..9899226 100755
--- a/plugins-scripts/check_disk_smb.pl
+++ b/plugins-scripts/check_disk_smb.pl
@@ -54,10 +54,10 @@ GetOptions
54 54
55if ($opt_V) { 55if ($opt_V) {
56 print_revision($PROGNAME,'@NP_VERSION@'); #' 56 print_revision($PROGNAME,'@NP_VERSION@'); #'
57 exit $ERRORS{'OK'}; 57 exit $ERRORS{'UNKNOWN'};
58} 58}
59 59
60if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 60if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
61 61
62my $smbclient = $utils::PATH_TO_SMBCLIENT; 62my $smbclient = $utils::PATH_TO_SMBCLIENT;
63$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 15330f7..56b8e97 100755
--- a/plugins-scripts/check_file_age.pl
+++ b/plugins-scripts/check_file_age.pl
@@ -60,12 +60,12 @@ GetOptions(
60 60
61if ($opt_V) { 61if ($opt_V) {
62 print_revision($PROGNAME, '@NP_VERSION@'); 62 print_revision($PROGNAME, '@NP_VERSION@');
63 exit $ERRORS{'OK'}; 63 exit $ERRORS{'UNKNOWN'};
64} 64}
65 65
66if ($opt_h) { 66if ($opt_h) {
67 print_help(); 67 print_help();
68 exit $ERRORS{'OK'}; 68 exit $ERRORS{'UNKNOWN'};
69} 69}
70 70
71$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 49d674d..e3fe296 100755
--- a/plugins-scripts/check_flexlm.pl
+++ b/plugins-scripts/check_flexlm.pl
@@ -58,7 +58,7 @@ GetOptions
58 58
59if ($opt_V) { 59if ($opt_V) {
60 print_revision($PROGNAME,'@NP_VERSION@'); 60 print_revision($PROGNAME,'@NP_VERSION@');
61 exit $ERRORS{'OK'}; 61 exit $ERRORS{'UNKNOWN'};
62} 62}
63 63
64unless (defined $opt_t) { 64unless (defined $opt_t) {
@@ -66,7 +66,7 @@ unless (defined $opt_t) {
66} 66}
67 67
68 68
69if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 69if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
70 70
71unless (defined $opt_F) { 71unless (defined $opt_F) {
72 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 1a7fbba..3eed4bc 100755
--- a/plugins-scripts/check_ifoperstatus.pl
+++ b/plugins-scripts/check_ifoperstatus.pl
@@ -367,17 +367,17 @@ sub process_arguments() {
367 367
368 if ($status == 0){ 368 if ($status == 0){
369 print_help(); 369 print_help();
370 exit $ERRORS{'OK'}; 370 exit $ERRORS{'UNKNOWN'};
371 } 371 }
372 372
373 if ($opt_V) { 373 if ($opt_V) {
374 print_revision($PROGNAME,'@NP_VERSION@'); 374 print_revision($PROGNAME,'@NP_VERSION@');
375 exit $ERRORS{'OK'}; 375 exit $ERRORS{'UNKNOWN'};
376 } 376 }
377 377
378 if ($opt_h) { 378 if ($opt_h) {
379 print_help(); 379 print_help();
380 exit $ERRORS{'OK'}; 380 exit $ERRORS{'UNKNOWN'};
381 } 381 }
382 382
383 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 2c76d0c..9f2f7c3 100755
--- a/plugins-scripts/check_ifstatus.pl
+++ b/plugins-scripts/check_ifstatus.pl
@@ -119,7 +119,7 @@ $status = process_arguments();
119if ($status != 0) 119if ($status != 0)
120{ 120{
121 print_help() ; 121 print_help() ;
122 exit $ERRORS{'OK'}; 122 exit $ERRORS{'UNKNOWN'};
123} 123}
124 124
125 125
@@ -313,17 +313,17 @@ sub process_arguments() {
313 313
314 if ($status == 0){ 314 if ($status == 0){
315 print_help(); 315 print_help();
316 exit $ERRORS{'OK'}; 316 exit $ERRORS{'UNKNOWN'};
317 } 317 }
318 318
319 if ($opt_V) { 319 if ($opt_V) {
320 print_revision($PROGNAME,'@NP_VERSION@'); 320 print_revision($PROGNAME,'@NP_VERSION@');
321 exit $ERRORS{'OK'}; 321 exit $ERRORS{'UNKNOWN'};
322 } 322 }
323 323
324 if ($opt_h) { 324 if ($opt_h) {
325 print_help(); 325 print_help();
326 exit $ERRORS{'OK'}; 326 exit $ERRORS{'UNKNOWN'};
327 } 327 }
328 328
329 unless (defined $timeout) { 329 unless (defined $timeout) {
diff --git a/plugins-scripts/check_ircd.pl b/plugins-scripts/check_ircd.pl
index afedfb9..22d21c2 100755
--- a/plugins-scripts/check_ircd.pl
+++ b/plugins-scripts/check_ircd.pl
@@ -181,10 +181,10 @@ MAIN:
181 181
182 if ($opt_V) { 182 if ($opt_V) {
183 print_revision($PROGNAME,'@NP_VERSION@'); 183 print_revision($PROGNAME,'@NP_VERSION@');
184 exit $ERRORS{'OK'}; 184 exit $ERRORS{'UNKNOWN'};
185 } 185 }
186 186
187 if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 187 if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
188 188
189 ($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");
190 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 3086e94..32f498d 100755
--- a/plugins-scripts/check_mailq.pl
+++ b/plugins-scripts/check_mailq.pl
@@ -573,12 +573,12 @@ sub process_arguments(){
573 573
574 if ($opt_V) { 574 if ($opt_V) {
575 print_revision($PROGNAME,'@NP_VERSION@'); 575 print_revision($PROGNAME,'@NP_VERSION@');
576 exit $ERRORS{'OK'}; 576 exit $ERRORS{'UNKNOWN'};
577 } 577 }
578 578
579 if ($opt_h) { 579 if ($opt_h) {
580 print_help(); 580 print_help();
581 exit $ERRORS{'OK'}; 581 exit $ERRORS{'UNKNOWN'};
582 } 582 }
583 583
584 if (defined $opt_v ){ 584 if (defined $opt_v ){
diff --git a/plugins-scripts/check_mssql.pl b/plugins-scripts/check_mssql.pl
index a436a8f..fb3952d 100755
--- a/plugins-scripts/check_mssql.pl
+++ b/plugins-scripts/check_mssql.pl
@@ -130,7 +130,7 @@ sub process_arguments {
130 130
131 if (defined $opt_V) { 131 if (defined $opt_V) {
132 print_revision($PROGNAME,'@NP_VERSION@'); 132 print_revision($PROGNAME,'@NP_VERSION@');
133 exit $ERRORS{'OK'}; 133 exit $ERRORS{'UNKNOWN'};
134 } 134 }
135 135
136 syntax("Help:") if ($help); 136 syntax("Help:") if ($help);
diff --git a/plugins-scripts/check_netdns.pl b/plugins-scripts/check_netdns.pl
index af1456b..38538e5 100755
--- a/plugins-scripts/check_netdns.pl
+++ b/plugins-scripts/check_netdns.pl
@@ -32,6 +32,9 @@ use lib "$FindBin::Bin";
32use utils; 32use utils;
33 33
34my $PROGNAME = "check_netdns"; 34my $PROGNAME = "check_netdns";
35sub print_help ();
36sub print_version();
37sub print_usage ();
35 38
36$ENV{'PATH'}='@TRUSTED_PATH@'; 39$ENV{'PATH'}='@TRUSTED_PATH@';
37$ENV{'BASH_ENV'}=''; 40$ENV{'BASH_ENV'}='';
@@ -43,12 +46,12 @@ GetOptions("V" => $opt_V, "version" => $opt_V,
43 "t=i" => $opt_t, "timeout=i" => $opt_t, 46 "t=i" => $opt_t, "timeout=i" => $opt_t,
44 "s=s" => $opt_s, "server=s" => $opt_s, 47 "s=s" => $opt_s, "server=s" => $opt_s,
45 "H=s" => $opt_H, "hostname=s" => $opt_H); 48 "H=s" => $opt_H, "hostname=s" => $opt_H);
46 49
47# -h means display verbose help screen 50# -h means display verbose help screen
48if($opt_h){ print_help(); exit 0; } 51if($opt_h){ print_help(); exit 3; }
49 52
50# -V means display version number 53# -V means display version number
51if ($opt_V) { print_version(); exit 0; } 54if ($opt_V) { print_version(); exit 3; }
52 55
53# -H means host name 56# -H means host name
54$opt_H = shift unless ($opt_H); 57$opt_H = shift unless ($opt_H);
@@ -70,7 +73,7 @@ if ($opt_s) {
70 $server = $1; 73 $server = $1;
71 } else { 74 } else {
72 print "$opt_s is not a valid host name"; 75 print "$opt_s is not a valid host name";
73 exit -1; 76 exit 3;
74 } 77 }
75} 78}
76 79
diff --git a/plugins-scripts/check_ntp.pl b/plugins-scripts/check_ntp.pl
deleted file mode 100755
index 13da939..0000000
--- 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 cbdeceb..47d6e49 100755
--- a/plugins-scripts/check_rpc.pl
+++ b/plugins-scripts/check_rpc.pl
@@ -63,12 +63,12 @@ GetOptions(
63); 63);
64 64
65# -h means display verbose help screen 65# -h means display verbose help screen
66if ($opt_h) { print_help(); exit $ERRORS{'OK'}; } 66if ($opt_h) { print_help(); exit $ERRORS{'UNKNOWN'}; }
67 67
68# -V means display version number 68# -V means display version number
69if ($opt_V) { 69if ($opt_V) {
70 print_revision($PROGNAME,'@NP_VERSION@'); 70 print_revision($PROGNAME,'@NP_VERSION@');
71 exit $ERRORS{'OK'}; 71 exit $ERRORS{'UNKNOWN'};
72} 72}
73 73
74# 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 979416e..41e15f5 100755
--- a/plugins-scripts/check_wave.pl
+++ b/plugins-scripts/check_wave.pl
@@ -31,12 +31,12 @@ GetOptions
31 31
32if ($opt_V) { 32if ($opt_V) {
33 print_revision($PROGNAME,'@NP_VERSION@'); #' 33 print_revision($PROGNAME,'@NP_VERSION@'); #'
34 exit $ERRORS{'OK'}; 34 exit $ERRORS{'UNKNOWN'};
35} 35}
36 36
37if ($opt_h) { 37if ($opt_h) {
38 print_help(); 38 print_help();
39 exit $ERRORS{'OK'}; 39 exit $ERRORS{'UNKNOWN'};
40} 40}
41 41
42$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 be8ae2f..c58f7bf 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/check_apt.c b/plugins/check_apt.c
index 8747f90..a639a41 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 a877f88..04bce38 100644
--- a/plugins/check_by_ssh.c
+++ b/plugins/check_by_ssh.c
@@ -209,10 +209,10 @@ process_arguments (int argc, char **argv)
209 switch (c) { 209 switch (c) {
210 case 'V': /* version */ 210 case 'V': /* version */
211 print_revision (progname, NP_VERSION); 211 print_revision (progname, NP_VERSION);
212 exit (STATE_OK); 212 exit (STATE_UNKNOWN);
213 case 'h': /* help */ 213 case 'h': /* help */
214 print_help (); 214 print_help ();
215 exit (STATE_OK); 215 exit (STATE_UNKNOWN);
216 case 'v': /* help */ 216 case 'v': /* help */
217 verbose = TRUE; 217 verbose = TRUE;
218 break; 218 break;
diff --git a/plugins/check_cluster.c b/plugins/check_cluster.c
index cf699e1..b86e501 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 a3d033f..826eb8d 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 d899b11..db4b20e 100644
--- a/plugins/check_dig.c
+++ b/plugins/check_dig.c
@@ -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 eb573f5..9693bad 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -766,10 +766,10 @@ process_arguments (int argc, char **argv)
766 break; 766 break;
767 case 'V': /* version */ 767 case 'V': /* version */
768 print_revision (progname, NP_VERSION); 768 print_revision (progname, NP_VERSION);
769 exit (STATE_OK); 769 exit (STATE_UNKNOWN);
770 case 'h': /* help */ 770 case 'h': /* help */
771 print_help (); 771 print_help ();
772 exit (STATE_OK); 772 exit (STATE_UNKNOWN);
773 case '?': /* help */ 773 case '?': /* help */
774 usage (_("Unknown argument")); 774 usage (_("Unknown argument"));
775 } 775 }
diff --git a/plugins/check_dns.c b/plugins/check_dns.c
index 2212122..d6bd2c0 100644
--- a/plugins/check_dns.c
+++ b/plugins/check_dns.c
@@ -395,10 +395,10 @@ process_arguments (int argc, char **argv)
395 switch (c) { 395 switch (c) {
396 case 'h': /* help */ 396 case 'h': /* help */
397 print_help (); 397 print_help ();
398 exit (STATE_OK); 398 exit (STATE_UNKNOWN);
399 case 'V': /* version */ 399 case 'V': /* version */
400 print_revision (progname, NP_VERSION); 400 print_revision (progname, NP_VERSION);
401 exit (STATE_OK); 401 exit (STATE_UNKNOWN);
402 case 'v': /* version */ 402 case 'v': /* version */
403 verbose = TRUE; 403 verbose = TRUE;
404 break; 404 break;
diff --git a/plugins/check_dummy.c b/plugins/check_dummy.c
index 3ed6871..212a134 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 274dd75..da1ce1a 100644
--- a/plugins/check_fping.c
+++ b/plugins/check_fping.c
@@ -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 29e59e2..709dae1 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 5fe0698..f159f5a 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 b1a69e5..2038f4a 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))
@@ -880,17 +880,42 @@ check_http (void)
880 double elapsed_time_transfer = 0.0; 880 double elapsed_time_transfer = 0.0;
881 int page_len = 0; 881 int page_len = 0;
882 int result = STATE_OK; 882 int result = STATE_OK;
883 char *force_host_header = NULL;
883 884
884 /* try to connect to the host at the given port number */ 885 /* try to connect to the host at the given port number */
885 gettimeofday (&tv_temp, NULL); 886 gettimeofday (&tv_temp, NULL);
886 if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK) 887 if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK)
887 die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n")); 888 die (STATE_CRITICAL, _("HTTP CRITICAL - Unable to open TCP socket\n"));
888 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 }
889#ifdef HAVE_SSL 913#ifdef HAVE_SSL
890 elapsed_time_connect = (double)microsec_connect / 1.0e6; 914 elapsed_time_connect = (double)microsec_connect / 1.0e6;
891 if (use_ssl == TRUE) { 915 if (use_ssl == TRUE) {
892 gettimeofday (&tv_temp, NULL); 916 gettimeofday (&tv_temp, NULL);
893 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");
894 if (result != STATE_OK) 919 if (result != STATE_OK)
895 die (STATE_CRITICAL, NULL); 920 die (STATE_CRITICAL, NULL);
896 microsec_ssl = deltime (tv_temp); 921 microsec_ssl = deltime (tv_temp);
@@ -904,29 +929,51 @@ check_http (void)
904 } 929 }
905#endif /* HAVE_SSL */ 930#endif /* HAVE_SSL */
906 931
907 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);
908 937
909 /* tell HTTP/1.1 servers not to keep the connection alive */ 938 /* tell HTTP/1.1 servers not to keep the connection alive */
910 xasprintf (&buf, "%sConnection: close\r\n", buf); 939 xasprintf (&buf, "%sConnection: close\r\n", buf);
911 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
912 /* optionally send the host header info */ 950 /* optionally send the host header info */
913 if (host_name) { 951 if (host_name) {
914 /* 952 if (force_host_header) {
915 * 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);
916 * 14.23). Some server applications/configurations cause trouble if the 954 }
917 * (default) port is explicitly specified in the "Host:" header line. 955 else {
918 */ 956 /*
919 if ((use_ssl == FALSE && server_port == HTTP_PORT) || 957 * Specify the port only if we're using a non-default port (see RFC 2616,
920 (use_ssl == TRUE && server_port == HTTPS_PORT)) 958 * 14.23). Some server applications/configurations cause trouble if the
921 xasprintf (&buf, "%sHost: %s\r\n", buf, host_name); 959 * (default) port is explicitly specified in the "Host:" header line.
922 else 960 */
923 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 }
924 } 969 }
925 970
926 /* optionally send any other header tag */ 971 /* optionally send any other header tag */
927 if (http_opt_headers_count) { 972 if (http_opt_headers_count) {
928 for (i = 0; i < http_opt_headers_count ; i++) { 973 for (i = 0; i < http_opt_headers_count ; i++) {
929 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 }
930 } 977 }
931 /* 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 */
932 /* Covered in a testcase in tests/check_http.t */ 979 /* Covered in a testcase in tests/check_http.t */
@@ -1508,7 +1555,7 @@ print_help (void)
1508 printf (" %s\n", _("URL to GET or POST (default: /)")); 1555 printf (" %s\n", _("URL to GET or POST (default: /)"));
1509 printf (" %s\n", "-P, --post=STRING"); 1556 printf (" %s\n", "-P, --post=STRING");
1510 printf (" %s\n", _("URL encoded http POST data")); 1557 printf (" %s\n", _("URL encoded http POST data"));
1511 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)");
1512 printf (" %s\n", _("Set HTTP method.")); 1559 printf (" %s\n", _("Set HTTP method."));
1513 printf (" %s\n", "-N, --no-body"); 1560 printf (" %s\n", "-N, --no-body");
1514 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."));
@@ -1582,7 +1629,7 @@ print_help (void)
1582 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,"));
1583 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"));
1584 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"));
1585 printf (" %s\n", _("the certificate is expired.")); 1632 printf (" %s\n\n", _("the certificate is expired."));
1586 printf ("\n"); 1633 printf ("\n");
1587 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");
1588 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,"));
@@ -1590,6 +1637,13 @@ print_help (void)
1590 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."));
1591 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"));
1592 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
1593#endif 1647#endif
1594 1648
1595 printf (UT_SUPPORT); 1649 printf (UT_SUPPORT);
diff --git a/plugins/check_ide_smart.c b/plugins/check_ide_smart.c
index 47605e9..8d540ca 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 cfc8222..e70d6a5 100644
--- a/plugins/check_ldap.c
+++ b/plugins/check_ldap.c
@@ -325,10 +325,10 @@ process_arguments (int argc, char **argv)
325 switch (c) { 325 switch (c) {
326 case 'h': /* help */ 326 case 'h': /* help */
327 print_help (); 327 print_help ();
328 exit (STATE_OK); 328 exit (STATE_UNKNOWN);
329 case 'V': /* version */ 329 case 'V': /* version */
330 print_revision (progname, NP_VERSION); 330 print_revision (progname, NP_VERSION);
331 exit (STATE_OK); 331 exit (STATE_UNKNOWN);
332 case 't': /* timeout period */ 332 case 't': /* timeout period */
333 if (!is_intnonneg (optarg)) 333 if (!is_intnonneg (optarg))
334 usage2 (_("Timeout interval must be a positive integer"), optarg); 334 usage2 (_("Timeout interval must be a positive integer"), optarg);
diff --git a/plugins/check_load.c b/plugins/check_load.c
index cde63e5..a96435f 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 cf3fe04..1fda549 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 3b038cf..eb66f62 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 216626b..5773afd 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 71ab776..49a14dd 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 791b6db..40d68f0 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 f621b0a..59c135d 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 a7d278d..75efc28 100644
--- a/plugins/check_ntp.c
+++ b/plugins/check_ntp.c
@@ -691,11 +691,11 @@ int process_arguments(int argc, char **argv){
691 switch (c) { 691 switch (c) {
692 case 'h': 692 case 'h':
693 print_help(); 693 print_help();
694 exit(STATE_OK); 694 exit(STATE_UNKNOWN);
695 break; 695 break;
696 case 'V': 696 case 'V':
697 print_revision(progname, NP_VERSION); 697 print_revision(progname, NP_VERSION);
698 exit(STATE_OK); 698 exit(STATE_UNKNOWN);
699 break; 699 break;
700 case 'v': 700 case 'v':
701 verbose++; 701 verbose++;
diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c
index 44424af..c656b0f 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 e344f8b..295f86f 100644
--- a/plugins/check_ntp_time.c
+++ b/plugins/check_ntp_time.c
@@ -477,11 +477,11 @@ int process_arguments(int argc, char **argv){
477 switch (c) { 477 switch (c) {
478 case 'h': 478 case 'h':
479 print_help(); 479 print_help();
480 exit(STATE_OK); 480 exit(STATE_UNKNOWN);
481 break; 481 break;
482 case 'V': 482 case 'V':
483 print_revision(progname, NP_VERSION); 483 print_revision(progname, NP_VERSION);
484 exit(STATE_OK); 484 exit(STATE_UNKNOWN);
485 break; 485 break;
486 case 'v': 486 case 'v':
487 verbose++; 487 verbose++;
diff --git a/plugins/check_nwstat.c b/plugins/check_nwstat.c
index 1a7bfa1..e7e8de0 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 af5eb9b..9a4d25f 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 9bad1ec..2eb699e 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 dbc5c3e..423ecbe 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 402aac5..4bcc56b 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 b294347..03cbb8b 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 00bd4d2..6491e6e 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 2430453..56040ff 100644
--- a/plugins/check_smtp.c
+++ b/plugins/check_smtp.c
@@ -623,10 +623,10 @@ process_arguments (int argc, char **argv)
623 break; 623 break;
624 case 'V': /* version */ 624 case 'V': /* version */
625 print_revision (progname, NP_VERSION); 625 print_revision (progname, NP_VERSION);
626 exit (STATE_OK); 626 exit (STATE_UNKNOWN);
627 case 'h': /* help */ 627 case 'h': /* help */
628 print_help (); 628 print_help ();
629 exit (STATE_OK); 629 exit (STATE_UNKNOWN);
630 case '?': /* help */ 630 case '?': /* help */
631 usage5 (); 631 usage5 ();
632 } 632 }
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 62e6b8b..28cc44d 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -709,10 +709,10 @@ process_arguments (int argc, char **argv)
709 usage5 (); 709 usage5 ();
710 case 'h': /* help */ 710 case 'h': /* help */
711 print_help (); 711 print_help ();
712 exit (STATE_OK); 712 exit (STATE_UNKNOWN);
713 case 'V': /* version */ 713 case 'V': /* version */
714 print_revision (progname, NP_VERSION); 714 print_revision (progname, NP_VERSION);
715 exit (STATE_OK); 715 exit (STATE_UNKNOWN);
716 case 'v': /* verbose */ 716 case 'v': /* verbose */
717 verbose++; 717 verbose++;
718 break; 718 break;
diff --git a/plugins/check_ssh.c b/plugins/check_ssh.c
index 3658965..8ccbd5a 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 25e0bac..4d5a407 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 a18c37a..6dc9aa9 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;
diff --git a/plugins/check_time.c b/plugins/check_time.c
index 3943742..baf8c59 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 099881d..dc5a348 100644
--- a/plugins/check_ups.c
+++ b/plugins/check_ups.c
@@ -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 a009f20..54415a4 100644
--- a/plugins/check_users.c
+++ b/plugins/check_users.c
@@ -210,10 +210,10 @@ process_arguments (int argc, char **argv)
210 usage5 (); 210 usage5 ();
211 case 'h': /* help */ 211 case 'h': /* help */
212 print_help (); 212 print_help ();
213 exit (STATE_OK); 213 exit (STATE_UNKNOWN);
214 case 'V': /* version */ 214 case 'V': /* version */
215 print_revision (progname, NP_VERSION); 215 print_revision (progname, NP_VERSION);
216 exit (STATE_OK); 216 exit (STATE_UNKNOWN);
217 case 'c': /* critical */ 217 case 'c': /* critical */
218 if (!is_intnonneg (optarg)) 218 if (!is_intnonneg (optarg))
219 usage4 (_("Critical threshold must be a positive integer")); 219 usage4 (_("Critical threshold must be a positive integer"));
diff --git a/plugins/netutils.c b/plugins/netutils.c
index 83f8942..705aaf0 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/sslutils.c b/plugins/sslutils.c
index 43b1a5a..4f9c793 100644
--- a/plugins/sslutils.c
+++ b/plugins/sslutils.c
@@ -195,7 +195,9 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
195# ifdef USE_OPENSSL 195# ifdef USE_OPENSSL
196 X509 *certificate=NULL; 196 X509 *certificate=NULL;
197 X509_NAME *subj=NULL; 197 X509_NAME *subj=NULL;
198 char timestamp[50] = "";
198 char cn[MAX_CN_LENGTH]= ""; 199 char cn[MAX_CN_LENGTH]= "";
200
199 int cnlen =-1; 201 int cnlen =-1;
200 int status=STATE_UNKNOWN; 202 int status=STATE_UNKNOWN;
201 203
@@ -204,7 +206,7 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
204 struct tm stamp; 206 struct tm stamp;
205 float time_left; 207 float time_left;
206 int days_left; 208 int days_left;
207 char timestamp[50] = ""; 209 int time_remaining;
208 time_t tm_t; 210 time_t tm_t;
209 211
210 certificate=SSL_get_peer_certificate(s); 212 certificate=SSL_get_peer_certificate(s);
@@ -258,7 +260,8 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
258 (tm->data[6 + offset] - '0') * 10 + (tm->data[7 + offset] - '0'); 260 (tm->data[6 + offset] - '0') * 10 + (tm->data[7 + offset] - '0');
259 stamp.tm_min = 261 stamp.tm_min =
260 (tm->data[8 + offset] - '0') * 10 + (tm->data[9 + offset] - '0'); 262 (tm->data[8 + offset] - '0') * 10 + (tm->data[9 + offset] - '0');
261 stamp.tm_sec = 0; 263 stamp.tm_sec =
264 (tm->data[10 + offset] - '0') * 10 + (tm->data[11 + offset] - '0');
262 stamp.tm_isdst = -1; 265 stamp.tm_isdst = -1;
263 266
264 time_left = difftime(timegm(&stamp), time(NULL)); 267 time_left = difftime(timegm(&stamp), time(NULL));
@@ -269,21 +272,35 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
269 if (days_left > 0 && days_left <= days_till_exp_warn) { 272 if (days_left > 0 && days_left <= days_till_exp_warn) {
270 printf (_("%s - Certificate '%s' expires in %d day(s) (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, days_left, timestamp); 273 printf (_("%s - Certificate '%s' expires in %d day(s) (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, days_left, timestamp);
271 if (days_left > days_till_exp_crit) 274 if (days_left > days_till_exp_crit)
272 return STATE_WARNING; 275 status = STATE_WARNING;
273 else 276 else
274 return STATE_CRITICAL; 277 status = STATE_CRITICAL;
278 } else if (days_left == 0 && time_left > 0) {
279 if (time_left >= 3600)
280 time_remaining = (int) time_left / 3600;
281 else
282 time_remaining = (int) time_left / 60;
283
284 printf (_("%s - Certificate '%s' expires in %u %s (%s)\n"),
285 (days_left>days_till_exp_crit) ? "WARNING" : "CRITICAL", cn, time_remaining,
286 time_left >= 3600 ? "hours" : "minutes", timestamp);
287
288 if ( days_left > days_till_exp_crit)
289 status = STATE_WARNING;
290 else
291 status = STATE_CRITICAL;
275 } else if (time_left < 0) { 292 } else if (time_left < 0) {
276 printf(_("CRITICAL - Certificate '%s' expired on %s.\n"), cn, timestamp); 293 printf(_("CRITICAL - Certificate '%s' expired on %s.\n"), cn, timestamp);
277 status=STATE_CRITICAL; 294 status=STATE_CRITICAL;
278 } else if (days_left == 0) { 295 } else if (days_left == 0) {
279 printf (_("%s - Certificate '%s' expires today (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, timestamp); 296 printf (_("%s - Certificate '%s' just expired (%s).\n"), (days_left>days_till_exp_crit)?"WARNING":"CRITICAL", cn, timestamp);
280 if (days_left > days_till_exp_crit) 297 if (days_left > days_till_exp_crit)
281 return STATE_WARNING; 298 status = STATE_WARNING;
282 else 299 else
283 return STATE_CRITICAL; 300 status = STATE_CRITICAL;
284 } else { 301 } else {
285 printf(_("OK - Certificate '%s' will expire on %s.\n"), cn, timestamp); 302 printf(_("OK - Certificate '%s' will expire on %s.\n"), cn, timestamp);
286 status=STATE_OK; 303 status = STATE_OK;
287 } 304 }
288 X509_free(certificate); 305 X509_free(certificate);
289 return status; 306 return status;
diff --git a/plugins/t/check_http.t b/plugins/t/check_http.t
index 2539a28..c2caec6 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,6 +115,40 @@ 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);
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' );
diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t
index d93a0ec..e72d243 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.', "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\)./', "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\)./', "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.',
204 "output ok" ); 204 "output ok" );
205 205
206} 206}
diff --git a/plugins/utils.c b/plugins/utils.c
index 7f49e7b..a864e4a 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}