git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/branches/2.8@15319 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			338 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			338 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| # IBM(c) 2011EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| 
 | |
| #-------------------------------------------------------------------------------
 | |
| #=head1  routeop  
 | |
| #=head2  routeop is called by makeroutes command and setuproutes postscript to
 | |
| #        setup a route on a node.    
 | |
| #        The syntax is:
 | |
| #          routeop add/delete net mask gateway ifname
 | |
| #=cut
 | |
| #-------------------------------------------------------------------------------
 | |
| 
 | |
| op=$1
 | |
| 
 | |
| net=$2
 | |
| mask=$3
 | |
| gw=$4
 | |
| if [ -n "$5" ]; then
 | |
|     ifname=$5
 | |
| fi
 | |
| 
 | |
| 
 | |
| route_exists()
 | |
| {
 | |
|     net=$1
 | |
|     mask=$2
 | |
|     gw=$3
 | |
|     ret=0
 | |
| 
 | |
|     if [ -n "$4" ]; then
 | |
| 	ifname=$4
 | |
|     fi
 | |
| 
 | |
|     os_type=$(uname -s)
 | |
| 
 | |
|     # ipv6
 | |
|     if echo $net | grep : 2>&1 1>/dev/null
 | |
|     then
 | |
|         result=`ip -6 route show $net/$mask`
 | |
|         if [ $? -ne 0 ] || [ -z "$result" ]
 | |
|         then
 | |
|             ret=0
 | |
|         else
 | |
|             ret=1
 | |
|         fi
 | |
|     else
 | |
|         result=`netstat -nr|grep $net`;
 | |
|         if [ $? -eq 0 ] && [ -n "$result" ]; then
 | |
| 	        for x in `echo "$result"|tr -s " " ","`
 | |
|        	        do
 | |
| 	            if [ "$os_type" = "Linux" ]; then
 | |
| 	     	        net1=`echo $x|cut -d',' -f1`
 | |
| 		            gw1=`echo $x|cut -d',' -f2`
 | |
| 		            mask1=`echo $x|cut -d',' -f3`
 | |
| 		            if [ "$net" = "$net1" ] && [ "$mask" = "$mask1" ] && [ "$gw" = "$gw1" ]; then
 | |
| 		                ret=1
 | |
| 		                break
 | |
| 		            fi
 | |
| 	            else
 | |
| 	        	    tmp1=`echo $x|cut -d',' -f1`
 | |
| 		            gw1=`echo $x|cut -d',' -f2`
 | |
| 
 | |
|                     n1=`echo $net |cut -d'.' -f1`	        
 | |
|                     n2=`echo $net |cut -d'.' -f2`	        
 | |
|                     n3=`echo $net |cut -d'.' -f3`	        
 | |
|                     n4=`echo $net |cut -d'.' -f4`
 | |
| 
 | |
| 		            netnum="$(( ($n1 << 24) + ($n2 << 16) + ($n3 << 8) + $n4 ))"
 | |
|                     bits=32
 | |
| 		            while [ `expr $netnum % 2` -eq 0 ]
 | |
| 		            do
 | |
| 		                bits="$(( $bits - 1 ))"
 | |
| 		                netnum="$(( $netnum >> 1 ))"
 | |
| 		            done
 | |
|                 
 | |
|                     tmp2="$net/$bits";
 | |
| 		            #echo "$tmp2=$tmp2"
 | |
| 		            if [ "$tmp1" = "$tmp2" ] && [ "$gw" = "$gw1" ]; then
 | |
| 		                ret=1
 | |
| 		                break
 | |
| 		            fi
 | |
| 	            fi
 | |
| 	            done
 | |
|         fi
 | |
|     fi
 | |
|     
 | |
|     echo $ret
 | |
| }
 | |
| 
 | |
| add_persistent_route() 
 | |
| {
 | |
|     net=$1;
 | |
|     mask=$2;
 | |
|     gw=$3;
 | |
|     if [ -n "$4" ]; then
 | |
| 	ifname=$4
 | |
|     fi
 | |
| 
 | |
|     xcat_config_start="# xCAT_CONFIG_START";
 | |
|     xcat_config_end="# xCAT_CONFIG_END";
 | |
| 
 | |
|     if [ "$(uname -s)" = "Linux" ]; then
 | |
| 	#determine the os name
 | |
| 	OS_name="something"
 | |
| 	if [ -f /etc/redhat-release ]
 | |
| 	then
 | |
|             OS_name="redhat"  #it can be RedHatFerdora or CentOS
 | |
| 	elif [ -f /etc/SuSE-release ]
 | |
| 	then
 | |
|             OS_name="sles"
 | |
| 	fi
 | |
| 
 | |
| 	case $OS_name in
 | |
| 	    sles)
 | |
| 		#echo "sles"
 | |
|         # ipv6 net
 | |
| 		filename="/etc/sysconfig/network/routes";
 | |
|         if echo $net | grep : 2>&1 1>/dev/null
 | |
|         then
 | |
|             route="$net/$mask $gw - -"
 | |
|             route1="$net\/$mask $gw - -";
 | |
|         else
 | |
| 		    route="$net $gw $mask $ifname";
 | |
| 		    route1="$net $gw $mask $ifname";
 | |
|         fi
 | |
| 		if [ -f $filename ]; then
 | |
| 		    grep "$route" $filename 2>&1 1>/dev/null
 | |
| 		    if [ $? -ne 0 ]; then #route does not exist
 | |
| 			grep "$xcat_config_start" $filename 2>&1 1>/dev/null
 | |
| 			if [ $? -ne 0 ]; then #no xCAT section
 | |
| 			    echo $xcat_config_start >> $filename
 | |
| 			    echo $route >> $filename
 | |
| 			    echo $xcat_config_end >> $filename
 | |
| 			else
 | |
| 			    sed -i -e s/"$xcat_config_end"/"$route1\n$xcat_config_end"/g $filename
 | |
| 			fi
 | |
| 			echo "Persistent route \"$route\" added in $filename."
 | |
| 		    else 
 | |
| 			echo "Persistent route \"$route\" already exists in $filename."
 | |
| 		    fi
 | |
| 		else
 | |
| 		    #echo "got here"
 | |
| 		    echo "$xcat_config_start" > $filename
 | |
| 		    echo "$route" >> $filename
 | |
| 		    echo "$xcat_config_end" >> $filename
 | |
| 		    echo "Route \"$route\" added in $filename."
 | |
| 		fi
 | |
| 
 | |
| 		;;
 | |
| 	    ubuntu*)
 | |
| 		echo "Adding persistent route on Ubuntu is not supported yet."
 | |
| 		;;
 | |
| 	    redhat)
 | |
| 		#echo "rh/fedora/centos"
 | |
|         # ipv6 net
 | |
|         if echo $net | grep : 2>&1 1>/dev/null
 | |
|         then
 | |
| 		    filename="/etc/sysconfig/static-routes-ipv6";
 | |
| 		    route="$ifname $net/$mask $gw";
 | |
|             # $net/mask does not work with sed cmd
 | |
| 		    route1="$ifname $net\/$mask $gw";
 | |
|         else
 | |
| 		    filename="/etc/sysconfig/static-routes";
 | |
| 		    route="any net $net netmask $mask gw $gw $ifname";
 | |
| 		    route1="any net $net netmask $mask gw $gw $ifname";
 | |
|         fi
 | |
| 		if [ -f $filename ]; then
 | |
| 		    grep "$route" $filename 2>&1 1>/dev/null
 | |
| 		    if [ $? -ne 0 ]; then #route does not exist
 | |
| 		        grep "$xcat_config_start" $filename 2>&1 1>/dev/null
 | |
| 		        if [ $? -ne 0 ]; then #no xCAT section
 | |
| 		            echo $xcat_config_start >> $filename
 | |
| 		            echo $route >> $filename
 | |
| 		            echo $xcat_config_end >> $filename
 | |
| 		        else
 | |
| 		            sed -i -e s/"$xcat_config_end"/"$route1\n$xcat_config_end"/g $filename
 | |
| 		        fi
 | |
| 		        echo "Persistent route \"$route\" added in $filename."
 | |
| 		    else 
 | |
| 		        echo "Persistent route \"$route\" already exists in $filename."
 | |
| 		    fi
 | |
| 		else
 | |
| 		        #echo "got here"
 | |
| 		        echo "$xcat_config_start" > $filename
 | |
| 		        echo "$route" >> $filename
 | |
| 		        echo "$xcat_config_end" >> $filename
 | |
| 		        echo "Persistent route \"$route\" added in $filename."
 | |
| 	   fi
 | |
| 	  ;;
 | |
| 	esac
 | |
|     else #AIX
 | |
| 	echo "Adding persistent route on AIX is not supported yet."
 | |
|     fi
 | |
| }
 | |
| 
 | |
| rm_persistent_route() 
 | |
| {
 | |
|     net=$1;
 | |
|     mask=$2;
 | |
|     gw=$3;
 | |
|     if [ -n "$4" ]; then
 | |
| 	ifname=$4
 | |
|     fi
 | |
| 
 | |
|     if [ "$(uname -s)" = "Linux" ]; then
 | |
| 	#determine the os name
 | |
| 	OS_name="something"
 | |
| 	if [ -f /etc/redhat-release ]
 | |
| 	then
 | |
|             OS_name="redhat"  #it can be RedHatFerdora or CentOS
 | |
| 	elif [ -f /etc/SuSE-release ]
 | |
| 	then
 | |
|             OS_name="sles"
 | |
| 	fi
 | |
| 
 | |
| 	case $OS_name in
 | |
| 	    sles)
 | |
| 		#echo "sles"
 | |
| 		filename="/etc/sysconfig/network/routes";
 | |
|         # ipv6 net
 | |
|         if echo $net | grep : 2>&1 1>/dev/null
 | |
|         then
 | |
|             route="$net/$mask $gw - -";
 | |
|             route1="$net\/$mask $gw - -";
 | |
|         else
 | |
| 		    route="$net $gw $mask";
 | |
| 		    route1="$net $gw $mask";
 | |
|         fi
 | |
| 		if [ -f $filename ]; then
 | |
| 		    sed -i -e s/"$route1"//g $filename
 | |
| 		fi
 | |
| 		echo "Persistent route \"$route\" removed from $filename."
 | |
| 		;;
 | |
| 	    ubuntu*)
 | |
| 		echo "Removing persistent route on Ubuntu is not supported yet."
 | |
| 		;;
 | |
| 	    redhat)
 | |
| 		#echo "rh/fedora/centos"
 | |
|         #ipv6
 | |
|         if echo $net | grep : 2>&1 1>/dev/null
 | |
|         then
 | |
|             filename="/etc/sysconfig/static-routes-ipv6";
 | |
|             # $net/$mask does not work with sed
 | |
|             route="$ifname $net\/$mask $gw"
 | |
|             route1="$ifname $net/$mask $gw"
 | |
|         else
 | |
| 		    filename="/etc/sysconfig/static-routes";
 | |
| 		    route="any net $net netmask $mask gw $gw $ifname";
 | |
| 		    route1="any net $net netmask $mask gw $gw $ifname";
 | |
|         fi
 | |
| 		if [ -f $filename ]; then
 | |
| 		    sed -i -e s/"$route"//g $filename
 | |
| 		fi
 | |
| 		echo "Persistent route \"$route1\" removed from $filename."
 | |
| 		;;
 | |
| 	esac
 | |
|     else #AIX
 | |
| 	echo "Removing persistent route on AIX is not supported yet."
 | |
|     fi
 | |
| }
 | |
|    
 | |
| 
 | |
| 
 | |
| if [ "$op" = "add" ]; then
 | |
|     result=$(route_exists $net $mask $gw)
 | |
|     if [ "$result" = "0" ]; then
 | |
|         #ipv6
 | |
|         if echo $net | grep : 2>&1 1>/dev/null
 | |
|         then
 | |
| 	        if [ "$(uname -s)" = "Linux" ]; then
 | |
| 	            cmd="ip -6 route add $net/$mask via $gw"
 | |
| 	        else 
 | |
|                 # AIX TODO 
 | |
| 	            cmd="ip -6 route add $net/$mask via $gw"
 | |
| 	        fi
 | |
|         else
 | |
| 	        if [ "$(uname -s)" = "Linux" ]; then
 | |
| 	            cmd="route add -net $net netmask $mask gw $gw"
 | |
| 	        else 
 | |
| 	            cmd="route add -net $net -netmask $mask $gw"
 | |
|             fi
 | |
| 	    fi
 | |
| 	    echo "Adding temporary route: $cmd"
 | |
| 	    result=`$cmd 2>&1`
 | |
| 	    code=$?
 | |
| 	    if [ $code -ne 0 ]; then
 | |
| 	        logger -t xCAT -p local4.err "$cmd\nerror code=$code, result=$result."
 | |
| 	        echo "  error code=$code, result=$result."
 | |
| 	        #exit 1;
 | |
| 	    fi
 | |
|     else
 | |
|         #ipv6
 | |
|         if echo $net | grep : 2>&1 1>/dev/null
 | |
|         then
 | |
|             echo "The temporary route ($net/$mask $gw) already exists."
 | |
|         else
 | |
| 	        echo "The temporary route ($net $mask $gw) already exists."
 | |
|         fi
 | |
|     fi  
 | |
|   
 | |
|     #add persistent route
 | |
|     add_persistent_route $net $mask $gw $ifname
 | |
| elif [ "$op" = "delete" ]; then
 | |
|     result=$(route_exists $net $mask $gw)
 | |
|     if [ "$result" = "1" ]; then
 | |
|     # ipv6
 | |
|     if echo $net | grep : 2>&1 1>/dev/null
 | |
|     then
 | |
| 	    if [ "$(uname -s)" = "Linux" ]; then
 | |
| 	        cmd="ip -6 route delete $net/$mask via $gw"
 | |
| 	    else 
 | |
|             # AIX TODO
 | |
| 	        cmd="ip -6 route delete $net/$mask via $gw"
 | |
| 	    fi
 | |
|     else
 | |
| 	    if [ "$(uname -s)" = "Linux" ]; then
 | |
| 	        cmd="route delete -net $net netmask $mask gw $gw"
 | |
| 	    else 
 | |
| 	        cmd="route delete -net $net -netmask $mask $gw"
 | |
| 	    fi
 | |
|     fi
 | |
| 
 | |
| 	echo "Removing temporary route: $cmd"
 | |
| 	result=`$cmd 2>&1`
 | |
| 	code=$?
 | |
| 	if [ $code -ne 0 ]; then
 | |
| 	    logger -t xCAT  -p local4.err "$cmd\nerror code=$code, result=$result."
 | |
| 	    echo "  error code=$code, result=$result."
 | |
| 	fi
 | |
|     else
 | |
| 	echo "The temporary route ($net $mask $gw) does not exist."
 | |
|     fi
 | |
| 	
 | |
|     #remove the persistent route
 | |
|     rm_persistent_route $net $mask $gw $ifname
 | |
| fi
 | |
| exit 0
 |