blob: ce13ccd39a0d6460ed7bafdba402253719324fc8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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
}
|