#!/bin/sh

echo "enter & execute dhcp6c-script"

DHCP6_FILE=/etc/dhcp6/dhcp6c_conf
RA_CONF_FILE=/etc/dhcp6/dhcp6c_radvd.conf
RESOLV_FILE=/etc/resolv.conf
PF_FILE=/etc/dhcp6/dhcp6c_pf

#get lan interface name
#LAN_INF=$(uci -q -P /var/state get network.lan.ifname)
LAN_INF=br-lan
V6_WAN_MODE=`uci -q get ipv6.wan.mode`

resolv_remove() {
  DHCLIENT6=/etc/resolv.conf.dhclient6
  cp $RESOLV_FILE $DHCLIENT6
  grep -Ev $1 $DHCLIENT6 > $RESOLV_FILE
}

make_resolv_conf() {
  if [ "$new_dhcp6_name_servers" ]; then
    if [ "$new_dhcp6_domain_search" ]; then
      resolv_remove ":|^search"     # remove search domain & IPv6 nameservers
      echo search $new_dhcp6_domain_search >> $RESOLV_FILE
    else
      resolv_remove ":"             # remove IPv6 nameservers
    fi

    for nameserver in $new_dhcp6_name_servers; do
      echo nameserver $nameserver >> $RESOLV_FILE
    done
  fi
}

exit_with_hook_radvd() { 
  echo $1 > /tmp/dhcp6c_radvd
}

exit_with_hook_dhcp6s() { 
  echo $1 > /tmp/dhcp6c_6s
}

###
### DHCPv6 Handlers
###

config_radvd() {
  new_max_life=$(cat $DHCP6_FILE | grep -m 1 [n]ew_max_life | awk '{print $2}')
  new_preferred_life=$(cat $DHCP6_FILE | grep -m 1 [n]ew_preferred_life | awk '{print $2}')
  default_life=$(uci -q get ipv6.lan_radvd.adv_time)
  
  echo "interface $LAN_INF"  > $RA_CONF_FILE
  echo "{"  >> $RA_CONF_FILE
  echo "   AdvSendAdvert on;"  >> $RA_CONF_FILE
  echo "   MaxRtrAdvInterval 90;"  >> $RA_CONF_FILE
  if [ $default_life != "" ]; then
    echo "   AdvDefaultLifetime $default_life;"  >> $RA_CONF_FILE
  fi
  echo "" >> /etc/dhcp6/dhcp6c_radvd.conf
  echo "   prefix $new_ip6_prefix_radvd"  >> /etc/dhcp6/dhcp6c_radvd.conf
  echo "   {"  >> /etc/dhcp6/dhcp6c_radvd.conf
  echo "     AdvOnLink on;"  >> /etc/dhcp6/dhcp6c_radvd.conf
  echo "     AdvAutonomous on;"  >> /etc/dhcp6/dhcp6c_radvd.conf
  
  if [ x${new_preferred_life} != x ]; then
    echo "     AdvPreferredLifetime $new_preferred_life;"  >> $RA_CONF_FILE
  fi
  
  if [ x${new_max_life} != x ]; then
    echo "     AdvValidLifetime $new_max_life;"  >> $RA_CONF_FILE
  fi
  
  echo "" >> /etc/dhcp6/dhcp6c_radvd.conf
  echo "   };"  >> $RA_CONF_FILE
  
  echo "" >> $RA_CONF_FILE
  if [ "$new_dhcp6_name_servers" != "" ]; then
    echo "   RDNSS $new_dhcp6_name_servers"  >> $RA_CONF_FILE
    echo "   {"  >> $RA_CONF_FILE
    echo "   };"  >> $RA_CONF_FILE
  fi
  
  echo "" >> /etc/dhcp6/dhcp6c_radvd.conf
  echo "};"  >> $RA_CONF_FILE
}

radvd() {
	radvd_pid=$(ps | grep -m 1 [r]advd | awk '{print $1}')
	#echo $radvd_pid
	if [ "$radvd_pid" != "" ]; then
	    echo "enter radvd 1"
		if [ -f $RA_CONF_FILE ]; then
			old_ip6_prefix=$(cat $RA_CONF_FILE | grep -m 1 [p]refix | awk '{print $2}')
			
			#echo $old_ip6_prefix
			#echo $new_ip6_prefix_radvd
			
			if [ x${old_ip6_prefix} != x${new_ip6_prefix_radvd} ] ; then
			    #echo "kill radvd"
				kill $radvd_pid
				config_radvd
				exit_with_hook_radvd 1
        #radvd -C $RA_CONF_FILE -m stderr_syslog -p /var/run/radvd.pid
			else
			    #echo "don't kill radvd"
				exit_with_hook_radvd 0
			fi
		else
			kill $radvd_pid
			config_radvd
			exit_with_hook_radvd 1
      #radvd -C $RA_CONF_FILE -m stderr_syslog -p /var/run/radvd.pid
		fi
	else
		echo "enter radvd 2"
		config_radvd
		exit_with_hook_radvd 1
    #radvd -C $RA_CONF_FILE -m stderr_syslog -p /var/run/radvd.pid
	fi
}

echo "DHCPv6 Handlers: x$reason"

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

if [ -f $PF_FILE ] ; then
	new_ip6_prefix_radvd=$(cat $PF_FILE | grep -m 1 "$LAN_INF-prefix" | awk '{print $2}')
fi

if [ x$reason = xBOUND6 ]; then
  #echo "In xBOUND6"

  if [ x${new_ip6_address} != x ] && [ x${new_ip6_prefixlen} != x ] ; then
    ifconfig ${interface} inet6 ${new_ip6_address}/${new_ip6_prefixlen} alias
  fi

  # Check for nameserver options.
  make_resolv_conf
  
  if [ x${new_ip6_prefix} != x ] ; then
    # check radvd config
    radvd
  fi

  if [ "$V6_WAN_MODE" != "ppp" ] ; then   # not PPP mode
  if [ "$V6_WAN_MODE" != "dhcpv6-3" -a "$V6_WAN_MODE" != "dhcpv6" -a "$V6_WAN_MODE" != "dhcpv6-4" ]; then # not DHCPv6 mode
    ip -6 route del 2000::/3 2>/dev/null
    ip -6 route add 2000::/3 dev br-wan
  fi
  fi

elif [ x$reason = xRELEASE6 ]; then
  proc_radvd=$(ps | grep radvd | grep [/]etc/dhcp6/dhcp6c_radvd.conf)
  if [ "$proc_radvd" != "" ]; then
    killall radvd
  fi
fi

