summaryrefslogtreecommitdiffstats
path: root/heartbeat/SendArp
diff options
context:
space:
mode:
Diffstat (limited to 'heartbeat/SendArp')
-rwxr-xr-xheartbeat/SendArp277
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
+