#!/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