#!/bin/sh
# pmatch determines if 1st argument string is matched by 2nd argument pattern

pmatch ()
{
  case $1 in
    $2) return 0;;  # zero return code means string matched by pattern
  esac

  return 1          # non-zero return code means string not matched by pattern
}
# converts netmask CIDR fromat to  x.x.x.x mask value
maskfromprefix ()
{
 prefixlen=$1
 maskval=$((0xffffffff>>(32-prefixlen)<<(32-prefixlen)))
 mask1=$((maskval >> 24))
 mask2=$((maskval >> 16 & 0xff))
 mask3=$((maskval >> 8 & 0xff))
 mask4=$((maskval & 0xff))
 echo $mask1.$mask2.$mask3.$mask4
 NETMASK=$mask1.$mask2.$mask3.$mask4
}

network_ipv4calc ()
{
    # Returns the network value needed for Ubuntu /etc/network/interface file
    # $1 must be the IP Address
    # $2 must be the Netmask value
    IP_1=`echo $1 | cut -d . -f 1`
    IP_2=`echo $1 | cut -d . -f 2`
    IP_3=`echo $1 | cut -d . -f 3`
    IP_4=`echo $1 | cut -d . -f 4`

    NETM_1=`echo $2 | cut -d . -f 1`
    NETM_2=`echo $2 | cut -d . -f 2`
    NETM_3=`echo $2 | cut -d . -f 3`
    NETM_4=`echo $2 | cut -d . -f 4`

    NET_1=$(($IP_1 & $NETM_1))
    NET_2=$(($IP_2 & $NETM_2))
    NET_3=$(($IP_3 & $NETM_3))
    NET_4=$(($IP_4 & $NETM_4))

    NETWORK="$NET_1.$NET_2.$NET_3.$NET_4"
    echo $NETWORK
}

if [ -f /etc/os-release ] && (cat /etc/os-release |grep -i  '^NAME=[ "]*Cumulus Linux[ "]*$' >/dev/null 2>&1); then
    OSVER="cumulus"
fi

if [ -f /etc/os-release ] && (cat /etc/os-release |grep NAME|grep -i SLE >/dev/null); then
   OSVER="SLE"
fi

defgw=`ip route | grep default | awk '{print $3}' | head -n1`
if ( pmatch $OSVER "ubuntu*" ) || (pmatch $OSVER "cumulus")
then
    echo `hostname` >/etc/hostname
    mv /etc/network/interfaces /etc/network/interfaces.old # this file will be filled up next
elif [ -f /etc/SuSE-release ] || (pmatch $OSVER "SLE")
then
    #SLES9 and SLES10, uses /etc/sysconfig/network/ifcfg-eth-id-<mac>
    #SLES11, uses /etc/sysconfig/network/ifcfg-eth<x>
    NICFILEPRE="/etc/sysconfig/network/ifcfg-"
    echo `hostname` > /etc/HOSTNAME
    if [ ! -z "$defgw" ]; then
        echo "default $defgw - -" > /etc/sysconfig/routes
    fi
else
    #RedHat uses /etc/sysconfig/network-scripts/ifcfg-eth<x>
    NICFILEPRE="/etc/sysconfig/network-scripts/ifcfg-"
    if [ -f "/etc/hostname" ]; then # for rh7
        echo `hostname` >/etc/hostname
    else
        sed -i "s/HOSTNAME.*/HOSTNAME=`hostname`/" /etc/sysconfig/network
    fi
    if [ ! -z "$defgw" ]; then
        grep -qw GATEWAY /etc/sysconfig/network && \
            sed -i "s/^GATEWAY.*/GATEWAY=$defgw/" /etc/sysconfig/network || \
            echo "GATEWAY=$defgw" >> /etc/sysconfig/network
    fi
fi

HOSTNAMECTL=`which hostnamectl 2>&1 | grep -v "/usr/bin/which: no"`
if [ ! -z $HOSTNAMECTL ] && [ ! -z $NODE ]; then
    SET_HOSTNAME=$NODE
    if [ ! -z $DOMAIN ]; then
        SET_HOSTNAME=$NODE.$DOMAIN
    fi
    echo "Setting hostname to: $SET_HOSTNAME"
    hostnamectl set-hostname $SET_HOSTNAME
fi

for nic in `ip link |grep "BROADCAST" |awk '{print $2}'   | sed s/://`; do
    IPADDRMASK=`ip -4 -o a sh dev $nic | awk '/inet/{print $4}' | head -n 1`
    IPADDR=`echo $IPADDRMASK | awk -F'/' '{print $1}'`
    [ -z $IPADDR ] && continue
    PREFIXMASK=`echo $IPADDRMASK | awk -F'/' '{print $2}'`
    # converts to x.x.x.x mask value
    maskfromprefix $PREFIXMASK
    if ( pmatch $OSVER "ubuntu*" ) || (pmatch $OSVER "cumulus")
    then
        NETWORK=`network_ipv4calc $IPADDR $NETMASK`
        #BROADCAST=`ifconfig $nic | grep Bcast | awk '{print $3}' | awk -F: '{print $2}'`
        BROADCAST=`ip -4 -oneline addr show $nic|grep brd| awk -F ' ' '{print $6}'`

        if [ ! -z "$BROADCAST" ]; then
            broadcast_line="broadcast $BROADCAST"
        else
            broadcast_line=""
        fi


        if [ ! -z "$defgw" ]; then
            gateway_line="gateway $defgw"
        else
            gateway_line=""
        fi
        # add info to interfaces file on ubuntu, TBD does unbuntu change to systemd, this will not exist
        if ( pmatch $OSVER "cumulus" )
        then
            cat >>/etc/network/interfaces <<EOF
source /etc/network/interfaces.d/*.intf
auto $nic
iface $nic inet static
    address $IPADDR
    netmask $NETMASK
    $broadcast_line
    $gateway_line


EOF
        else
            cat >>/etc/network/interfaces <<EOF
auto $nic
iface $nic inet static
    address $IPADDR
    network $NETWORK
    netmask $NETMASK
    $broadcast_line
    $gateway_line


EOF

        fi
    # not ubuntu
    else
        if [ -f ${NICFILEPRE}${nic} ]
        then
            NICFILE=${NICFILEPRE}${nic}
        else
            #mac=`ifconfig $nic|grep HWaddr|awk '{print $5}'|tr "[A-Z]" "[a-z]"`
            mac=`ip link show $nic | grep "ether\|infiniband" | awk '{print $2}'`
            [ -z $mac  ] && continue
            NICFILE=${NICFILEPRE}eth-id-${mac}
        fi
        sed -i s/BOOTPROTO=dhcp/BOOTPROTO=static/ $NICFILE
        sed -i s/BOOTPROTO=\'dhcp\'/BOOTPROTO=static/ $NICFILE
        sed -i s/BOOTPROTO=\"dhcp\"/BOOTPROTO=static/ $NICFILE
        grep ^IPADDR= $NICFILE >/dev/null
        if [ $? -eq 0 ]
        then
            sed -i '/IPADDR=/d'  $NICFILE
        fi
        echo IPADDR=$IPADDR >> $NICFILE
        grep ^NETMASK= $NICFILE >/dev/null
        if [ $? -eq 0 ]
        then
            sed -i '/NETMASK=/d' $NICFILE
        fi
        echo NETMASK=$NETMASK >> $NICFILE
    fi

    #for netboot/statelite case, restart the network interface. For diskful installation, it is not necessary because the restart of the network  will happen at the first boot.
    if [ "$NODESETSTATE" = "netboot" ] || [ "$NODESETSTATE" = "statelite" ]
    then
	ifdown $nic
        ifup $nic
    fi
done

if ( pmatch $OSVER "ubuntu*") || (pmatch $OSVER "cumulus")
then
    cat >>/etc/network/interfaces <<EOF
auto lo
iface lo inet loopback


EOF
fi

exit 0
