summaryrefslogtreecommitdiffstats
path: root/heartbeat/http-mon.sh
diff options
context:
space:
mode:
Diffstat (limited to 'heartbeat/http-mon.sh')
-rw-r--r--heartbeat/http-mon.sh140
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
+}