#!/bin/sh
RESOLV_IPV4="/var/etc/resolv.conf"
RESOLV_IPV6="/var/etc/resolv_ipv6.conf"
RESOLV_RDNSSD="/var/etc/resolv_rdnssd.conf"
RESOLV_DHCPV6="/var/etc/resolv_dhcpv6.conf"
RESOLV_CONF="/etc/resolv.conf"
DHCP_PD="/var/tmp/dhcp_pd"
DHCP_PD_OLD="/var/tmp/dhcp_pd.old"
RADVD_PID="/var/run/radvd.pid"
RADVD_CONFIG="/var/etc/radvd.conf"
DHCPD6_CONFIG="/var/etc/dhcpd6.conf"
AFTR_ADDR="/var/tmp/aftr_address"
WAN_PROTO=$(nvram get wan_proto)
IPV6_WAN_PROTO=$(nvram get ipv6_wan_proto)
AUTOCONFIG=$(nvram get autoconfig_type)
DSLITE_PID="/var/run/dslite.pid"
SPECIFY_DNS=$(nvram get ipv6_wan_specify_dns)
PREVIOUS_DN="/var/tmp/previous_dn"
PREVIOUS_DNS="/var/tmp/previous_dns"
PREVIOUS_IAPD="/var/tmp/previous_iapd"
DNS=$(cat $PREVIOUS_DNS)
IAPD=$(cat $PREVIOUS_IAPD)
DN=$(cat $PREVIOUS_DN)

restart_lan(){
	if [ -z "$(ip -6 route | grep "default via")" ]; then
			return 0
	fi
	if [ "$1" = "dns" ]; then
		echo IPv6 Domain Name Server is changed, restart IPv6 LAN
	cli ipv6 radvd stop
	fi
	if [ "$1" = "iapd" ]; then
		echo IAPD is changed, restart IPv6 LAN
		sed -i 's/AdvValidLifetime.*/AdvValidLifetime 7200;/g' /var/etc/radvd.conf
		sed -i 's/AdvPreferredLifetime.*/AdvPreferredLifetime 0;/g' /var/etc/radvd.conf
		killall -9 radvd
		rm /var/run/radvd.pid
		radvd -C /var/etc/radvd.conf
		killall -9 radvd
		rm /var/run/radvd.pid
	fi
	cli ipv6 radvd start
	cli ipv6 dhcp6d stop
	cli ipv6 dhcp6d start
	cli ipv6 route start
}

if [ "$SPECIFY_DNS" = "0" -o "$SPECIFY_DNS" = "ipv6_wan_specify_dns = 0" ] && [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then
	rm -f $RESOLV_DHCPV6
	if [ -n "$new_domain_name" ]; then
		echo search $new_domain_name >> $RESOLV_DHCPV6
	fi
	if [ -n "$new_domain_name_servers" ]; then
		for nameserver in $new_domain_name_servers; do
			echo nameserver $nameserver >> $RESOLV_DHCPV6
		done
		cat $RESOLV_DHCPV6 $RESOLV_RDNSSD > $RESOLV_IPV6
		cat $RESOLV_IPV6 | grep "^search" | sed -e :x -e '$!N;s/\n/ /;tx' | sed 's/ search / /g' > "$RESOLV_IPV6.tmp"
		cat $RESOLV_DHCPV6 $RESOLV_RDNSSD | grep -v "^search" | sed '3,$d' > $RESOLV_IPV6
		cat $RESOLV_IPV6.tmp >> $RESOLV_IPV6
		rm -rf $RESOLV_IPV6.tmp
		cat $RESOLV_IPV6 $RESOLV_IPV4 > $RESOLV_CONF
	fi
fi

if [ -n "$new_iapd_prefix" ]; then
	if [ ! -e $RADVD_PID ]; then
		restart_lan
	elif [ "$new_iapd_prefix" != "$IAPD" ]; then
		restart_lan iapd
	elif [ "$SPECIFY_DNS" = "0" -o "$SPECIFY_DNS" = "ipv6_wan_specify_dns = 0" ] && [ -n "$new_domain_name_servers" -a "$new_domain_name_servers" != "$DNS" ]; then
		restart_lan dns
	elif [ -n "$new_domain_name" -a "$new_domain_name" != "$DN" ]; then
		restart_lan dns
	fi
	cp $DHCP_PD $DHCP_PD_OLD
else
	if [ "$SPECIFY_DNS" = "0" -o "$SPECIFY_DNS" = "ipv6_wan_specify_dns = 0" ] && [ -n "$new_domain_name_servers" -a "$new_domain_name_servers" != "$DNS" ]; then
		restart_lan dns
	elif [ -n "$new_domain_name" -a "$new_domain_name" != "$DN" ]; then
		restart_lan dns
	fi
fi

if [ -n "$new_iapd_prefix" ]; then
	echo "$new_iapd_prefix" > $PREVIOUS_IAPD
fi
if [ -n "$new_domain_name_servers" ]; then
	echo "$new_domain_name_servers" > $PREVIOUS_DNS
fi
if [ -n "$new_domain_name" ]; then
	echo "$new_domain_name" > $PREVIOUS_DN
fi

if [ "$WAN_PROTO" = "wan_proto = dslite" ] || [ "$WAN_PROTO" = "dslite" ]; then
	if [ -n "$new_aftr_name" -o -n "$new_domain_name_servers"  ]; then
		if [ -n "$new_aftr_name" ]; then
			if [ "$new_aftr_name" != "$(cat $AFTR_ADDR)" -o ! -e $DSLITE_PID ]; then
			cli ipv6 dslite stop
			cli ipv6 dslite start $new_aftr_name
			fi
		elif [ ! -e $DSLITE_PID ]; then
			cli ipv6 dslite start
		fi
	fi
fi
