#!/bin/bash
# To use this script, copy it to directory /etc/keepalived/scripts
# and add one or more of the following to the keepalived configuration
# file in the global_defs section:
# notify_fifo /tmp/notify_fifo
# vrrp_notify_fifo /tmp/vrrp_notify_fifo
# lvs_notify_fifo /tmp/lvs_notify_fifo
# This script will then need to be executed, passing it the name of the
# fifo.
#
# As an alternative to executing this script manually, add one or more of
# the following in the global_defs section of the config:
# notify_fifo_script /etc/keepalived/scripts/sample_notify_fifo.sh
# vrrp_notify_fifo_script /etc/keepalived/scripts/sample_notify_fifo.sh
# lvs_notify_fifo_script /etc/keepalived/scripts/sample_notify_fifo.sh
# If run this way, Keepalived will terminate the script with SIGTERM when
# it exits.
CREATED_FIFO=0
FIFO=$1
[[ -z $FIFO ]] && echo "A FIFO name must be specified" && exit 1
LOG_FILE=/tmp/${FIFO##*/}.log
stopping()
{
PROLOGUE=$(echo "$(date +"%a %b %e %X %Y")": \[$PPID:$$\])
echo "$PROLOGUE" STOPPING >>$LOG_FILE
}
start_shutdown()
{
# When keepalived terminates, it sends a TERM signal to this script before
# sending the fifo notifies. We catch the SIGTERM here, and after a short
# delay send a SIGALRM to the main script process
( sleep 0.5
kill -ALRM $$
) &
}
trap "{ stopping; [[ $CREATED_FIFO -eq 1 ]] && rm -f $FIFO; exit 0; }" HUP INT QUIT USR1 USR2 PIPE ALRM
trap start_shutdown TERM
if [[ ! -p $FIFO ]]; then
mkfifo $FIFO
if [[ $? -eq 0 ]]; then
CREATED_FIFO=1
else
echo "Unable to create fifo $FIFO"
exit 1
fi
fi
# If keepalived terminates, the FIFO will be closed, so
# read the FIFO in a loop. It keepalived hasn't opened the
# FIFO, the script will be blocked until it has been opened.
while [[ 1 ]]
do
[[ ! -p $FIFO ]] && echo FIFO $FIFO missing && exit 1
while read line; do
PROLOGUE=$(echo "$(date +"%a %b %e %X %Y")": \[$PPID:$$\])
set $line
TYPE=$1
if [[ $TYPE = INSTANCE || $TYPE = GROUP ]]; then
VRRP_INST=${2//\"/}
STATE=$3
PRIORITY=$4
# Now take whatever action is required
echo "$PROLOGUE" $TYPE $VRRP_INST $STATE $PRIORITY >>$LOG_FILE
elif [[ $TYPE = VS ]]; then
VS=$2
STATE=$3
# Now take whatever action is required
echo "$PROLOGUE" $TYPE $VS $STATE >>$LOG_FILE
elif [[ $TYPE = RS ]]; then
RS=$2
VS=$3
STATE=$4
# Now take whatever action is required
echo "$PROLOGUE" $TYPE $RS $VS $STATE >>$LOG_FILE
else
echo "$PROLOGUE" $TYPE - unknown "($*)" >>$LOG_FILE
fi
done < $FIFO
echo "$PROLOGUE" STOPPED >>$LOG_FILE
done