#!/bin/bash
# vim:shiftwidth=4:tabstop=4:expandtab:textwidth=78:softtabstop=4:ai:

   ##############################################################
  #    Written Mar 5, 2008 and released under the GNU/GPLv2    ##
 #    (c) Jeff Schroeder (jeffschroeder@computer.org)         # #
##############################################################  #
#                                                            #  #
# change_status - Used by keepalived (http://keepalived.org) #  #
#                 to run a list of scripts under /etc/vrrp.d #  #
#                 on transition between master, backup and   #  #
#                 fault states. The main idea is flexibility #  #
#                                                            # #
###############################################################

export PATH=/bin:/usr/bin:/sbin:/usr/sbin:$PATH

VRRP_DIR=/etc/vrrp.d
STATEDIR=/var/run
STATE=$(echo $1 | tr 'A-Z' 'a-z' 2>/dev/null)

# Pretty print error messages with a big red ERROR: line
error () {
    start='\033[1;31m\033'
    end='\033[0m'
    echo -e "${start} ERROR:${end} $*"
    exit 1
}

# Run some sanity checks before doing anything
check_your_sanity () {

    keepalived=/etc/init.d/keepalived

    if [ ! -d $VRRP_DIR ]; then
        error "$VRRP_DIR does not exist. Nothing to do"
    fi


    if [ "$STATE" == "status" ]; then
        # Check the state files touched by /etc/vrrp.d/ scripts
        if [ -f ${STATEDIR}/MASTER ]; then
            status=MASTER
        elif [ -f ${STATEDIR}/BACKUP ]; then
            status=BACKUP
        elif [ -f ${STATEDIR}/FAULT ]; then
            status=FAULT
        else
            status=unknown
        fi

        if [ -x $keepalived ]; then
            echo "Current status is ${status}"
            $keepalived status 2>/dev/null
        fi

        exit 0
    fi

    # Are we root?
    if [ `id -u` -ne 0 ]; then
        error "needs root privileges"
        exit 1
    fi

    # No sense in running scripts when a bogus state is passed
    if (! echo $STATE | egrep -qi '^(master|backup|fault)$'); then
        echo "Usage: $0 { master | backup | fault }" >&2
    exit 1
    fi

    # NOTE: This glob won't work in dash
    if [ -z "$(ls ${VRRP_DIR}/*[^~,])" ]; then
        # Nothing to do so exit gracefully
        exit 0
    fi
}

run_vrrp_scripts () {
    echo "Changing vrrp state to $STATE"

    # Redhat's crappy run-parts doesn't support argv. Debian's does...
    for script in `ls ${VRRP_DIR}/*[^~,] 2>/dev/null`; do
        # Don't run any of these extensions
        echo $script | egrep -qs '\.(rpmsave|rpmorig|rpmnew|swp)$' && continue
	if [ -x $script ]; then
            $script $STATE
	else
	    echo "WARNING: Skipping non-executable: $script" >&2
	    continue
        fi
    done
}

##### Main program starts here

check_your_sanity
run_vrrp_scripts
exit 0
