mirror of
https://github.com/monitoring-plugins/monitoring-plugins.git
synced 2026-06-09 00:32:05 -04:00
Merge pull request #1535 from monitoring-plugins/feature_check_curl
Feature check curl
This commit is contained in:
commit
00948e95f4
18 changed files with 4325 additions and 59 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
|
@ -142,6 +142,7 @@ NP-VERSION-FILE
|
|||
/plugins/check_by_ssh
|
||||
/plugins/check_clamd
|
||||
/plugins/check_cluster
|
||||
/plugins/check_curl
|
||||
/plugins/check_dbi
|
||||
/plugins/check_dig
|
||||
/plugins/check_disk
|
||||
|
|
@ -202,6 +203,12 @@ NP-VERSION-FILE
|
|||
/plugins/stamp-h*
|
||||
/plugins/urlize
|
||||
|
||||
# /plugins/picohttpparser
|
||||
/plugins/picohttpparser/Makefile
|
||||
/plugins/picohttpparser/Makefile.in
|
||||
/plugins/picohttpparser/.deps
|
||||
/plugins/picohttpparser/libpicohttpparser.a
|
||||
|
||||
# /plugins/t/
|
||||
/plugins/t/*.tmp
|
||||
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@ install:
|
|||
- sudo apt-get install -qq --no-install-recommends autoconf automake
|
||||
- sudo apt-get install -qq --no-install-recommends faketime
|
||||
- sudo apt-get install -qq --no-install-recommends libmonitoring-plugin-perl
|
||||
- sudo apt-get install -qq --no-install-recommends libcurl4-openssl-dev
|
||||
- sudo apt-get install -qq --no-install-recommends liburiparser-dev
|
||||
- sudo apt-get install -qq --no-install-recommends squid
|
||||
# Trusty related dependencies (not yet provided)
|
||||
- test "$(dpkg -l | grep -E "mysql-(client|server)-[0-9].[0-9]" | grep -c ^ii)" -gt 0 || sudo apt-get install -qq --no-install-recommends mariadb-client mariadb-server
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ Using the DLPI support on SysV systems to get the host MAC address in check_dhcp
|
|||
Stenberg, Daniel
|
||||
Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se>
|
||||
http://curl.haxx.se/
|
||||
Use of duplication of macros in m4/np_curl.m4
|
||||
Use of duplication of macros in m4/np_curl.m4 (slighly adapted for m4/uriparser.m4 too)
|
||||
|
||||
Coreutils team
|
||||
Copyright (C) 91, 1995-2004 Free Software Foundation, Inc.
|
||||
|
|
@ -31,3 +31,9 @@ Gnulib team
|
|||
Copyright (C) 2001, 2003, 2004, 2006 Free Software Foundation, Inc
|
||||
http://www.gnu.org/software/gnulib/
|
||||
Use of lib files that originally were used from coreutils
|
||||
|
||||
Copyright (c) 2009-2014 Kazuho Oku, Tokuhiro Matsuno, Daisuke Murase,
|
||||
Shigeo Mitsunari
|
||||
picohttpparser
|
||||
https://github.com/h2o/picohttpparser
|
||||
Use of the library for HTTP header parsing in check_curl.
|
||||
|
|
|
|||
16
REQUIREMENTS
16
REQUIREMENTS
|
|
@ -11,6 +11,22 @@ check_ldaps, check_http --ssl, check_tcp --ssl, check_smtp --starttls
|
|||
- Requires openssl or gnutls libraries for SSL connections
|
||||
http://www.openssl.org, http://www.gnu.org/software/gnutls
|
||||
|
||||
check_curl:
|
||||
- Requires libcurl 7.15.2 or later
|
||||
http://www.haxx.se
|
||||
- --ssl/-S and -C requires OpenSSL for certificate checks, otherwise
|
||||
libcurl must be quite new to support CURLINFO_CERTINFO with
|
||||
GnuTLS and NSS libraries:
|
||||
- 7.42.0 or newer for GnuTLS
|
||||
- 7.34.0 or newer for NSS
|
||||
GnuTLS is known to create problems on some distributions with
|
||||
self-signed certificate chains
|
||||
http://www.openssl.org, http://www.gnu.org/software/gnutls,
|
||||
http://www.mozilla.org/projects/security/pki/nss/,
|
||||
other SSL implementations are currently not supported
|
||||
- uriparser 0.7.5 or later
|
||||
https://uriparser.github.io/
|
||||
|
||||
check_fping:
|
||||
- Requires the fping utility distributed with SATAN. Either
|
||||
download and install SATAN or grab the fping program from
|
||||
|
|
|
|||
39
configure.ac
39
configure.ac
|
|
@ -385,6 +385,42 @@ if test "$ac_cv_header_wtsapi32_h" = "yes"; then
|
|||
AC_SUBST(WTSAPI32LIBS)
|
||||
fi
|
||||
|
||||
_can_enable_check_curl=no
|
||||
dnl Check for cURL library
|
||||
LIBCURL_CHECK_CONFIG(yes, 7.15.2, [
|
||||
_can_enable_check_curl=yes
|
||||
LIBCURLINCLUDE="$LIBCURL_CPPFLAGS"
|
||||
LIBCURLLIBS="$LIBCURL"
|
||||
LIBCURLCFLAGS="$LIBCURL_CPPFLAGS"
|
||||
AC_SUBST(LIBCURLINCLUDE)
|
||||
AC_SUBST(LIBCURLLIBS)
|
||||
AC_SUBST(LIBCURLCFLAGS)
|
||||
], [
|
||||
_can_enable_check_curl=no
|
||||
AC_MSG_WARN([Skipping curl plugin])
|
||||
AC_MSG_WARN([install libcurl libs to compile this plugin (see REQUIREMENTS).])
|
||||
])
|
||||
|
||||
dnl Check for uriparser library
|
||||
URIPARSER_CHECK(yes, 0.7.5, [
|
||||
URIPARSERINCLUDE="$URIPARSER_CPPFLAGS"
|
||||
URIPARSERLIBS="$URIPARSER"
|
||||
URIPARSERCFLAGS="$URIPARSER_CPPFLAGS"
|
||||
AC_SUBST(URIPARSERINCLUDE)
|
||||
AC_SUBST(URIPARSERLIBS)
|
||||
AC_SUBST(URIPARSERCFLAGS)
|
||||
], [
|
||||
_can_enable_check_curl=no
|
||||
AC_MSG_WARN([Skipping curl plugin])
|
||||
AC_MSG_WARN([install the uriparser library to compile this plugin (see REQUIREMENTS).])
|
||||
])
|
||||
|
||||
dnl prerequisites met, enable the plugin
|
||||
if test x$_can_enable_check_curl = xyes; then
|
||||
EXTRAS="$EXTRAS check_curl\$(EXEEXT)"
|
||||
fi
|
||||
AC_CONFIG_FILES([plugins/picohttpparser/Makefile])
|
||||
|
||||
dnl Fallback to who(1) if the system doesn't provide an utmpx(5) interface
|
||||
if test "$ac_cv_header_utmpx_h" = "no" -a "$ac_cv_header_wtsapi32_h" = "no"
|
||||
then
|
||||
|
|
@ -1894,4 +1930,5 @@ ACX_FEATURE([enable],[perl-modules])
|
|||
ACX_FEATURE([with],[cgiurl])
|
||||
ACX_FEATURE([with],[trusted-path])
|
||||
ACX_FEATURE([enable],[libtap])
|
||||
|
||||
ACX_FEATURE([with],[libcurl])
|
||||
ACX_FEATURE([with],[uriparser])
|
||||
|
|
|
|||
272
m4/libcurl.m4
Normal file
272
m4/libcurl.m4
Normal file
|
|
@ -0,0 +1,272 @@
|
|||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2006, David Shaw <dshaw@jabberwocky.com>
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
# are also available at https://curl.haxx.se/docs/copyright.html.
|
||||
#
|
||||
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
# copies of the Software, and permit persons to whom the Software is
|
||||
# furnished to do so, under the terms of the COPYING file.
|
||||
#
|
||||
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
# KIND, either express or implied.
|
||||
#
|
||||
###########################################################################
|
||||
# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
|
||||
# [ACTION-IF-YES], [ACTION-IF-NO])
|
||||
# ----------------------------------------------------------
|
||||
# David Shaw <dshaw@jabberwocky.com> May-09-2006
|
||||
#
|
||||
# Checks for libcurl. DEFAULT-ACTION is the string yes or no to
|
||||
# specify whether to default to --with-libcurl or --without-libcurl.
|
||||
# If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the
|
||||
# minimum version of libcurl to accept. Pass the version as a regular
|
||||
# version number like 7.10.1. If not supplied, any version is
|
||||
# accepted. ACTION-IF-YES is a list of shell commands to run if
|
||||
# libcurl was successfully found and passed the various tests.
|
||||
# ACTION-IF-NO is a list of shell commands that are run otherwise.
|
||||
# Note that using --without-libcurl does run ACTION-IF-NO.
|
||||
#
|
||||
# This macro #defines HAVE_LIBCURL if a working libcurl setup is
|
||||
# found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary
|
||||
# values. Other useful defines are LIBCURL_FEATURE_xxx where xxx are
|
||||
# the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy
|
||||
# where yyy are the various protocols supported by libcurl. Both xxx
|
||||
# and yyy are capitalized. See the list of AH_TEMPLATEs at the top of
|
||||
# the macro for the complete list of possible defines. Shell
|
||||
# variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also
|
||||
# defined to 'yes' for those features and protocols that were found.
|
||||
# Note that xxx and yyy keep the same capitalization as in the
|
||||
# curl-config list (e.g. it's "HTTP" and not "http").
|
||||
#
|
||||
# Users may override the detected values by doing something like:
|
||||
# LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure
|
||||
#
|
||||
# For the sake of sanity, this macro assumes that any libcurl that is
|
||||
# found is after version 7.7.2, the first version that included the
|
||||
# curl-config script. Note that it is very important for people
|
||||
# packaging binary versions of libcurl to include this script!
|
||||
# Without curl-config, we can only guess what protocols are available,
|
||||
# or use curl_version_info to figure it out at runtime.
|
||||
|
||||
AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
||||
[
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM])
|
||||
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_RTSP],[Defined if libcurl supports RTSP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_POP3],[Defined if libcurl supports POP3])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_IMAP],[Defined if libcurl supports IMAP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_SMTP],[Defined if libcurl supports SMTP])
|
||||
|
||||
AC_ARG_WITH(libcurl,
|
||||
AS_HELP_STRING([--with-libcurl=PREFIX],[look for the curl library in PREFIX/lib and headers in PREFIX/include]),
|
||||
[_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])])
|
||||
|
||||
if test "$_libcurl_with" != "no" ; then
|
||||
|
||||
AC_PROG_AWK
|
||||
|
||||
_libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'"
|
||||
|
||||
_libcurl_try_link=yes
|
||||
|
||||
if test -d "$_libcurl_with" ; then
|
||||
LIBCURL_CPPFLAGS="-I$withval/include"
|
||||
_libcurl_ldflags="-L$withval/lib"
|
||||
AC_PATH_PROG([_libcurl_config],[curl-config],[],
|
||||
["$withval/bin"])
|
||||
else
|
||||
AC_PATH_PROG([_libcurl_config],[curl-config],[],[$PATH])
|
||||
fi
|
||||
|
||||
if test x$_libcurl_config != "x" ; then
|
||||
AC_CACHE_CHECK([for the version of libcurl],
|
||||
[libcurl_cv_lib_curl_version],
|
||||
[libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`])
|
||||
|
||||
_libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse`
|
||||
_libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse`
|
||||
|
||||
if test $_libcurl_wanted -gt 0 ; then
|
||||
AC_CACHE_CHECK([for libcurl >= version $2],
|
||||
[libcurl_cv_lib_version_ok],
|
||||
[
|
||||
if test $_libcurl_version -ge $_libcurl_wanted ; then
|
||||
libcurl_cv_lib_version_ok=yes
|
||||
else
|
||||
libcurl_cv_lib_version_ok=no
|
||||
fi
|
||||
])
|
||||
fi
|
||||
|
||||
if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then
|
||||
if test x"$LIBCURL_CPPFLAGS" = "x" ; then
|
||||
LIBCURL_CPPFLAGS=`$_libcurl_config --cflags`
|
||||
fi
|
||||
if test x"$LIBCURL" = "x" ; then
|
||||
LIBCURL=`$_libcurl_config --libs`
|
||||
|
||||
# This is so silly, but Apple actually has a bug in their
|
||||
# curl-config script. Fixed in Tiger, but there are still
|
||||
# lots of Panther installs around.
|
||||
case "${host}" in
|
||||
powerpc-apple-darwin7*)
|
||||
LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'`
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# All curl-config scripts support --feature
|
||||
_libcurl_features=`$_libcurl_config --feature`
|
||||
|
||||
# Is it modern enough to have --protocols? (7.12.4)
|
||||
if test $_libcurl_version -ge 461828 ; then
|
||||
_libcurl_protocols=`$_libcurl_config --protocols`
|
||||
fi
|
||||
else
|
||||
_libcurl_try_link=no
|
||||
fi
|
||||
|
||||
unset _libcurl_wanted
|
||||
fi
|
||||
|
||||
if test $_libcurl_try_link = yes ; then
|
||||
|
||||
# we didn't find curl-config, so let's see if the user-supplied
|
||||
# link line (or failing that, "-lcurl") is enough.
|
||||
LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"}
|
||||
|
||||
AC_CACHE_CHECK([whether libcurl is usable],
|
||||
[libcurl_cv_lib_curl_usable],
|
||||
[
|
||||
_libcurl_save_cppflags=$CPPFLAGS
|
||||
CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS"
|
||||
_libcurl_save_libs=$LIBS
|
||||
LIBS="$LIBCURL $LIBS"
|
||||
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <curl/curl.h>]],[[
|
||||
/* Try and use a few common options to force a failure if we are
|
||||
missing symbols or can't link. */
|
||||
int x;
|
||||
curl_easy_setopt(NULL,CURLOPT_URL,NULL);
|
||||
x=CURL_ERROR_SIZE;
|
||||
x=CURLOPT_WRITEFUNCTION;
|
||||
x=CURLOPT_WRITEDATA;
|
||||
x=CURLOPT_ERRORBUFFER;
|
||||
x=CURLOPT_STDERR;
|
||||
x=CURLOPT_VERBOSE;
|
||||
if (x) {;}
|
||||
]])],libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
|
||||
|
||||
CPPFLAGS=$_libcurl_save_cppflags
|
||||
LIBS=$_libcurl_save_libs
|
||||
unset _libcurl_save_cppflags
|
||||
unset _libcurl_save_libs
|
||||
])
|
||||
|
||||
if test $libcurl_cv_lib_curl_usable = yes ; then
|
||||
|
||||
# Does curl_free() exist in this version of libcurl?
|
||||
# If not, fake it with free()
|
||||
|
||||
_libcurl_save_cppflags=$CPPFLAGS
|
||||
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
|
||||
_libcurl_save_libs=$LIBS
|
||||
LIBS="$LIBS $LIBCURL"
|
||||
|
||||
AC_CHECK_FUNC(curl_free,,
|
||||
AC_DEFINE(curl_free,free,
|
||||
[Define curl_free() as free() if our version of curl lacks curl_free.]))
|
||||
|
||||
CPPFLAGS=$_libcurl_save_cppflags
|
||||
LIBS=$_libcurl_save_libs
|
||||
unset _libcurl_save_cppflags
|
||||
unset _libcurl_save_libs
|
||||
|
||||
AC_DEFINE(HAVE_LIBCURL,1,
|
||||
[Define to 1 if you have a functional curl library.])
|
||||
AC_SUBST(LIBCURL_CPPFLAGS)
|
||||
AC_SUBST(LIBCURL)
|
||||
|
||||
for _libcurl_feature in $_libcurl_features ; do
|
||||
AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1])
|
||||
eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes
|
||||
done
|
||||
|
||||
if test "x$_libcurl_protocols" = "x" ; then
|
||||
|
||||
# We don't have --protocols, so just assume that all
|
||||
# protocols are available
|
||||
_libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT TFTP"
|
||||
|
||||
if test x$libcurl_feature_SSL = xyes ; then
|
||||
_libcurl_protocols="$_libcurl_protocols HTTPS"
|
||||
|
||||
# FTPS wasn't standards-compliant until version
|
||||
# 7.11.0 (0x070b00 == 461568)
|
||||
if test $_libcurl_version -ge 461568; then
|
||||
_libcurl_protocols="$_libcurl_protocols FTPS"
|
||||
fi
|
||||
fi
|
||||
|
||||
# RTSP, IMAP, POP3 and SMTP were added in
|
||||
# 7.20.0 (0x071400 == 463872)
|
||||
if test $_libcurl_version -ge 463872; then
|
||||
_libcurl_protocols="$_libcurl_protocols RTSP IMAP POP3 SMTP"
|
||||
fi
|
||||
fi
|
||||
|
||||
for _libcurl_protocol in $_libcurl_protocols ; do
|
||||
AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1])
|
||||
eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes
|
||||
done
|
||||
else
|
||||
unset LIBCURL
|
||||
unset LIBCURL_CPPFLAGS
|
||||
fi
|
||||
fi
|
||||
|
||||
unset _libcurl_try_link
|
||||
unset _libcurl_version_parse
|
||||
unset _libcurl_config
|
||||
unset _libcurl_feature
|
||||
unset _libcurl_features
|
||||
unset _libcurl_protocol
|
||||
unset _libcurl_protocols
|
||||
unset _libcurl_version
|
||||
unset _libcurl_ldflags
|
||||
fi
|
||||
|
||||
if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then
|
||||
# This is the IF-NO path
|
||||
ifelse([$4],,:,[$4])
|
||||
else
|
||||
# This is the IF-YES path
|
||||
ifelse([$3],,:,[$3])
|
||||
fi
|
||||
|
||||
unset _libcurl_with
|
||||
])dnl
|
||||
140
m4/uriparser.m4
Normal file
140
m4/uriparser.m4
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
# (this check is rougly based on and inspired libcurl.m4)
|
||||
# URIPARSER_CHECK ([DEFAULT-ACTION], [MINIMUM-VERSION],
|
||||
# [ACTION-IF-YES], [ACTION-IF-NO])
|
||||
# Checks for uriparser library. DEFAULT-ACTION is the string yes or no to
|
||||
# specify whether to default to --with-uriparser or --without-liburiparser.
|
||||
# If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the
|
||||
# minimum version of uriparser to accept. Pass the version as a regular
|
||||
# version number like 0.8.5. If not supplied, any version is
|
||||
# accepted. ACTION-IF-YES is a list of shell commands to run if
|
||||
# uriparser was successfully found and passed the various tests.
|
||||
# ACTION-IF-NO is a list of shell commands that are run otherwise.
|
||||
# Note that using --without-uriparser does run ACTION-IF-NO.
|
||||
#
|
||||
# This macro #defines HAVE_URIPARSER if a working uriparser setup is
|
||||
# found, and sets @URIPARSER@ and @URIPARSER_CPPFLAGS@ to the necessary
|
||||
# values.
|
||||
#
|
||||
# Users may override the detected values by doing something like:
|
||||
# URIPARSER="-luriparser" URIPARSER_CPPFLAGS="-I/usr/myinclude" ./configure
|
||||
#
|
||||
|
||||
AC_DEFUN([URIPARSER_CHECK],
|
||||
[
|
||||
AC_ARG_WITH(uriparser,
|
||||
AS_HELP_STRING([--with-uriparser=PREFIX],[look for the uriparser library in PREFIX/lib and headers in PREFIX/include]),
|
||||
[_uriparser_with=$withval],[_uriparser_with=ifelse([$1],,[yes],[$1])])
|
||||
|
||||
if test "$_uriparser_with" != "no" ; then
|
||||
|
||||
_uriparser_try_link=yes
|
||||
|
||||
AC_CHECK_PROG(PKGCONFIG,pkg-config,pkg-config,no)
|
||||
|
||||
if test "x$URIPARSER" != "x" || test "x$URIPARSER_CPPFLAGS" != "x"; then
|
||||
:
|
||||
elif test -d "$_uriparser_with" ; then
|
||||
URIPARSER_CPPFLAGS="-I$withval/include"
|
||||
_uriparser_ldflags="-L$withval/lib"
|
||||
|
||||
elif test x$PKGCONFIG != xno; then
|
||||
|
||||
AC_CACHE_CHECK([for the version of uriparser],
|
||||
[uriparser_cv_uriparser_version],
|
||||
[uriparser_cv_uriparser_version=`$PKGCONFIG liburiparser --modversion`])
|
||||
|
||||
AC_PROG_AWK
|
||||
|
||||
_uriparser_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'"
|
||||
|
||||
_uriparser_version=`echo $uriparser_cv_uriparser_version | $_uriparser_version_parse`
|
||||
_uriparser_wanted=`echo ifelse([$2],,[0],[$2]) | $_uriparser_version_parse`
|
||||
|
||||
if test $_uriparser_wanted -gt 0 ; then
|
||||
AC_CACHE_CHECK([for uriparser >= version $2],
|
||||
[uriparser_cv_lib_version_ok],
|
||||
[
|
||||
if test $_uriparser_version -ge $_uriparser_wanted ; then
|
||||
uriparser_cv_lib_version_ok=yes
|
||||
else
|
||||
uriparser_cv_lib_version_ok=no
|
||||
fi
|
||||
])
|
||||
fi
|
||||
|
||||
if test $_uriparser_wanted -eq 0 || test x$uriparser_cv_lib_version_ok = xyes ; then
|
||||
if test x"$URIPARSER_CPPFLAGS" = "x" ; then
|
||||
URIPARSER_CPPFLAGS=`$PKGCONFIG liburiparser --cflags`
|
||||
fi
|
||||
if test x"$URIPARSER" = "x" ; then
|
||||
URIPARSER=`$PKGCONFIG liburiparser --libs`
|
||||
fi
|
||||
else
|
||||
_uriparser_try_link=no
|
||||
fi
|
||||
|
||||
unset _uriparser_wanted
|
||||
else
|
||||
dnl no pkg-config, ok, do our best and set some defaults
|
||||
URIPARSER_CPPFLAGS="-I/usr/include"
|
||||
URIPARSER="-luriparser -L/usr/lib -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/i686-linux-gnu"
|
||||
fi
|
||||
|
||||
if test $_uriparser_try_link = yes ; then
|
||||
|
||||
# let's see if the user-supplied
|
||||
# link line (or failing that, "-luriparser") is enough.
|
||||
URIPARSER=${URIPARSER-"$_uriparser_ldflags -luriparser"}
|
||||
|
||||
AC_CACHE_CHECK([whether uriparser is usable],
|
||||
[uriparser_cv_lib_uriparser_usable],
|
||||
[
|
||||
_liburiparser_save_cppflags=$CPPFLAGS
|
||||
CPPFLAGS="$URIPARSER_CPPFLAGS $CPPFLAGS"
|
||||
_liburiparser_save_libs=$LIBS
|
||||
LIBS="$URIPARSER $LIBS"
|
||||
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <uriparser/Uri.h>]],[[
|
||||
/* Try and use a few common options to force a failure if we are
|
||||
missing symbols or cannot link. */
|
||||
UriParserStateA state;
|
||||
UriUriA uri;
|
||||
state.uri = &uri;
|
||||
char *location = "http://test.dom/dir/file.ext";
|
||||
int x = uriParseUriA (&state, location);
|
||||
if (x == URI_SUCCESS) {;}
|
||||
]])],uriparser_cv_lib_uriparser_usable=yes,uriparser_cv_lib_uriparser_usable=no)
|
||||
|
||||
CPPFLAGS=$_liburiparser_save_cppflags
|
||||
LIBS=$_liburiparser_save_libs
|
||||
unset _liburiparser_save_cppflags
|
||||
unset _liburiparser_save_libs
|
||||
])
|
||||
|
||||
if test $uriparser_cv_lib_uriparser_usable = yes ; then
|
||||
AC_DEFINE(HAVE_URIPARSER,1,
|
||||
[Define to 1 if you have a functional uriparser library.])
|
||||
AC_SUBST(URIPARSER_CPPFLAGS)
|
||||
AC_SUBST(URIPARSER)
|
||||
else
|
||||
unset URIPARSER
|
||||
unset URIPARSER_CPPFLAGS
|
||||
fi
|
||||
fi
|
||||
|
||||
unset _uriparser_try_link
|
||||
unset _uriparser_version_parse
|
||||
unset _uriparser_version
|
||||
unset _uriparser_ldflags
|
||||
fi
|
||||
|
||||
if test x$_uriparser_with = xno || test x$uriparser_cv_lib_uriparser_usable != xyes ; then
|
||||
# This is the IF-NO path
|
||||
ifelse([$4],,:,[$4])
|
||||
else
|
||||
# This is the IF-YES path
|
||||
ifelse([$3],,:,[$3])
|
||||
fi
|
||||
|
||||
unset _uriparser_with
|
||||
])dnl
|
||||
|
|
@ -38,7 +38,9 @@ check_tcp_programs = check_ftp check_imap check_nntp check_pop \
|
|||
EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \
|
||||
check_swap check_fping check_ldap check_game check_dig \
|
||||
check_nagios check_by_ssh check_dns check_nt check_ide_smart \
|
||||
check_procs check_mysql_query check_apt check_dbi
|
||||
check_procs check_mysql_query check_apt check_dbi check_curl
|
||||
|
||||
SUBDIRS = picohttpparser
|
||||
|
||||
EXTRA_DIST = t tests
|
||||
|
||||
|
|
@ -69,6 +71,9 @@ test-debug:
|
|||
|
||||
check_apt_LDADD = $(BASEOBJS)
|
||||
check_cluster_LDADD = $(BASEOBJS)
|
||||
check_curl_CFLAGS = $(AM_CFLAGS) $(LIBCURLCFLAGS) $(URIPARSERCFLAGS) $(LIBCURLINCLUDE) $(URIPARSERINCLUDE) -Ipicohttpparser
|
||||
check_curl_CPPFLAGS = $(AM_CPPFLAGS) $(LIBCURLCFLAGS) $(URIPARSERCFLAGS) $(LIBCURLINCLUDE) $(URIPARSERINCLUDE) -Ipicohttpparser
|
||||
check_curl_LDADD = $(NETLIBS) $(LIBCURLLIBS) $(SSLOBJS) $(URIPARSERLIBS) picohttpparser/libpicohttpparser.a
|
||||
check_dbi_LDADD = $(NETLIBS) $(DBILIBS)
|
||||
check_dig_LDADD = $(NETLIBS)
|
||||
check_disk_LDADD = $(BASEOBJS)
|
||||
|
|
@ -89,7 +94,7 @@ check_mysql_query_CFLAGS = $(AM_CFLAGS) $(MYSQLCFLAGS)
|
|||
check_mysql_query_CPPFLAGS = $(AM_CPPFLAGS) $(MYSQLINCLUDE)
|
||||
check_mysql_query_LDADD = $(NETLIBS) $(MYSQLLIBS)
|
||||
check_nagios_LDADD = $(BASEOBJS)
|
||||
check_nt_LDADD = $(NETLIBS)
|
||||
check_nt_LDADD = $(NETLIBS)
|
||||
check_ntp_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_nwstat_LDADD = $(NETLIBS)
|
||||
|
|
|
|||
2335
plugins/check_curl.c
Normal file
2335
plugins/check_curl.c
Normal file
File diff suppressed because it is too large
Load diff
3
plugins/picohttpparser/Makefile.am
Normal file
3
plugins/picohttpparser/Makefile.am
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
noinst_LIBRARIES = libpicohttpparser.a
|
||||
|
||||
libpicohttpparser_a_SOURCES = picohttpparser.c picohttpparser.h
|
||||
645
plugins/picohttpparser/picohttpparser.c
Normal file
645
plugins/picohttpparser/picohttpparser.c
Normal file
|
|
@ -0,0 +1,645 @@
|
|||
/*
|
||||
* Copyright (c) 2009-2014 Kazuho Oku, Tokuhiro Matsuno, Daisuke Murase,
|
||||
* Shigeo Mitsunari
|
||||
*
|
||||
* The software is licensed under either the MIT License (below) or the Perl
|
||||
* license.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#ifdef __SSE4_2__
|
||||
#ifdef _MSC_VER
|
||||
#include <nmmintrin.h>
|
||||
#else
|
||||
#include <x86intrin.h>
|
||||
#endif
|
||||
#endif
|
||||
#include "picohttpparser.h"
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
#else
|
||||
#define likely(x) (x)
|
||||
#define unlikely(x) (x)
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define ALIGNED(n) _declspec(align(n))
|
||||
#else
|
||||
#define ALIGNED(n) __attribute__((aligned(n)))
|
||||
#endif
|
||||
|
||||
#define IS_PRINTABLE_ASCII(c) ((unsigned char)(c)-040u < 0137u)
|
||||
|
||||
#define CHECK_EOF() \
|
||||
if (buf == buf_end) { \
|
||||
*ret = -2; \
|
||||
return NULL; \
|
||||
}
|
||||
|
||||
#define EXPECT_CHAR_NO_CHECK(ch) \
|
||||
if (*buf++ != ch) { \
|
||||
*ret = -1; \
|
||||
return NULL; \
|
||||
}
|
||||
|
||||
#define EXPECT_CHAR(ch) \
|
||||
CHECK_EOF(); \
|
||||
EXPECT_CHAR_NO_CHECK(ch);
|
||||
|
||||
#define ADVANCE_TOKEN(tok, toklen) \
|
||||
do { \
|
||||
const char *tok_start = buf; \
|
||||
static const char ALIGNED(16) ranges2[16] = "\000\040\177\177"; \
|
||||
int found2; \
|
||||
buf = findchar_fast(buf, buf_end, ranges2, 4, &found2); \
|
||||
if (!found2) { \
|
||||
CHECK_EOF(); \
|
||||
} \
|
||||
while (1) { \
|
||||
if (*buf == ' ') { \
|
||||
break; \
|
||||
} else if (unlikely(!IS_PRINTABLE_ASCII(*buf))) { \
|
||||
if ((unsigned char)*buf < '\040' || *buf == '\177') { \
|
||||
*ret = -1; \
|
||||
return NULL; \
|
||||
} \
|
||||
} \
|
||||
++buf; \
|
||||
CHECK_EOF(); \
|
||||
} \
|
||||
tok = tok_start; \
|
||||
toklen = buf - tok_start; \
|
||||
} while (0)
|
||||
|
||||
static const char *token_char_map = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||
"\0\1\0\1\1\1\1\1\0\0\1\1\0\1\1\0\1\1\1\1\1\1\1\1\1\1\0\0\0\0\0\0"
|
||||
"\0\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\0\0\1\1"
|
||||
"\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\1\0\1\0"
|
||||
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
|
||||
|
||||
static const char *findchar_fast(const char *buf, const char *buf_end, const char *ranges, size_t ranges_size, int *found)
|
||||
{
|
||||
*found = 0;
|
||||
#if __SSE4_2__
|
||||
if (likely(buf_end - buf >= 16)) {
|
||||
__m128i ranges16 = _mm_loadu_si128((const __m128i *)ranges);
|
||||
|
||||
size_t left = (buf_end - buf) & ~15;
|
||||
do {
|
||||
__m128i b16 = _mm_loadu_si128((const __m128i *)buf);
|
||||
int r = _mm_cmpestri(ranges16, ranges_size, b16, 16, _SIDD_LEAST_SIGNIFICANT | _SIDD_CMP_RANGES | _SIDD_UBYTE_OPS);
|
||||
if (unlikely(r != 16)) {
|
||||
buf += r;
|
||||
*found = 1;
|
||||
break;
|
||||
}
|
||||
buf += 16;
|
||||
left -= 16;
|
||||
} while (likely(left != 0));
|
||||
}
|
||||
#else
|
||||
/* suppress unused parameter warning */
|
||||
(void)buf_end;
|
||||
(void)ranges;
|
||||
(void)ranges_size;
|
||||
#endif
|
||||
return buf;
|
||||
}
|
||||
|
||||
static const char *get_token_to_eol(const char *buf, const char *buf_end, const char **token, size_t *token_len, int *ret)
|
||||
{
|
||||
const char *token_start = buf;
|
||||
|
||||
#ifdef __SSE4_2__
|
||||
static const char ALIGNED(16) ranges1[16] = "\0\010" /* allow HT */
|
||||
"\012\037" /* allow SP and up to but not including DEL */
|
||||
"\177\177"; /* allow chars w. MSB set */
|
||||
int found;
|
||||
buf = findchar_fast(buf, buf_end, ranges1, 6, &found);
|
||||
if (found)
|
||||
goto FOUND_CTL;
|
||||
#else
|
||||
/* find non-printable char within the next 8 bytes, this is the hottest code; manually inlined */
|
||||
while (likely(buf_end - buf >= 8)) {
|
||||
#define DOIT() \
|
||||
do { \
|
||||
if (unlikely(!IS_PRINTABLE_ASCII(*buf))) \
|
||||
goto NonPrintable; \
|
||||
++buf; \
|
||||
} while (0)
|
||||
DOIT();
|
||||
DOIT();
|
||||
DOIT();
|
||||
DOIT();
|
||||
DOIT();
|
||||
DOIT();
|
||||
DOIT();
|
||||
DOIT();
|
||||
#undef DOIT
|
||||
continue;
|
||||
NonPrintable:
|
||||
if ((likely((unsigned char)*buf < '\040') && likely(*buf != '\011')) || unlikely(*buf == '\177')) {
|
||||
goto FOUND_CTL;
|
||||
}
|
||||
++buf;
|
||||
}
|
||||
#endif
|
||||
for (;; ++buf) {
|
||||
CHECK_EOF();
|
||||
if (unlikely(!IS_PRINTABLE_ASCII(*buf))) {
|
||||
if ((likely((unsigned char)*buf < '\040') && likely(*buf != '\011')) || unlikely(*buf == '\177')) {
|
||||
goto FOUND_CTL;
|
||||
}
|
||||
}
|
||||
}
|
||||
FOUND_CTL:
|
||||
if (likely(*buf == '\015')) {
|
||||
++buf;
|
||||
EXPECT_CHAR('\012');
|
||||
*token_len = buf - 2 - token_start;
|
||||
} else if (*buf == '\012') {
|
||||
*token_len = buf - token_start;
|
||||
++buf;
|
||||
} else {
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
*token = token_start;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static const char *is_complete(const char *buf, const char *buf_end, size_t last_len, int *ret)
|
||||
{
|
||||
int ret_cnt = 0;
|
||||
buf = last_len < 3 ? buf : buf + last_len - 3;
|
||||
|
||||
while (1) {
|
||||
CHECK_EOF();
|
||||
if (*buf == '\015') {
|
||||
++buf;
|
||||
CHECK_EOF();
|
||||
EXPECT_CHAR('\012');
|
||||
++ret_cnt;
|
||||
} else if (*buf == '\012') {
|
||||
++buf;
|
||||
++ret_cnt;
|
||||
} else {
|
||||
++buf;
|
||||
ret_cnt = 0;
|
||||
}
|
||||
if (ret_cnt == 2) {
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
*ret = -2;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define PARSE_INT(valp_, mul_) \
|
||||
if (*buf < '0' || '9' < *buf) { \
|
||||
buf++; \
|
||||
*ret = -1; \
|
||||
return NULL; \
|
||||
} \
|
||||
*(valp_) = (mul_) * (*buf++ - '0');
|
||||
|
||||
#define PARSE_INT_3(valp_) \
|
||||
do { \
|
||||
int res_ = 0; \
|
||||
PARSE_INT(&res_, 100) \
|
||||
*valp_ = res_; \
|
||||
PARSE_INT(&res_, 10) \
|
||||
*valp_ += res_; \
|
||||
PARSE_INT(&res_, 1) \
|
||||
*valp_ += res_; \
|
||||
} while (0)
|
||||
|
||||
/* returned pointer is always within [buf, buf_end), or null */
|
||||
static const char *parse_http_version(const char *buf, const char *buf_end, int *minor_version, int *ret)
|
||||
{
|
||||
/* we want at least [HTTP/1.<two chars>] to try to parse */
|
||||
if (buf_end - buf < 9) {
|
||||
*ret = -2;
|
||||
return NULL;
|
||||
}
|
||||
EXPECT_CHAR_NO_CHECK('H');
|
||||
EXPECT_CHAR_NO_CHECK('T');
|
||||
EXPECT_CHAR_NO_CHECK('T');
|
||||
EXPECT_CHAR_NO_CHECK('P');
|
||||
EXPECT_CHAR_NO_CHECK('/');
|
||||
EXPECT_CHAR_NO_CHECK('1');
|
||||
EXPECT_CHAR_NO_CHECK('.');
|
||||
PARSE_INT(minor_version, 1);
|
||||
return buf;
|
||||
}
|
||||
|
||||
static const char *parse_headers(const char *buf, const char *buf_end, struct phr_header *headers, size_t *num_headers,
|
||||
size_t max_headers, int *ret)
|
||||
{
|
||||
for (;; ++*num_headers) {
|
||||
CHECK_EOF();
|
||||
if (*buf == '\015') {
|
||||
++buf;
|
||||
EXPECT_CHAR('\012');
|
||||
break;
|
||||
} else if (*buf == '\012') {
|
||||
++buf;
|
||||
break;
|
||||
}
|
||||
if (*num_headers == max_headers) {
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
if (!(*num_headers != 0 && (*buf == ' ' || *buf == '\t'))) {
|
||||
/* parsing name, but do not discard SP before colon, see
|
||||
* http://www.mozilla.org/security/announce/2006/mfsa2006-33.html */
|
||||
headers[*num_headers].name = buf;
|
||||
static const char ALIGNED(16) ranges1[] = "\x00 " /* control chars and up to SP */
|
||||
"\"\"" /* 0x22 */
|
||||
"()" /* 0x28,0x29 */
|
||||
",," /* 0x2c */
|
||||
"//" /* 0x2f */
|
||||
":@" /* 0x3a-0x40 */
|
||||
"[]" /* 0x5b-0x5d */
|
||||
"{\377"; /* 0x7b-0xff */
|
||||
int found;
|
||||
buf = findchar_fast(buf, buf_end, ranges1, sizeof(ranges1) - 1, &found);
|
||||
if (!found) {
|
||||
CHECK_EOF();
|
||||
}
|
||||
while (1) {
|
||||
if (*buf == ':') {
|
||||
break;
|
||||
} else if (!token_char_map[(unsigned char)*buf]) {
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
++buf;
|
||||
CHECK_EOF();
|
||||
}
|
||||
if ((headers[*num_headers].name_len = buf - headers[*num_headers].name) == 0) {
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
++buf;
|
||||
for (;; ++buf) {
|
||||
CHECK_EOF();
|
||||
if (!(*buf == ' ' || *buf == '\t')) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
headers[*num_headers].name = NULL;
|
||||
headers[*num_headers].name_len = 0;
|
||||
}
|
||||
const char *value;
|
||||
size_t value_len;
|
||||
if ((buf = get_token_to_eol(buf, buf_end, &value, &value_len, ret)) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
/* remove trailing SPs and HTABs */
|
||||
const char *value_end = value + value_len;
|
||||
for (; value_end != value; --value_end) {
|
||||
const char c = *(value_end - 1);
|
||||
if (!(c == ' ' || c == '\t')) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
headers[*num_headers].value = value;
|
||||
headers[*num_headers].value_len = value_end - value;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
static const char *parse_request(const char *buf, const char *buf_end, const char **method, size_t *method_len, const char **path,
|
||||
size_t *path_len, int *minor_version, struct phr_header *headers, size_t *num_headers,
|
||||
size_t max_headers, int *ret)
|
||||
{
|
||||
/* skip first empty line (some clients add CRLF after POST content) */
|
||||
CHECK_EOF();
|
||||
if (*buf == '\015') {
|
||||
++buf;
|
||||
EXPECT_CHAR('\012');
|
||||
} else if (*buf == '\012') {
|
||||
++buf;
|
||||
}
|
||||
|
||||
/* parse request line */
|
||||
ADVANCE_TOKEN(*method, *method_len);
|
||||
do {
|
||||
++buf;
|
||||
} while (*buf == ' ');
|
||||
ADVANCE_TOKEN(*path, *path_len);
|
||||
do {
|
||||
++buf;
|
||||
} while (*buf == ' ');
|
||||
if (*method_len == 0 || *path_len == 0) {
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
if ((buf = parse_http_version(buf, buf_end, minor_version, ret)) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (*buf == '\015') {
|
||||
++buf;
|
||||
EXPECT_CHAR('\012');
|
||||
} else if (*buf == '\012') {
|
||||
++buf;
|
||||
} else {
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return parse_headers(buf, buf_end, headers, num_headers, max_headers, ret);
|
||||
}
|
||||
|
||||
int phr_parse_request(const char *buf_start, size_t len, const char **method, size_t *method_len, const char **path,
|
||||
size_t *path_len, int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len)
|
||||
{
|
||||
const char *buf = buf_start, *buf_end = buf_start + len;
|
||||
size_t max_headers = *num_headers;
|
||||
int r;
|
||||
|
||||
*method = NULL;
|
||||
*method_len = 0;
|
||||
*path = NULL;
|
||||
*path_len = 0;
|
||||
*minor_version = -1;
|
||||
*num_headers = 0;
|
||||
|
||||
/* if last_len != 0, check if the request is complete (a fast countermeasure
|
||||
againt slowloris */
|
||||
if (last_len != 0 && is_complete(buf, buf_end, last_len, &r) == NULL) {
|
||||
return r;
|
||||
}
|
||||
|
||||
if ((buf = parse_request(buf, buf_end, method, method_len, path, path_len, minor_version, headers, num_headers, max_headers,
|
||||
&r)) == NULL) {
|
||||
return r;
|
||||
}
|
||||
|
||||
return (int)(buf - buf_start);
|
||||
}
|
||||
|
||||
static const char *parse_response(const char *buf, const char *buf_end, int *minor_version, int *status, const char **msg,
|
||||
size_t *msg_len, struct phr_header *headers, size_t *num_headers, size_t max_headers, int *ret)
|
||||
{
|
||||
/* parse "HTTP/1.x" */
|
||||
if ((buf = parse_http_version(buf, buf_end, minor_version, ret)) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
/* skip space */
|
||||
if (*buf != ' ') {
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
do {
|
||||
++buf;
|
||||
} while (*buf == ' ');
|
||||
/* parse status code, we want at least [:digit:][:digit:][:digit:]<other char> to try to parse */
|
||||
if (buf_end - buf < 4) {
|
||||
*ret = -2;
|
||||
return NULL;
|
||||
}
|
||||
PARSE_INT_3(status);
|
||||
|
||||
/* get message includig preceding space */
|
||||
if ((buf = get_token_to_eol(buf, buf_end, msg, msg_len, ret)) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (*msg_len == 0) {
|
||||
/* ok */
|
||||
} else if (**msg == ' ') {
|
||||
/* remove preceding space */
|
||||
do {
|
||||
++*msg;
|
||||
--*msg_len;
|
||||
} while (**msg == ' ');
|
||||
} else {
|
||||
/* garbage found after status code */
|
||||
*ret = -1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return parse_headers(buf, buf_end, headers, num_headers, max_headers, ret);
|
||||
}
|
||||
|
||||
int phr_parse_response(const char *buf_start, size_t len, int *minor_version, int *status, const char **msg, size_t *msg_len,
|
||||
struct phr_header *headers, size_t *num_headers, size_t last_len)
|
||||
{
|
||||
const char *buf = buf_start, *buf_end = buf + len;
|
||||
size_t max_headers = *num_headers;
|
||||
int r;
|
||||
|
||||
*minor_version = -1;
|
||||
*status = 0;
|
||||
*msg = NULL;
|
||||
*msg_len = 0;
|
||||
*num_headers = 0;
|
||||
|
||||
/* if last_len != 0, check if the response is complete (a fast countermeasure
|
||||
against slowloris */
|
||||
if (last_len != 0 && is_complete(buf, buf_end, last_len, &r) == NULL) {
|
||||
return r;
|
||||
}
|
||||
|
||||
if ((buf = parse_response(buf, buf_end, minor_version, status, msg, msg_len, headers, num_headers, max_headers, &r)) == NULL) {
|
||||
return r;
|
||||
}
|
||||
|
||||
return (int)(buf - buf_start);
|
||||
}
|
||||
|
||||
int phr_parse_headers(const char *buf_start, size_t len, struct phr_header *headers, size_t *num_headers, size_t last_len)
|
||||
{
|
||||
const char *buf = buf_start, *buf_end = buf + len;
|
||||
size_t max_headers = *num_headers;
|
||||
int r;
|
||||
|
||||
*num_headers = 0;
|
||||
|
||||
/* if last_len != 0, check if the response is complete (a fast countermeasure
|
||||
against slowloris */
|
||||
if (last_len != 0 && is_complete(buf, buf_end, last_len, &r) == NULL) {
|
||||
return r;
|
||||
}
|
||||
|
||||
if ((buf = parse_headers(buf, buf_end, headers, num_headers, max_headers, &r)) == NULL) {
|
||||
return r;
|
||||
}
|
||||
|
||||
return (int)(buf - buf_start);
|
||||
}
|
||||
|
||||
enum {
|
||||
CHUNKED_IN_CHUNK_SIZE,
|
||||
CHUNKED_IN_CHUNK_EXT,
|
||||
CHUNKED_IN_CHUNK_DATA,
|
||||
CHUNKED_IN_CHUNK_CRLF,
|
||||
CHUNKED_IN_TRAILERS_LINE_HEAD,
|
||||
CHUNKED_IN_TRAILERS_LINE_MIDDLE
|
||||
};
|
||||
|
||||
static int decode_hex(int ch)
|
||||
{
|
||||
if ('0' <= ch && ch <= '9') {
|
||||
return ch - '0';
|
||||
} else if ('A' <= ch && ch <= 'F') {
|
||||
return ch - 'A' + 0xa;
|
||||
} else if ('a' <= ch && ch <= 'f') {
|
||||
return ch - 'a' + 0xa;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
ssize_t phr_decode_chunked(struct phr_chunked_decoder *decoder, char *buf, size_t *_bufsz)
|
||||
{
|
||||
size_t dst = 0, src = 0, bufsz = *_bufsz;
|
||||
ssize_t ret = -2; /* incomplete */
|
||||
|
||||
while (1) {
|
||||
switch (decoder->_state) {
|
||||
case CHUNKED_IN_CHUNK_SIZE:
|
||||
for (;; ++src) {
|
||||
int v;
|
||||
if (src == bufsz)
|
||||
goto Exit;
|
||||
if ((v = decode_hex(buf[src])) == -1) {
|
||||
if (decoder->_hex_count == 0) {
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (decoder->_hex_count == sizeof(size_t) * 2) {
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
decoder->bytes_left_in_chunk = decoder->bytes_left_in_chunk * 16 + v;
|
||||
++decoder->_hex_count;
|
||||
}
|
||||
decoder->_hex_count = 0;
|
||||
decoder->_state = CHUNKED_IN_CHUNK_EXT;
|
||||
/* fallthru */
|
||||
case CHUNKED_IN_CHUNK_EXT:
|
||||
/* RFC 7230 A.2 "Line folding in chunk extensions is disallowed" */
|
||||
for (;; ++src) {
|
||||
if (src == bufsz)
|
||||
goto Exit;
|
||||
if (buf[src] == '\012')
|
||||
break;
|
||||
}
|
||||
++src;
|
||||
if (decoder->bytes_left_in_chunk == 0) {
|
||||
if (decoder->consume_trailer) {
|
||||
decoder->_state = CHUNKED_IN_TRAILERS_LINE_HEAD;
|
||||
break;
|
||||
} else {
|
||||
goto Complete;
|
||||
}
|
||||
}
|
||||
decoder->_state = CHUNKED_IN_CHUNK_DATA;
|
||||
/* fallthru */
|
||||
case CHUNKED_IN_CHUNK_DATA: {
|
||||
size_t avail = bufsz - src;
|
||||
if (avail < decoder->bytes_left_in_chunk) {
|
||||
if (dst != src)
|
||||
memmove(buf + dst, buf + src, avail);
|
||||
src += avail;
|
||||
dst += avail;
|
||||
decoder->bytes_left_in_chunk -= avail;
|
||||
goto Exit;
|
||||
}
|
||||
if (dst != src)
|
||||
memmove(buf + dst, buf + src, decoder->bytes_left_in_chunk);
|
||||
src += decoder->bytes_left_in_chunk;
|
||||
dst += decoder->bytes_left_in_chunk;
|
||||
decoder->bytes_left_in_chunk = 0;
|
||||
decoder->_state = CHUNKED_IN_CHUNK_CRLF;
|
||||
}
|
||||
/* fallthru */
|
||||
case CHUNKED_IN_CHUNK_CRLF:
|
||||
for (;; ++src) {
|
||||
if (src == bufsz)
|
||||
goto Exit;
|
||||
if (buf[src] != '\015')
|
||||
break;
|
||||
}
|
||||
if (buf[src] != '\012') {
|
||||
ret = -1;
|
||||
goto Exit;
|
||||
}
|
||||
++src;
|
||||
decoder->_state = CHUNKED_IN_CHUNK_SIZE;
|
||||
break;
|
||||
case CHUNKED_IN_TRAILERS_LINE_HEAD:
|
||||
for (;; ++src) {
|
||||
if (src == bufsz)
|
||||
goto Exit;
|
||||
if (buf[src] != '\015')
|
||||
break;
|
||||
}
|
||||
if (buf[src++] == '\012')
|
||||
goto Complete;
|
||||
decoder->_state = CHUNKED_IN_TRAILERS_LINE_MIDDLE;
|
||||
/* fallthru */
|
||||
case CHUNKED_IN_TRAILERS_LINE_MIDDLE:
|
||||
for (;; ++src) {
|
||||
if (src == bufsz)
|
||||
goto Exit;
|
||||
if (buf[src] == '\012')
|
||||
break;
|
||||
}
|
||||
++src;
|
||||
decoder->_state = CHUNKED_IN_TRAILERS_LINE_HEAD;
|
||||
break;
|
||||
default:
|
||||
assert(!"decoder is corrupt");
|
||||
}
|
||||
}
|
||||
|
||||
Complete:
|
||||
ret = bufsz - src;
|
||||
Exit:
|
||||
if (dst != src)
|
||||
memmove(buf + dst, buf + src, bufsz - src);
|
||||
*_bufsz = dst;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int phr_decode_chunked_is_in_data(struct phr_chunked_decoder *decoder)
|
||||
{
|
||||
return decoder->_state == CHUNKED_IN_CHUNK_DATA;
|
||||
}
|
||||
|
||||
#undef CHECK_EOF
|
||||
#undef EXPECT_CHAR
|
||||
#undef ADVANCE_TOKEN
|
||||
87
plugins/picohttpparser/picohttpparser.h
Normal file
87
plugins/picohttpparser/picohttpparser.h
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* Copyright (c) 2009-2014 Kazuho Oku, Tokuhiro Matsuno, Daisuke Murase,
|
||||
* Shigeo Mitsunari
|
||||
*
|
||||
* The software is licensed under either the MIT License (below) or the Perl
|
||||
* license.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef picohttpparser_h
|
||||
#define picohttpparser_h
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define ssize_t intptr_t
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* contains name and value of a header (name == NULL if is a continuing line
|
||||
* of a multiline header */
|
||||
struct phr_header {
|
||||
const char *name;
|
||||
size_t name_len;
|
||||
const char *value;
|
||||
size_t value_len;
|
||||
};
|
||||
|
||||
/* returns number of bytes consumed if successful, -2 if request is partial,
|
||||
* -1 if failed */
|
||||
int phr_parse_request(const char *buf, size_t len, const char **method, size_t *method_len, const char **path, size_t *path_len,
|
||||
int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len);
|
||||
|
||||
/* ditto */
|
||||
int phr_parse_response(const char *_buf, size_t len, int *minor_version, int *status, const char **msg, size_t *msg_len,
|
||||
struct phr_header *headers, size_t *num_headers, size_t last_len);
|
||||
|
||||
/* ditto */
|
||||
int phr_parse_headers(const char *buf, size_t len, struct phr_header *headers, size_t *num_headers, size_t last_len);
|
||||
|
||||
/* should be zero-filled before start */
|
||||
struct phr_chunked_decoder {
|
||||
size_t bytes_left_in_chunk; /* number of bytes left in current chunk */
|
||||
char consume_trailer; /* if trailing headers should be consumed */
|
||||
char _hex_count;
|
||||
char _state;
|
||||
};
|
||||
|
||||
/* the function rewrites the buffer given as (buf, bufsz) removing the chunked-
|
||||
* encoding headers. When the function returns without an error, bufsz is
|
||||
* updated to the length of the decoded data available. Applications should
|
||||
* repeatedly call the function while it returns -2 (incomplete) every time
|
||||
* supplying newly arrived data. If the end of the chunked-encoded data is
|
||||
* found, the function returns a non-negative number indicating the number of
|
||||
* octets left undecoded at the tail of the supplied buffer. Returns -1 on
|
||||
* error.
|
||||
*/
|
||||
ssize_t phr_decode_chunked(struct phr_chunked_decoder *decoder, char *buf, size_t *bufsz);
|
||||
|
||||
/* returns if the chunked decoder is in middle of chunked data */
|
||||
int phr_decode_chunked_is_in_data(struct phr_chunked_decoder *decoder);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,29 +1,29 @@
|
|||
/*****************************************************************************
|
||||
*
|
||||
*
|
||||
* Monitoring Plugins SSL utilities
|
||||
*
|
||||
*
|
||||
* License: GPL
|
||||
* Copyright (c) 2005-2010 Monitoring Plugins Development Team
|
||||
*
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
*
|
||||
* This file contains common functions for plugins that require SSL.
|
||||
*
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define MAX_CN_LENGTH 256
|
||||
|
|
@ -193,12 +193,22 @@ int np_net_ssl_read(void *buf, int num) {
|
|||
|
||||
int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
|
||||
# ifdef USE_OPENSSL
|
||||
X509 *certificate=NULL;
|
||||
X509 *certificate = NULL;
|
||||
certificate=SSL_get_peer_certificate(s);
|
||||
return(np_net_ssl_check_certificate(certificate, days_till_exp_warn, days_till_exp_crit));
|
||||
# else /* ifndef USE_OPENSSL */
|
||||
printf("%s\n", _("WARNING - Plugin does not support checking certificates."));
|
||||
return STATE_WARNING;
|
||||
# endif /* USE_OPENSSL */
|
||||
}
|
||||
|
||||
int np_net_ssl_check_certificate(X509 *certificate, int days_till_exp_warn, int days_till_exp_crit){
|
||||
# ifdef USE_OPENSSL
|
||||
X509_NAME *subj=NULL;
|
||||
char timestamp[50] = "";
|
||||
char cn[MAX_CN_LENGTH]= "";
|
||||
char *tz;
|
||||
|
||||
|
||||
int cnlen =-1;
|
||||
int status=STATE_UNKNOWN;
|
||||
|
||||
|
|
@ -210,7 +220,6 @@ int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
|
|||
int time_remaining;
|
||||
time_t tm_t;
|
||||
|
||||
certificate=SSL_get_peer_certificate(s);
|
||||
if (!certificate) {
|
||||
printf("%s\n",_("CRITICAL - Cannot retrieve server certificate."));
|
||||
return STATE_CRITICAL;
|
||||
|
|
|
|||
199
plugins/t/check_curl.t
Normal file
199
plugins/t/check_curl.t
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
#! /usr/bin/perl -w -I ..
|
||||
#
|
||||
# HyperText Transfer Protocol (HTTP) Test via check_http
|
||||
#
|
||||
#
|
||||
|
||||
use strict;
|
||||
use Test::More;
|
||||
use POSIX qw/mktime strftime/;
|
||||
use NPTest;
|
||||
|
||||
plan tests => 57;
|
||||
|
||||
my $successOutput = '/OK.*HTTP.*second/';
|
||||
|
||||
my $res;
|
||||
my $plugin = 'check_http';
|
||||
$plugin = 'check_curl' if $0 =~ m/check_curl/mx;
|
||||
|
||||
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");
|
||||
|
||||
my $faketime = -x '/usr/bin/faketime' ? 1 : 0;
|
||||
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin $host_tcp_http -wt 300 -ct 600"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 0, "Webserver $host_tcp_http responded" );
|
||||
like( $res->output, $successOutput, "Output OK" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin $host_tcp_http -wt 300 -ct 600 -v -v -v -k 'bob:there' -k 'carl:frown'"
|
||||
);
|
||||
like( $res->output, '/bob:there\r\ncarl:frown\r\n/', "Got headers with multiple -k options" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin $host_nonresponsive -wt 1 -ct 2 -t 3"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "Webserver $host_nonresponsive not responding" );
|
||||
# was CRITICAL only, but both check_curl and check_http print HTTP CRITICAL (puzzle?!)
|
||||
cmp_ok( $res->output, 'eq', "HTTP CRITICAL - Invalid HTTP response received from host on port 80: cURL returned 28 - Timeout was reached", "Output OK");
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin $hostname_invalid -wt 1 -ct 2"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "Webserver $hostname_invalid not valid" );
|
||||
# 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
|
||||
# Is also possible to get a socket timeout if DNS is not responding fast enough
|
||||
# cURL gives us consistent strings from it's own 'lib/strerror.c'
|
||||
like( $res->output, "/cURL returned 6 - Couldn't resolve host name/", "Output OK");
|
||||
|
||||
# host header checks
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.'\s*$/ms', "Host Header OK" );
|
||||
like( $res->output, '/CURLOPT_URL: http:\/\/'.$host_tcp_http.':80\//ms', "Url OK" );
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http -p 80");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.'\s*$/ms', "Host Header OK" );
|
||||
like( $res->output, '/CURLOPT_URL: http:\/\/'.$host_tcp_http.':80\//ms', "Url OK" );
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http:8080 -p 80");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.':8080\s*$/ms', "Host Header OK" );
|
||||
like( $res->output, '/CURLOPT_URL: http:\/\/'.$host_tcp_http.':80\//ms', "Url OK" );
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http:8080 -p 80");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.':8080\s*$/ms', "Host Header OK" );
|
||||
like( $res->output, '/CURLOPT_URL: http:\/\/'.$host_tcp_http.':80\//ms', "Url OK" );
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http:8080 -p 80 -k 'Host: testhost:8001'");
|
||||
like( $res->output, '/^Host: testhost:8001\s*$/ms', "Host Header OK" );
|
||||
like( $res->output, '/CURLOPT_URL: http:\/\/'.$host_tcp_http.':80\//ms', "Url OK" );
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -I $host_tcp_http -p 80 -k 'Host: testhost:8001'");
|
||||
like( $res->output, '/^Host: testhost:8001\s*$/ms', "Host Header OK" );
|
||||
like( $res->output, '/CURLOPT_URL: http:\/\/'.$host_tcp_http.':80\//ms', "Url OK" );
|
||||
|
||||
SKIP: {
|
||||
skip "No internet access", 3 if $internet_access eq "no";
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tls_http -S");
|
||||
like( $res->output, '/^Host: '.$host_tls_http.'\s*$/ms', "Host Header OK" );
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tls_http:8080 -S -p 443");
|
||||
like( $res->output, '/^Host: '.$host_tls_http.':8080\s*$/ms', "Host Header OK" );
|
||||
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tls_http:443 -S -p 443");
|
||||
like( $res->output, '/^Host: '.$host_tls_http.'\s*$/ms', "Host Header OK" );
|
||||
};
|
||||
|
||||
SKIP: {
|
||||
skip "No host serving monitoring in index file", 7 unless $host_tcp_http2;
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'monitoring'" );
|
||||
cmp_ok( $res->return_code, "==", 0, "Got a reference to 'monitoring'");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'mONiTORing'" );
|
||||
cmp_ok( $res->return_code, "==", 2, "Not got 'mONiTORing'");
|
||||
like ( $res->output, "/pattern not found/", "Error message says 'pattern not found'");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -R 'mONiTORing'" );
|
||||
cmp_ok( $res->return_code, "==", 0, "But case insensitive doesn't mind 'mONiTORing'");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'monitoring' --invert-regex" );
|
||||
cmp_ok( $res->return_code, "==", 2, "Invert results work when found");
|
||||
like ( $res->output, "/pattern found/", "Error message says 'pattern found'");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'mONiTORing' --invert-regex" );
|
||||
cmp_ok( $res->return_code, "==", 0, "And also when not found");
|
||||
}
|
||||
SKIP: {
|
||||
skip "No internet access", 16 if $internet_access eq "no";
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin --ssl $host_tls_http"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 0, "Can read https for $host_tls_http" );
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -C 1 --ssl $host_tls_http" );
|
||||
cmp_ok( $res->return_code, '==', 0, "Checking certificate for $host_tls_http");
|
||||
like ( $res->output, "/Certificate '$host_tls_cert' will expire on/", "Output OK" );
|
||||
my $saved_cert_output = $res->output;
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -C 8000,1 --ssl $host_tls_http" );
|
||||
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" );
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin $host_tls_http -C 1" );
|
||||
is( $res->return_code, 0, "Old syntax for cert checking okay" );
|
||||
is( $res->output, $saved_cert_output, "Same output as new syntax" );
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tls_http -C 1" );
|
||||
is( $res->return_code, 0, "Updated syntax for cert checking okay" );
|
||||
is( $res->output, $saved_cert_output, "Same output as new syntax" );
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -C 1 $host_tls_http" );
|
||||
cmp_ok( $res->output, 'eq', $saved_cert_output, "--ssl option automatically added");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin $host_tls_http -C 1" );
|
||||
cmp_ok( $res->output, 'eq', $saved_cert_output, "Old syntax for cert checking still works");
|
||||
|
||||
# run some certificate checks with faketime
|
||||
SKIP: {
|
||||
skip "No faketime binary found", 12 if !$faketime;
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC ./$plugin -C 1 $host_tls_http");
|
||||
like($res->output, qr/OK - Certificate '$host_tls_cert' will expire on/, "Catch cert output");
|
||||
is( $res->return_code, 0, "Catch cert output exit code" );
|
||||
my($mon,$day,$hour,$min,$sec,$year) = ($res->output =~ /(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/);
|
||||
if(!defined $year) {
|
||||
die("parsing date failed from: ".$res->output);
|
||||
}
|
||||
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));
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' just expired/, "Output on expire date");
|
||||
is( $res->return_code, 2, "Output on expire date" );
|
||||
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expires in 0 minutes/, "cert expires in 1 second output");
|
||||
is( $res->return_code, 2, "cert expires in 1 second exit code" );
|
||||
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expires in 2 minutes/, "cert expires in 2 minutes output");
|
||||
is( $res->return_code, 2, "cert expires in 2 minutes exit code" );
|
||||
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expires in 2 hours/, "cert expires in 2 hours output");
|
||||
is( $res->return_code, 2, "cert expires in 2 hours exit code" );
|
||||
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expired on/, "Certificate expired output");
|
||||
is( $res->return_code, 2, "Certificate expired exit code" );
|
||||
};
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin --ssl $host_tls_http -E" );
|
||||
like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
|
||||
like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./$plugin --ssl -H www.e-paycobalt.com"
|
||||
);
|
||||
cmp_ok( $res->return_code, "==", 0, "Can read https for www.e-paycobalt.com (uses AES certificate)" );
|
||||
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H www.mozilla.com -u /firefox -f follow" );
|
||||
is( $res->return_code, 0, "Redirection based on location is okay");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -H www.mozilla.com --extended-perfdata" );
|
||||
like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
|
||||
}
|
||||
|
|
@ -14,6 +14,8 @@ plan tests => 50;
|
|||
my $successOutput = '/OK.*HTTP.*second/';
|
||||
|
||||
my $res;
|
||||
my $plugin = 'check_http';
|
||||
$plugin = 'check_curl' if $0 =~ m/check_curl/mx;
|
||||
|
||||
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");
|
||||
|
|
@ -29,24 +31,24 @@ my $faketime = -x '/usr/bin/faketime' ? 1 : 0;
|
|||
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_http $host_tcp_http -wt 300 -ct 600"
|
||||
"./$plugin $host_tcp_http -wt 300 -ct 600"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 0, "Webserver $host_tcp_http responded" );
|
||||
like( $res->output, $successOutput, "Output OK" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_http $host_tcp_http -wt 300 -ct 600 -v -v -v -k 'bob:there' -k 'carl:frown'"
|
||||
"./$plugin $host_tcp_http -wt 300 -ct 600 -v -v -v -k 'bob:there' -k 'carl:frown'"
|
||||
);
|
||||
like( $res->output, '/bob:there\r\ncarl:frown\r\n/', "Got headers with multiple -k options" );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_http $host_nonresponsive -wt 1 -ct 2 -t 3"
|
||||
"./$plugin $host_nonresponsive -wt 1 -ct 2 -t 3"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "Webserver $host_nonresponsive not responding" );
|
||||
cmp_ok( $res->output, 'eq', "CRITICAL - Socket timeout after 3 seconds", "Output OK");
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_http $hostname_invalid -wt 1 -ct 2"
|
||||
"./$plugin $hostname_invalid -wt 1 -ct 2"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 2, "Webserver $hostname_invalid not valid" );
|
||||
# The first part of the message comes from the OS catalogue, so cannot check this.
|
||||
|
|
@ -55,86 +57,86 @@ cmp_ok( $res->return_code, '==', 2, "Webserver $hostname_invalid not valid" );
|
|||
like( $res->output, "/Unable to open TCP socket|Socket timeout after/", "Output OK");
|
||||
|
||||
# host header checks
|
||||
$res = NPTest->testCmd("./check_http -v -H $host_tcp_http");
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.'\s*$/ms', "Host Header OK" );
|
||||
|
||||
$res = NPTest->testCmd("./check_http -v -H $host_tcp_http -p 80");
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http -p 80");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.'\s*$/ms', "Host Header OK" );
|
||||
|
||||
$res = NPTest->testCmd("./check_http -v -H $host_tcp_http:8080 -p 80");
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http:8080 -p 80");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.':8080\s*$/ms', "Host Header OK" );
|
||||
|
||||
$res = NPTest->testCmd("./check_http -v -H $host_tcp_http:8080 -p 80");
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tcp_http:8080 -p 80");
|
||||
like( $res->output, '/^Host: '.$host_tcp_http.':8080\s*$/ms', "Host Header OK" );
|
||||
|
||||
SKIP: {
|
||||
skip "No internet access", 3 if $internet_access eq "no";
|
||||
|
||||
$res = NPTest->testCmd("./check_http -v -H $host_tls_http -S");
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tls_http -S");
|
||||
like( $res->output, '/^Host: '.$host_tls_http.'\s*$/ms', "Host Header OK" );
|
||||
|
||||
$res = NPTest->testCmd("./check_http -v -H $host_tls_http:8080 -S -p 443");
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tls_http:8080 -S -p 443");
|
||||
like( $res->output, '/^Host: '.$host_tls_http.':8080\s*$/ms', "Host Header OK" );
|
||||
|
||||
$res = NPTest->testCmd("./check_http -v -H $host_tls_http:443 -S -p 443");
|
||||
$res = NPTest->testCmd("./$plugin -v -H $host_tls_http:443 -S -p 443");
|
||||
like( $res->output, '/^Host: '.$host_tls_http.'\s*$/ms', "Host Header OK" );
|
||||
};
|
||||
|
||||
SKIP: {
|
||||
skip "No host serving monitoring in index file", 7 unless $host_tcp_http2;
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H $host_tcp_http2 -r 'monitoring'" );
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'monitoring'" );
|
||||
cmp_ok( $res->return_code, "==", 0, "Got a reference to 'monitoring'");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H $host_tcp_http2 -r 'mONiTORing'" );
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'mONiTORing'" );
|
||||
cmp_ok( $res->return_code, "==", 2, "Not got 'mONiTORing'");
|
||||
like ( $res->output, "/pattern not found/", "Error message says 'pattern not found'");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H $host_tcp_http2 -R 'mONiTORing'" );
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -R 'mONiTORing'" );
|
||||
cmp_ok( $res->return_code, "==", 0, "But case insensitive doesn't mind 'mONiTORing'");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H $host_tcp_http2 -r 'monitoring' --invert-regex" );
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'monitoring' --invert-regex" );
|
||||
cmp_ok( $res->return_code, "==", 2, "Invert results work when found");
|
||||
like ( $res->output, "/pattern found/", "Error message says 'pattern found'");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H $host_tcp_http2 -r 'mONiTORing' --invert-regex" );
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tcp_http2 -r 'mONiTORing' --invert-regex" );
|
||||
cmp_ok( $res->return_code, "==", 0, "And also when not found");
|
||||
}
|
||||
SKIP: {
|
||||
skip "No internet access", 16 if $internet_access eq "no";
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_http --ssl $host_tls_http"
|
||||
"./$plugin --ssl $host_tls_http"
|
||||
);
|
||||
cmp_ok( $res->return_code, '==', 0, "Can read https for $host_tls_http" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -C 1 --ssl $host_tls_http" );
|
||||
$res = NPTest->testCmd( "./$plugin -C 1 --ssl $host_tls_http" );
|
||||
cmp_ok( $res->return_code, '==', 0, "Checking certificate for $host_tls_http");
|
||||
like ( $res->output, "/Certificate '$host_tls_cert' will expire on/", "Output OK" );
|
||||
my $saved_cert_output = $res->output;
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -C 8000,1 --ssl $host_tls_http" );
|
||||
$res = NPTest->testCmd( "./$plugin -C 8000,1 --ssl $host_tls_http" );
|
||||
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" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_http $host_tls_http -C 1" );
|
||||
$res = NPTest->testCmd( "./$plugin $host_tls_http -C 1" );
|
||||
is( $res->return_code, 0, "Old syntax for cert checking okay" );
|
||||
is( $res->output, $saved_cert_output, "Same output as new syntax" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H $host_tls_http -C 1" );
|
||||
$res = NPTest->testCmd( "./$plugin -H $host_tls_http -C 1" );
|
||||
is( $res->return_code, 0, "Updated syntax for cert checking okay" );
|
||||
is( $res->output, $saved_cert_output, "Same output as new syntax" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -C 1 $host_tls_http" );
|
||||
$res = NPTest->testCmd( "./$plugin -C 1 $host_tls_http" );
|
||||
cmp_ok( $res->output, 'eq', $saved_cert_output, "--ssl option automatically added");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http $host_tls_http -C 1" );
|
||||
$res = NPTest->testCmd( "./$plugin $host_tls_http -C 1" );
|
||||
cmp_ok( $res->output, 'eq', $saved_cert_output, "Old syntax for cert checking still works");
|
||||
|
||||
# run some certificate checks with faketime
|
||||
SKIP: {
|
||||
skip "No faketime binary found", 7 if !$faketime;
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC ./check_http -C 1 $host_tls_http");
|
||||
skip "No faketime binary found", 12 if !$faketime;
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC ./$plugin -C 1 $host_tls_http");
|
||||
like($res->output, qr/OK - Certificate '$host_tls_cert' will expire on/, "Catch cert output");
|
||||
is( $res->return_code, 0, "Catch cert output exit code" );
|
||||
my($mon,$day,$hour,$min,$sec,$year) = ($res->output =~ /(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/);
|
||||
|
|
@ -144,51 +146,51 @@ SKIP: {
|
|||
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));
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts))."' ./check_http -C 1 $host_tls_http");
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' just expired/, "Output on expire date");
|
||||
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts-1))."' ./check_http -C 1 $host_tls_http");
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expires in 0 minutes/, "cert expires in 1 second output");
|
||||
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts-120))."' ./check_http -C 1 $host_tls_http");
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expires in 2 minutes/, "cert expires in 2 minutes output");
|
||||
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts-7200))."' ./check_http -C 1 $host_tls_http");
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expires in 2 hours/, "cert expires in 2 hours output");
|
||||
|
||||
$res = NPTest->testCmd("LC_TIME=C TZ=UTC faketime -f '".strftime("%Y-%m-%d %H:%M:%S", localtime($ts+1))."' ./check_http -C 1 $host_tls_http");
|
||||
$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");
|
||||
like($res->output, qr/CRITICAL - Certificate '$host_tls_cert' expired on/, "Certificate expired output");
|
||||
};
|
||||
|
||||
$res = NPTest->testCmd( "./check_http --ssl $host_tls_http -E" );
|
||||
$res = NPTest->testCmd( "./$plugin --ssl $host_tls_http -E" );
|
||||
like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
|
||||
like ( $res->output, '/time_ssl=[\d\.]+/', 'Extended Performance Data SSL Output OK' );
|
||||
|
||||
$res = NPTest->testCmd(
|
||||
"./check_http --ssl -H www.e-paycobalt.com"
|
||||
"./$plugin --ssl -H www.e-paycobalt.com"
|
||||
);
|
||||
cmp_ok( $res->return_code, "==", 0, "Can read https for www.e-paycobalt.com (uses AES certificate)" );
|
||||
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H www.mozilla.com -u /firefox -f follow" );
|
||||
$res = NPTest->testCmd( "./$plugin -H www.mozilla.com -u /firefox -f follow" );
|
||||
is( $res->return_code, 0, "Redirection based on location is okay");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -H www.mozilla.com --extended-perfdata" );
|
||||
$res = NPTest->testCmd( "./$plugin -H www.mozilla.com --extended-perfdata" );
|
||||
like ( $res->output, '/time_connect=[\d\.]+/', 'Extended Performance Data Output OK' );
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "No internet access or proxy configured", 6 if $internet_access eq "no" or ! $host_tcp_proxy;
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -I $host_tcp_proxy -p $port_tcp_proxy -u http://$host_tcp_http -e 200,301,302");
|
||||
$res = NPTest->testCmd( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -u http://$host_tcp_http -e 200,301,302");
|
||||
is( $res->return_code, 0, "Proxy HTTP works");
|
||||
like($res->output, qr/OK: Status line output matched/, "Proxy HTTP Output is sufficent");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT");
|
||||
$res = NPTest->testCmd( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT");
|
||||
is( $res->return_code, 0, "Proxy HTTP CONNECT works");
|
||||
like($res->output, qr/HTTP OK:/, "Proxy HTTP CONNECT output sufficent");
|
||||
|
||||
$res = NPTest->testCmd( "./check_http -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT:HEAD");
|
||||
$res = NPTest->testCmd( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT:HEAD");
|
||||
is( $res->return_code, 0, "Proxy HTTP CONNECT works with override method");
|
||||
like($res->output, qr/HTTP OK:/, "Proxy HTTP CONNECT output sufficent");
|
||||
}
|
||||
|
|
|
|||
498
plugins/tests/check_curl.t
Executable file
498
plugins/tests/check_curl.t
Executable file
|
|
@ -0,0 +1,498 @@
|
|||
#! /usr/bin/perl -w -I ..
|
||||
#
|
||||
# Test check_http by having an actual HTTP server running
|
||||
#
|
||||
# To create the https server certificate:
|
||||
# openssl req -new -x509 -keyout server-key.pem -out server-cert.pem -days 3650 -nodes
|
||||
# to create a new expired certificate:
|
||||
# faketime '2008-01-01 12:00:00' openssl req -new -x509 -keyout expired-key.pem -out expired-cert.pem -days 1 -nodes
|
||||
# Country Name (2 letter code) [AU]:DE
|
||||
# State or Province Name (full name) [Some-State]:Bavaria
|
||||
# Locality Name (eg, city) []:Munich
|
||||
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:Monitoring Plugins
|
||||
# Organizational Unit Name (eg, section) []:
|
||||
# Common Name (e.g. server FQDN or YOUR name) []:Monitoring Plugins
|
||||
# Email Address []:devel@monitoring-plugins.org
|
||||
|
||||
use strict;
|
||||
use Test::More;
|
||||
use NPTest;
|
||||
use FindBin qw($Bin);
|
||||
|
||||
$ENV{'LC_TIME'} = "C";
|
||||
|
||||
my $common_tests = 70;
|
||||
my $ssl_only_tests = 8;
|
||||
# Check that all dependent modules are available
|
||||
eval "use HTTP::Daemon 6.01;";
|
||||
plan skip_all => 'HTTP::Daemon >= 6.01 required' if $@;
|
||||
eval {
|
||||
require HTTP::Status;
|
||||
require HTTP::Response;
|
||||
};
|
||||
|
||||
my $plugin = 'check_http';
|
||||
$plugin = 'check_curl' if $0 =~ m/check_curl/mx;
|
||||
|
||||
# look for libcurl version to see if some advanced checks are possible (>= 7.49.0)
|
||||
my $advanced_checks = 12;
|
||||
my $use_advanced_checks = 0;
|
||||
my $required_version = '7.49.0';
|
||||
my $virtual_host = 'www.somefunnyhost.com';
|
||||
my $virtual_port = 42;
|
||||
my $curl_version = '';
|
||||
open (my $fh, '-|', "./$plugin --version") or die;
|
||||
while (<$fh>) {
|
||||
if (m{libcurl/([\d.]+)\s}) {
|
||||
$curl_version = $1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
close ($fh);
|
||||
if ($curl_version) {
|
||||
my ($major, $minor, $release) = split (/\./, $curl_version);
|
||||
my ($req_major, $req_minor, $req_release) = split (/\./, $required_version);
|
||||
my $check = ($major <=> $req_major or $minor <=> $req_minor or $release <=> $req_release);
|
||||
if ($check >= 0) {
|
||||
$use_advanced_checks = 1;
|
||||
print "Found libcurl $major.$minor.$release. Using advanced checks\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ($@) {
|
||||
plan skip_all => "Missing required module for test: $@";
|
||||
} else {
|
||||
if (-x "./$plugin") {
|
||||
plan tests => $common_tests * 2 + $ssl_only_tests + $advanced_checks;
|
||||
} else {
|
||||
plan skip_all => "No $plugin compiled";
|
||||
}
|
||||
}
|
||||
|
||||
my $servers = { http => 0 }; # HTTP::Daemon should always be available
|
||||
eval { require HTTP::Daemon::SSL };
|
||||
if ($@) {
|
||||
diag "Cannot load HTTP::Daemon::SSL: $@";
|
||||
} else {
|
||||
$servers->{https} = 0;
|
||||
}
|
||||
|
||||
# set a fixed version, so the header size doesn't vary
|
||||
$HTTP::Daemon::VERSION = "1.00";
|
||||
|
||||
my $port_http = 50000 + int(rand(1000));
|
||||
my $port_https = $port_http + 1;
|
||||
my $port_https_expired = $port_http + 2;
|
||||
|
||||
# This array keeps sockets around for implementing timeouts
|
||||
my @persist;
|
||||
|
||||
# Start up all servers
|
||||
my @pids;
|
||||
my $pid = fork();
|
||||
if ($pid) {
|
||||
# Parent
|
||||
push @pids, $pid;
|
||||
if (exists $servers->{https}) {
|
||||
# Fork a normal HTTPS server
|
||||
$pid = fork();
|
||||
if ($pid) {
|
||||
# Parent
|
||||
push @pids, $pid;
|
||||
# Fork an expired cert server
|
||||
$pid = fork();
|
||||
if ($pid) {
|
||||
push @pids, $pid;
|
||||
} else {
|
||||
my $d = HTTP::Daemon::SSL->new(
|
||||
LocalPort => $port_https_expired,
|
||||
LocalAddr => "127.0.0.1",
|
||||
SSL_cert_file => "$Bin/certs/expired-cert.pem",
|
||||
SSL_key_file => "$Bin/certs/expired-key.pem",
|
||||
) || die;
|
||||
print "Please contact https expired at: <URL:", $d->url, ">\n";
|
||||
run_server( $d );
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
my $d = HTTP::Daemon::SSL->new(
|
||||
LocalPort => $port_https,
|
||||
LocalAddr => "127.0.0.1",
|
||||
SSL_cert_file => "$Bin/certs/server-cert.pem",
|
||||
SSL_key_file => "$Bin/certs/server-key.pem",
|
||||
) || die;
|
||||
print "Please contact https at: <URL:", $d->url, ">\n";
|
||||
run_server( $d );
|
||||
exit;
|
||||
}
|
||||
}
|
||||
# give our webservers some time to startup
|
||||
sleep(1);
|
||||
} else {
|
||||
# Child
|
||||
#print "child\n";
|
||||
my $d = HTTP::Daemon->new(
|
||||
LocalPort => $port_http,
|
||||
LocalAddr => "127.0.0.1",
|
||||
) || die;
|
||||
print "Please contact http at: <URL:", $d->url, ">\n";
|
||||
run_server( $d );
|
||||
exit;
|
||||
}
|
||||
|
||||
# Run the same server on http and https
|
||||
sub run_server {
|
||||
my $d = shift;
|
||||
MAINLOOP: while (my $c = $d->accept ) {
|
||||
while (my $r = $c->get_request) {
|
||||
if ($r->method eq "GET" and $r->url->path =~ m^/statuscode/(\d+)^) {
|
||||
$c->send_basic_header($1);
|
||||
$c->send_crlf;
|
||||
} elsif ($r->method eq "GET" and $r->url->path =~ m^/file/(.*)^) {
|
||||
$c->send_basic_header;
|
||||
$c->send_crlf;
|
||||
$c->send_file_response("$Bin/var/$1");
|
||||
} elsif ($r->method eq "GET" and $r->url->path eq "/slow") {
|
||||
$c->send_basic_header;
|
||||
$c->send_crlf;
|
||||
sleep 1;
|
||||
$c->send_response("slow");
|
||||
} elsif ($r->url->path eq "/method") {
|
||||
if ($r->method eq "DELETE") {
|
||||
$c->send_error(HTTP::Status->RC_METHOD_NOT_ALLOWED);
|
||||
} elsif ($r->method eq "foo") {
|
||||
$c->send_error(HTTP::Status->RC_NOT_IMPLEMENTED);
|
||||
} else {
|
||||
$c->send_status_line(200, $r->method);
|
||||
}
|
||||
} elsif ($r->url->path eq "/postdata") {
|
||||
$c->send_basic_header;
|
||||
$c->send_crlf;
|
||||
$c->send_response($r->method.":".$r->content);
|
||||
} elsif ($r->url->path eq "/redirect") {
|
||||
$c->send_redirect( "/redirect2" );
|
||||
} elsif ($r->url->path eq "/redir_external") {
|
||||
$c->send_redirect(($d->isa('HTTP::Daemon::SSL') ? "https" : "http") . "://169.254.169.254/redirect2" );
|
||||
} elsif ($r->url->path eq "/redirect2") {
|
||||
$c->send_basic_header;
|
||||
$c->send_crlf;
|
||||
$c->send_response(HTTP::Response->new( 200, 'OK', undef, 'redirected' ));
|
||||
} elsif ($r->url->path eq "/redir_timeout") {
|
||||
$c->send_redirect( "/timeout" );
|
||||
} elsif ($r->url->path eq "/timeout") {
|
||||
# Keep $c from being destroyed, but prevent severe leaks
|
||||
unshift @persist, $c;
|
||||
delete($persist[1000]);
|
||||
next MAINLOOP;
|
||||
} elsif ($r->url->path eq "/header_check") {
|
||||
$c->send_basic_header;
|
||||
$c->send_header('foo');
|
||||
$c->send_crlf;
|
||||
} elsif ($r->url->path eq "/virtual_port") {
|
||||
# return sent Host header
|
||||
$c->send_basic_header;
|
||||
$c->send_crlf;
|
||||
$c->send_response(HTTP::Response->new( 200, 'OK', undef, $r->header ('Host')));
|
||||
} else {
|
||||
$c->send_error(HTTP::Status->RC_FORBIDDEN);
|
||||
}
|
||||
$c->close;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
END {
|
||||
foreach my $pid (@pids) {
|
||||
if ($pid) { print "Killing $pid\n"; kill "INT", $pid }
|
||||
}
|
||||
};
|
||||
|
||||
if ($ARGV[0] && $ARGV[0] eq "-d") {
|
||||
while (1) {
|
||||
sleep 100;
|
||||
}
|
||||
}
|
||||
|
||||
my $result;
|
||||
my $command = "./$plugin -H 127.0.0.1";
|
||||
|
||||
run_common_tests( { command => "$command -p $port_http" } );
|
||||
SKIP: {
|
||||
skip "HTTP::Daemon::SSL not installed", $common_tests + $ssl_only_tests if ! exists $servers->{https};
|
||||
run_common_tests( { command => "$command -p $port_https", ssl => 1 } );
|
||||
|
||||
$result = NPTest->testCmd( "$command -p $port_https -S -C 14" );
|
||||
is( $result->return_code, 0, "$command -p $port_https -S -C 14" );
|
||||
is( $result->output, "OK - Certificate 'Monitoring Plugins' will expire on Fri Feb 16 15:31:44 2029 +0000.", "output ok" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -p $port_https -S -C 14000" );
|
||||
is( $result->return_code, 1, "$command -p $port_https -S -C 14000" );
|
||||
like( $result->output, '/WARNING - Certificate \'Monitoring Plugins\' expires in \d+ day\(s\) \(Fri Feb 16 15:31:44 2029 \+0000\)./', "output ok" );
|
||||
|
||||
# Expired cert tests
|
||||
$result = NPTest->testCmd( "$command -p $port_https -S -C 13960,14000" );
|
||||
is( $result->return_code, 2, "$command -p $port_https -S -C 13960,14000" );
|
||||
like( $result->output, '/CRITICAL - Certificate \'Monitoring Plugins\' expires in \d+ day\(s\) \(Fri Feb 16 15:31:44 2029 \+0000\)./', "output ok" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -p $port_https_expired -S -C 7" );
|
||||
is( $result->return_code, 2, "$command -p $port_https_expired -S -C 7" );
|
||||
is( $result->output,
|
||||
'CRITICAL - Certificate \'Monitoring Plugins\' expired on Wed Jan 2 11:00:26 2008 +0000.',
|
||||
"output ok" );
|
||||
|
||||
}
|
||||
|
||||
my $cmd;
|
||||
|
||||
# advanced checks with virtual hostname and virtual port
|
||||
SKIP: {
|
||||
skip "libcurl version is smaller than $required_version", 6 unless $use_advanced_checks;
|
||||
|
||||
# http without virtual port
|
||||
$cmd = "./$plugin -H $virtual_host -I 127.0.0.1 -p $port_http -u /virtual_port -r ^$virtual_host:$port_http\$";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
# http with virtual port (!= 80)
|
||||
$cmd = "./$plugin -H $virtual_host:$virtual_port -I 127.0.0.1 -p $port_http -u /virtual_port -r ^$virtual_host:$virtual_port\$";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
# http with virtual port (80)
|
||||
$cmd = "./$plugin -H $virtual_host:80 -I 127.0.0.1 -p $port_http -u /virtual_port -r ^$virtual_host\$";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
}
|
||||
|
||||
# and the same for SSL
|
||||
SKIP: {
|
||||
skip "libcurl version is smaller than $required_version and/or HTTP::Daemon::SSL not installed", 6 if ! exists $servers->{https} or not $use_advanced_checks;
|
||||
# https without virtual port
|
||||
$cmd = "./$plugin -H $virtual_host -I 127.0.0.1 -p $port_https --ssl -u /virtual_port -r ^$virtual_host:$port_https\$";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
# https with virtual port (!= 443)
|
||||
$cmd = "./$plugin -H $virtual_host:$virtual_port -I 127.0.0.1 -p $port_https --ssl -u /virtual_port -r ^$virtual_host:$virtual_port\$";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
# https with virtual port (443)
|
||||
$cmd = "./$plugin -H $virtual_host:443 -I 127.0.0.1 -p $port_https --ssl -u /virtual_port -r ^$virtual_host\$";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
}
|
||||
|
||||
|
||||
sub run_common_tests {
|
||||
my ($opts) = @_;
|
||||
my $command = $opts->{command};
|
||||
if ($opts->{ssl}) {
|
||||
$command .= " --ssl";
|
||||
}
|
||||
|
||||
$result = NPTest->testCmd( "$command -u /file/root" );
|
||||
is( $result->return_code, 0, "/file/root");
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - 274 bytes in [\d\.]+ second/', "Output correct" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -u /file/root -s Root" );
|
||||
is( $result->return_code, 0, "/file/root search for string");
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - 274 bytes in [\d\.]+ second/', "Output correct" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -u /file/root -s NonRoot" );
|
||||
is( $result->return_code, 2, "Missing string check");
|
||||
like( $result->output, qr%^HTTP CRITICAL: HTTP/1\.1 200 OK - string 'NonRoot' not found on 'https?://127\.0\.0\.1:\d+/file/root'%, "Shows search string and location");
|
||||
|
||||
$result = NPTest->testCmd( "$command -u /file/root -s NonRootWithOver30charsAndMoreFunThanAWetFish" );
|
||||
is( $result->return_code, 2, "Missing string check");
|
||||
like( $result->output, qr%HTTP CRITICAL: HTTP/1\.1 200 OK - string 'NonRootWithOver30charsAndM...' not found on 'https?://127\.0\.0\.1:\d+/file/root'%, "Shows search string and location");
|
||||
|
||||
$result = NPTest->testCmd( "$command -u /header_check -d foo" );
|
||||
is( $result->return_code, 0, "header_check search for string");
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - 96 bytes in [\d\.]+ second/', "Output correct" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -u /header_check -d bar" );
|
||||
is( $result->return_code, 2, "Missing header string check");
|
||||
like( $result->output, qr%^HTTP CRITICAL: HTTP/1\.1 200 OK - header 'bar' not found on 'https?://127\.0\.0\.1:\d+/header_check'%, "Shows search string and location");
|
||||
|
||||
my $cmd;
|
||||
$cmd = "$command -u /slow";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, "$cmd");
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
$result->output =~ /in ([\d\.]+) second/;
|
||||
cmp_ok( $1, ">", 1, "Time is > 1 second" );
|
||||
|
||||
$cmd = "$command -u /statuscode/200";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /statuscode/200 -e 200";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - Status line output matched "200" - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /statuscode/201";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 201 Created - \d+ bytes in [\d\.]+ second /', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /statuscode/201 -e 201";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 201 Created - Status line output matched "201" - \d+ bytes in [\d\.]+ second /', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /statuscode/201 -e 200";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 2, $cmd);
|
||||
like( $result->output, '/^HTTP CRITICAL - Invalid HTTP response received from host on port \d+: HTTP/1.1 201 Created/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /statuscode/200 -e 200,201,202";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - Status line output matched "200,201,202" - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /statuscode/201 -e 200,201,202";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 201 Created - Status line output matched "200,201,202" - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /statuscode/203 -e 200,201,202";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 2, $cmd);
|
||||
like( $result->output, '/^HTTP CRITICAL - Invalid HTTP response received from host on port (\d+): HTTP/1.1 203 Non-Authoritative Information/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -j HEAD -u /method";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 HEAD - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -j POST -u /method";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 POST - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -j GET -u /method";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 GET - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /method";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 GET - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -P foo -u /method";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 POST - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -j DELETE -u /method";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 1, $cmd);
|
||||
like( $result->output, '/^HTTP WARNING: HTTP/1.1 405 Method Not Allowed/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -j foo -u /method";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 2, $cmd);
|
||||
like( $result->output, '/^HTTP CRITICAL: HTTP/1.1 501 Not Implemented/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -P stufftoinclude -u /postdata -s POST:stufftoinclude";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -j PUT -P stufftoinclude -u /postdata -s PUT:stufftoinclude";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
# To confirm that the free doesn't segfault
|
||||
$cmd = "$command -P stufftoinclude -j PUT -u /postdata -s PUT:stufftoinclude";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /redirect";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 301 Moved Permanently - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -f follow -u /redirect";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -u /redirect -k 'follow: me'";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 301 Moved Permanently - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -f follow -u /redirect -k 'follow: me'";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -f sticky -u /redirect -k 'follow: me'";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
$cmd = "$command -f stickyport -u /redirect -k 'follow: me'";
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
is( $result->return_code, 0, $cmd);
|
||||
like( $result->output, '/^HTTP OK: HTTP/1.1 200 OK - \d+ bytes in [\d\.]+ second/', "Output correct: ".$result->output );
|
||||
|
||||
# These tests may block
|
||||
print "ALRM\n";
|
||||
|
||||
# stickyport - on full urlS port is set back to 80 otherwise
|
||||
$cmd = "$command -f stickyport -u /redir_external -t 5 -s redirected";
|
||||
eval {
|
||||
local $SIG{ALRM} = sub { die "alarm\n" };
|
||||
alarm(2);
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
alarm(0); };
|
||||
isnt( $@, "alarm\n", $cmd );
|
||||
is( $result->return_code, 0, $cmd );
|
||||
|
||||
# Let's hope there won't be any web server on :80 returning "redirected"!
|
||||
$cmd = "$command -f sticky -u /redir_external -t 5 -s redirected";
|
||||
eval {
|
||||
local $SIG{ALRM} = sub { die "alarm\n" };
|
||||
alarm(2);
|
||||
$result = NPTest->testCmd( $cmd );
|
||||
alarm(0); };
|
||||
isnt( $@, "alarm\n", $cmd );
|
||||
isnt( $result->return_code, 0, $cmd );
|
||||
|
||||
# Test an external address - timeout
|
||||
SKIP: {
|
||||
skip "This doesn't seem to work all the time", 1 unless ($ENV{HTTP_EXTERNAL});
|
||||
$cmd = "$command -f follow -u /redir_external -t 5";
|
||||
eval {
|
||||
$result = NPTest->testCmd( $cmd, 2 );
|
||||
};
|
||||
like( $@, "/timeout in command: $cmd/", $cmd );
|
||||
}
|
||||
|
||||
$cmd = "$command -u /timeout -t 5";
|
||||
eval {
|
||||
$result = NPTest->testCmd( $cmd, 2 );
|
||||
};
|
||||
like( $@, "/timeout in command: $cmd/", $cmd );
|
||||
|
||||
$cmd = "$command -f follow -u /redir_timeout -t 2";
|
||||
eval {
|
||||
$result = NPTest->testCmd( $cmd, 5 );
|
||||
};
|
||||
is( $@, "", $cmd );
|
||||
|
||||
}
|
||||
|
|
@ -32,13 +32,16 @@ eval {
|
|||
require HTTP::Response;
|
||||
};
|
||||
|
||||
my $plugin = 'check_http';
|
||||
$plugin = 'check_curl' if $0 =~ m/check_curl/mx;
|
||||
|
||||
if ($@) {
|
||||
plan skip_all => "Missing required module for test: $@";
|
||||
} else {
|
||||
if (-x "./check_http") {
|
||||
if (-x "./$plugin") {
|
||||
plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests;
|
||||
} else {
|
||||
plan skip_all => "No check_http compiled";
|
||||
plan skip_all => "No $plugin compiled";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -187,7 +190,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") {
|
|||
}
|
||||
|
||||
my $result;
|
||||
my $command = "./check_http -H 127.0.0.1";
|
||||
my $command = "./$plugin -H 127.0.0.1";
|
||||
|
||||
run_common_tests( { command => "$command -p $port_http" } );
|
||||
SKIP: {
|
||||
|
|
|
|||
6
po/de.po
6
po/de.po
|
|
@ -13,10 +13,10 @@ msgstr ""
|
|||
"PO-Revision-Date: 2004-12-23 17:46+0100\n"
|
||||
"Last-Translator: <>\n"
|
||||
"Language-Team: English <en@li.org>\n"
|
||||
"Language: en\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=iso-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: en\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);X-Generator: KBabel 1.3.1\n"
|
||||
|
||||
#: plugins/check_by_ssh.c:86 plugins/check_cluster.c:76 plugins/check_dig.c:88
|
||||
|
|
@ -5438,8 +5438,8 @@ msgstr ""
|
|||
|
||||
#: plugins/negate.c:174
|
||||
msgid ""
|
||||
"Ok must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer "
|
||||
"(0-3)."
|
||||
"Ok must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-"
|
||||
"3)."
|
||||
msgstr ""
|
||||
|
||||
#: plugins/negate.c:180
|
||||
|
|
|
|||
Loading…
Reference in a new issue