#!/bin/sh

PPP_IFACE=ppp1
LAN_IFACE=br0

function startDHCP6C {
    echo -n running dhcp6c...
    killall -9 dhcp6c &>/dev/null
    local slept=0
    while [ -z "`ifconfig $LAN_IFACE | egrep 'inet6 addr: 2001:.*/64'`" ]; do
	if ! `pidof dhcp6c &>/dev/null`; then
	    dhcp6c $PPP_IFACE
	fi

	sleep 1
	echo -n .

	slept=$((slept + 1))
	if [ $slept -gt 30 ]; then
    	    echo "failed, exiting."
	    killall -9 dhcp6c &>/dev/null
	    delAddresses
	    exit -1
	fi
    done
    echo ok
}

function getGlobalPart {
    local fullAddr=`ifconfig $LAN_IFACE | egrep "inet6 addr: 2001:.*/64" | head -n 1 | awk '{print $3}'`
    echo getting global part of the received v6 address: $fullAddr
    local fullAddrTmp=$fullAddr
    local globalPartSepPos=0
    for i in {1..4}; do
	local sepPos=`expr index $fullAddrTmp :`
	fullAddrTmp=${fullAddrTmp:$sepPos}
	globalPartSepPos=$((globalPartSepPos + $sepPos))
    done
    globalPart=${fullAddr:0:$((globalPartSepPos - 1))}
}

function delAddresses {
    echo -n deleting received v6 addresses from $LAN_IFACE...
    local slept=0
    while [ ! -z "`ifconfig $LAN_IFACE | egrep "inet6 addr: 2001:.*/64"`" ]; do
	ifconfig $LAN_IFACE del `ifconfig $LAN_IFACE | egrep "inet6 addr: 2001:.*/64" | awk '{print $3}'` &>/dev/null
	echo -n .
	slept=$((slept + 1))
	if [ $slept -gt 5 ]; then
	    echo "failed, exiting."
	    killall -9 dhcp6c &>/dev/null
	    exit -1
	fi
    done
    echo ok
}

function createDHCP6SConf {
    rm -f /etc/wide-dhcpv6/dhcp6s.conf &>/dev/null
    OLDIFS=$IFS
    IFS=$'\n'
    while read line; do
	echo $line | sed s/--GLOBALPART--/$globalPart/g >>/etc/wide-dhcpv6/dhcp6s.conf
    done </etc/wide-dhcpv6/dhcp6s.conf.template
    IFS=$OLDIFS
}

function createRADVDConf {
    rm -f /etc/radvd.conf &>/dev/null
    OLDIFS=$IFS
    IFS=$'\n'
    while read line; do
	echo $line | sed s/--GLOBALPART--/$globalPart/g >>/etc/radvd.conf
    done </etc/radvd.conf.template
    IFS=$OLDIFS
}

echo starting ipv6 configuration
delAddresses
echo adding default v6 route
ip -6 route add default dev $PPP_IFACE &>/dev/null
startDHCP6C
getGlobalPart
currentIP=$globalPart::1
delAddresses
echo adding $currentIP/64 to $LAN_IFACE
ifconfig $LAN_IFACE add $currentIP/64
echo saving current ip
echo $currentIP >/usr/local/var/currentip.v6
echo $globalPart >>/usr/local/var/currentip.v6
echo creating dhcp6s.conf
createDHCP6SConf
echo starting dhcp6s
killall -9 dhcp6s &>/dev/null
dhcp6s $LAN_IFACE
echo creating radvd.conf
createRADVDConf
echo starting radvd
/etc/init.d/radvd restart &>/dev/null
echo generating bind zone files
/etc/bind/pri/generate
echo reloading bind
killall -HUP named
echo ipv6 configured successfully.
exit 0
