diff options
Diffstat (limited to 'heartbeat/http-mon.sh')
-rw-r--r-- | heartbeat/http-mon.sh | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/heartbeat/http-mon.sh b/heartbeat/http-mon.sh new file mode 100644 index 0000000..ce13ccd --- /dev/null +++ b/heartbeat/http-mon.sh @@ -0,0 +1,140 @@ +# +# General http monitor code +# (sourced by apache and httpmon) +# +# Author: Alan Robertson +# Sun Jiang Dong +# +# Support: users@clusterlabs.org +# +# License: GNU General Public License (GPL) +# +# Copyright: (C) 2002-2005 International Business Machines +# + +# default options for http clients +# NB: We _always_ test a local resource, so it should be +# safe to connect from the local interface. +bind_address="127.0.0.1" +curl_ipv6_opts="" +if ocf_is_true "$OCF_RESKEY_use_ipv6" || echo "$STATUSURL" | grep -qs "::"; then + bind_address="::1" + curl_ipv6_opts="-g" +fi +WGETOPTS="-O- -q -L --no-proxy --bind-address=$bind_address" +CURLOPTS="-o - -Ss -L --interface lo $curl_ipv6_opts" + +request_url_header() { + which curl >/dev/null 2>&1 + if [ $? -eq 0 ]; then + curl -IL --connect-timeout 5 --interface lo $curl_ipv6_opts "$1" > /dev/null 2>&1 + return $? + fi + + which wget >/dev/null 2>&1 + if [ $? -eq 0 ]; then + local header=$(wget --server-response --spider --timeout=5 --tries=2 "$1" 2>&1) + if [ $? -eq 0 ]; then + return $OCF_SUCCESS + fi + + # a 4xx error is still a server response. + echo "$header" | grep "HTTP/1.1 4.. " > /dev/null 2>&1 + return $? + fi + return $OCF_ERR_GENERIC +} + +# +# run the http client +# +curl_func() { + cl_opts="$CURLOPTS $test_httpclient_opts" + if [ x != "x$test_user" ]; then + echo "-u $test_user:$test_password" | + curl -K - $cl_opts "$1" + else + curl $cl_opts "$1" + fi +} +wget_func() { + auth="" + cl_opts="$WGETOPTS $test_httpclient_opts" + [ x != "x$test_user" ] && + auth="--http-user=$test_user --http-passwd=$test_password" + wget $auth $cl_opts "$1" +} +# +# rely on whatever the user provided +userdefined() { + $test_httpclient $test_httpclient_opts "$1" +} + +# +# find a good http client +# +findhttpclient() { + # prefer wget (for historical reasons) + if [ "x$CLIENT" != x ] && which "$CLIENT" >/dev/null 2>&1; then + echo "$CLIENT" + elif which wget >/dev/null 2>&1; then + echo "wget" + elif which curl >/dev/null 2>&1; then + echo "curl" + else + return 1 + fi +} +gethttpclient() { + [ -z "$test_httpclient" ] && + test_httpclient=$ourhttpclient + case "$test_httpclient" in + curl|wget) echo ${test_httpclient}_func;; #these are supported + *) echo userdefined;; + esac +} + +# test configuration good? +is_testconf_sane() { + if [ "x$test_regex" = x -o "x$test_url" = x ]; then + ocf_log err "test regular expression or test url empty" + return 1 + fi + if [ "x$test_user$test_password" != x -a \( "x$test_user" = x -o "x$test_password" = x \) ]; then + ocf_log err "bad user authentication for extended test" + return 1 + fi + return 0 +} +# +# read the test definition from the config +# +readtestconf() { + test_name="$1" # we look for this one or the first one if empty + lcnt=0 + readdef="" + test_url="" test_regex="" + test_user="" test_password="" + test_httpclient="" test_httpclient_opts="" + + while read key value; do + lcnt=$((lcnt+1)) + if [ "$readdef" ]; then + case "$key" in + "url") test_url="$value" ;; + "user") test_user="$value" ;; + "password") test_password="$value" ;; + "client") test_httpclient="$value" ;; + "client_opts") test_httpclient_opts="$value" ;; + "match") test_regex="$value" ;; + "end") break ;; + "#"*|"") ;; + *) ocf_log err "$lcnt: $key: unknown keyword"; return 1 ;; + esac + else + [ "$key" = "test" ] && + [ -z "$test_name" -o "$test_name" = "$value" ] && + readdef=1 + fi + done +} |