#!/bin/bash
# dhclient-script for Linux. Dan Halbert, March, 1997.
# Updated for Linux 2.[12] by Brian J. Murrell, January 1999.
# No guarantees about this. I'm a novice at the details of Linux
# networking.

# Notes:

# 0. This script is based on the netbsd script supplied with dhcp-970306.

# 1. ifconfig down apparently deletes all relevant routes and flushes
# the arp cache, so this doesn't need to be done explicitly.

# 2. The alias address handling here has not been tested AT ALL.
# I'm just going by the doc of modern Linux ip aliasing, which uses
# notations like eth0:0, eth0:1, for each alias.

# 3. I have to calculate the network address, and calculate the broadcast
# address if it is not supplied. This might be much more easily done
# by the dhclient C code, and passed on.

# 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious
# of the $1 in its args.

# 'ip' just looks too weird.  /sbin/ip looks less weird.
ip=/sbin/ip

#close stdout
exec 1<&-

# Must be used on exit.   Invokes the local dhcp client exit hooks, if any.
exit_with_hooks() {
  exit_status=$1
  if [ -f /etc/dhclient-exit-hooks ]; then
    . /etc/dhclient-exit-hooks
  fi
  exit $exit_status
}

# Invoke the local dhcp client enter hooks, if they exist.
if [ -f /etc/dhclient-enter-hooks ]; then
  exit_status=0
  . /etc/dhclient-enter-hooks
  # allow the local script to abort processing of this state
  # local script must set exit_status variable to nonzero.
  if [ $exit_status -ne 0 ]; then
    exit $exit_status
  fi
fi

# update /etc/resolv.conf based on received values
make_resolv_conf() {
	local args="dns v4"
	local argsv6="dns v6"
	# DHCPv4
	if [ -n "$new_domain_search" ] || [ -n "$new_domain_name" ] ||
		[ -n "$new_domain_name_servers" ]; then

		{
		if [ -n "$new_domain_search" ]; then
			if [ -n "$new_domain_name" ]; then
				domain_in_search_list=""
				for domain in $new_domain_search; do
					if [ "$domain" = "${new_domain_name}" ] ||
						[ "$domain" = "${new_domain_name}." ]; then
						domain_in_search_list="Yes"
					fi
				done
				if [ -z "$domain_in_search_list" ]; then
					new_domain_search="$new_domain_name $new_domain_search"
				fi
			fi
		args="$args search ${new_domain_search}"
		elif [ -n "$new_domain_name" ]; then
			args="$args search ${new_domain_name}"
		fi

		if [ -n "$new_domain_name_servers" ]; then
			for nameserver in $new_domain_name_servers; do
				args="$args nameserver ${nameserver}"
			done
		fi
		if [ "$args" != "dns v4" ]; then
			/fabos/libexec/dhclient_bridge $args
		fi
		}
	# DHCPv6
	elif [ -n "$new_dhcp6_domain_search" ] || [ -n "$new_dhcp6_name_servers" ]; then

		{
		if [ -n "$new_dhcp6_domain_search" ]; then
			argsv6="$argsv6 search ${new_dhcp6_domain_search%% *}"
		fi

		if [ -n "$new_dhcp6_name_servers" ]; then
			for nameserver in $new_dhcp6_name_servers; do
				argsv6="$argsv6 nameserver ${nameserver}"
			done
		fi
		if [ "$argsv6" != "dns v6" ]; then
                	/fabos/libexec/dhclient_bridge $argsv6
                fi
		}
	fi
}

###
### DHCPv4 Handlers
###

if [ x$new_ip_address != x ]; then
   new_ipaddr_arg="ipaddr $new_ip_address"
fi

if [ x$new_subnet_mask != x ]; then
  new_subnet_arg="mask $new_subnet_mask"
fi

if [ x$new_routers != x ]; then
  new_router_arg="gateway $new_routers"
fi

echo "Inside dhclient script"
echo $client
echo $interface
echo $new_ip_address

if [ x$client != x ] ; then
   new_client_name=$client
else  
   new_client_name="PIZZA"
fi

echo $new_client_name
 
if [ x$reason = xPREINIT ] ; then
  echo "PREINIT"
fi

if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \
   [ x$reason = xREBIND ] || [ x$reason = xREBOOT ] ; then
   if [ x$reason = xBOUND ] ; then
      if [ x${new_ip_address} = x ] ; then
		echo "BOUND"
      fi

      echo "BOUND"
   /fabos/libexec/dhclient_bridge v4 add $new_client_name \
	$new_ipaddr_arg $new_subnet_arg $new_router_arg

   fi

   if [ x$reason = xREBIND ] || [ x$reason = xREBOOT ] ; then
      if [ x${new_ip_address} = x ] ; then
         echo "RENEW or REBIND"
      fi

      echo "RENEW or REBIND"
   /fabos/libexec/dhclient_bridge v4 add $new_client_name \
	$new_ipaddr_arg $new_subnet_arg $new_router_arg 

   fi

   # update /etc/resolv.conf
   make_resolv_conf

fi

if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \
   || [ x$reason = xSTOP ]; then
   if [ x${old_ip_address} = x ] ; then
      echo "EXPIRE or RELEASE or STOP"
   fi

   /fabos/libexec/dhclient_bridge v4 del $new_client_name \
       $new_ip_address $new_subnet_mask
fi

# todo Have not handled timeout..

###
### DHCPv6 Handlers
###

echo $client
echo $new_ip6_prefixlen 
if [ x$new_ip6_address != x ]; then
   new_ip6_addr_arg="ip6_addr $new_ip6_address"
fi

if [ x$new_ip6_prefixlen != x ]; then
   new_ip6_prefix_arg="ip6_prefix $new_ip6_prefixlen"
fi

if [ x$client != x ] ; then
   new_ip6_client_name=$client
else
   new_ip6_client_name="PIZZA"
fi

if [ x$reason = xPREINIT6 ] ; then
  echo "PREINIT6"			
fi

if [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then
    echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix}

fi

if [ x$reason = xBOUND6 ] ; then
  if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then
  echo "BOUND6"			
  fi

  echo "BOUND6"
  /fabos/libexec/dhclient_bridge v6 add $new_ip6_client_name \
    $new_ip6_addr_arg $new_ip6_prefix_arg 

  # update /etc/resolv.conf
  if [ "${new_dhcp6_name_servers}" != "${old_dhcp6_name_servers}" ] ||
     [ "${new_dhcp6_domain_search}" != "${old_dhcp6_domain_search}" ]; then
      make_resolv_conf
  fi
fi

if [ x$reason = xRENEW6 ] || [ x$reason = xREBIND6 ] ; then
  if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then
  echo "RENEW6 or REBIND6"			
  fi

  echo "RENEW6 or REBIND6"			
  /fabos/libexec/dhclient_bridge v6 add $new_ip6_client_name \
    $new_ip6_addr_arg $new_ip6_prefix_arg 

  # update /etc/resolv.conf
  if [ "${new_dhcp6_name_servers}" != "${old_dhcp6_name_servers}" ] ||
     [ "${new_dhcp6_domain_search}" != "${old_dhcp6_domain_search}" ]; then
      make_resolv_conf
  fi
fi

if [ x$reason = xDEPREF6 ] ; then
  if [ x${new_ip6_prefixlen} = x ] ; then
  echo "DEPREF6"			
  fi

  /fabos/libexec/dhclient_bridge v6 dep $new_ip6_client_name \
    $new_ip6_address $new_ip6_prefixlen 
fi

if [ x$reason = xEXPIRE6 -o x$reason = xRELEASE6 -o x$reason = xSTOP6 ] ; then
  if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then
   echo "EXPIRE or RELEASE or STOP"
  fi

  
  /fabos/libexec/dhclient_bridge v6 del $new_ip6_client_name \
      $new_ip6_address 
fi

