Hi, Just a few comments below.
Cheers, Dejan On Wed, Apr 04, 2012 at 01:52:12AM +0200, Christian Franke wrote: > Hello Florian, > > Your question is fully justified - I sincerely apologize for ignoring > that comprehensive documentation. > > I rewrote the patch trying to adhere to the requirements given in the > documentation. > > Best Regards, > Christian > > --- > AUTHORS | 1 + > doc/man/Makefile.am | 1 + > heartbeat/Makefile.am | 1 + > heartbeat/proxyarp | 381 > +++++++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 384 insertions(+) > create mode 100755 heartbeat/proxyarp > > diff --git a/AUTHORS b/AUTHORS > index ee0169a..f39b565 100644 > --- a/AUTHORS > +++ b/AUTHORS > @@ -11,6 +11,7 @@ Andrew Price <andy at andrewprice.me.uk> > Benjamin Marzinski <bmarzins at redhat.com> > Bob Peterson <rpeterso at redhat.com> > Chris Feist <cfeist at redhat.com> > +Christian Franke <nobody at nowhere dot ws> > Christian Rishoj <christ...@rishoj.net> > Christine Caulfield <ccaulfie at redhat.com> > Daiki Matsuda <d.mat...@gmail.com> > diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am > index a7dae80..56169a2 100644 > --- a/doc/man/Makefile.am > +++ b/doc/man/Makefile.am > @@ -120,6 +120,7 @@ man_MANS = ocf_heartbeat_AoEtarget.7 \ > ocf_heartbeat_postfix.7 \ > ocf_heartbeat_pound.7 \ > ocf_heartbeat_proftpd.7 \ > + ocf_heartbeat_proxyarp.7 \ > ocf_heartbeat_rsyncd.7 \ > ocf_heartbeat_rsyslog.7 \ > ocf_heartbeat_scsi2reservation.7 \ > diff --git a/heartbeat/Makefile.am b/heartbeat/Makefile.am > index adfd97c..cb33cb2 100644 > --- a/heartbeat/Makefile.am > +++ b/heartbeat/Makefile.am > @@ -87,6 +87,7 @@ ocf_SCRIPTS = ClusterMon \ > pound \ > pgsql \ > proftpd \ > + proxyarp \ > Pure-FTPd \ > Raid1 \ > Route \ > diff --git a/heartbeat/proxyarp b/heartbeat/proxyarp > new file mode 100755 > index 0000000..bed0273 > --- /dev/null > +++ b/heartbeat/proxyarp > @@ -0,0 +1,381 @@ > +#!/bin/sh > +# > +# OCF Resource Agent for Proxy ARP on Linux > +# Copyright (c) 2012 Christian Franke <nob...@nowhere.ws> > +# > +# Based on: > +# > +# OCF Resource Agent compliant IPaddr2 script. > +# > +# Based on work by Tuomo Soini, ported to the OCF RA API by Lars > +# Marowsky-Brée. Implements Cluster Alias IP functionality too. > +# > +# Cluster Alias IP cleanup, fixes and testing by Michael Schwartzkopff > +# > +# Copyright (c) 2003 Tuomo Soini > +# Copyright (c) 2004-2006 SUSE LINUX AG, Lars Marowsky-Brée > +# All Rights Reserved. > +# > +# 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. > +# > +# > + > +# OCF parameters are as below > +# OCF_RESKEY_ip > +# OCF_RESKEY_nic > +# OCF_RESKEY_arp_interval > +# OCF_RESKEY_arp_count > +# OCF_RESKEY_arp_mac > +# OCF_RESKEY_arp_insist > + > +####################################################################### > +# Initialization: > + > +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} > +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs > + > +# Defaults > +OCF_RESKEY_arp_interval_default=200 > +OCF_RESKEY_arp_count_default=5 > +OCF_RESKEY_arp_mac_default="ffffffffffff" > +OCF_RESKEY_arp_insist_default=false > + > +: ${OCF_RESKEY_arp_interval=${OCF_RESKEY_arp_interval_default}} > +: ${OCF_RESKEY_arp_count=${OCF_RESKEY_arp_count_default}} > +: ${OCF_RESKEY_arp_mac=${OCF_RESKEY_arp_mac_default}} > +: ${OCF_RESKEY_arp_insist=${OCF_RESKEY_arp_insist_default}} > +####################################################################### > + > +SENDARP=$HA_BIN/send_arp > +PIDDIR=$HA_RSCTMP > + > +####################################################################### > + > +meta_data() { > + cat <<END > +<?xml version="1.0"?> > +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> > +<resource-agent name="proxyarp"> > +<version>1.0</version> > + > +<longdesc lang="en"> > +This Linux specific resource maintains a proxy arp entry. > +It also supports sending gratuitous arp when the resource > +starts up. > +</longdesc> > + > +<shortdesc lang="en">Manages proxy arp (Linux specific version)</shortdesc> > + > +<parameters> > +<parameter name="ip" required="1"> Does this need unique=1 too? > +<longdesc lang="en"> > +The IPv4 address to be configured in dotted quad notation, for example > +"192.168.1.1". > +</longdesc> > +<shortdesc lang="en">IPv4 address</shortdesc> > +<content type="string" /> > +</parameter> > +<parameter name="nic" required="1"> > +<longdesc lang="en"> > +The base network interface on which questions for arp will be replied to. > +</longdesc> > +<shortdesc lang="en">Network interface</shortdesc> > +<content type="string"/> > +</parameter> > +<parameter name="arp_interval"> > +<longdesc lang="en"> > +Specify the interval between unsolicited ARP packets in milliseconds. > +</longdesc> > +<shortdesc lang="en">ARP packet interval in ms</shortdesc> > +<content type="integer" default="${OCF_RESKEY_arp_interval_default}"/> > +</parameter> > + > +<parameter name="arp_count"> > +<longdesc lang="en"> > +Number of unsolicited ARP packets to send. > +</longdesc> > +<shortdesc lang="en">ARP packet count</shortdesc> > +<content type="integer" default="${OCF_RESKEY_arp_count_default}"/> > +</parameter> > + > +<parameter name="arp_mac"> > +<longdesc lang="en"> > +MAC address to send the ARP packets to. > + > +You really shouldn't be touching this. > + > +</longdesc> > +<shortdesc lang="en">ARP MAC</shortdesc> > +<content type="string" default="${OCF_RESKEY_arp_mac_default}"/> > +</parameter> > + > +<parameter name="arp_insist"> This name sounds awkward. The point is that it is very important (critical) that sending gratuitous arp succeeds. "insist" implies some action, but there won't be any. Perhaps gratuitous_arp_critical. > +<longdesc lang="en"> > +Whether or not to insist on successful gratuitous arp. > + > +In some setups, gratuitous arp is very important, because > +its failure would cause huge service disruptions. For those > +cases, it is wise to insist on gratuitous arp to run successfuly > +for the start operation to report success. > +</longdesc> > +<shortdesc lang="en">Insist on gratuitous ARP</shortdesc> > +<content type="string" default="${OCF_RESKEY_arp_insist_default}"/> > +</parameter> > + > +</parameters> > +<actions> > +<action name="start" timeout="20s" /> > +<action name="stop" timeout="20s" /> > +<action name="status" depth="0" timeout="20s" interval="10s" /> > +<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 > + > + exit $OCF_SUCCESS > +} > + > +proxy_arp_init() { > + if [ X`uname -s` != "XLinux" ]; then > + ocf_log err "proxyarp only supported on Linux." > + exit $OCF_ERR_INSTALLED > + fi > + > + if [ X"$OCF_RESKEY_ip" = "X" ]; then > + ocf_log err "IP address (the ip parameter) is mandatory" > + exit $OCF_ERR_CONFIGURED > + fi > + > + if [ X"$OCF_RESKEY_nic" = "X" ]; then > + ocf_log err "Interface (the nic parameter) is mandatory" > + exit $OCF_ERR_CONFIGURED > + fi > + > + if > + case $__OCF_ACTION in > + start|stop) ocf_is_root > + ;; > + *) true > + ;; > + esac > + then > + : YAY! > + else > + ocf_log err "You must be root for $__OCF_ACTION operation." > + exit $OCF_ERR_PERM > + fi > + > + IP="$OCF_RESKEY_ip" > + NIC="$OCF_RESKEY_nic" > + SENDARPPIDFILE="$PIDDIR/send_arp-$IP" Looks like this may conflict with other RAs. [Needs to be fixed elsewhere!] Best to add $OCF_RESOURCE_INSTANCE somewhere. > +} > + > +# > +# Removes a proxy arp entry from the arp table > +# > +remove_proxy_arp () { > + local ipaddr iface > + > + ipaddr="$1" > + iface="$2" > + > + CMD="$IP2UTIL neigh del proxy $ipaddr dev $iface" > + > + ocf_run $CMD || return $OCF_ERR_GENERIC > + > + return $OCF_SUCCESS > +} > + > +# > +# Adds a proxy arp entry to the arp table > +# > +add_proxy_arp () { > + local msg ipaddr iface > + > + ipaddr="$1" > + iface="$2" > + > + CMD="$IP2UTIL neigh add proxy $ipaddr dev $iface" > + msg="Adding proxy arp for $ipaddr on $iface" > + > + ocf_log info "$msg" > + ocf_run $CMD || return $OCF_ERR_GENERIC > + > + return $OCF_SUCCESS > +} > + > +# > +# Run send_arp to note peers about new mac address "notify" instead of "note" (though the comment may be superfluous). > +# > +run_send_arp() { > + local args > + > + args="-i $OCF_RESKEY_arp_interval -r $OCF_RESKEY_arp_count -p > $SENDARPPIDFILE $NIC $IP auto not_used not_used" > + ocf_log info "$SENDARP $args" > + > + $SENDARP $args > + if [ $? -ne 0 ]; then > + ocf_log err "gratuitous arp failed." > + return $OCF_ERR_GENERIC > + fi > + > + return $OCF_SUCCESS > +} > + > +####################################################################### > + > +proxy_arp_usage() { > + cat <<END > +usage: $0 {start|stop|status|monitor|validate-all|meta-data} > + > +Expects to have a fully populated OCF RA-compliant environment set. > +END > +} > + > +proxy_arp_monitor() { > + local proxy_entries > + > + if ! ha_pseudo_resource "${OCF_RESOURCE_INSTANCE}" monitor; then > + return $OCF_NOT_RUNNING > + fi > + > + proxy_entries=`grep ' 0xc ' /proc/net/arp | grep -c -F "$IP"` > + if [ $proxy_entries -gt 0 ]; then > + return $OCF_SUCCESS > + else > + return $OCF_GENERIC_ERROR > + fi > +} > + > +proxy_arp_installed() { > + check_binary $IP2UTIL > + > + if ocf_is_true "$OCF_RESKEY_arp_insist"; then > + check_binary $SENDARP > + elif ! have_binary $SENDARP; then > + ocf_log warn "$SENDARP not found - gratuitous arp will not work" > + fi > +} > + > +proxy_arp_start() { > + if [ -z "$NIC" ] || [ -z "$IP" ]; then > + return $OCF_ERR_CONFIGURED > + fi > + > + proxy_arp_monitor > + if [ $? -eq $OCF_SUCCESS ]; then > + return $OCF_SUCCESS > + fi > + > + proxy_arp_installed > + ha_pseudo_resource "${OCF_RESOURCE_INSTANCE}" start > + > + add_proxy_arp $IP $NIC > + if [ $? -ne $OCF_SUCCESS ]; then > + ocf_log err "$CMD failed." > + return $OCF_ERR_GENERIC > + fi > + > + # the proxy arp entry is inserted synchronously, so it should have been > + # inserted successfully at this point > + proxy_arp_monitor > + if [ $? -ne $OCF_SUCCESS ]; then > + return $OCF_ERR_GENERIC > + fi > + > + run_send_arp > + if [ $? -ne $OCF_SUCCESS ] && ocf_is_true "$OCF_RESKEY_arp_insist"; then if ! run_send_arp && ocf_is_true "$OCF_RESKEY_arp_insist"; then > + # gratuitous arp failed - but we insist it should succeed > + return $OCF_ERR_GENERIC > + fi > + > + return $OCF_SUCCESS > +} > + > +proxy_arp_stop() { > + proxy_arp_monitor > + if [ $? -eq $OCF_NOT_RUNNING ]; then > + return $OCF_SUCCESS > + fi > + > + if [ -f "$SENDARPPIDFILE" ] ; then > + kill `cat "$SENDARPPIDFILE"` > + if [ $? -ne 0 ]; then > + ocf_log warn "Could not kill previously running > send_arp for $IP" > + else > + ocf_log info "killed previously running send_arp for > $IP" > + rm -f "$SENDARPPIDFILE" > + fi > + fi > + > + remove_proxy_arp $IP $NIC > + proxy_arp_monitor > + if [ $? -ne $OCF_ERR_GENERIC ]; then > + ocf_log err "Removal of proxy arp entry for $IP failed" > + return $OCF_ERR_GENERIC > + fi > + > + ha_pseudo_resource "${OCF_RESOURCE_INSTANCE}" stop > + return $OCF_SUCCESS > +} > + > +proxy_arp_validate() { > + proxy_arp_init > + > + if ocf_is_decimal "$OCF_RESKEY_arp_interval" && [ > $OCF_RESKEY_arp_interval -gt 0 ]; then > + : > + else > + ocf_log err "Invalid OCF_RESKEY_arp_interval > [$OCF_RESKEY_arp_interval]" > + exit $OCF_ERR_CONFIGURED > + fi > + > + if ocf_is_decimal "$OCF_RESKEY_arp_count" && [ $OCF_RESKEY_arp_count > -gt 0 ]; then > + : > + else > + ocf_log err "Invalid OCF_RESKEY_arp_count > [$OCF_RESKEY_arp_count]" > + exit $OCF_ERR_CONFIGURED > + fi > +} > + > +case $__OCF_ACTION in > +meta-data) meta_data > + ;; > +usage|help) proxy_arp_usage > + exit $OCF_SUCCESS > + ;; > +esac > + > +proxy_arp_validate > + > +case $__OCF_ACTION in > +start) proxy_arp_start > + ;; > +stop) proxy_arp_stop > + ;; > +monitor) proxy_arp_monitor > + ;; > +validate-all) proxy_arp_installed > + ;; > +*) proxy_arp_usage > + exit $OCF_ERR_UNIMPLEMENTED > + ;; > +esac > -- > 1.7.9.2 > > _______________________________________________________ > 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/ _______________________________________________________ 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/