#!/usr/bin/env bash
# 
# Copyright 2008-2014 VMware, Inc.  All rights reserved. 
# 

# this command is referenced from vami_announce_net.sh
# and vami_login_textgen.py

export TEXTDOMAINDIR=/opt/vmware/lib/locale
export TEXTDOMAIN=vami_network

export IPV6FILE=/proc/net/if_inet6
export IPV6ADDR=
export IPV6ADDRDEL=
export IPV6DEVICENAME=
export IPV6DEVICENUMBER=
export IPV6PREFIXLEN=
export IPV6SCOPE=
export IPV6INTFLAG=
export IPV6LOCALINKADDR=
export IPV6MACADDR=

interfaces()
{
    sed -n 's/ \+\(eth[0-9]\+\):.*/\1/p' /proc/net/dev | sort
}

# placeholder implementation
default_interface()
{
    /sbin/ifconfig | grep -o -m1 '^eth[0-9]'
}

ip_addr()
{
    /sbin/ifconfig $1 | sed -n 's/.*inet addr:\([^ ][^ ]*\) .*/\1/p'
}

ip6_mac_addr() {
    # Extract the mac address portion from ipv6 local link address.
    IPV6LOCALINKADDR=$(ip -6 -o addr show dev $1 scope link | awk '{print $4}')
    IPV6MACADDR=${IPV6LOCALINKADDR#*::}
    IPV6MACADDR=${IPV6MACADDR%/*}
}

ip6_extract() {
    IPV6DEVICENAME=$1
    if ! [[ -r $IPV6FILE ]]; then
        # If no ipv6 interface file then assume ipv6 disabled
        return
    fi

    # choose static ip if it's defined
    staticV6=$(ip -6 -o addr show dev $IPV6DEVICENAME scope global permanent | awk '{print $4}')
    if ! [[ -z $staticV6 ]]; then
        read -r IPV6ADDRDEL IPV6PREFIXLEN <<< $(echo $staticV6 | tr '/' ' ')
        return
    fi

    ip6_mac_addr $IPV6DEVICENAME
    IFS=$'\n'
    for i in $(ip -6 -o addr show dev $IPV6DEVICENAME scope global | awk '{print $4}'); do
        IFS=' ' read -r IPV6ADDRDEL IPV6PREFIXLEN <<< $(echo $i | tr '/' ' ')
        # Prefer address generated from DHCPv6, than ones from slaac/autoconfig.
        # Address from later (matches with MAC address).
        if ! [[ $IPV6ADDRDEL =~ $IPV6MACADDR$ ]]; then
            break
        fi
    done
}

ip6_addr()
{
    #/sbin/ifconfig $1 | sed -n 's/.*inet6 addr: \([^ ][^ /]*\)\/[0-9]\+ Scope:Global.*/\1/p' | head -1
    ip6_extract $1
    if [[ -z $IPV6ADDRDEL ]]; then
        # echo "No suitable ipv6 address found for device: $IPV6DEVICENAME"
        return
    fi
    echo $IPV6ADDRDEL
}

prefix()
{
    #/sbin/ifconfig $1 | sed -n 's/.*inet6 addr: \([^ ][^ /]*\)\/\([0-9]\+\) Scope:Global.*/\2/p' | head -1
    ip6_extract $1
    if [[ -z $IPV6PREFIXLEN ]]; then
        return
    fi
    echo $IPV6PREFIXLEN
}


broadcast()
{
    /sbin/ifconfig $1 | sed -n 's/.*Bcast:\([^ ][^ ]*\) .*/\1/p'
}

netmask()
{
    /sbin/ifconfig $1 | sed -n 's/.*Mask:\(.*\)$/\1/p'
}

gateway()
{
    /opt/vmware/share/vami/vami_get_network $1 | grep active_gatewayv4 | awk '{print $2}'
}

gateway6()
{
    /opt/vmware/share/vami/vami_get_network $1 | grep active_gatewayv6 | awk '{print $2}'
}

hw_addr()
{
    /sbin/ifconfig $1 | sed -n 's/.*HWaddr \(.*\)$/\1/p'
}

# vami_get_network without an interface argument
# dumps everything that is known.  For the blue
# screen's appliance ip, we simply want the first
# ip that we can find.  This will return the ipv4
# or ipv6 of the first interface to have one.
first_ip()
{
    /opt/vmware/share/vami/vami_get_network | grep "active_ipv[46]addr: [0-9a-fA-F]" | sed -n 's/.*addr: \(.*\)/\1/p' | head -1
}

ensure_network_configuration()
{
    ans=`/opt/vmware/share/vami/vami_get_network $1 2>/dev/null | grep config_present | awk '{print $2}'`
    if [ "$ans" = "true" ]
    then
        echo `gettext "Configuration for $1 found"`
    else
        /opt/vmware/share/vami/vami_move_network add $1
        # Bring up the interface
        /opt/vmware/share/vami/vami_set_network $1 DHCPV4
        echo `gettext "Default configuration for $1 added"`
    fi
}

name=`basename $0`

case "$name" in
    vami_interfaces|vami_default_interface|vami_first_ip)
        if [ $# -ne 0 ]
        then
            echo `gettext Usage:` $name
            exit 1
        fi
        ;;
    *)
        if [ $# -ne 1 ]
        then
            echo `gettext Usage:` $name `gettext interface`
            exit 1
        fi
        ;;
esac

case "$name" in
    vami_interfaces)
        interfaces
        ;;
    vami_default_interface)
        default_interface
        ;;
    vami_first_ip)
        first_ip
        ;;
    vami_ensure_network_configuration)
        ensure_network_configuration $1
        ;;
    vami_ip_addr)
        ip_addr $1
        ;;
    vami_ip6_addr)
        ip6_addr $1
        ;;
    vami_broadcast)
        broadcast $1
        ;;
    vami_netmask)
        netmask $1
        ;;
    vami_prefix)
        prefix $1
        ;;
    vami_gateway)
        gateway $1
        ;;
    vami_gateway6)
        gateway6 $1
        ;;
    vami_network)
        ip=`ip_addr $1`
        bc=`broadcast $1`
        nm=`netmask $1`
        gw=`gateway $1`
        echo $1 "$ip" "$bc" "$nm" "$gw"
        ;;
    vami_hw_addr)
        hw_addr $1
        ;;
    *)
        echo `gettext "Unknown program name"` \"$name\".
        echo `gettext "Known programs names:"`
        echo vami_ip_addr, vami_ip6_addr, vami_broadcast, vami_netmask, vami_prefix, vami_gateway, vami_gateway6, vami_network, vami_hw_addr, vami_default_interface, vami_interfaces, vami_first_ip, vami_ensure_network_configuration
        exit 1
        ;;
esac    
exit 0
