git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@14966 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			261 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			6.4 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)
 | 
						|
 | 
						|
    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
 | 
						|
    
 | 
						|
    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"
 | 
						|
		filename="/etc/sysconfig/network/routes";
 | 
						|
		route="$net $gw $mask $ifname";
 | 
						|
		if [ -f $filename ]; then
 | 
						|
		    grep "$route" $filename
 | 
						|
		    if [ $? -ne 0 ]; then #route does not exist
 | 
						|
			grep "$xcat_config_start" $filename
 | 
						|
			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"/"$route\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"
 | 
						|
		filename="/etc/sysconfig/static-routes";
 | 
						|
		route="any net $net netmask $mask gw $gw $ifname";
 | 
						|
		if [ -f $filename ]; then
 | 
						|
		    grep "$route" $filename
 | 
						|
		    if [ $? -ne 0 ]; then #route does not exist
 | 
						|
			grep "$xcat_config_start" $filename
 | 
						|
			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"/"$route\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";
 | 
						|
		route="$net $gw $mask $ifname";
 | 
						|
		if [ -f $filename ]; then
 | 
						|
		    sed -i -e s/"$route"//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"
 | 
						|
		filename="/etc/sysconfig/static-routes";
 | 
						|
		route="any net $net netmask $mask gw $gw $ifname";
 | 
						|
		if [ -f $filename ]; then
 | 
						|
		    sed -i -e s/"$route"//g $filename
 | 
						|
		fi
 | 
						|
		echo "Persistent route \"$route\" 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
 | 
						|
	if [ "$(uname -s)" = "Linux" ]; then
 | 
						|
	    cmd="route add -net $net netmask $mask gw $gw"
 | 
						|
	else 
 | 
						|
	    cmd="route add -net $net -netmask $mask $gw"
 | 
						|
	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
 | 
						|
	echo "The temporary route ($net $mask $gw) already exists."
 | 
						|
    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
 | 
						|
	if [ "$(uname -s)" = "Linux" ]; then
 | 
						|
	    cmd="route delete -net $net netmask $mask gw $gw"
 | 
						|
	else 
 | 
						|
	    cmd="route delete -net $net -netmask $mask $gw"
 | 
						|
	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
 |