Am 08.03.2011 13:32, schrieb Klaus Darilion: > Hi! > > Instead of adding a virtual IP address to an interface > (ocf:heartbeat:IPaddr2), how do I manage a physical interface? Are there > any special resource scripts?
Hi! I tried to reuse ocf:heartbeat:IPaddr2 to manage and IP address as primary IP address on a certain interface. Basically ocf:heartbeat:IPaddr2 works, but there are problems if the interface is down but the IP address is configured. 1. the failure won't be detected 2. adding the IP will fail if the IP is already added Thus this patch: 1. also checks if the interface is up, not only if the IP address is configured 2. before adding the IP address, it will delete the IP address if the address is already configured (on any interface, with any netmask). Thus the "add" will always work. You might want to add it. regards Klaus
--- IPaddr2 2011-03-10 17:03:25.000000000 +0100 +++ IPaddr2Interface 2011-03-10 17:59:10.000000000 +0100 @@ -2,7 +2,7 @@ # # $Id: IPaddr2.in,v 1.24 2006/08/09 13:01:54 lars Exp $ # -# OCF Resource Agent compliant IPaddr2 script. +# OCF Resource Agent compliant script: IPaddr2Interface # # Based on work by Tuomo Soini, ported to the OCF RA API by Lars # Marowsky-Brée. Implements Cluster Alias IP functionality too. @@ -12,6 +12,7 @@ # # Copyright (c) 2003 Tuomo Soini # Copyright (c) 2004-2006 SUSE LINUX AG, Lars Marowsky-Brée +# Copyright (c) 2004-2011 IPCom GmnH, www.ipcom.at, Klaus Darilion # All Rights Reserved. # # This program is free software; you can redistribute it and/or modify @@ -356,16 +357,33 @@ # is an interface name (e.g., "eth0"). # find_interface() { + ipaddr="$1" # # List interfaces but exclude FreeS/WAN ipsecN virtual interfaces # - local iface=`$IP2UTIL -o -f inet addr show | grep "\ $BASEIP/$NETMASK" \ + local iface=`$IP2UTIL -o -f inet addr show | grep "\ $ipaddr/" \ | cut -d ' ' -f2 | grep -v '^ipsec[0-9][0-9]*$'` echo $iface return 0 } # +# Find out if the interface is up, return "up" or "down" +# +interface_status() { + iface="$1" + local status=`$IP2UTIL -o link show $iface up` + + if [ -z "$status" ]; then + echo "down" + return 0 + fi + + echo "up" + return 0 +} + +# # Delete an interface # delete_interface () { @@ -391,6 +409,17 @@ iface="$4" label="$5" + # If the address is already configured, the adding will fail + # (eg. interface is configured, but DOWN). Therefore always + # delete the IP address first. + cur_nic="`find_interface $ipaddr`" + if [ -n "$cur_nic" ]; then + CMD="$IP2UTIL -f inet addr del $ipaddr dev $cur_nic" + + ocf_log info "$CMD" + $CMD + fi + CMD="$IP2UTIL -f inet addr add $ipaddr/$netmask brd $broadcast dev $iface" if [ ! -z "$label" ]; then @@ -557,6 +586,12 @@ ;; esac + int_status="`interface_status $cur_nic`" + if [ "$int_status" = "down" ]; then + echo "no" + return 0 + fi + echo "ok" return 0 fi
_______________________________________________ Pacemaker mailing list: Pacemaker@oss.clusterlabs.org http://oss.clusterlabs.org/mailman/listinfo/pacemaker Project Home: http://www.clusterlabs.org Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf Bugs: http://developerbugs.linux-foundation.org/enter_bug.cgi?product=Pacemaker