diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:52:36 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 07:52:36 +0000 |
commit | 7de03e4e519705301265c0415b3c0af85263a7ac (patch) | |
tree | 29d819c5227e3619d18a67d2a5dde963b3229dbe /heartbeat/apache | |
parent | Initial commit. (diff) | |
download | resource-agents-7de03e4e519705301265c0415b3c0af85263a7ac.tar.xz resource-agents-7de03e4e519705301265c0415b3c0af85263a7ac.zip |
Adding upstream version 1:4.13.0.upstream/1%4.13.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rwxr-xr-x | heartbeat/apache | 744 | ||||
-rw-r--r-- | heartbeat/apache-conf.sh | 196 |
2 files changed, 940 insertions, 0 deletions
diff --git a/heartbeat/apache b/heartbeat/apache new file mode 100755 index 0000000..448225e --- /dev/null +++ b/heartbeat/apache @@ -0,0 +1,744 @@ +#!/bin/sh +# +# High-Availability Apache/IBMhttp control script +# +# apache (aka IBMhttpd) +# +# Description: starts/stops apache web servers. +# +# Author: Alan Robertson +# Sun Jiang Dong +# +# Support: users@clusterlabs.org +# +# License: GNU General Public License (GPL) +# +# Copyright: (C) 2002-2005 International Business Machines +# +# +# An example usage in /etc/ha.d/haresources: +# node1 10.0.0.170 apache::/opt/IBMHTTPServer/conf/httpd.conf +# node1 10.0.0.170 IBMhttpd +# +# Our parsing of the Apache config files is very rudimentary. +# It'll work with lots of different configurations - but not every +# possible configuration. +# +# Patches are being accepted ;-) +# +# OCF parameters: +# OCF_RESKEY_configfile +# OCF_RESKEY_httpd +# OCF_RESKEY_port +# OCF_RESKEY_statusurl +# OCF_RESKEY_options +# OCF_RESKEY_testregex +# OCF_RESKEY_client +# OCF_RESKEY_testurl +# OCF_RESKEY_testregex10 +# OCF_RESKEY_testconffile +# OCF_RESKEY_testname +# OCF_RESKEY_envfiles + + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs +. ${OCF_FUNCTIONS_DIR}/apache-conf.sh +. ${OCF_FUNCTIONS_DIR}/http-mon.sh +HA_VARRUNDIR=${HA_VARRUN} + +# Parameter defaults + +OCF_RESKEY_httpd_default="/usr/sbin/httpd" +OCF_RESKEY_envfiles_default="/etc/apache2/envvars" +OCF_RESKEY_use_ipv6_default="false" + +####################################################################### +# +# Configuration options - usually you don't need to change these +# +####################################################################### +# +IBMHTTPD=/opt/IBMHTTPServer/bin/httpd +HTTPDLIST="/sbin/httpd2 /usr/sbin/httpd2 /usr/sbin/apache2 /sbin/httpd /usr/sbin/httpd /usr/sbin/apache $IBMHTTPD" +MPM=/usr/share/apache2/find_mpm +if [ -x $MPM ]; then + HTTPDLIST="$HTTPDLIST `$MPM 2>/dev/null`" +fi + +LOCALHOST="http://localhost" +HTTPDOPTS="-DSTATUS" +DEFAULT_IBMCONFIG=/opt/IBMHTTPServer/conf/httpd.conf +DEFAULT_SUSECONFIG="/etc/apache2/httpd.conf" +DEFAULT_RHELCONFIG="/etc/httpd/conf/httpd.conf" +DEFAULT_DEBIANCONFIG="/etc/apache2/apache2.conf" +# +# You can also set +# HTTPD +# PORT +# STATUSURL +# CONFIGFILE +# in this section if what we're doing doesn't work for you... +# +# End of Configuration options +####################################################################### + +CMD=`basename $0` + +# The config-file-pathname is the pathname to the configuration +# file for this web server. Various appropriate defaults are +# assumed if no config file is specified. If this command is +# invoked as *IBM*, then the default config file name is +# $DEFAULT_IBMCONFIG, otherwise the default config file +# will be either $DEFAULT_RHELCONFIG or $DEFAULT_SUSECONFIG depending +# on which is detected. +usage() { +cat <<-END +usage: $0 action + +action: + start start the web server + + stop stop the web server + + status return the status of web server, run or down + + monitor return TRUE if the web server appears to be working. + For this to be supported you must configure mod_status + and give it a server-status URL. You have to have + installed either curl or wget for this to work. + + meta-data show meta data message + + validate-all validate the instance parameters +END +} + +get_pid() { + if [ -f $PidFile ]; then + cat $PidFile + else + false + fi +} +# +# return TRUE if a process with given PID is running +# +ProcessRunning() { + local pid=$1 + + # Use /proc if it looks like it's here... + if [ -d /proc -a -d /proc/1 ]; then + [ -d /proc/$pid ] + else + # This assumes we're running as root... + kill -s 0 "$pid" >/dev/null 2>&1 + fi +} +silent_status() { + local pid + local rc=$OCF_ERR_GENERIC + local retries=0 + + # Set a retry when apache's Graceful restart is applied and the pid file can not be acquired. + if [ "$__OCF_ACTION" = "monitor" ] && ! ocf_is_probe; then + retries=5 + fi + + while true; do + pid=`get_pid` + if [ -n "$pid" ]; then + ProcessRunning $pid + rc=$? + break + fi + + : No pid file + if [ $retries -le 0 ]; then + break + fi + + sleep 1 + retries=`expr $retries - 1` + done + + return $rc +} + +# May be useful to add other distros in future +validate_default_config() { + if is_suse_based; then + validate_default_suse_config + elif is_debian_based; then + validate_default_debian_config + else + return 0 + fi +} + +# When using the default /etc/apache2/httpd.conf on SUSE, the file +# /etc/apache2/sysconfig.d/include.conf is required to be present, +# but this is only generated if you run the apache init script +# (with contents derived from /etc/sysconfig/apache2). So, here, +# if we're using the default system config file and it requires +# that include, we run "/etc/init.d/apache2 configtest" to ensure +# the relevant config is generated and valid. We're also taking +# this opportunity to enable mod_status if it's not present. +validate_default_suse_config() { + if [ "$CONFIGFILE" = "$DEFAULT_SUSECONFIG" ] && \ + grep -Eq '^Include[[:space:]]+/etc/apache2/sysconfig.d/include.conf' "$CONFIGFILE" + then + [ -x "/usr/sbin/a2enmod" ] && ocf_run -q /usr/sbin/a2enmod status + # init script style, for crusty old SUSE + if [ -x "/etc/init.d/apache2" ]; then + ocf_run -q /etc/init.d/apache2 configtest || return 1 + # systemd style, for shiny new SUSE + elif [ -x "/usr/sbin/start_apache2" ]; then + ocf_run -q /usr/sbin/start_apache2 -t || return 1 + fi + fi + + # mod_status: some existing users might don't want to use mod_status, check if present in configuration + if [ "$CONFIGFILE" = "$DEFAULT_SUSECONFIG" ] && \ + grep -Eq '^Include[[:space:]]+/etc/apache2/mod_status.conf' "$CONFIGFILE" + then + # load module only if module exists + apache_mod_status="/usr/lib64/apache2-prefork/mod_status.so" + if [ -e $apache_mod_status ]; then + LOAD_STATUS_MODULE="LoadModule status_module $apache_mod_status" + fi + fi + return 0 +} + +# Debian's Default configuration uses a lock directory /var/lock/apache2 +# which is only generated using the lsb init script issues configtest. To +# ensure these default directories are present it's useful to run a configtest +# prior to the resource startup which will create the needed directories +# +# To support multiple apache instances the debian scripts and configs +# obey apache2/envvars. (copy /etc/apache2 -> /etc/apache2-instance) +# adjust (SUFFIX) envvars and set OCF_RESKEY_envfiles +validate_default_debian_config() { + if find /etc/apache2* -name apache2.conf | grep -q "$CONFIGFILE" + then + export APACHE_CONFDIR=$(dirname $CONFIGFILE) + [ -x "/usr/sbin/a2enmod" ] && ocf_run -q /usr/sbin/a2enmod status + ocf_run -q /usr/sbin/apache2ctl configtest || return 1 + fi + return 0 +} + +apache_start() { + if + silent_status + then + ocf_log info "$CMD already running (pid `get_pid`)" + return $OCF_SUCCESS + fi + + validate_default_config || return $OCF_ERR_CONFIGURED + + if [ -z $PIDFILE_DIRECTIVE ]; then + if [ -z "$LOAD_STATUS_MODULE" ]; then + ocf_run $HTTPD $HTTPDOPTS $OPTIONS -f $CONFIGFILE + else + ocf_run $HTTPD -C "$LOAD_STATUS_MODULE" $HTTPDOPTS $OPTIONS -f $CONFIGFILE + fi + else + if [ -z "$LOAD_STATUS_MODULE" ]; then + ocf_run $HTTPD $HTTPDOPTS $OPTIONS -f $CONFIGFILE -c "PidFile $PidFile" + else + ocf_run $HTTPD $HTTPDOPTS -C "$LOAD_STATUS_MODULE" $OPTIONS -f $CONFIGFILE -c "PidFile $PidFile" + fi + fi + + tries=0 + while : # wait until the user set timeout + do + apache_monitor + ec=$? + if [ $ec -eq $OCF_NOT_RUNNING ] + then + tries=`expr $tries + 1` + ocf_log info "waiting for apache $CONFIGFILE to come up" + sleep 1 + else + break + fi + done + + if [ $ec -ne 0 ] && silent_status; then + apache_stop + fi + return $ec +} + +signal_children() +{ + for sig in SIGTERM SIGHUP SIGKILL ; do + if pgrep -f $HTTPD.*$CONFIGFILE >/dev/null ; then + pkill -$sig -f $HTTPD.*$CONFIGFILE >/dev/null + ocf_log info "signal $sig sent to apache children" + sleep 1 + else + break + fi + done +} + +graceful_stop() +{ + local tries=10 + local pid=$1 + + # Try graceful stop for half timeout period if timeout period is present + if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then + tries=$((($OCF_RESKEY_CRM_meta_timeout/1000) / 2)) + fi + + ocf_log info "Attempting graceful stop of apache PID $pid" + kill -WINCH $pid >/dev/null + while + ProcessRunning $pid && + [ $tries -gt 0 ] + do + sleep 1 + tries=`expr $tries - 1` + done + + if [ $tries -eq 0 ]; then + # graceful stop didn't work, process still up. + return 1 + fi + + return 0 +} + +kill_stop() +{ + local tries=0 + local pid=$1 + + ocf_log info "Killing apache PID $pid" + if ProcessRunning $pid; then + kill $pid >/dev/null + while + [ $tries -lt 10 ] + do + if ProcessRunning $pid; then + tries=`expr $tries + 1` + sleep 1 + else + break + fi + done + fi +} + +apache_stop() { + local ret=$OCF_SUCCESS + local pid + + if ! silent_status; then + ocf_log info "$CMD is not running." + signal_children + return $ret + fi + + pid=`get_pid` + graceful_stop $pid + if [ $? -ne 0 ]; then + kill_stop $pid + fi + + signal_children + + if ProcessRunning $pid; then + ocf_exit_reason "$CMD still running ($pid). Killing pid failed." + ret=$OCF_ERR_GENERIC + fi + + if [ $ret -eq 0 ]; then + ocf_log info "$CMD stopped." + fi + + return $ret +} + +apache_monitor_10() { + if [ -f "$TESTCONFFILE" ] && [ -r "$TESTCONFFILE" ]; then + readtestconf < $TESTCONFFILE + else + test_url="$TESTURL" + test_regex="$TESTREGEX10" + fi + + whattorun=`gethttpclient` + fixtesturl + is_testconf_sane || + return $OCF_ERR_CONFIGURED + + if $whattorun "$test_url" | grep -Ei "$test_regex" > /dev/null + then + return $OCF_SUCCESS + else + if ! ocf_is_probe; then + ocf_exit_reason "Failed to access httpd status page." + fi + return $OCF_ERR_GENERIC + fi +} + +# If the user has not provided any basic monitoring +# information, allow the agent to verify the server is +# healthy and capable of processing requests by requesting +# the http header of website's index +attempt_index_monitor_request() { + local indexpage="" + + if [ -n "$OCF_RESKEY_testregex" ]; then + return 1; + fi + if [ -n "$OCF_RESKEY_testregex10" ]; then + return 1; + fi + if [ -n "$OCF_RESKEY_testurl" ]; then + return 1; + fi + if [ -n "$OCF_RESKEY_statusurl" ]; then + return 1; + fi + if [ -n "$OCF_RESKEY_testconffile" ]; then + return 1; + fi + + indexpage=$(buildlocalurl) + + request_url_header $indexpage + if [ $? -ne 0 ]; then + return $OCF_ERR_GENERIC + fi + ocf_log debug "Successfully retrieved http header at $indexpage" + return 0 +} + +apache_monitor_basic() { + if ${ourhttpclient}_func "$STATUSURL" | grep -Ei "$TESTREGEX" > /dev/null + then + return $OCF_SUCCESS + fi + + attempt_index_monitor_request + if [ $? -eq 0 ]; then + return $OCF_SUCCESS + fi + + if ! ocf_is_probe; then + ocf_exit_reason "Failed to access httpd status page." + fi + return $OCF_ERR_GENERIC +} +apache_monitor() { + silent_status + if [ $? -ne 0 ]; then + ocf_log info "$CMD not running" + return $OCF_NOT_RUNNING + fi + + ourhttpclient=`findhttpclient` # we'll need one + if [ -z "$ourhttpclient" ]; then + ocf_exit_reason "could not find a http client; make sure that either wget or curl is available" + return $OCF_ERR_INSTALLED + fi + + case `ocf_check_level 10` in + 0) apache_monitor_basic;; + 10) apache_monitor_10;; + esac +} + +detect_default_config() +{ + if [ -f $DEFAULT_SUSECONFIG ]; then + echo $DEFAULT_SUSECONFIG + elif [ -f $DEFAULT_DEBIANCONFIG ]; then + echo $DEFAULT_DEBIANCONFIG + else + echo $DEFAULT_RHELCONFIG + fi +} + + +apache_meta_data(){ + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="apache" version="1.0"> +<version>1.0</version> + +<longdesc lang="en"> +This is the resource agent for the Apache Web server. +This resource agent operates both version 1.x and version 2.x Apache +servers. + +The start operation ends with a loop in which monitor is +repeatedly called to make sure that the server started and that +it is operational. Hence, if the monitor operation does not +succeed within the start operation timeout, the apache resource +will end with an error status. + +The monitor operation by default loads the server status page +which depends on the mod_status module and the corresponding +configuration file (usually /etc/apache2/mod_status.conf). +Make sure that the server status page works and that the access +is allowed *only* from localhost (address 127.0.0.1). +See the statusurl and testregex attributes for more details. + +See also http://httpd.apache.org/ +</longdesc> +<shortdesc lang="en">Manages an Apache Web server instance</shortdesc> + +<parameters> +<parameter name="configfile" required="0" unique="1"> +<longdesc lang="en"> +The full pathname of the Apache configuration file. +This file is parsed to provide defaults for various other +resource agent parameters. +</longdesc> +<shortdesc lang="en">configuration file path</shortdesc> +<content type="string" default="$(detect_default_config)" /> +</parameter> + +<parameter name="httpd"> +<longdesc lang="en"> +The full pathname of the httpd binary (optional). +</longdesc> +<shortdesc lang="en">httpd binary path</shortdesc> +<content type="string" default="${OCF_RESKEY_httpd_default}" /> +</parameter> + +<parameter name="port" > +<longdesc lang="en"> +A port number that we can probe for status information +using the statusurl. +This will default to the port number found in the +configuration file, or 80, if none can be found +in the configuration file. + +</longdesc> +<shortdesc lang="en">httpd port</shortdesc> +<content type="integer" /> +</parameter> + +<parameter name="statusurl"> +<longdesc lang="en"> +The URL to monitor (the apache server status page by default). +If left unspecified, it will be inferred from +the apache configuration file. + +If you set this, make sure that it succeeds *only* from the +localhost (127.0.0.1). Otherwise, it may happen that the cluster +complains about the resource being active on multiple nodes. +</longdesc> +<shortdesc lang="en">url name</shortdesc> +<content type="string" /> +</parameter> + +<parameter name="testregex"> +<longdesc lang="en"> +Regular expression to match in the output of statusurl. +Case insensitive. +</longdesc> +<shortdesc lang="en">monitor regular expression</shortdesc> +<content type="string" default="exists, but impossible to show in a human readable format (try grep testregex)"/> +</parameter> + +<parameter name="client"> +<longdesc lang="en"> +Client to use to query to Apache. If not specified, the RA will +try to find one on the system. Currently, wget and curl are +supported. For example, you can set this parameter to "curl" if +you prefer that to wget. +</longdesc> +<shortdesc lang="en">http client</shortdesc> +<content type="string" default=""/> +</parameter> + +<parameter name="testurl"> +<longdesc lang="en"> +URL to test. If it does not start with "http", then it's +considered to be relative to the Listen address. +</longdesc> +<shortdesc lang="en">test url</shortdesc> +<content type="string" /> +</parameter> + +<parameter name="testregex10"> +<longdesc lang="en"> +Regular expression to match in the output of testurl. +Case insensitive. +</longdesc> +<shortdesc lang="en">extended monitor regular expression</shortdesc> +<content type="string" /> +</parameter> + +<parameter name="testconffile"> +<longdesc lang="en"> +A file which contains test configuration. Could be useful if +you have to check more than one web application or in case sensitive +info should be passed as arguments (passwords). Furthermore, +using a config file is the only way to specify certain +parameters. + +Please see README.webapps for examples and file description. +</longdesc> +<shortdesc lang="en">test configuration file</shortdesc> +<content type="string" /> +</parameter> + +<parameter name="testname"> +<longdesc lang="en"> +Name of the test within the test configuration file. +</longdesc> +<shortdesc lang="en">test name</shortdesc> +<content type="string" /> +</parameter> + +<parameter name="options"> +<longdesc lang="en"> +Extra options to apply when starting apache. See man httpd(8). +</longdesc> +<shortdesc lang="en">command line options</shortdesc> +<content type="string" /> +</parameter> + +<parameter name="envfiles"> +<longdesc lang="en"> +Files (one or more) which contain extra environment variables. +If you want to prevent script from reading the default file, set +this parameter to empty string. +</longdesc> +<shortdesc lang="en">environment settings files</shortdesc> +<content type="string" default="${OCF_RESKEY_envfiles_default}"/> +</parameter> + +<parameter name="use_ipv6"> +<longdesc lang="en"> +We will try to detect if the URL (for monitor) is IPv6, but if +that doesn't work set this to true to enforce IPv6. +</longdesc> +<shortdesc lang="en">use ipv6 with http clients</shortdesc> +<content type="boolean" default="${OCF_RESKEY_use_ipv6_default}"/> +</parameter> + +</parameters> + +<actions> +<action name="start" timeout="40s" /> +<action name="stop" timeout="60s" /> +<action name="status" timeout="30s" /> +<action name="monitor" depth="0" timeout="20s" interval="10s" /> +<action name="meta-data" timeout="5s" /> +<action name="validate-all" timeout="5s" /> +</actions> +</resource-agent> +END + return $OCF_SUCCESS +} + +apache_validate_all() { + if [ -z "$HTTPD" ]; then + ocf_exit_reason "apache httpd program not found" + return $OCF_ERR_INSTALLED + fi + if [ ! -x "$HTTPD" ]; then + ocf_exit_reason "HTTPD $HTTPD not found or is not an executable!" + return $OCF_ERR_INSTALLED + fi + if [ ! -f $CONFIGFILE ]; then + ocf_exit_reason "Configuration file $CONFIGFILE not found!" + return $OCF_ERR_INSTALLED + fi + + # validate testconffile/testurl before apache_monitor_10() + if [ -n "$TESTCONFFILE" ]; then + if [ ! -f "$TESTCONFFILE" ] || [ ! -r "$TESTCONFFILE" ]; then + ocf_exit_reason "Configuration file $TESTCONFFILE not found, or not readable." + return $OCF_ERR_INSTALLED + fi + else + if [ -n "$TESTURL" ]; then + # remove leading or trailing spaces/tabs + local temp=$(printf "$TESTURL" | sed -e 's/^[ \t]*//g' -e 's/[ \t]*$//g') + + if [ -z "$temp" ]; then + ocf_exit_reason "testurl: \"$TESTURL\" seems to be an empty string?" + return $OCF_ERR_CONFIGURED + fi + fi + + # FIXME: validate TESTREGEX10 will be needed if empty regex is not allow. + fi + + ocf_mkstatedir root 755 `dirname $PidFile` || return $OCF_ERR_INSTALLED + return $OCF_SUCCESS +} + +find_httpd_prog() { + case $0 in + *IBM*) + HTTPD=$IBMHTTPD + DefaultConfig=$DEFAULT_IBMCONFIG;; + *) + HTTPD= + for h in $HTTPDLIST + do + if [ -f $h -a -x $h ]; then + HTTPD=$h + break + fi + done + + # Let the user know that the $HTTPD used is not the one (s)he specified via $OCF_RESKEY_httpd + if [ "X$OCF_RESKEY_httpd" != X -a "X$HTTPD" != X ]; then + ocf_log info "Using $HTTPD as HTTPD" + fi + DefaultConfig=$(detect_default_config) + ;; + esac +} + +apache_getconfig() { + # these variables are global + HTTPD="$OCF_RESKEY_httpd" + PORT="$OCF_RESKEY_port" + STATUSURL="$OCF_RESKEY_statusurl" + CONFIGFILE="$OCF_RESKEY_configfile" + OPTIONS="$OCF_RESKEY_options" + CLIENT=${OCF_RESKEY_client} + TESTREGEX=${OCF_RESKEY_testregex:-'</ *html *>'} + TESTURL="$OCF_RESKEY_testurl" + TESTREGEX10=${OCF_RESKEY_testregex10} + TESTCONFFILE="$OCF_RESKEY_testconffile" + TESTNAME="$OCF_RESKEY_testname" + : ${OCF_RESKEY_envfiles=${OCF_RESKEY_envfiles_default}} + source_envfiles $OCF_RESKEY_envfiles + + if [ "X$HTTPD" = X -o ! -f "$HTTPD" -o ! -x "$HTTPD" ]; then + find_httpd_prog + fi + + CONFIGFILE=${CONFIGFILE:-$DefaultConfig} + if [ -n "$HTTPD" ]; then + httpd_basename=`basename $HTTPD` + case $httpd_basename in + *-*) httpd_basename=`echo "$httpd_basename" | sed -e 's%\-.*%%'`;; + esac + fi + GetParams $CONFIGFILE +} + +OCF_REQUIRED_PARAMS="" +OCF_REQUIRED_BINARIES="" +ocf_rarun $* 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 +} |