Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > media > main-src > by-pkgid > e536fc0c6270ec1d92a0fd41bb1f8360 > files > 41

rgmanager-2.0.52-28.el5_8.2.src.rpm

From 31a310c603936867f651295358e31af6c2714f6a Mon Sep 17 00:00:00 2001
From: Shane Bradley <sbradley@redhat.com>
Date: Tue, 15 Dec 2009 16:55:51 -0500
Subject: [PATCH] rgmanager: Fix ipv6 handling

Resolves: rhbz#533461

Signed-off-by: Lon Hohberger <lhh@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 1e9bb2f..4f7e432 100755
--- a/rgmanager/src/resources/ip.sh
+++ b/rgmanager/src/resources/ip.sh
@@ -175,6 +175,7 @@ ipv6_expand()
 	typeset addr=$1
 	typeset maskbits
 	typeset -i x
+	typeset tempaddr
 	
 	maskbits=${addr/*\//}
 	if [ "$maskbits" = "$addr" ]; then
@@ -184,6 +185,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/::/\ }
 
@@ -732,8 +752,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
@@ -751,12 +785,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
@@ -772,13 +820,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
@@ -809,6 +870,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 $?
 		;;
-- 
1.6.2.5