Hi,
This RA is to assign an IP with different subnet to a nic.
It uses RIP2 with quagga package.
It has been tested on SLES9 and SuSE10.
Please review the RA and test it in the case you are interested in it.
And it's really appreciate that if someone would like to contribute the BGP or
other protocols versions.
Thanks Guy Coates for his very helpful scripts.
--
Best Regards,
Huang Zhen
Linux-HA, Linux Technology Center, China Systems & Technology Lab
China Development Labs, Beijing Tel: 86-10-82782244 Ext. 2845
Email: [EMAIL PROTECTED]
#!/bin/sh
#
# License: GNU General Public License (GPL)
# Support: [EMAIL PROTECTED]
# Author: Huang Zhen <[EMAIL PROTECTED]>
# Copyright (c) 2006 International Business Machines
#
# Virtual IP Address by RIP2 protocol.
# This script manages IP alias in different subnet with quagga/ripd.
# It can add an IP alias, or remove one.
#
# The quagga package should be installed to run this RA
#
# usage: $0 {start|stop|status|monitor|validate-all|meta-data}
#
# The "start" arg adds an IP alias.
# Surprisingly, the "stop" arg removes one. :-)
#
# OCF parameters are as below
# OCF_RESKEY_ip The IP address in different subnet
# OCF_RESKEY_nic The nic for broadcast the route information
#
#######################################################################
# Initialization:
. @hb_libdir@/ocf-shellfuncs
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@/run/@HB_PKG@
VLDIR=$HA_VARRUNDIR/rsctmp/VIPArip
RIPDCONF=$VLDIR/ripd.conf
[EMAIL PROTECTED]@
USAGE="usage: $0 {start|stop|status|monitor|validate-all|meta-data}";
#######################################################################
LC_ALL=C
export LC_ALL
[EMAIL PROTECTED]@/ha.d
. ${HA_D}/shellfuncs
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="VIPArip">
<version>1.0</version>
<longdesc lang="en">
Virtual IP Address by RIP2 protocol.
This script manages IP alias in different subnet with quagga/ripd.
It can add an IP alias, or remove one.
</longdesc>
<shortdesc lang="en">Virtual IP Address by RIP2 protocol</shortdesc>
<parameters>
<parameter name="ip" unique="1" required="1">
<longdesc lang="en">
The IPv4 address in different subnet, for example "192.168.1.1".
</longdesc>
<shortdesc lang="en">The IP address in different subnet</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="nic" unique="0">
<longdesc lang="en">
The nic for broadcast the route information.
The ripd uses this nic to broadcast the route informaton to others
</longdesc>
<shortdesc lang="en">The nic for broadcast the route information</shortdesc>
<content type="string" default="eth0"/>
</parameter>
</parameters>
<actions>
<action name="start" timeout="90" />
<action name="stop" timeout="100" />
<action name="monitor" depth="10" timeout="20s" interval="5s" start-delay="1s"
/>
<action name="validate-all" timeout="30s" />
<action name="meta-data" timeout="5s" />
</actions>
</resource-agent>
END
exit $OCF_SUCCESS
}
usage() {
echo $USAGE >&2
}
new_config_file() {
echo new_config_file $1 $2 $3
cat >$RIPDCONF <<END
hostname ripd
password zebra
debug rip events
debug rip packet
debug rip zebra
log file /var/log/quagga/quagga.log
router rip
!nic_tag
no passive-interface $2
network $2
distribute-list private out $2
distribute-list private in $2
!metric_tag
redistribute connected metric $3
!ip_tag
access-list private permit $1/32
access-list private deny any
END
}
set_metric() {
echo set_metric $1
sed "s/redistribute connected metric .*/redistribute connected metric
$1/g" $RIPDCONF > $RIPDCONF.tmp
cp $RIPDCONF.tmp $RIPDCONF
}
add_ip() {
echo add_ip $1
sed "s/ip_tag/ip_tag\naccess-list private permit $1\/32/g" $RIPDCONF >
$RIPDCONF.tmp
cp $RIPDCONF.tmp $RIPDCONF
}
del_ip() {
echo del_ip $1
sed "/$1/d" $RIPDCONF > $RIPDCONF.tmp
cp $RIPDCONF.tmp $RIPDCONF
if $GREP "access-list private permit" $RIPDCONF>/dev/null
then
echo some other IP is running
reload_config
else
stop_quagga
echo remove $RIPDCONF
rm $RIPDCONF
fi
}
add_nic() {
echo add_nic $1
if $GREP "network $1" $RIPDCONF >/dev/null
then
echo the nic is already in the config file
else
sed "s/nic_tag/nic_tag\n no passive-interface $1\n network $1\n
distribute-list private out $1\n distribute-list private in $1/g" $RIPDCONF >
$RIPDCONF.tmp
cp $RIPDCONF.tmp $RIPDCONF
fi
}
reload_config() {
echo reload_config
echo $RIPDCONF:
cat $RIPDCONF
echo killall -SIGHUP ripd
killall -SIGHUP ripd
}
start_quagga() {
echo start_quagga
echo $RIPDCONF:
cat $RIPDCONF
echo /usr/sbin/zebra -d
/usr/sbin/zebra -d
echo /usr/sbin/ripd -d -f $RIPDCONF
/usr/sbin/ripd -d -f $RIPDCONF
}
stop_quagga() {
echo stop_quagga
echo $RIPDCONF:
cat $RIPDCONF
echo killall -SIGTERM ripd
killall -SIGTERM ripd
echo killall -SIGTERM zebra
killall -SIGTERM zebra
}
start_rip_ip() {
echo start_rip_ip
if [ -d "$VLDIR/" ] || mkdir -p "$VLDIR/"
then
: Directory $VLDIR now exists
else
ocf_log err "Could not create \"$VLDIR/\"."
exit $OCF_ERR_GENERIC
fi
if [ x"$OCF_RESKEY_nic" = x ]
then
echo OCF_RESKEY_nic is null, set to eth0
OCF_RESKEY_nic="eth0"
fi
if $IP addr | $GREP $OCF_RESKEY_ip >/dev/null
then
ocf_log err "Invalid OCF_RESKEY_ip [$OCF_RESKEY_ip]"
exit $OCF_ERR_ARGS
fi
$IP addr add $OCF_RESKEY_ip/32 dev lo
if [ -f "$RIPDCONF" ]
then
# there is a config file, add new data(IP,nic,metric)
# to the existing config file.
add_ip $OCF_RESKEY_ip
add_nic $OCF_RESKEY_nic
set_metric 1
reload_config
echo sleep 3
sleep 3
set_metric 3
reload_config
else
new_config_file $OCF_RESKEY_ip $OCF_RESKEY_nic 1
start_quagga
echo sleep 3
sleep 3
set_metric 3
reload_config
fi
return $OCF_SUCCESS
}
stop_rip_ip() {
echo stop_rip_ip
status_rip_ip
if [ $? = $OCF_NOT_RUNNING ]
then
ocf_log err "Invalid OCF_RESKEY_ip [$OCF_RESKEY_ip]"
exit $OCF_ERR_ARGS
fi
$IP addr del $OCF_RESKEY_ip dev lo
echo sleep 2
sleep 2
del_ip $OCF_RESKEY_ip
return $OCF_SUCCESS
}
status_rip_ip() {
if $IP addr | $GREP $OCF_RESKEY_ip >/dev/null
then
if $GREP $OCF_RESKEY_ip $RIPDCONF >/dev/null
then
if pidof ripd >/dev/null
then
return $OCF_SUCCESS
fi
fi
fi
return $OCF_NOT_RUNNING
}
if
[ $# -ne 1 ]
then
usage
exit $OCF_ERR_ARGS
fi
if [ x"$OCF_RESKEY_ip" = x ]
then
ocf_log err "Invalid OCF_RESKEY_ip [$OCF_RESKEY_ip]"
exit $OCF_ERR_ARGS
fi
case $1 in
start) start_rip_ip;;
stop) stop_rip_ip;;
status) status_rip_ip;;
monitor) status_rip_ip;;
validate-all) exit $OCF_SUCCESS;;
meta-data) meta_data;;
usage) usage; exit $OCF_SUCCESS;;
*) usage
exit $OCF_ERR_ARGS
;;
esac
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/