resource-agents: master - rgmanager: Fix ipv6 handling

Lon Hohberger lon at fedoraproject.org
Tue Dec 15 22:08:54 UTC 2009


Gitweb:        http://git.fedorahosted.org/git/resource-agents.git?p=resource-agents.git;a=commitdiff;h=f9d933d42f7a1c42ad54be3fdaf0887b0252c4ee
Commit:        f9d933d42f7a1c42ad54be3fdaf0887b0252c4ee
Parent:        26e9e538b22554d21ae43c4b379b664daf6f05d3
Author:        Shane Bradley <sbradley at redhat.com>
AuthorDate:    Tue Dec 15 16:55:51 2009 -0500
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Tue Dec 15 17:08:45 2009 -0500

rgmanager: Fix ipv6 handling

Resolves: rhbz#533461

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/src/resources/ip.sh |   84 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/rgmanager/src/resources/ip.sh b/rgmanager/src/resources/ip.sh
index f974fa9..714da05 100644
--- a/rgmanager/src/resources/ip.sh
+++ b/rgmanager/src/resources/ip.sh
@@ -155,6 +155,7 @@ ipv6_expand()
 	typeset addr=$1
 	typeset maskbits
 	typeset -i x
+	typeset tempaddr
 	
 	maskbits=${addr/*\//}
 	if [ "$maskbits" = "$addr" ]; then
@@ -164,6 +165,25 @@ ipv6_expand()
 		addr=${addr/\/*/}
 	fi
 
+	# grab each hex quad and expand it to 4 digits if it isn't already
+	# leave doublecolon in place for expansion out to the proper number of zeros later
+	tempaddr=""
+	for count in `seq 1 8`; do
+		quad=`echo $addr|awk -v count=$count -F : '{print $count}'`
+		quadlen=${#quad}
+		if [ $quadlen -eq 0 ]; then
+			quad=::
+		elif [ $quadlen -eq 1 ]; then
+			quad=000$quad
+		elif [ $quadlen -eq 2 ]; then
+			quad=00$quad
+		elif [ $quadlen -eq 3 ]; then
+			quad=0$quad
+		fi
+		tempaddr=$tempaddr$quad
+	done
+	addr=$tempaddr
+
 	# use space as placeholder
 	addr=${addr/::/\ }
 
@@ -711,8 +731,22 @@ check_interface_up()
 {
 	declare dev
 	declare addr=${2/\/*/}
+	declare currentAddr caExpanded
+
+	if [ "$1" == "inet6" ]; then
+		addrExpanded=$(ipv6_expand $addr)
+		for currentAddr in `/sbin/ip -f $1 -o addr|awk '{print $4}'`; do
+			caExpanded=$(ipv6_expand $currentAddr)
+			caExpanded=${caExpanded/\/*/}
+			if [ "$addrExpanded" == "$caExpanded" ]; then
+				dev=$(/sbin/ip -f $1 -o addr | grep " ${currentAddr/\/*/}" | awk '{print $2}')
+				break
+			fi
+		done
+	else
+		dev=$(/sbin/ip -f $1 -o addr | grep " $addr/" | awk '{print $2}')
+	fi
 
-	dev=$(/sbin/ip -f $1 -o addr | grep " $addr/" | awk '{print $2}')
 	if [ -z "$dev" ]; then
 		return 1
 	fi
@@ -730,12 +764,26 @@ address_configured()
 {
 	declare line
 	declare addr
+	declare currentAddr caExpanded
 
 	# Chop off maxk bits 
 	addr=${2/\/*/}
-        line=$(/sbin/ip -f $1 -o addr | grep " $addr/")
 
-        if [ -z "$line" ]; then
+	if [ "$1" == "inet6" ]; then
+		addrExpanded=$(ipv6_expand $addr)
+		for currentAddr in `/sbin/ip -f $1 -o addr|awk '{print $4}'`; do
+			caExpanded=$(ipv6_expand $currentAddr)
+			caExpanded=${caExpanded/\/*/}
+			if [ "$addrExpanded" == "$caExpanded" ]; then
+				line=$(/sbin/ip -f $1 -o addr | grep " ${currentAddr/\/*/}");
+				break
+			fi
+		done
+	else
+		line=$(/sbin/ip -f $1 -o addr | grep " $addr/")
+	fi
+
+	if [ -z "$line" ]; then
 		return 1
 	fi
 	return 0
@@ -751,13 +799,26 @@ ip_op()
 	declare dev
 	declare rtr
 	declare addr=${3/\/*/}
-	
+	declare caExpanded currentAddr
 
 	if [ "$2" = "status" ]; then
 
 		ocf_log debug "Checking $3, Level $OCF_CHECK_LEVEL"
 	
-		dev=$(/sbin/ip -f $1 -o addr | grep " $addr/" | awk '{print $2}')
+		if [ "$1" == "inet6" ]; then
+			addrExpanded=$(ipv6_expand $addr)
+			for currentAddr in `/sbin/ip -f $1 -o addr|awk '{print $4}'`; do
+				caExpanded=$(ipv6_expand $currentAddr)
+				caExpanded=${caExpanded/\/*/}
+				if [ "$addrExpanded" == "$caExpanded" ]; then
+					dev=$(/sbin/ip -f $1 -o addr | grep " ${currentAddr/\/*/}" | awk '{print $2}')
+					break
+				fi
+			done
+		else
+			dev=$(/sbin/ip -f $1 -o addr | grep " $addr/" | awk '{print $2}')
+		fi
+
 		if [ -z "$dev" ]; then
 			ocf_log warn "$3 is not configured"
 			return 1
@@ -788,6 +849,19 @@ ip_op()
 		return $?
 		;;
 	inet6)
+		if [ "$2" = "del" ]; then
+			addrExpanded=$(ipv6_expand $addr)
+			for currentAddr in `/sbin/ip -f $1 -o addr|awk '{print $4}'`; do
+				caExpanded=$(ipv6_expand $currentAddr)
+				caExpanded=${caExpanded/\/*/}
+				if [ "$addrExpanded" == "$caExpanded" ]; then
+					addr6=$(/sbin/ip -f $1 -o addr | grep " ${currentAddr/\/*/}" | awk '{print $4}')
+					ipv6 $2 $addr6
+					return $?
+				fi
+			done
+		fi
+
 		ipv6 $2 $3
 		return $?
 		;;


More information about the cluster-commits mailing list