2005-07-24 21:47:15 -04:00
#! /usr/bin/perl -w -I ..
#
# HyperText Transfer Protocol (HTTP) Test via check_http
#
#
2002-02-28 01:42:51 -05:00
use strict ;
2006-03-07 05:23:31 -05:00
use Test::More ;
2015-10-02 09:54:30 -04:00
use POSIX qw/mktime strftime/ ;
2005-07-24 21:47:15 -04:00
use NPTest ;
2022-07-20 07:33:49 -04:00
plan tests = > 49 ;
2006-03-24 11:13:40 -05:00
2006-03-07 05:23:31 -05:00
my $ successOutput = '/OK.*HTTP.*second/' ;
2002-02-28 01:42:51 -05:00
2006-03-07 05:23:31 -05:00
my $ res ;
2017-03-18 17:48:35 -04:00
my $ plugin = 'check_http' ;
$ plugin = 'check_curl' if $ 0 =~ m/check_curl/mx ;
2002-02-28 01:42:51 -05:00
2018-12-04 09:20:18 -05:00
my $ host_tcp_http = getTestParameter ( "NP_HOST_TCP_HTTP" , "A host providing the HTTP Service (a web server)" , "localhost" ) ;
my $ host_tls_http = getTestParameter ( "NP_HOST_TLS_HTTP" , "A host providing the HTTPS Service (a tls web server)" , "localhost" ) ;
my $ host_tls_cert = getTestParameter ( "NP_HOST_TLS_CERT" , "the common name of the certificate." , "localhost" ) ;
my $ host_nonresponsive = getTestParameter ( "NP_HOST_NONRESPONSIVE" , "The hostname of system not responsive to network requests" , "10.0.0.1" ) ;
my $ hostname_invalid = getTestParameter ( "NP_HOSTNAME_INVALID" , "An invalid (not known to DNS) hostname" , "nosuchhost" ) ;
my $ internet_access = getTestParameter ( "NP_INTERNET_ACCESS" , "Is this system directly connected to the internet?" , "yes" ) ;
my $ host_tcp_http2 = getTestParameter ( "NP_HOST_TCP_HTTP2" , "A host providing an index page containing the string 'monitoring'" , "test.monitoring-plugins.org" ) ;
my $ host_tcp_proxy = getTestParameter ( "NP_HOST_TCP_PROXY" , "A host providing a HTTP proxy with CONNECT support" , "localhost" ) ;
my $ port_tcp_proxy = getTestParameter ( "NP_PORT_TCP_PROXY" , "Port of the proxy with HTTP and CONNECT support" , "3128" ) ;
2007-04-01 10:21:09 -04:00
2015-10-02 09:54:30 -04:00
my $ faketime = - x '/usr/bin/faketime' ? 1 : 0 ;
2007-04-01 10:21:09 -04:00
2006-03-07 05:23:31 -05:00
$ res = NPTest - > testCmd (
2017-03-18 17:48:35 -04:00
"./$plugin $host_tcp_http -wt 300 -ct 600"
2006-03-07 05:23:31 -05:00
) ;
cmp_ok ( $ res - > return_code , '==' , 0 , "Webserver $host_tcp_http responded" ) ;
like ( $ res - > output , $ successOutput , "Output OK" ) ;
2005-07-24 21:47:15 -04:00
2006-04-05 03:58:29 -04:00
$ res = NPTest - > testCmd (
2017-03-18 17:48:35 -04:00
"./$plugin $host_tcp_http -wt 300 -ct 600 -v -v -v -k 'bob:there' -k 'carl:frown'"
2006-04-05 03:58:29 -04:00
) ;
2013-08-15 05:10:04 -04:00
like ( $ res - > output , '/bob:there\r\ncarl:frown\r\n/' , "Got headers with multiple -k options" ) ;
2006-04-05 03:58:29 -04:00
2006-03-07 05:23:31 -05:00
$ res = NPTest - > testCmd (
2017-03-18 17:48:35 -04:00
"./$plugin $host_nonresponsive -wt 1 -ct 2 -t 3"
2006-03-07 05:23:31 -05:00
) ;
cmp_ok ( $ res - > return_code , '==' , 2 , "Webserver $host_nonresponsive not responding" ) ;
2015-10-02 09:54:30 -04:00
cmp_ok ( $ res - > output , 'eq' , "CRITICAL - Socket timeout after 3 seconds" , "Output OK" ) ;
2002-02-28 01:42:51 -05:00
2006-03-07 05:23:31 -05:00
$ res = NPTest - > testCmd (
2017-03-18 17:48:35 -04:00
"./$plugin $hostname_invalid -wt 1 -ct 2"
2006-03-07 05:23:31 -05:00
) ;
cmp_ok ( $ res - > return_code , '==' , 2 , "Webserver $hostname_invalid not valid" ) ;
2006-03-24 11:13:40 -05:00
# The first part of the message comes from the OS catalogue, so cannot check this.
# On Debian, it is Name or service not known, on Darwin, it is No address associated with nodename
2006-03-29 03:18:50 -05:00
# Is also possible to get a socket timeout if DNS is not responding fast enough
like ( $ res - > output , "/Unable to open TCP socket|Socket timeout after/" , "Output OK" ) ;
2005-07-24 21:47:15 -04:00
2016-11-11 04:32:19 -05:00
# host header checks
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -v -H $host_tcp_http" ) ;
2016-11-11 04:32:19 -05:00
like ( $ res - > output , '/^Host: ' . $ host_tcp_http . '\s*$/ms' , "Host Header OK" ) ;
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -v -H $host_tcp_http -p 80" ) ;
2016-11-11 04:32:19 -05:00
like ( $ res - > output , '/^Host: ' . $ host_tcp_http . '\s*$/ms' , "Host Header OK" ) ;
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -v -H $host_tcp_http:8080 -p 80" ) ;
2016-11-11 04:32:19 -05:00
like ( $ res - > output , '/^Host: ' . $ host_tcp_http . ':8080\s*$/ms' , "Host Header OK" ) ;
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -v -H $host_tcp_http:8080 -p 80" ) ;
2016-11-11 04:32:19 -05:00
like ( $ res - > output , '/^Host: ' . $ host_tcp_http . ':8080\s*$/ms' , "Host Header OK" ) ;
SKIP: {
skip "No internet access" , 3 if $ internet_access eq "no" ;
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -v -H $host_tls_http -S" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , '/^Host: ' . $ host_tls_http . '\s*$/ms' , "Host Header OK" ) ;
2016-11-11 04:32:19 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -v -H $host_tls_http:8080 -S -p 443" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , '/^Host: ' . $ host_tls_http . ':8080\s*$/ms' , "Host Header OK" ) ;
2016-11-11 04:32:19 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -v -H $host_tls_http:443 -S -p 443" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , '/^Host: ' . $ host_tls_http . '\s*$/ms' , "Host Header OK" ) ;
2016-11-11 04:32:19 -05:00
} ;
2007-04-01 10:21:09 -04:00
SKIP: {
2014-01-18 03:40:24 -05:00
skip "No host serving monitoring in index file" , 7 unless $ host_tcp_http2 ;
2006-03-24 11:13:40 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H $host_tcp_http2 -r 'monitoring'" ) ;
2014-01-18 03:40:24 -05:00
cmp_ok ( $ res - > return_code , "==" , 0 , "Got a reference to 'monitoring'" ) ;
2006-12-20 17:33:29 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H $host_tcp_http2 -r 'mONiTORing'" ) ;
2014-01-18 03:40:24 -05:00
cmp_ok ( $ res - > return_code , "==" , 2 , "Not got 'mONiTORing'" ) ;
2007-04-01 10:21:09 -04:00
like ( $ res - > output , "/pattern not found/" , "Error message says 'pattern not found'" ) ;
2006-12-20 17:33:29 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H $host_tcp_http2 -R 'mONiTORing'" ) ;
2014-01-18 03:40:24 -05:00
cmp_ok ( $ res - > return_code , "==" , 0 , "But case insensitive doesn't mind 'mONiTORing'" ) ;
2006-03-24 11:13:40 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H $host_tcp_http2 -r 'monitoring' --invert-regex" ) ;
2007-04-01 10:21:09 -04:00
cmp_ok ( $ res - > return_code , "==" , 2 , "Invert results work when found" ) ;
like ( $ res - > output , "/pattern found/" , "Error message says 'pattern found'" ) ;
2006-03-24 11:13:40 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H $host_tcp_http2 -r 'mONiTORing' --invert-regex" ) ;
2007-04-01 10:21:09 -04:00
cmp_ok ( $ res - > return_code , "==" , 0 , "And also when not found" ) ;
}
SKIP: {
2022-11-29 08:24:07 -05:00
skip "No internet access" , 22 if $ internet_access eq "no" ;
2007-04-01 10:21:09 -04:00
$ res = NPTest - > testCmd (
2017-03-18 17:48:35 -04:00
"./$plugin --ssl $host_tls_http"
2007-04-01 10:21:09 -04:00
) ;
2017-03-10 16:23:40 -05:00
cmp_ok ( $ res - > return_code , '==' , 0 , "Can read https for $host_tls_http" ) ;
2007-04-01 10:21:09 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -C 1 --ssl $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
cmp_ok ( $ res - > return_code , '==' , 0 , "Checking certificate for $host_tls_http" ) ;
like ( $ res - > output , "/Certificate '$host_tls_cert' will expire on/" , "Output OK" ) ;
2007-04-01 10:21:09 -04:00
my $ saved_cert_output = $ res - > output ;
2006-03-24 11:13:40 -05:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -C 8000,1 --ssl $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
cmp_ok ( $ res - > return_code , '==' , 1 , "Checking certificate for $host_tls_http" ) ;
like ( $ res - > output , qr/WARNING - Certificate '$host_tls_cert' expires in \d+ day/ , "Output Warning" ) ;
2012-06-25 06:32:01 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin $host_tls_http -C 1" ) ;
2007-04-01 10:21:09 -04:00
is ( $ res - > return_code , 0 , "Old syntax for cert checking okay" ) ;
is ( $ res - > output , $ saved_cert_output , "Same output as new syntax" ) ;
2006-05-25 11:34:54 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H $host_tls_http -C 1" ) ;
2007-04-01 10:21:09 -04:00
is ( $ res - > return_code , 0 , "Updated syntax for cert checking okay" ) ;
is ( $ res - > output , $ saved_cert_output , "Same output as new syntax" ) ;
2006-05-25 11:34:54 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin -C 1 $host_tls_http" ) ;
2007-04-01 10:21:09 -04:00
cmp_ok ( $ res - > output , 'eq' , $ saved_cert_output , "--ssl option automatically added" ) ;
2006-05-25 11:34:54 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin $host_tls_http -C 1" ) ;
2007-04-01 10:21:09 -04:00
cmp_ok ( $ res - > output , 'eq' , $ saved_cert_output , "Old syntax for cert checking still works" ) ;
2006-05-25 11:34:54 -04:00
2015-10-02 09:54:30 -04:00
# run some certificate checks with faketime
SKIP: {
2021-04-28 09:48:20 -04:00
skip "No faketime binary found" , 7 if ! $ faketime ;
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "LC_TIME=C TZ=UTC ./$plugin -C 1 $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , qr/OK - Certificate '$host_tls_cert' will expire on/ , "Catch cert output" ) ;
2015-10-02 09:54:30 -04:00
is ( $ res - > return_code , 0 , "Catch cert output exit code" ) ;
2016-11-07 16:46:06 -05:00
my ( $ mon , $ day , $ hour , $ min , $ sec , $ year ) = ( $ res - > output =~ /(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/ ) ;
2015-10-02 09:54:30 -04:00
if ( ! defined $ year ) {
2016-11-07 16:46:06 -05:00
die ( "parsing date failed from: " . $ res - > output ) ;
2015-10-02 09:54:30 -04:00
}
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 } ;
my $ ts = mktime ( $ sec , $ min , $ hour , $ day , $ months - > { $ mon } , $ year - 1900 ) ;
my $ time = strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( $ ts ) ) ;
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "LC_TIME=C TZ=UTC faketime -f '" . strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( $ ts ) ) . "' ./$plugin -C 1 $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , qr/CRITICAL - Certificate '$host_tls_cert' just expired/ , "Output on expire date" ) ;
2015-10-02 09:54:30 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "LC_TIME=C TZ=UTC faketime -f '" . strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( $ ts - 1 ) ) . "' ./$plugin -C 1 $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , qr/CRITICAL - Certificate '$host_tls_cert' expires in 0 minutes/ , "cert expires in 1 second output" ) ;
2015-10-02 09:54:30 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "LC_TIME=C TZ=UTC faketime -f '" . strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( $ ts - 120 ) ) . "' ./$plugin -C 1 $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , qr/CRITICAL - Certificate '$host_tls_cert' expires in 2 minutes/ , "cert expires in 2 minutes output" ) ;
2015-10-02 09:54:30 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "LC_TIME=C TZ=UTC faketime -f '" . strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( $ ts - 7200 ) ) . "' ./$plugin -C 1 $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , qr/CRITICAL - Certificate '$host_tls_cert' expires in 2 hours/ , "cert expires in 2 hours output" ) ;
2015-10-02 09:54:30 -04:00
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "LC_TIME=C TZ=UTC faketime -f '" . strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( $ ts + 1 ) ) . "' ./$plugin -C 1 $host_tls_http" ) ;
2017-03-10 16:23:40 -05:00
like ( $ res - > output , qr/CRITICAL - Certificate '$host_tls_cert' expired on/ , "Certificate expired output" ) ;
2015-10-02 09:54:30 -04:00
} ;
2017-03-18 17:48:35 -04:00
$ res = NPTest - > testCmd ( "./$plugin --ssl $host_tls_http -E" ) ;
2013-08-15 11:28:49 -04:00
like ( $ res - > output , '/time_connect=[\d\.]+/' , 'Extended Performance Data Output OK' ) ;
like ( $ res - > output , '/time_ssl=[\d\.]+/' , 'Extended Performance Data SSL Output OK' ) ;
2024-07-23 10:22:12 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H monitoring-plugins.org -u /download.html -f follow" ) ;
2007-04-01 10:21:09 -04:00
is ( $ res - > return_code , 0 , "Redirection based on location is okay" ) ;
2013-08-15 11:28:49 -04:00
2024-07-23 10:22:12 -04:00
$ res = NPTest - > testCmd ( "./$plugin -H monitoring-plugins.org --extended-perfdata" ) ;
2013-08-15 11:28:49 -04:00
like ( $ res - > output , '/time_connect=[\d\.]+/' , 'Extended Performance Data Output OK' ) ;
2007-04-01 10:21:09 -04:00
}
2018-11-06 05:32:52 -05:00
SKIP: {
skip "No internet access or proxy configured" , 6 if $ internet_access eq "no" or ! $ host_tcp_proxy ;
2019-04-04 07:09:15 -04:00
$ res = NPTest - > testCmd ( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -u http://$host_tcp_http -e 200,301,302" ) ;
2018-11-06 05:32:52 -05:00
is ( $ res - > return_code , 0 , "Proxy HTTP works" ) ;
2023-04-14 10:37:47 -04:00
like ( $ res - > output , qr/OK: Status line output matched/ , "Proxy HTTP Output is sufficient" ) ;
2018-11-06 05:32:52 -05:00
2019-04-04 07:09:15 -04:00
$ res = NPTest - > testCmd ( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT" ) ;
2018-11-06 05:32:52 -05:00
is ( $ res - > return_code , 0 , "Proxy HTTP CONNECT works" ) ;
2023-04-14 10:37:47 -04:00
like ( $ res - > output , qr/HTTP OK:/ , "Proxy HTTP CONNECT output sufficient" ) ;
2018-11-06 05:32:52 -05:00
2019-04-04 07:09:15 -04:00
$ res = NPTest - > testCmd ( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT:HEAD" ) ;
2018-11-06 05:32:52 -05:00
is ( $ res - > return_code , 0 , "Proxy HTTP CONNECT works with override method" ) ;
2023-04-14 10:37:47 -04:00
like ( $ res - > output , qr/HTTP OK:/ , "Proxy HTTP CONNECT output sufficient" ) ;
2018-11-06 05:32:52 -05:00
}