#!/bin/sh
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html

#-------------------------------------------------------------------------------
# Sample xCAT post script for configuring hfi settings and some conventions.
# This scripts works for both diskfull installs, diskless boots on AIX or Linux.
# Input:
#   IP address: Each hfi interface should be assigned its hostname and IP address.
#               hostname should be resolable from either /etc/hosts or name 
#               resolution, with format: <nodename>-hfx
#   netmask: Netmask is hardcoded in this script.  You have to manually modify it
#            if it doesn't meet your requirement.
#-------------------------------------------------------------------------------
PLTFRM=`uname`
NETMASK=255.0.0.0

RETURNVAL=0

# bond-mld binary is shipped seperately, admin should adjust the following PATH 
# to where bond-mld binary is. 
PATH=$PATH:/usr/local/sbin/
export PATH

name=`echo $NODE | awk -F-hf '{print $1}'`
if [ -z $name ]
then
    name=$NODE
fi

if [[ $PLTFRM != AIX  ]] && [[ $PLTFRM != aix  ]]
then

    # A difference between service node and compute node is that service node is booted from
    # ethernet, all the HFI interfaces should be configured.  Compute node is booted from hf0
    # so hf0 on compute node should not be re-configured on compute node.
    if [[ $NTYPE = service ]]
    then

        CLIENT_IP=`ping -c 3 $name-hf0 -I hf0 2>/dev/null | grep "data" | sed 's/.* (\([0-9.]*\)).*/\1/' | uniq 2>&1`

        if [ -n "$CLIENT_IP" ]
        then
            echo "DEVICE=hf0
NM_CONTROLLED=yes
IPADDR=$CLIENT_IP
NETMASK=$NETMASK
ONBOOT=yes
" >/etc/sysconfig/network-scripts/ifcfg-hf0

            ifdown hf0
            ifup hf0
        else
            logger -t xcat -p local4.err "confighfi: cannot resolve hostname $name-hf0"
            RETURNVAL=-1
        fi
    elif [[ -z "$NTYPE" ]]
    then
        logger -t xcat -p local4.err "confighfi: cannot read node type definition"
        RETURNVAL=-1
    fi

    # Configure hf0-hf<n> interfaces one by one.
    for i in 1 2 3 4 5 6 7
    do

        CLIENT_IP=`ping -c 3 $name-hf$i -I hf$i 2>/dev/null | grep "data" | sed 's/.* (\([0-9.]*\)).*/\1/' | uniq 2>&1`

        if [ -n "$CLIENT_IP" ]
        then
            echo "DEVICE=hf$i
NM_CONTROLLED=yes
IPADDR=$CLIENT_IP
NETMASK=$NETMASK
ONBOOT=yes
" >/etc/sysconfig/network-scripts/ifcfg-hf$i

            ifdown hf$i
            ifup hf$i
        else
            logger -t xcat -p local4.err "confighfi: cannot resolve hostname $name-hf$i"
            RETURNVAL=-1
        fi
    done

    # Configure bond0 on Linux
    if lsmod | grep bonding
    then
        rmmod bonding
    fi

    modprobe bonding mode=multi-link miimon=100 xmit_hash_policy=layer3+4 

    CLIENT_IP=`ping -c 3 $name-bond0 -I bond0 2>/dev/null | grep "data" | sed 's/.* (\([0-9.]*\)).*/\1/' | uniq 2>&1`
    if [ -n "$CLIENT_IP" ]
    then
        echo "DEVICE=bond0
NM_CONTROLLED=yes
IPADDR=$CLIENT_IP
NETMASK=$NETMASK
ONBOOT=yes
" >/etc/sysconfig/network-scripts/ifcfg-bond0
    fi

    x=0
    while [ $x -le $i ]; do
        ip link set dev hf${x} down
        echo +hf${x} > /sys/class/net/bond0/bonding/slaves
        x=$((x+1))
    done

    bond-mld > m.out 2>&1 &
    ip link set dev bond0 mtu 65536

    ifdown bond0
    ifup bond0

else
    # Configurartion for AIX
    if [[ $NTYPE = service ]]
    then

        CLIENT_IP=`ping -q -n -c 1 -w 1 $name-hf0 | grep PING |awk '{print $3}' | sed 's/(\(.*\)):/\1/' `

        if [ -n "$CLIENT_IP" ]
        then
            mkhfi -i hf0 -a $CLIENT_IP -m $NETMASK
        else
            logger -t xcat -p local4.err "confighfi: cannot resolve hostname $name-hf0"
            RETURNVAL=-1
        fi
    elif [[ -z "$NTYPE" ]]
    then
        logger -t xcat -p local4.err "confighfi: cannot read node type definition"
        RETURNVAL=-1
    fi

    for i in 1 2 3
    do
        CLIENT_IP=`ping -q -n -c 1 -w 1 $name-hf$i | grep PING |awk '{print $3}' | sed 's/(\(.*\)):/\1/' `

        if [ -n "$CLIENT_IP" ]
        then
            mkhfi -i hf$i -a $CLIENT_IP -m $NETMASK
        else
            logger -t xcat -p local4.err "confighfi: cannot resolve hostname $name-hf$i"
            RETURNVAL=-1
        fi

    done

    # Configure ml0 for AIX.
    CLIENT_IP=`ping -q -n -c 1 -w 1 $name-ml0 | grep PING |awk '{print $3}' | sed 's/(\(.*\)):/\1/' `

    if [ -n "$CLIENT_IP" ]
    then
        #Check whether the mlt0 is available
        `lsdev -C | grep mlt0 | grep Available 2>&1 >/dev/null`

        chdev -l ml0 -a state=detach

        # Reconfig ml0 since HFx are configured after ml0 is available 
        rmdev -l mlt0
        mkdev -l mlt0

        sleep 2
        chdev -l ml0 -a netaddr=$CLIENT_IP -a netmask=$NETMASK -a state=up
    else
        logger -t xcat -p local4.err "confighfi: cannot resolve hostname $name-ml0"
        RETURNVAL=-1
    fi

fi

exit $RETURNVAL