diff options
Diffstat (limited to 'heartbeat/apache-conf.sh')
-rw-r--r-- | heartbeat/apache-conf.sh | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/heartbeat/apache-conf.sh b/heartbeat/apache-conf.sh new file mode 100644 index 0000000..6aaaf76 --- /dev/null +++ b/heartbeat/apache-conf.sh @@ -0,0 +1,196 @@ +# +# Common apache code +# (sourced by apache) +# +# Author: Alan Robertson +# Sun Jiang Dong +# +# Support: users@clusterlabs.org +# +# License: GNU General Public License (GPL) +# +# Copyright: (C) 2002-2005 International Business Machines +# + +source_envfiles() { + for f; do + [ -f "$f" -a -r "$f" ] && + . "$f" + done +} + +apachecat() { + awk ' + function procline() { + split($0,a); + if( a[1]~/^[Ii]nclude$/ ) { + includedir=a[2]; + gsub("\"","",includedir); + procinclude(includedir); + } else { + if( a[1]=="ServerRoot" ) { + rootdir=a[2]; + gsub("\"","",rootdir); + } + print; + } + } + function printfile(infile, a) { + while( (getline<infile) > 0 ) { + procline(); + } + close(infile); + } + function allfiles(dir, cmd,f) { + cmd="find -L "dir" -type f"; + while( ( cmd | getline f ) > 0 ) { + printfile(f); + } + close(cmd); + } + function listfiles(pattern, cmd,f) { + cmd="ls "pattern" 2>/dev/null"; + while( ( cmd | getline f ) > 0 ) { + printfile(f); + } + close(cmd); + } + function procinclude(spec) { + if( rootdir!="" && spec!~/^\// ) { + spec=rootdir"/"spec; + } + if( isdir(spec) ) { + allfiles(spec); # read all files in a directory (and subdirs) + } else { + listfiles(spec); # there could be jokers + } + } + function isdir(s) { + return !system("test -d \""s"\""); + } + { procline(); } + ' $1 | + sed 's/#.*//;s/[[:blank:]]*$//;s/^[[:blank:]]*//' | + grep -v '^$' +} + +# +# set parameters (as shell vars) from our apache config file +# +get_apache_params() { + configfile=$1 + shift 1 + vars=$(echo "$@" | sed 's/ /,/g') + + eval ` + apachecat $configfile | awk -v vars="$vars" ' + BEGIN{ + split(vars,v,","); + for( i in v ) + vl[i]=tolower(v[i]); + } + { + for( i in v ) + if( tolower($1)==vl[i] ) { + print v[i]"="$2 + delete vl[i] + break + } + } + '` +} + +# +# Return the location(s) that are handled by the given handler +# +FindLocationForHandler() { + PerlScript='while (<>) { + /<Location "?([^ >"]+)/i && ($loc=$1); + '"/SetHandler +$2"'/i && print "$loc\n"; + }' + apachecat $1 | perl -e "$PerlScript" +} + +# +# Check if the port is valid +# +CheckPort() { + ocf_is_decimal "$1" && [ $1 -gt 0 ] +} + +buildlocalurl() { + [ "x$Listen" != "x" ] && + echo "http://${Listen}" || + echo "${LOCALHOST}:${PORT}" +} +# the test url may need a local prefix (as specified in the +# apache Listen directive) +fixtesturl() { + echo $test_url | grep -qs "^http" && return + test_url="`buildlocalurl`$test_url" +} +# +# Get all the parameters we need from the Apache config file +# +GetParams() { + ConfigFile=$1 + if [ ! -f $ConfigFile ]; then + return $OCF_ERR_INSTALLED + fi + get_apache_params $ConfigFile ServerRoot PidFile Port Listen + case $PidFile in + /*) ;; + [[:alnum:]]*) PidFile=$ServerRoot/$PidFile;; + *) + # If the PidFile is not set in the config, set + # a default location. + PidFile=$HA_VARRUNDIR/${httpd_basename}-${OCF_RESOURCE_INSTANCE}.pid + # Force the daemon to use this location by using + # the -c option, which adds the PidFile directive + # as if it was in the configuration file to begin with. + PIDFILE_DIRECTIVE="true" + ;; + esac + + for p in "$PORT" "$Port" 80; do + if CheckPort "$p"; then + PORT="$p" + break + fi + done + + echo $Listen | grep ':' >/dev/null || # Listen could be just port spec + Listen="localhost:$Listen" + + # + # It's difficult to figure out whether the server supports + # the status operation. + # (we start our server with -DSTATUS - just in case :-)) + # + # Typically (but not necessarily) the status URL is /server-status + # + # For us to think status will work, we have to have the following things: + # + # - The server-status handler has to be mapped to some URL somewhere + # + # We assume that: + # + # - the "main" web server at $PORT will also support it if we can find it + # somewhere in the file + # - it will be supported at the same URL as the one we find in the file + # + # If this doesn't work for you, then set the statusurl attribute. + # + if + [ "X$STATUSURL" = "X" ] + then + StatusURL=`FindLocationForHandler $1 server-status | tail -1` + STATUSURL="`buildlocalurl`$StatusURL" + fi + + if ! test "$PidFile"; then + return $OCF_ERR_INSTALLED + else + return $OCF_SUCCESS + fi +} |