#!/bin/bash -x

##Support set eip on cvm
##Veriosn:1.0
##Depends:iproute tools
##Provide by QCLOUD 

METADATA=http://metadata.tencentyun.com/latest/meta-data/network/interfaces/macs
DEV=eth0
RC_LOCAL=/etc/rc.local
RT_TABLES=/etc/iproute2/rt_tables

pre_check()
{
    if command -v curl >/dev/null; then
        echo "curl is installed."
    else
        echo "curl is not installed."
        exit 1
    fi
}

user_confirm()
{
    echo "Do you want to continue execute eip direct connection? (y/n)"

    read answer

    if [ "$answer" = "y" ]; then
        echo "Continuing..."
    else
        echo "Exiting..."
        exit 1
    fi
}

get_public_ip_by_mac()
{
    eip=$(curl -m 5 $METADATA/$1/local-ipv4s/$2/public-ipv4)
    if [ $? -ne 0 ] || [ -z $eip ]; then
        echo "get eip failed, pls pass eip." 
        exit 1
    fi
    export eip
}

get_local_ip_by_mac()
{
    local=$(curl -m 5 $METADATA/$1/primary-local-ipv4)
    if [ $? -ne 0 ] || [ -z $local ]; then
        echo "get local ipv4 failed." 
        exit 1
    fi
    
    export local
}

get_hwaddr()
{
    local hwaddr=$(cat /sys/class/net/${DEV}/address 2>/dev/null)
    while test "${hwaddr}" = "00:00:00:00:00:00"; do
        sleep 0.1
        hwaddr=$(cat /sys/class/net/${DEV}/address 2>/dev/null)
    done

    echo $hwaddr
}

get_gateway()
{
    gwip=$(curl -m 5 $METADATA/$hwaddr/local-ipv4s/$local/gateway)
    if [ -z "$gwip" ]; then
        exit 1
    fi
    export gwip
}

set_eip_to_dev()
{
    local eip=$1
    local table=$((${DEV#eth} + 10))
    
    ip addr show dev $DEV | grep -q "$eip" || ip addr add $eip dev $DEV
    [ $? -eq 0 ] || echo set eip to $DEV failed,maybe $eip already exist on $DEV.

    cat $RT_TABLES | grep -q "$table $DEV" || echo "$table $DEV" >> $RT_TABLES

    ip route show table $table | grep -q "default via $gwip dev $DEV" || ip route add default dev $DEV via $gwip src $eip table $table
    ip rule show | grep -q "from $eip lookup" || ip rule add from $eip table $table
}

set_eip_route()
{
    local srcip=$1

    ip route show | grep -q '10.0.0.0/8' || ip route add 10.0.0.0/8 dev eth0 via $gwip
    ip route show | grep -q '100.64.0.0/10' || ip route add 100.64.0.0/10 dev eth0 via $gwip
    ip route show | grep -q '172.16.0.0/12' || ip route add 172.16.0.0/12 dev eth0 via $gwip
    ip route show | grep -q '192.168.0.0/16' || ip route add 192.168.0.0/16 dev eth0 via $gwip
    ip route show | grep -q '169.254.0.0/16' || ip route add 169.254.0.0/16 dev eth0 via $gwip
    ip route show | grep -q '183.60.83.19' || ip route add 183.60.83.19 dev eth0 via $gwip
    ip route show | grep -q '183.60.82.98' || ip route add 183.60.82.98 dev eth0 via $gwip
    ip route show | grep -q '255.255.255.255' || ip route add 255.255.255.255 dev eth0 via $gwip
    ip route del default dev $DEV
    ip route add default via $gwip dev $DEV src $srcip
}

set_svr_cfg()
{
    if [ ! -f "/etc/eip_direct.sh" ]; then
        cp $PWD/eip_direct.sh  /etc/
        chmod +x /etc/eip_direct.sh
    fi
    cat $RC_LOCAL | grep "/etc/eip_direct.sh install $DEV $1"
    [ $? -eq 0 ] && return
    echo "/etc/eip_direct.sh install $DEV $1"  >>  $RC_LOCAL
}

del_private_ip()
{
    local private_ip=$(ip addr show dev $DEV | awk '$1 == "inet" && $3 == "brd" { print $2 }')
    if [ -z $private_ip ]; then
        exit 1
    fi
    ip addr del $private_ip dev $DEV
}

reset_network()
{   
    sed -i '/eip_direct/d'  $RC_LOCAL
    rm /etc/eip_direct.sh
    service network restart
}

case "$1" in
    install)
        DEV=$2
        pre_check
        hwaddr=$(get_hwaddr)
        get_local_ip_by_mac $hwaddr
        get_gateway
        if [ $# -eq 2 ];then
            get_public_ip_by_mac $hwaddr $local
        elif [ $# -eq 3 ];then
            eip=$3
        else
            echo "usage: $0 install ethx [eip]"
            exit 1
        fi
        # user_confirm
        set_eip_to_dev $eip
        set_eip_route $eip
        set_svr_cfg $eip
        # del_private_ip
        ;;
    uninstall)
        reset_network
        ;;
    help|*)
    echo $"usage: 
        $0 {install|uninstall|help} [ethx] [eip]}"
    ;;
esac