#!/bin/bash
# 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 ifnamea   #NOTE: the add/delete will be
#                 obsoleted, using 'replace' is recommended.
#          routeop replace net mask gateway ifname   #NOTE: it only works for sles so far
#                 net - IP of net like 192.168.1.0. The keyword
#                       'default' is used to set the default route.
#                 mask - The length of the netmask (CIDR) like 8,16,24 OR
#                       the dotted-decimal format like 255.255.0.0
#                 gateway - The next hop. It could be set to 0.0.0.0 for omitting
#                 ifname - The interface to route to the next hop
#=head3 example
#        routeop replace default 0 10.1.0.209 eth0
#        routeop replace 50.1.0.0 16 10.1.0.210 eth0
#        routeop replace 60.1.1.0 24 0.0.0.0 eth0
#        routeop replace 70.1.1.0 24 10.1.0.211    #NOTE: this is NOT supported for redhat
#=cut
#-------------------------------------------------------------------------------


if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then
   str_dir_name=`dirname $0`
   . $str_dir_name/xcatlib.sh
fi

op=$1

net=$2
mask=$3
gw=$4
if [ -n "$5" ]; then
    ifname=$5
fi

# use nummask to know whether the netmask format is 255.255.255.0 or CIDR (a number)
nummask=0
echo $mask | egrep "^[.0123456789]+$" > /dev/null
if [ $? -ne 0 ]; then
    echo "Error: invalid format of netmask $mask."
    exit 1
else
    echo $mask | egrep "^[0123456789]+$" > /dev/null
    if [ $? -eq 0 ]; then # only has digital
        nummask=1    # the netmask is the length of network mask.
        if [ $mask -ge 128 ]; then
            echo "Error: invalid format of netmask $mask."
            exit 1
        fi
    fi
fi



function debianpreconf(){
    #create the config sub dir
    if [ ! -d "/etc/network/interfaces.d" ];then
        mkdir -p "/etc/network/interfaces.d"
    fi
    #search xcat flag
    XCATFLAG=`grep "#XCAT_CONFIG" /etc/network/interfaces`
    if [ -n "$XCATFLAG" ];then
        return
    fi

    #back up the old interface configure
    if [ ! -e "/etc/network/interfaces.bak" ];then
        mv /etc/network/interfaces /etc/network/interfaces.bak
    fi

    #create the new config file
    echo "#XCAT_CONFIG" > /etc/network/interfaces
    echo "source /etc/network/interfaces.d/*" >> /etc/network/interfaces

    CONFFILE=''

    #read the backfile
    cat /etc/network/interfaces.bak | while read LINE
    do
        if [ ! "$LINE" ];then
            continue
        fi
        FIRSTCHAR=${LINE:0:1}
        if [ $FIRSTCHAR = '#' ];then
            continue
        fi

        CONFTYPE=`echo $LINE | cut -d" " -f1`
        if [ $CONFTYPE = 'auto' -o $CONFTYPE = 'allow-hotplug' ];then
            LINE=${LINE#$CONFTYPE}
            for NICNAME in $LINE; do
                echo "$CONFTYPE $NICNAME" > "/etc/network/interfaces.d/$NICNAME"
            done
        elif [ $CONFTYPE = 'iface' -o $CONFTYPE = 'mapping' ];then
            #find out the nic name, should think about the eth0:1
            NICNAME=`echo $LINE | cut -d" " -f 2 | cut -d":" -f 1`
            CONFFILE="/etc/network/interfaces.d/$NICNAME"
            if [ ! -e $CONFFILE ];then
                echo "auto $NICNAME" > $CONFFILE
            fi

            #write lines into the conffile
            echo $LINE >> $CONFFILE
        else
            echo $LINE >> $CONFFILE
        fi

    done
}

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`
                    ifname1=`echo $x|cut -d',' -f8`
                    if [ "$net" = "$net1" ] && [ "$mask" = "$mask1" ] && [ "$gw" = "$gw1" ] && [ "$ifname" = "$ifname1"  ]; 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
}

# handle the route replace operation that adding the setting to configuration file 
replace_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"
    else
        OS_name="debian"
    fi

    # The replace operation does not support debain so far
    if [ "$OS_name" != "redhat" ] && [ "$OS_name" != "sles" ]; then
        echo "Warning: replace operation only supports to add persistent route for sles and redhat by now."
        return
    fi

    # set the destination of the route for searching in the route configuration file
    if [ "$net" = "default" ]; then
        routedest="default"
        routedest1="default"
    else
        routedest="$net/$mask"
        routedest1="$net\/$mask"
    fi
    
    case $OS_name in
        sles)
        filename="/etc/sysconfig/network/routes";
        if echo $net | grep : 2>&1 1>/dev/null
        then
            # for ipv6
            if [ "$gw" = "" -o "$gw" = "::" ] ; then
                route="$net/$mask :: - $ifname"
                route1="$net\/$mask :: - $ifname";
            else
                route="$net/$mask $gw - -"
                route1="$net\/$mask $gw - -";
            fi
        else
            # for ipv4
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                if [ "$net" = "default" ]; then
                    route="default - - $ifname";
                    route1="default - - $ifname";
                else
                    route="$net/$mask - - $ifname";
                    route1="$net\/$mask - - $ifname";
                fi
            else
                if [ "$net" = "default" ]; then
                    route="default $gw - $ifname";
                    route1="default $gw - $ifname";
                else
                    route="$net/$mask $gw - $ifname";
                    route1="$net\/$mask $gw - $ifname";
                fi
            fi
        fi
        if [ -f $filename ]; then
            egrep "^$routedest" $filename 2>&1 1>/dev/null
            if [ $? -ne 0 ]; then #route does not exist
                echo $route >> $filename
                echo "Persistent route \"$route\" has been added in $filename."
            else 
                # replace it
                sed -i -e "s/$routedest1.*/$route1/g" $filename
                echo "Persistent route \"$route\" has been replaced in $filename."
            fi
        else
            echo "$route" > $filename
            echo "Persistent route \"$route\" has been added in $filename."
        fi
        ;;

        redhat)
        #echo "rh/fedora/centos"
        if [ -z "$ifname" ]; then
            echo "Error: the device name is necessary to configure static route."
            return
        fi
        
        if echo $net | grep : 2>&1 1>/dev/null
        then
            # ipv6
            filename="/etc/sysconfig/network-scripts/route6-$ifname"
            if [ "$gw" = "" -o "$gw" = "::" ] ; then
                route="$net/$mask dev $ifname"
                route1="$net\/$mask dev $ifname"
            else
                route="$net/$mask via $gw"
                route1="$net\/$mask via $gw"
            fi
        else
            # ipv4
            filename="/etc/sysconfig/network-scripts/route-$ifname"
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                route="$net/$mask dev $ifname"
                route1="$net\/$mask dev $ifname"
            else
                route="$net/$mask via $gw"
                route1="$net\/$mask via $gw"
            fi
        fi
        if [ -f $filename ]; then
            egrep "^$routedest" $filename 2>&1 1>/dev/null
            if [ $? -ne 0 ]; then #route does not exist
                echo $route >> $filename
                echo "Persistent route \"$route\" has been added in $filename."
            else 
                # replace it
                sed -i -e "s/$routedest1.*/$route1/g" $filename
                echo "Persistent route \"$route\" has been replaced in $filename."
            fi
        else
            echo "$route" > $filename
            echo "Persistent route \"$route\" has been added in $filename."
        fi
        ;;
        
        debian)
            debianpreconf
            matchstr=""
            v6flag=0
            #on debian/ubuntu need the network device name
            if [ ! $ifname ];then
                ifname=`netstat -nr | grep "$net" | awk '{print $8}' | head -1`
            fi
            filename="/etc/network/interfaces.d/$ifname"

            if [ ! -f $filename ];then
                echo "auto $ifname" > $filename
                echo "iface $ifname inet dhcp" >> $filename
            fi
            echo $net | grep : 2>&1 1>/dev/null
            #ipv6
            if [ $? -eq 0 ];then
        if [ "$gw" = "" -o "$gw" = "::" ] ; then
                    matchstr="$net/$mask dev $ifname"
        else
                    matchstr="$net/$mask gw $gw"
                fi
                v6flag=1
            else
        if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                    matchstr="net $net netmask $mask dev $ifname"
        else
                    matchstr="net $net netmask $mask gw $gw"
        fi
            fi

            grep "$matchstr" $filename 2>&1 1>/dev/null
            if [ $? -ne 0 ];then
                foundflag=0
                tempfile="/etc/network/interfaces.d/tmp"
                while read LINE
                do
                    echo $LINE | grep "iface" 2>&1 1>/dev/null
                    if [ $? -eq 0 -a $foundflag -eq 1 ];then
                        foundflag=0
                        if [ $v6flag -eq 1 ];then
                    if [ "$gw" = "" -o "$gw" = "::" ] ; then
                                echo "  up route -A inet6 add $net/$mask dev $ifname" >> $tempfile
                                echo "  down route -A inet6 del $net/$mask dev $ifname" >> $tempfile
                else
                                echo "  up route -A inet6 add $net/$mask gw $gw" >> $tempfile
                                echo "  down route -A inet6 del $net/$mask gw $gw" >> $tempfile
                    fi
                        else
                    if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                    echo "  up route add -net $net netmask $mask dev $ifname" >> $tempfile
                    echo "  down route del -net $net netmask $mask dev $ifname" >> $tempfile
                else
                                echo "  up route add -net $net netmask $mask gw $gw" >> $tempfile
                                echo "  down route del -net $net netmask $mask gw $gw" >> $tempfile
                fi
                        fi
                    fi
                    echo $LINE | grep "iface $ifname " 2>&1 1>/dev/null
                    #this is the last line of the device
                    if [ $? -eq 0 ];then
                        foundflag=1
                    fi

                    echo $LINE >> $tempfile
                done < $filename
                #the insert place is the last line of the config file
                if [ $foundflag -eq 1 ];then
                    if [ $v6flag -eq 1 ];then
                if [ "$gw" = "" -o "$gw" = "::" ] ; then
                            echo "  up route -A inet6 add $net/$mask dev $ifname" >> $tempfile
                            echo "  down route -A inet6 del $net/$mask dev $ifname" >> $tempfile
            else
                            echo "  up route -A inet6 add $net/$mask gw $gw" >> $tempfile
                            echo "  down route -A inet6 del $net/$mask gw $gw" >> $tempfile
            fi
                    else
                if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                echo "  up route add -net $net netmask $mask dev $ifname" >> $tempfile
                echo "  down route del -net $net netmask $mask dev $ifname" >> $tempfile
            else
                            echo "  up route add -net $net netmask $mask gw $gw" >> $tempfile
                            echo "  down route del -net $net netmask $mask gw $gw" >> $tempfile
            fi
                    fi 
                fi
                mv -f $tempfile $filename
                echo "Persistent route \"$matchstr\" added in $filename."
            else
                echo "Persisten route \"$match\" already exists in $filename"
            fi
        ;;
        
    esac
    else #AIX
    echo "Adding persistent route on AIX is not supported yet."
    fi
}

# handle the route add operation that adding the setting to configuration file 
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"
    else
        OS_name="debian"
    fi

    # The replace operation does not support redhat and debain so far
    if [ "$op" = "replace" ]; then
        if [ "$OS_name" = "redhat" -o "$OS_name" = "debain" ]; then
            echo "Warning: replace operation only supports to add persistent route for sles by now."
            return
        fi  
    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
            if [ "$gw" = "" -o "$gw" = "::" ] ; then
                route="$net/$mask :: - $ifname"
                route1="$net\/$mask :: - $ifname";
            else
                route="$net/$mask $gw - -"
                route1="$net\/$mask $gw - -";
            fi
        else
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                if [ $nummask -eq 1 ]; then
                    if [ "$net" = "default" ]; then
                        route="default - - $ifname";
                        route1="default - - $ifname";
                    else
                        route="$net/$mask - - $ifname";
                        route1="$net\/$mask - - $ifname";
                    fi
                else
                    route="$net 0.0.0.0 $mask $ifname";
                    route1="$net 0.0.0.0 $mask $ifname";
                fi
            else
                if [ $nummask -eq 1 ]; then
                    if [ "$net" = "default" ]; then
                        route="default $gw - $ifname";
                        route1="default $gw - $ifname";
                    else
                        route="$net/$mask $gw - $ifname";
                        route1="$net\/$mask $gw - $ifname";
                    fi
                else
                    route="$net $gw $mask $ifname";
                    route1="$net $gw $mask $ifname";
                fi
            fi
        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

        ;;
        debian)
            debianpreconf
            matchstr=""
            v6flag=0
            #on debian/ubuntu need the network device name
            if [ ! $ifname ];then
                ifname=`netstat -nr | grep "$net" | awk '{print $8}' | head -1`
            fi
            filename="/etc/network/interfaces.d/$ifname"

            if [ ! -f $filename ];then
                echo "auto $ifname" > $filename
                echo "iface $ifname inet dhcp" >> $filename
            fi
            echo $net | grep : 2>&1 1>/dev/null
            #ipv6
            if [ $? -eq 0 ];then
        if [ "$gw" = "" -o "$gw" = "::" ] ; then
                    matchstr="$net/$mask dev $ifname"
        else
                    matchstr="$net/$mask gw $gw"
                fi
                v6flag=1
            else
        if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                    matchstr="net $net netmask $mask dev $ifname"
        else
                    matchstr="net $net netmask $mask gw $gw"
        fi
            fi

            grep "$matchstr" $filename 2>&1 1>/dev/null
            if [ $? -ne 0 ];then
                foundflag=0
                tempfile="/etc/network/interfaces.d/tmp"
                while read LINE
                do
                    echo $LINE | grep "iface" 2>&1 1>/dev/null
                    if [ $? -eq 0 -a $foundflag -eq 1 ];then
                        foundflag=0
                        if [ $v6flag -eq 1 ];then
                    if [ "$gw" = "" -o "$gw" = "::" ] ; then
                                echo "  up route -A inet6 add $net/$mask dev $ifname" >> $tempfile
                                echo "  down route -A inet6 del $net/$mask dev $ifname" >> $tempfile
                else
                                echo "  up route -A inet6 add $net/$mask gw $gw" >> $tempfile
                                echo "  down route -A inet6 del $net/$mask gw $gw" >> $tempfile
                    fi
                        else
                    if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                    echo "  up route add -net $net netmask $mask dev $ifname" >> $tempfile
                    echo "  down route del -net $net netmask $mask dev $ifname" >> $tempfile
                else
                                echo "  up route add -net $net netmask $mask gw $gw" >> $tempfile
                                echo "  down route del -net $net netmask $mask gw $gw" >> $tempfile
                fi
                        fi
                    fi
                    echo $LINE | grep "iface $ifname " 2>&1 1>/dev/null
                    #this is the last line of the device
                    if [ $? -eq 0 ];then
                        foundflag=1
                    fi

                    echo $LINE >> $tempfile
                done < $filename
                #the insert place is the last line of the config file
                if [ $foundflag -eq 1 ];then
                    if [ $v6flag -eq 1 ];then
                if [ "$gw" = "" -o "$gw" = "::" ] ; then
                            echo "  up route -A inet6 add $net/$mask dev $ifname" >> $tempfile
                            echo "  down route -A inet6 del $net/$mask dev $ifname" >> $tempfile
            else
                            echo "  up route -A inet6 add $net/$mask gw $gw" >> $tempfile
                            echo "  down route -A inet6 del $net/$mask gw $gw" >> $tempfile
            fi
                    else
                if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                echo "  up route add -net $net netmask $mask dev $ifname" >> $tempfile
                echo "  down route del -net $net netmask $mask dev $ifname" >> $tempfile
            else
                            echo "  up route add -net $net netmask $mask gw $gw" >> $tempfile
                            echo "  down route del -net $net netmask $mask gw $gw" >> $tempfile
            fi
                    fi 
                fi
                mv -f $tempfile $filename
                echo "Persistent route \"$matchstr\" added in $filename."
            else
                echo "Persisten route \"$match\" already exists in $filename"
            fi
        ;;
        redhat)
        #echo "rh/fedora/centos"
        # ipv6 net
        if echo $net | grep : 2>&1 1>/dev/null
        then
            if [ "$gw" = "" ] ; then
            $gw = "::";
            fi
            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";
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
               route="any net $net netmask $mask dev $ifname";
               route1="any net $net netmask $mask dev $ifname";
        else
               route="any net $net netmask $mask gw $gw $ifname";
               route1="any net $net netmask $mask gw $gw $ifname";
        fi
        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"
    else
        OS_name="debian"
    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
        if [ $gw = "" -o $gw = "::" ] ; then
                route="$net/$mask :: - $ifname";
                route1="$net\/$mask :: - $ifname";
        else
                route="$net/$mask $gw - -";
                route1="$net\/$mask $gw - -";
        fi
        else
        if [ $gw = "" ] ; then
            $gw = "0.0.0.0";
            fi
            if [ -n "$ifname" ]; then
                route="$net $gw $mask $ifname";
                route1="$net $gw $mask $ifname";
            else
                route="$net $gw $mask -";
                route1="$net $gw $mask -";
            fi
        fi
        if [ -f $filename ]; then
            grep "$route" $filename 2>&1 1>/dev/null
            if [ $? -ne 0 ]; then # Does not exist in file
                echo "Persistent route \"$route\" does not exist in $filename."
            else
                sed -i -e s/"$route1"//g $filename
                echo "Persistent route \"$route\" removed from $filename."
            fi
        else
            echo "Persistent route file $filename does not exist."
        fi
        ;;
        debian)
            debianpreconf
            matchstr=""
            v6flag=0
            #on debian/ubuntu need the network device name
            if [ ! $ifname ];then
                ifname=`netstat -nr | grep "$net" | awk '{print $8}'`
            fi
            filename="/etc/network/interfaces.d/$ifname"

            echo $net | grep : 2>&1 1>/dev/null
            #ipv6
            if [ $? -eq 0 ];then
            if [ $gw = "" -o $gw = "::" ] ; then
                    matchstr="$net/$mask dev $ifname"
        else
                    matchstr="$net/$mask gw $gw"
        fi
                v6flag=1
            else
            if [ $gw = "" -o $gw = "0.0.0.0" ] ; then
                    matchstr="net $net netmask $mask dev $ifname"
        else
                    matchstr="net $net netmask $mask gw $gw"
        fi
            fi

            grep "$matchstr" $filename
            if [ $? -eq 0 ];then
                sed -i -e "/$matchstr/d" $filename
                echo "Persistent route \"$matchstr\" removed from $filename."
            else
                echo "Persistent route \"$matchstr\" does not exist in $filename."
            fi
        ;;
        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
            if [ "$gw" = "" -o "$gw" = "::" ] ; then
                route="$ifname $net\/$mask ::"
                route1="$ifname $net/$mask ::"
        else
                route="$ifname $net\/$mask $gw"
                route1="$ifname $net/$mask $gw"
        fi
        else
            filename="/etc/sysconfig/static-routes";
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
               route="any net $net netmask $mask dev $ifname";
               route1="any net $net netmask $mask dev $ifname";
            else
               route="any net $net netmask $mask gw $gw $ifname";
               route1="any net $net netmask $mask gw $gw $ifname";
            fi
        fi
        if [ -f $filename ]; then
            grep "$route" $filename 2>&1 1>/dev/null
            if [ $? -ne 0 ]; then # Does not exist in file
                echo "Persistent route \"$route1\" does not exist in $filename."
            else
                sed -i -e s/"$route"//g $filename
                echo "Persistent route \"$route1\" removed from $filename."
            fi
        else
            echo "Persistent route file $filename does not exist."
        fi
        ;;
    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
            if [ "$gw" = "" -o "$gw" = "::" ] ; then
                    cmd="ip -6 route add $net/$mask dev $ifname"
        else
                    cmd="ip -6 route add $net/$mask via $gw"
        fi
            else 
                # AIX TODO 
                cmd="ip -6 route add $net/$mask via $gw"
            fi
        else
            if [ "$(uname -s)" = "Linux" ]; then
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                    cmd="route add -net $net netmask $mask dev $ifname"
        else
                    cmd="route add -net $net netmask $mask gw $gw"
        fi
            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."
            if [ -f "/etc/debian_version" ];then
                exit 1;
            fi
        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
            if [ "$gw" = "" -o "$gw" = "::" ] ; then
                    cmd="ip -6 route delete $net/$mask dev $ifname"
        else
                    cmd="ip -6 route delete $net/$mask via $gw"
        fi
            else 
                # AIX TODO
                cmd="ip -6 route delete $net/$mask via $gw"
            fi
        else
            if [ "$(uname -s)" = "Linux" ]; then
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                    cmd="route delete -net $net netmask $mask dev $ifname"
        else
                    cmd="route delete -net $net netmask $mask gw $gw"
        fi
            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
elif [ "$op" = "replace" ]; then
    if [ $nummask -ne 1 ]; then
        mask=$(v4mask2prefix $mask)
    fi
    
    if echo $net | grep : 2>&1 1>/dev/null
    then # ipv6
        if [ "$(uname -s)" = "Linux" ]; then
            if [ "$gw" = "" -o "$gw" = "::" ] ; then
                if [ "$net" = "default" ]; then
                    cmd="ip -6 route replace default dev $ifname"
                else
                    cmd="ip -6 route replace $net/$mask dev $ifname"
                fi
            else
                if [ "$net" = "default" ]; then
                    cmd="ip -6 route replace default via $gw"
                else
                    cmd="ip -6 route replace $net/$mask via $gw"
                fi
            fi
        fi
    else #ipv4
        if [ "$(uname -s)" = "Linux" ]; then
            if [ "$gw" = "" -o "$gw" = "0.0.0.0" ] ; then
                if [ "$net" = "default" ]; then
                    cmd="ip route replace default dev $ifname"
                else
                    cmd="ip route replace $net/$mask dev $ifname"
                fi
            else
                if [ "$net" = "default" ]; then
                    cmd="ip route replace default via $gw"
                else
                    cmd="ip route replace $net/$mask via $gw"
                fi
            fi
        fi
    fi
    
    echo "Adding temporary route: $cmd"
    result=`$cmd 2>&1`
    code=$?
    if [ $code -ne 0 ]; then
        logger -t xCAT -p local4.err "Error: $cmd [error code=$code, result=$result]"
        echo "Error: $cmd [error code=$code, result=$result]"
        exit 1;
    fi
    
    #replace the persistent route
    replace_persistent_route $net $mask $gw $ifname
fi

exit 0