#! /bin/bash
#
# Wrapper around ip link command that handles IPv4, IPv6 and DHCP
# This is done in shell rather than perl to avoid the overhead of recompilation

if [ $# -ne 3 ]; then
    echo "Usage: $0 {add|delete} interface address"
    exit 1
fi

case $1 in
    add)
        if [[ "$3" = "dhcp" ]]; then
            exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=start
        elif [[ "$3" = "dhcpv6" ]]; then
            exec /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --start -ifname "$2"
        elif [[ "$3" =~ ":" ]]; then
            # Ipv6 address
            if ! ip -6 addr list dev $2 | grep -q $3; then
                exec sudo ip -6 addr add "$3" dev "$2"
            fi
        else
            if ! ip addr list dev $2 | grep -q $3; then
                exec sudo ip addr add "$3" broadcast + dev "$2"
            fi
        fi ;;

    delete)
        # Get current address from interface when using DHCP
        if [[ "$3" = "dhcp" ]]; then
            lease_file=/var/lib/dhcp/dhclient_"$(echo $2 | sed -e 's/\./_/')".leases;
            ip=$(sed -n 's/^\s\sfixed-address\s\(.*\);/\1/p' $lease_file | sed -n '$p');
            #ip_address=$(sed -n 's/^\s\sfixed-address\s\(.*\);/\1/p' $lease_file | sed -n '$p');
            # T1053 we need IP/prefix for normalize-ip to function
            ip_address=$(ip a s dev $2 | grep "inet $ip" | awk '{print $2}')
        elif [[ "$3" = "dhcpv6" ]]; then
            lease_file=/var/lib/dhcp/dhclient_v6_"$(echo $2 | sed -e 's/\./_/')".leases;
            ip_address=$(sed -n 's/^\s\s\s\siaaddr\s\(.*\)\s{/\1/p' $lease_file | sed -n '$p');
        else
            ip_address=$3;
        fi
        if [[ "$ip_address" = "" ]]; then
            ip_address='0.0.0.0/0'
        fi

        ### T1053 parameter $ip_address needs to be prefixed, not just the IP
        ip_address=$(/usr/libexec/vyos/system/normalize-ip $ip_address)

        if ! ip address show dev $2 2>/dev/null | grep -q "$ip_address"; then
            # Address doesn't exist there, nothing to delete
            exit 0
        fi

        if [ ! -d "/sys/class/net/$2" ]; then
            # device is already gone
            exit 0
        elif [[ "$3" = "dhcp" ]]; then
            exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=stop
        elif [[ "$3" = "dhcpv6" ]]; then
            exec /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --stop --ifname "$2"
        elif [[ "$3" =~ ":" ]]; then
            exec sudo ip -6 addr del "$ip_address" dev "$2"
        else
            exec sudo ip addr del "$ip_address" dev "$2"
        fi ;;
    *)
        echo "Unknown option $1"
        exit 1 ;;
esac
