#!/bin/bash
###
# Prepare networking from config files in data dir

set -e

source ${XENSOURCE_INVENTORY}

MANAGEMENT_CONF=${FIRSTBOOT_DATA_DIR}/management.conf
NETWORK_CONF=${FIRSTBOOT_DATA_DIR}/network.conf
UPGRADE="false"
[ -r ${FIRSTBOOT_DATA_DIR}/host.conf ] && . ${FIRSTBOOT_DATA_DIR}/host.conf

pif_attached() {
    local pif=$1
    attached=$($XE pif-list params=currently-attached uuid=$pif --minimal)
    managed=$($XE pif-list params=managed uuid=$pif --minimal)
    test "$attached" == "true" || test "$managed" == "false"
}

start() {
    [ "$UPGRADE" = true ] && return 0

    # Set iSCSI iBFT interface's to be unmanaged by XAPI
    for dir in /sys/firmware/ibft/ethernet{0,1} ; do
        [ ! -e $dir/mac ] && continue || \
        ibft_mac=$(cat $dir/mac)
        ibft_eth=$( ifconfig | grep -i $ibft_mac | awk '{ print $1 }' )
        if [ "$?" != "0" ]; then
            echo "Unable to find network interface for iSCSI iBFT mac $ibft_mac"
            continue
        fi
        $XE pif-introduce host-uuid=${INSTALLATION_UUID} device=${ibft_eth} managed=false
    done

    $XE pif-scan host-uuid=${INSTALLATION_UUID}

    if [ -e ${MANAGEMENT_CONF} ] ; then
        source ${MANAGEMENT_CONF}
        if PIF="$($XE pif-list host-uuid=${INSTALLATION_UUID} device=${LABEL} params=uuid --minimal)" ; then
            case $MODE in
                dhcp|none)
                    $XE pif-reconfigure-ip uuid=${PIF} mode=${MODE} || true
                    ;;
                static)
                    # loop over DNS1..DNSn making a comma-separated list:
                    unset dns
                    i=1
                    while :
                    do
                        d=`eval echo \\$DNS$i`
                        unset DNS$i
                        [ -n "$d" ] || break
                        [ -n "$dns" ] && dns="$dns,"
                        dns="$dns$d"
                        i=$((i+1))
                    done
                    domain=`echo $DOMAIN | tr ' ' ','`
                    $XE pif-reconfigure-ip uuid=${PIF} mode=static IP=${IP} netmask=${NETMASK} gateway=${GATEWAY} ${dns+DNS=$dns} || true
                    [ $domain ] && $XE pif-param-set uuid=${PIF} other-config:domain=$domain || true
                    ;;
            esac
            case $MODEV6 in
                dhcp|none|autoconf)
                    $XE pif-reconfigure-ipv6 uuid=${PIF} mode=${MODEV6} || true
                    ;;
                static)
                    $XE pif-reconfigure-ipv6 uuid=${PIF} mode=static IPv6=${IPv6} gateway=${IPv6_GATEWAY} || true
                    ;;
            esac
            if [ "${MANAGEMENT_ADDRESS_TYPE}" = "IPv6" ] ; then
                    $XE host-management-disable 
                    $XE pif-set-primary-address-type uuid="${PIF}" primary_address_type=${MANAGEMENT_ADDRESS_TYPE}
            fi
            $XE host-management-reconfigure pif-uuid="${PIF}"
        else
            logger "Warning: cannot configure IP settings for management PIF with name ${LABEL}"
        fi

        unset MODE IP NETMASK GATEWAY DOMAIN PIF LABEL 

        # we now attempt to plug all PIFs that are not already plugged:
        for pif in $($XE pif-list params=uuid --minimal | sed 's/,/ /g'); do
            if ! pif_attached $pif; then
                $XE pif-plug uuid=$pif
            fi
        done
    fi
}

case $1 in
    start)  start ;;
esac

