diff options
Diffstat (limited to 'heartbeat/VIPArip')
-rwxr-xr-x | heartbeat/VIPArip | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/heartbeat/VIPArip b/heartbeat/VIPArip new file mode 100755 index 0000000..688237d --- /dev/null +++ b/heartbeat/VIPArip @@ -0,0 +1,314 @@ +#!/bin/sh +# +# License: GNU General Public License (GPL) +# Support: users@clusterlabs.org +# Author: Huang Zhen <zhenhltc@cn.ibm.com> +# 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: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +RIPDCONF=$HA_RSCTMP/VIPArip-ripd.conf +ZEBRA=/usr/sbin/zebra +RIPD=/usr/sbin/ripd +USAGE="usage: $0 {start|stop|status|monitor|validate-all|meta-data}"; + +# Parameter defaults + +OCF_RESKEY_ip_default="" +OCF_RESKEY_nic_default="eth0" +OCF_RESKEY_zebra_binary_default="${ZEBRA}" +OCF_RESKEY_ripd_binary_default="${RIPD}" + +: ${OCF_RESKEY_ip=${OCF_RESKEY_ip_default}} +: ${OCF_RESKEY_nic=${OCF_RESKEY_nic_default}} +: ${OCF_RESKEY_zebra_binary=${OCF_RESKEY_zebra_binary_default}} +: ${OCF_RESKEY_ripd_binary=${OCF_RESKEY_ripd_binary_default}} + +####################################################################### + +meta_data() { +cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="VIPArip" version="1.0"> +<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">Manages a virtual IP address through RIP2</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="${OCF_RESKEY_ip_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 information to others +</longdesc> +<shortdesc lang="en">The nic for broadcast the route information</shortdesc> +<content type="string" default="${OCF_RESKEY_nic_default}"/> +</parameter> + +<parameter name="zebra_binary" unique="0"> +<longdesc lang="en"> +Absolute path to the zebra binary. +</longdesc> +<shortdesc lang="en">zebra binary</shortdesc> +<content type="string" default="${OCF_RESKEY_zebra_binary_default}"/> +</parameter> + +<parameter name="ripd_binary" unique="0"> +<longdesc lang="en"> +Absolute path to the ripd binary. +</longdesc> +<shortdesc lang="en">ripd binary</shortdesc> +<content type="string" default="${OCF_RESKEY_ripd_binary_default}"/> +</parameter> + +</parameters> + +<actions> +<action name="start" timeout="20s" /> +<action name="stop" timeout="20s" /> +<action name="monitor" depth="0" timeout="20s" interval="5s" /> +<action name="validate-all" timeout="20s" /> +<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 +} +check_params() { + if [ x"$OCF_RESKEY_ip" = x ] + then + ocf_log err "ip is a required parameter" + exit $OCF_ERR_CONFIGURED + fi +} +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 $ZEBRA -d + $ZEBRA -d + echo $RIPD -d -f $RIPDCONF + $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 + check_params + + if [ x"$OCF_RESKEY_nic" = x ] + then + echo OCF_RESKEY_nic is null, set to ${OCF_RESKEY_nic_default} + OCF_RESKEY_nic="${OCF_RESKEY_nic_default}" + fi + + status_rip_ip + case $? in + $OCF_SUCCESS) + ocf_log info "already running" + exit $OCF_SUCCESS + ;; + $OCF_NOT_RUNNING) + ;; + *) + ocf_log info "state undefined, stopping first" + stop_rip_ip + ;; + esac + + $IP2UTIL 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 + check_params + status_rip_ip + if [ $? = $OCF_NOT_RUNNING ] + then + exit $OCF_SUCCESS + fi + $IP2UTIL addr del $OCF_RESKEY_ip dev lo + echo sleep 2 + sleep 2 + del_ip $OCF_RESKEY_ip + return $OCF_SUCCESS +} + +status_rip_ip() { + check_params + if $IP2UTIL 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 + return $OCF_ERR_GENERIC + fi + return $OCF_NOT_RUNNING +} + +if + [ $# -ne 1 ] +then + usage + exit $OCF_ERR_ARGS +fi + +[ x != x"$OCF_RESKEY_zebra_binary" ] && + ZEBRA=$OCF_RESKEY_zebra_binary +[ x != x"$OCF_RESKEY_ripd_binary" ] && + RIPD=$OCF_RESKEY_ripd_binary + +case $1 in + start) start_rip_ip;; + stop) stop_rip_ip;; + status) status_rip_ip;; + monitor) status_rip_ip;; + validate-all) check_binary $IP2UTIL + exit $OCF_SUCCESS;; + meta-data) meta_data;; + usage) usage; exit $OCF_SUCCESS;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac |