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