[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-ha-dev
Subject:    [Linux-ha-dev] Some resource scripts for mangling routes
From:       Tuomo Soini <tis () foobar ! fi>
Date:       2006-02-09 9:20:07
Message-ID: 43EB0947.3070003 () foobar ! fi
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Here are some resource scripts to handle routing.

IProute resource script will add or delete routes on startup
IPrule resource script will add or delete ip rules on startup
IProutesrc will change device route source on startup and remove it on stop.

IProutesrc is not able to handle defaultroute so IPsrcaddr is still
needed for default route handling.


-- 
Tuomo Soini <tis@foobar.fi>
Linux and network services
+358 40 5240030
Foobar Oy <http://foobar.fi/>

["IProute" (text/plain)]

#!/bin/bash
#
#	$Id: IProute,v 1.17 2004/06/10 10:10:46 tis Exp $
#
#	Copyright (C) 2004 Tuomo Soini <tis@foobar.fi>
#
#	This script manages static routes
#
#	usage: $0 {add|del} {ifname} \
#		{start|stop|restart|condrestart|status}
#
#	Config file /etc/ha.d/route.d/route-{add|del}-{ifname}
#
#	The "start" arg adds or removes static routes.
#
#	Surprisingly, the "stop" may remove or add routes.
#
unset LANG
LC_ALL=C
export LC_ALL

# source function library
. /etc/ha.d/shellfuncs

IP2UTIL=/sbin/ip
VARLIB=/var/lib/heartbeat
VLDIR=$VARLIB/rsctmp/IProute
LOCKFILE=$VLDIR/route-$1-$2
RETVAL=0

doroute() {
	rtype=$1
	rcmd=$2
	rif=$3
	rc=0
	if
	    [ -f /etc/ha.d/route.d/route-${rtype}-${rif} ]
	then
	    cat /etc/ha.d/route.d/route-${rtype}-${rif} | grep -v '^#' \
		| sed -e 's/#.*//' | while read line
	    do
		if
		    [ "X$line" = "X" ]
		then
		    : empty line
		else
		    CMD="$IP2UTIL route ${rcmd} $line dev ${rif}"
		    if
			$CMD
		    then
			ha_log "info: IProute ${rtype}: $CMD"
		    else
			ha_log "WARN: IProute ${rtype}: $CMD"
		    fi
		fi
	    done
	    $IP2UTIL route flush cache
	else
	    ha_log "ERROR: IProute ${rtype} config file \
		/etc/ha.d/route.d/route-${rtype}-${rif} is missing"
	    rc=1
	fi
	return $rc
}

usage() {
	echo "usage: $0 {add|del} {ifname} \\"
	echo -e "\t{start|stop|restart|condrestart|status}"
	exit 1
}

start() {
	doroute $1 $2 $3
	if
	    [ "$?" -eq 0 ]
	then
	    if
		[ -d $VLDIR ]
	    then
		: vldir is there
	    else
		mkdir -p $VLDIR
	    fi
	    touch "$LOCKFILE"
	    RETVAL=$?
	else
	    RETVAL=1
	fi
}

stop() {
	doroute $1 $2 $3
	if
	    [ "$?" -eq 0 ]
	then
	    if
		[ -d $VLDIR ]
	    then
		: vldir is there
	    else
		mkdir -p $VLDIR
	    fi
	    rm -f "$LOCKFILE"
	    RETVAL=$?
	else
	    RETVAL=1
	fi
}

restart() {
	stop
	start
}

if
    [ $# -ne 3 ]
then
    usage
fi

ROUTECMD="$1"
ROUTEIF="$2"
INITCMD="$3"

case "$INITCMD" in
	start)
	    case "$ROUTECMD" in
		add)
		    start $ROUTECMD add $ROUTEIF
		    ;;
		del)
		    start $ROUTECMD delete $ROUTEIF
		    ;;
		*)
		    usage
	    esac
	    ;;
	stop) 
	    case "$ROUTECMD" in
		add)
		    stop $ROUTECMD delete $ROUTEIF
		    ;;
		del)
		    stop $ROUTECMD add $ROUTEIF
		    ;;
		*)
		    usage
	    esac
	    ;;
	restart|force-reload)
	    restart
	    ;;
	reload)
	    ;;
	condrestart)
	    [ -f "$LOCKFILE" ] && restart
	    ;;
	status)
	    if [ -f $LOCKFILE ]; then
		    echo "IProute is running..."
		    RETVAL=0
	    else
		    echo "IProute is stopped"
		    RETVAL=3
	    fi
	    ;;
	*)
	    usage
esac

exit $RETVAL

# EOF

["IProutesrc" (text/plain)]

#!/bin/bash
#
#	$Id: IProutesrc,v 1.11 2006/01/30 19:27:48 tis Exp $
#
#	Copyright (C) 2006 Tuomo Soini <tis@foobar.fi>
#
#	This script changes route source
#
#	usage: $0 {ifname} {ipaddr/prefix} [rt_table] \
#		{start|stop|restart|condrestart|status}
#
#	The "start" arg changes route source or add route if missing.
#
#	Surprisingly, the "stop" remove source from route.
#
unset LANG
LC_ALL=C
export LC_ALL

# source function library
. /etc/ha.d/shellfuncs

IP2UTIL=/sbin/ip
RETVAL=0

usage() {
	echo "usage: $0 {ifname} {ipaddr/prefix} [rt_table] \\"
	echo -e "\t{start|stop|restart|condrestart|status}"
	exit 1
}

start() {
	if
	    [ -n "$RTTABLE" ]
	then
	    RTTABLE=" table $RTTABLE"
	fi
	$IP2UTIL route change ${NETWORK}/${PREFIX} dev ${ROUTEIF} \
	    $RTTABLE src $IPADDR 2>/dev/null
	RETVAL=$?
	if
	    [ "$RETVAL" -gt 0 ]
	then
	    # Route seems to be missing. Create one
	    LOG="$($IP2UTIL route add ${NETWORK}/${PREFIX} dev ${ROUTEIF}${RTTABLE} src \
$IPADDR 2>&1)"  RETVAL=$?
	    if
		[ "$RETVAL" -gt 0 ]
	    then
		RETVAL=1
		[ -z "$LOG" ] && LOG="Silent error"
		ha_log "ERROR: cmd \"$IP2UTIL route add ${NETWORK}/${PREFIX} dev \
${ROUTEIF}${RTTABLE} src ${IPADDR}\" failed with error: \"$LOG\""  fi
	fi
}

stop() {
	if
	    [ -n "$RTTABLE" ]
	then
	    RTTABLE=" table $RTTABLE"
	fi
	$IP2UTIL route change ${NETWORK}/${PREFIX} dev ${ROUTEIF}${RTTABLE} 2>/dev/null
	RETVAL=$?
	if
	    [ "$RETVAL" -gt 0 ]
	then
	    # Route seems to be missing. Create one
	    LOG="$($IP2UTIL route add ${NETWORK}/${PREFIX} dev ${ROUTEIF}${RTTABLE} 2>&1)"
	    RETVAL=$?
	    if
		[ "$RETVAL" -gt 0 ]
	    then
		RETVAL=1
		[ -z "$LOG" ] && LOG="Silent error"
		ha_log "ERROR: cmd \"$IP2UTIL route add ${NETWORK}/${PREFIX} dev \
${ROUTEIF}${RTTABLE}\" failed with error: \"$LOG\""  fi
	else
	    RETVAL=0
	fi
}

parseroute() {
	while [ $# -gt 0 ]
	do
	    case $1 in
		src)
		    SOURCE=$2
		    shift; shift
		    ;;
		*)
		    shift
		    ;;
		esac
	done
}

status() {
	if
	    [ -n "$RTTABLE" ]
	then
	    RTTABLE=" table $RTTABLE"
	fi
	ROUTE="$($IP2UTIL route list ${NETWORK}/${PREFIX} dev ${ROUTEIF}${RTTABLE})"
	parseroute $ROUTE
	if
	    [ "$SOURCE" = "$IPADDR" ]
	then
	    echo "IProutesrc is running..."
	    RETVAL=0
	else
	    echo "IProutesrc is stopped"
	    RETVAL=3
	fi
}

restart() {
	stop
	start
}

if
    [ $# -eq 3 ]
then
    ROUTEIF="$1"
    # use /sbin/shorewall to calculate following variables:
    # CIDR
    # NETMASK
    # NETOWORK
    # BROADCAST
    eval $(/sbin/shorewall ipcalc $2)
    IPADDR=${CIDR%/*}
    PREFIX=${CIDR#*/}
    INITCMD="$3"
    RTTABLE=
    if
	[ -z "$ROUTEIF" -o -z "$PREFIX" -o -z "$NETWORK" -o -z "$IPADDR" ]
    then
	usage
    fi
else
    if
	[ $# -ne 4 ]
    then
	usage
    fi
    ROUTEIF="$1"
    # use /sbin/shorewall to calculate following variables:
    # CIDR
    # NETMASK
    # NETOWORK
    # BROADCAST
    eval $(/sbin/shorewall ipcalc $2)
    IPADDR=${CIDR%/*}
    PREFIX=${CIDR#*/}
    RTTABLE="$3"
    INITCMD="$4"
    if
	[ -z "$ROUTEIF" -o -z "$PREFIX" -o -z "$NETWORK" -o -z "$IPADDR" ]
    then
	usage
    fi
fi

case "$INITCMD" in
	start)
	    start
	    $IP2UTIL route flush cache
	    ;;
	stop) 
	    stop
	    $IP2UTIL route flush cache
	    ;;
	restart|force-reload)
	    restart
	    $IP2UTIL route flush cache
	    ;;
	reload)
	    ;;
	condrestart)
	    restart
	    $IP2UTIL route flush cache
	    ;;
	status)
	    status
	    ;;
	*)
	    usage
esac

exit $RETVAL

# EOF


["IPrule" (text/plain)]

#!/bin/bash
#
#	$Id: IPrule,v 1.5 2004/06/10 10:16:29 tis Exp $
#
#	Copyright (C) 2004 Tuomo Soini <tis@foobar.fi>
#
#	This script manages iproute2 rules
#
#	usage: IPrule {add|del} {rulesetname} \
#		{start|stop|restart|condrestart|status}
#
#	Config file /etc/ha.d/route.d/rule-{add|del}-{rulesetname}
#
#	The "start" arg adds or removes rules.
#
#	Surprisingly, the "stop" may remove or add rules.
#
unset LANG
LC_ALL=C
export LC_ALL

# source function library
. /etc/ha.d/shellfuncs

IP2UTIL=/sbin/ip
VARLIB=/var/lib/heartbeat
VLDIR=$VARLIB/rsctmp/IPrule
LOCKFILE=$VLDIR/rule-$1-$2
RETVAL=0

dorule() {
	rtype=$1
	rcmd=$2
	rset=$3
	rc=0
	if
	    [ -f /etc/ha.d/route.d/rule-${rtype}-${rset} ]
	then
	    cat /etc/ha.d/route.d/rule-${rtype}-${rset} | grep -v '^#' \
		| sed -e 's/#.*//' | while read line
	    do
		if
		    [ "X$line" = "X" ]
		then
		    : empty line
		else
		    CMD="$IP2UTIL rule $rcmd $line"
		    if
			$CMD
		    then
			ha_log "info: IPrule ${rtype}: $CMD"
		    else
			ha_log "WARN: IPrule ${rtype}: $CMD"
		    fi
		fi
	    done
	else
	    ha_log "ERROR: IPrule ${rtype}: config file \
		/etc/ha.d/route.d/rule-${rtype}-${rset} is missing"
	    rc=1
	fi
	return $rc
}

usage() {
	echo "usage: $0 {add|del} {rulesetname} \\"
	echo -e "\t{start|stop|restart|condrestart|status}"
	exit 1
}

start() {
	dorule $1 $2 $3
	if
	    [ "$?" -eq 0 ]
	then
	    if
		[ -d $VLDIR ]
	    then
		: vldir is there
	    else
		mkdir -p $VLDIR
	    fi
	    touch "$LOCKFILE"
	    RETVAL=$?
	else
	    RETVAL=1
	fi
}

stop() {
	dorule $1 $2 $3
	if
	    [ "$?" -eq 0 ]
	then
	    if
		[ -d $VLDIR ]
	    then
		: vldir is there
	    else
		mkdir -p $VLDIR
	    fi
	    rm -f "$LOCKFILE"
	    RETVAL=$?
	else
	    RETVAL=1
	fi
}

restart() {
	stop
	start
}

if
    [ $# -ne 3 ]
then
    usage
fi

RULECMD="$1"
RSETNAME="$2"
INITCMD="$3"

case "$INITCMD" in
	start)
	    case "$RULECMD" in
		add)
		    start $RULECMD add $RSETNAME
		    ;;
		del)
		    start $RULECMD delete $RSETNAME
		    ;;
		*)
		    usage
	    esac
	    ;;
	stop) 
	    case "$RULECMD" in
		add)
		    stop $RULECMD delete $RSETNAME
		    ;;
		del)
		    stop $RULECMD add $RSETNAME
		    ;;
		*)
		    usage
	    esac
	    ;;
	restart|force-reload)
	    restart
	    ;;
	reload)
	    ;;
	condrestart)
	    [ -f "$LOCKFILE" ] && restart
	    ;;
	status)
	    if [ -f $LOCKFILE ]; then
		    echo "IPrule is running..."
		    RETVAL=0
	    else
		    echo "IPrule is stopped"
		    RETVAL=3
	    fi
	    ;;
	*)
	    usage
esac

exit $RETVAL

# EOF

["signature.asc" (application/pgp-signature)]

_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic