#! /bin/bash
#  Reset each lan card
#  Module History:
#     04/08/2002   TF   Initial release
#     04/16/2003   TF   Replaced ifdown/ifup w/network restart. ifup would not return when
#                         changing from static to dhcp
#     09/25/2003   TF   Only do ONE network reset after all lan changes made
#     08/07/2007   MC   Added autoconfig/privext logic
#     08/29/2007   MC   Timeout after 3 seconds of waiting for IPv6 config
#     09/28/2007   MC   Run media speed config file
#     11/28/2007   MC   Start dhcp6c for DHCPv6 clients
#

actzTrace "XSETNETF: -> ifReset $*"

NETWORK_CONFIG_DIR=${1%%/}
shift
IPV6_AUTOCONF_FILE="$NETWORK_CONFIG_DIR/ipv6_autoconf.conf"
IPV6_PRIV_EXT_FILE="$NETWORK_CONFIG_DIR/ipv6_privext.conf"
DHCPV6_CLIENT_FILE="$NETWORK_CONFIG_DIR/dhcpv6_client.conf"
MEDIA_SPEED_FILE="$NETWORK_CONFIG_DIR/media_speed.conf"
dhcp_ifs=""
static_ifs=""
lsmod | grep -q "ipv6"
ipv6_flag="$?"     # 0 means we have IPv6

# Kill any dhclients that may be out hanging around
killall -9 dhclient >&- 2>&-
killall -9 dhcp6c >&- 2>&-

while [ $# -ne 0 ] # loop over arguments and shutdown the interfaces
do
   ifName=$1
   dhcp=$2
   actzTrace "XSETNETF: Shellscript ifReset; ifName = $ifName, dhcp = $dhcp"

   actzTrace "XSETNETF: ifdown $ifName"
   /sbin/ifdown $ifName >&- 2>&-

   actzTrace "XSETNETF: ifconfig $ifName down"
   /sbin/ifconfig "$ifName" down >&- 2>&-

   if [ "$dhcp" = "true" ]; then
     dhcp_ifs="$dhcp_ifs $ifName"
   else
     static_ifs="$static_ifs $ifName"
   fi

   shift
   shift
done

# Bring up the static interfaces before the dhcp interfaces
for ifName in $static_ifs; do
   if [ "$ipv6_flag" = "0" ]; then
      if grep -q "^$ifName$" "$IPV6_AUTOCONF_FILE"; then
         echo "1" > /proc/sys/net/ipv6/conf/default/autoconf
      fi
      if grep -q "^$ifName$" "$IPV6_PRIV_EXT_FILE"; then
         echo "1" > /proc/sys/net/ipv6/conf/default/use_tempaddr
      fi
   fi

   actzTrace "XSETNETF: ifup $ifName"
   /sbin/ifup $ifName >&- 2>&-

   if [ "$ipv6_flag" = "0" ]; then
      wait_num=0
      while [ ! -e "/proc/sys/net/ipv6/conf/$ifName/autoconf" ]; do
          if [ $wait_num -lt 3 ]; then
             wait_num=$((wait_num+1))
             actzTrace "XSETNETF: Waiting for $ifName to come up"
             sleep 1
          else
             actzTrace "XSETNETF: Still no ipv6 config for $ifName.. giving up"
             break
          fi
      done

      echo "0" > /proc/sys/net/ipv6/conf/default/autoconf
      echo "0" > /proc/sys/net/ipv6/conf/default/use_tempaddr
   fi
done

for ifName in $dhcp_ifs; do
   if [ "$ipv6_flag" = "0" ]; then
      if grep -q "^$ifName$" $IPV6_AUTOCONF_FILE; then
         echo "1" > /proc/sys/net/ipv6/conf/default/autoconf
      fi
      if grep -q "^$ifName$" $IPV6_PRIV_EXT_FILE; then
         echo "1" > /proc/sys/net/ipv6/conf/default/use_tempaddr
      fi
   fi

   actzTrace "XSETNETF: dhclient $ifName"
   /sbin/dhclient $ifName >&- 2>&- &

   if [ "$ipv6_flag" = "0" ]; then
      wait_num=0
      while [ ! -e "/proc/sys/net/ipv6/conf/$ifName/autoconf" ]; do
          if [ $wait_num -lt 3 ]; then
             wait_num=$((wait_num+1))
             actzTrace "XSETNETF: Waiting for $ifName to come up"
             sleep 1
          else
             actzTrace "XSETNETF: Still no ipv6 config for $ifName.. giving up"
             break
          fi
      done

      echo "0" > /proc/sys/net/ipv6/conf/default/autoconf
      echo "0" > /proc/sys/net/ipv6/conf/default/use_tempaddr
   fi
done

if [ "$ipv6_flag" = "0" ]; then
    for ifName in $static_ifs $dhcp_ifs; do
        if grep -q "^$ifName$" $DHCPV6_CLIENT_FILE; then
            wait_num=0
            while [ $wait_num -lt 3 ];do
                wait_num=$((wait_num+1))
                actzTrace "XSETNETF: Starting dhcp6c on interface $ifName"
                /usr/sbin/dhcp6c $ifName >&- 2>&- &

                sleep 1

                actzTrace "XSETNETF: Checking to see if dhcp6c is still running"
                procs=$(ps wax | grep "dhcp6c $ifName" | grep -v "grep" | wc -l)
                if [ "$procs" -gt 0 ]; then
                    actzTrace "XSETNETF: dhcp6c appears to be up and running."
                    break;
                else
                    actzTrace "XSETNETF: dhcp6c still isn't running.."
                fi
            done
        fi
    done
fi

actzTrace "XSETNETF: Executing media speed file"
. $MEDIA_SPEED_FILE >&- 2>&-

actzTrace "XSETNETF: <- ifReset"
