diff --git a/files/heartbeat/haproxy b/files/heartbeat/haproxy new file mode 100644 index 00000000..c5463672 --- /dev/null +++ b/files/heartbeat/haproxy @@ -0,0 +1,250 @@ +#!/bin/sh +# +# Resource script for haproxy daemon +# +# Description: Manages haproxy daemon as an OCF resource in +# an High Availability setup. +# +# HAProxy OCF script's Author: Russki +# Rsync OCF script's Author: Dhairesh Oza +# License: GNU General Public License (GPL) +# +# +# usage: $0 {start|stop|status|monitor|validate-all|meta-data} +# +# The "start" arg starts haproxy. +# +# The "stop" arg stops it. +# +# OCF parameters: +# OCF_RESKEY_binpath +# OCF_RESKEY_conffile +# OCF_RESKEY_extraconf +# +# Note:This RA requires that the haproxy config files has a "pidfile" +# entry so that it is able to act on the correct process +########################################################################## +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat} +. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs + +USAGE="Usage: $0 {start|stop|status|monitor|validate-all|meta-data}"; + +########################################################################## + +usage() +{ + echo $USAGE >&2 +} + +meta_data() +{ +cat < + + +1.0 + +This script manages haproxy daemon + +Manages an haproxy daemon + + + + + +The haproxy binary path. +For example, "/usr/sbin/haproxy" + +Full path to the haproxy binary + + + + + +The haproxy daemon configuration file name with full path. +For example, "/etc/haproxy/haproxy.cfg" + +Configuration file name with full path + + + + + +Extra command line arguments to pass to haproxy. +For example, "-f /etc/haproxy/shared.cfg" + +Extra command line arguments for haproxy + + + + + + + + + + + + + +END +exit $OCF_SUCCESS +} + +get_pid_and_conf_file() +{ + if [ -n "$OCF_RESKEY_conffile" ]; then + CONF_FILE=$OCF_RESKEY_conffile + else + CONF_FILE="/etc/haproxy/haproxy.cfg" + fi + + PIDFILE="`grep -v \"#\" ${CONF_FILE} | grep \"pidfile\" | sed 's/^[ \t]*pidfile[ \t]*//'`" + if [ "${PIDFILE}" = '' ]; then + PIDFILE="/var/run/${OCF_RESOURCE_INSTANCE}.pid" + fi +} + +haproxy_status() +{ + if [ -n "$PIDFILE" -a -f "$PIDFILE" ]; then + # haproxy is probably running + PID=`cat $PIDFILE` + if [ -n "$PID" ]; then + if ps -p $PID | grep haproxy >/dev/null ; then + ocf_log info "haproxy daemon running" + return $OCF_SUCCESS + else + ocf_log info "haproxy daemon is not running but pid file exists" + return $OCF_NOT_RUNNING + fi + else + ocf_log err "PID file empty!" + return $OCF_ERR_GENERIC + fi + fi + + # haproxy is not running + ocf_log info "haproxy daemon is not running" + return $OCF_NOT_RUNNING +} + +haproxy_start() +{ + # if haproxy is running return success + haproxy_status + retVal=$? + if [ $retVal -eq $OCF_SUCCESS ]; then + exit $OCF_SUCCESS + elif [ $retVal -ne $OCF_NOT_RUNNING ]; then + ocf_log err "Error. Unknown status." + exit $OCF_ERR_GENERIC + fi + + if [ -n "$OCF_RESKEY_binpath" ]; then + COMMAND="$OCF_RESKEY_binpath" + else + COMMAND="/usr/sbin/haproxy" + fi + + $COMMAND $OCF_RESKEY_extraconf -f $CONF_FILE -p $PIDFILE; + if [ $? -ne 0 ]; then + ocf_log err "Error. haproxy daemon returned error $?." + exit $OCF_ERR_GENERIC + fi + + ocf_log info "Started haproxy daemon." + exit $OCF_SUCCESS +} + + +haproxy_stop() +{ + if haproxy_status ; then + PID=`cat $PIDFILE` + if [ -n "$PID" ] ; then + kill $PID + if [ $? -ne 0 ]; then + kill -SIGKILL $PID + if [ $? -ne 0 ]; then + ocf_log err "Error. Could not stop haproxy daemon." + return $OCF_ERR_GENERIC + fi + fi + rm $PIDFILE 2>/dev/null + fi + fi + ocf_log info "Stopped haproxy daemon." + exit $OCF_SUCCESS +} + +haproxy_monitor() +{ + haproxy_status +} + +haproxy_validate_all() +{ + if [ -n "$OCF_RESKEY_binpath" -a ! -x "$OCF_RESKEY_binpath" ]; then + ocf_log err "Binary path $OCF_RESKEY_binpath does not exist." + exit $OCF_ERR_ARGS + fi + if [ -n "$OCF_RESKEY_conffile" -a ! -f "$OCF_RESKEY_conffile" ]; then + ocf_log err "Config file $OCF_RESKEY_conffile does not exist." + exit $OCF_ERR_ARGS + fi + + if grep -v "^#" "$CONF_FILE" | grep "pidfile" > /dev/null ; then + : + else + ocf_log err "Error. \"pidfile\" entry required in the haproxy config file by haproxy OCF RA." + return $OCF_ERR_GENERIC + fi + + return $OCF_SUCCESS +} + + +# +# Main +# + +if [ $# -ne 1 ]; then + usage + exit $OCF_ERR_ARGS +fi + +case $1 in + start) get_pid_and_conf_file + haproxy_start + ;; + + stop) get_pid_and_conf_file + haproxy_stop + ;; + + status) get_pid_and_conf_file + haproxy_status + ;; + + monitor)get_pid_and_conf_file + haproxy_monitor + ;; + + validate-all) get_pid_and_conf_file + haproxy_validate_all + ;; + + meta-data) meta_data + ;; + + usage) usage + exit $OCF_SUCCESS + ;; + + *) usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac