diff options
Diffstat (limited to 'heartbeat/SendArp')
-rwxr-xr-x | heartbeat/SendArp | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/heartbeat/SendArp b/heartbeat/SendArp new file mode 100755 index 0000000..5af7bec --- /dev/null +++ b/heartbeat/SendArp @@ -0,0 +1,277 @@ +#!/bin/sh +# +# +# Copyright (c) 2006, Huang Zhen <zhen.huang@gmail.com> +# Converting original heartbeat RA to OCF RA. +# +# Copyright (C) 2004 Horms <horms@verge.net.au> +# +# Based on IPaddr2: Copyright (C) 2003 Tuomo Soini <tis@foobar.fi> +# +# License: GNU General Public License (GPL) +# Support: users@clusterlabs.org +# +# This script send out gratuitous Arp for an IP address +# +# It can be used _instead_ of the IPaddr2 or IPaddr resource +# to send gratuitous arp for an IP address on a given interface, +# without adding the address to that interface. I.e. if for +# some reason you want to send gratuitous arp for addresses +# managed by IPaddr2 or IPaddr on an additional interface. +# +# OCF parameters are as below: +# OCF_RESKEY_ip +# OCF_RESKEY_nic +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of version 2 of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Further, this software is distributed without any warranty that it is +# free of the rightful claim of any third person regarding infringement +# or the like. Any license provided herein, whether implied or +# otherwise, applies only to this software file. Patent licenses, if +# any, provided herein do not apply to combinations of this program with +# other software, or any other product whatsoever. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. +# + +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +# Parameter defaults + +OCF_RESKEY_ip_default="" +OCF_RESKEY_nic_default="" +OCF_RESKEY_background_default="true" + +: ${OCF_RESKEY_ip=${OCF_RESKEY_ip_default}} +: ${OCF_RESKEY_nic=${OCF_RESKEY_nic_default}} +: ${OCF_RESKEY_background=${OCF_RESKEY_background_default}} + +SENDARP=$HA_BIN/send_arp +SENDARPPIDDIR=${HA_RSCTMP} + +BASEIP="$OCF_RESKEY_ip" +INTERFACE="$OCF_RESKEY_nic" +RESIDUAL="" +SENDARPPIDFILE="$SENDARPPIDDIR/send_arp-$BASEIP" +BACKGROUND=${OCF_RESKEY_background} + +# Set default values + + : ${ARP_INTERVAL_MS=200} # milliseconds between ARPs + : ${ARP_REPEAT=5} # repeat count + : ${ARP_BACKGROUND=$BACKGROUND} # no to run in foreground + : ${ARP_NETMASK=ffffffffffff} # netmask for ARP + +####################################################################### + +sendarp_meta_data() { + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="SendArp" version="1.0"> +<version>1.0</version> + +<longdesc lang="en"> +This RA can be used _instead_ of the IPaddr2 or IPaddr RA to +send gratuitous ARP for an IP address on a given interface, +without adding the address to that interface. For example, +if for some reason you wanted to send gratuitous ARP for +addresses managed by IPaddr2 or IPaddr on an additional +interface. +</longdesc> +<shortdesc lang="en">Broadcasts unsolicited ARP announcements</shortdesc> + +<parameters> +<parameter name="ip" unique="0" required="1"> +<longdesc lang="en"> +The IP address for sending ARP packet. +</longdesc> +<shortdesc lang="en">IP address</shortdesc> +<content type="string" default="${OCF_RESKEY_ip_default}" /> +</parameter> + +<parameter name="nic" unique="0" required="1"> +<longdesc lang="en"> +The NIC for sending ARP packet. +</longdesc> +<shortdesc lang="en">NIC</shortdesc> +<content type="string" default="${OCF_RESKEY_nic_default}" /> +</parameter> + +<parameter name="background" unique="0" required="0"> +<longdesc lang="en"> +Send ARPs in background. Set to false if you want to test if +sending ARPs succeeded. +</longdesc> +<shortdesc lang="en">Send ARPs in background</shortdesc> +<content type="boolean" default="${OCF_RESKEY_background_default}" /> +</parameter> + +</parameters> + +<actions> +<action name="start" timeout="20s" /> +<action name="stop" timeout="20s" /> +<action name="monitor" depth="0" timeout="20s" interval="10s" /> +<action name="meta-data" timeout="5s" /> +<action name="validate-all" timeout="20s" /> +</actions> +</resource-agent> +END +} + +####################################################################### + +sendarp_usage() { + cat <<END +usage: $0 {start|stop|monitor|validate-all|meta-data} + +Expects to have a fully populated OCF RA-compliant environment set. +END +} + +# +# Send gratuitous arp +# +sendarp_start() { + local rc + + sendarp_validate + if [ $? = $OCF_ERR_CONFIGURED ]; then + return $OCF_ERR_CONFIGURED + fi + + sendarp_monitor + if [ $? = $OCF_SUCCESS ]; then + return $OCF_SUCCESS + fi + + [ -r ${HA_CONFDIR}/arp_config ] && . ${HA_CONFDIR}/arp_config + if [ -r "${HA_CONFDIR}/arp_config:${TARGET_INTERFACE}" ]; then + . "${HA_CONFDIR}/arp_config:${TARGET_INTERFACE}" + fi + + + ARGS="-i $ARP_INTERVAL_MS -r $ARP_REPEAT -p $SENDARPPIDFILE $INTERFACE $BASEIP auto $BASEIP $ARP_NETMASK" + ocf_log debug "$SENDARP $ARGS" + + rc=$OCF_SUCCESS + if ocf_is_true $ARP_BACKGROUND; then + # not possible to check the status without wait! we can + # just log the outcome + # and wait-ing would be equal to not running in + # background + ($SENDARP $ARGS || + ocf_exit_reason "Could not send gratuitous arps") & + else + $SENDARP $ARGS || { + ocf_exit_reason "Could not send gratuitous arps" + rc=$OCF_ERR_GENERIC + } + fi + + if [ $rc -eq $OCF_SUCCESS ]; then + ha_pseudo_resource SendArp_${OCF_RESOURCE_INSTANCE} start + fi + return $rc +} + +# +# Stop sending gratuitous arp +# +sendarp_stop() { + sendarp_monitor + if [ $? -eq $OCF_NOT_RUNNING ]; then + return $OCF_SUCCESS + fi + + rc=$OCF_SUCCESS + + if + [ -f "$SENDARPPIDFILE" ] + then + kill `cat "$SENDARPPIDFILE"` + rc=$? + case $rc in + 0) + ocf_log info "killed previously running send_arp for $BASEIP" + rm -f "$SENDARPPIDFILE" + rc=$OCF_SUCCESS + ;; + *) + ocf_log warn "Could not kill previously running send_arp for $BASEIP" + rc=$OCF_ERR_GENERIC + ;; + esac + fi + + case $rc in + $OCF_SUCCESS) + ocf_log info "SendArp for $BASEIP/$INTERFACE released" + ha_pseudo_resource SendArp_${OCF_RESOURCE_INSTANCE} stop + ;; + *) + ocf_log warn "SendArp for $BASEIP/$INTERFACE NOT released" + ;; + esac + return $rc +} +# +sendarp_monitor() { + if [ -f "$SENDARPPIDFILE" ]; then + return $OCF_SUCCESS + fi + ha_pseudo_resource SendArp_${OCF_RESOURCE_INSTANCE} monitor +} + +sendarp_validate() { + if [ -z "$INTERFACE" -o -z "$BASEIP" -o -n "$RESIDUAL" ] + then + return $OCF_ERR_CONFIGURED + fi + return $OCF_SUCCESS +} + +case $__OCF_ACTION in +meta-data) sendarp_meta_data + exit $OCF_SUCCESS + ;; +start) sendarp_start + ;; +stop) sendarp_stop + ;; +monitor) sendarp_monitor + ;; +status) sendarp_monitor + if [ $? = $OCF_SUCCESS ]; then + echo "running" + exit $OCF_SUCCESS; + else + echo "stopped" + exit $OCF_NOT_RUNNING; + fi + ;; +validate-all) sendarp_validate + ;; +usage|help) sendarp_usage + exit $OCF_SUCCESS + ;; +*) sendarp_usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac + |