#!/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
}

result=$(route_exists $net $mask $gw)
if [ "$result" = "0" ]; then
    if [ "$op" = "add" ]; 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 "$cmd"
	result=`$cmd 2>&1`
	code=$?
	if [ $code -ne 0 ]; then
	    logger -t xCAT  "$cmd\nerror code=$code, result=$result."
	    echo "  error code=$code, result=$result."
	    exit 1;
	fi
    else
	echo "The route ($net $mask $gw) does not exist."
    fi
else
    if [ "$op" = "delete" ]; 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 "$cmd"
	result=`$cmd 2>&1`
	code=$?
	if [ $code -ne 0 ]; then
	    logger -t xCAT  "$cmd\nerror code=$code, result=$result."
	    echo "  error code=$code, result=$result."
	    exit 1;
	fi
    else
	echo "The route ($net $mask $gw) already exists."
    fi
fi
exit 0
