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