#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: localnet
# REQUIRE: dhcp6c
# BEFORE: named
# KEYWORD: shutdown
#

# The purpose of this script is to generate various ISP prefix dependent files.
#
# Specifically, the DNS (BIND) acls file for handling various views, a local ISP
# range address for the router itself (on a dedicated loopback device), and
# attach any static addresses for this machine to another loopback device.

. ${RC_ROUTER_HARNESS}/etc/rc.subr


name='localnet'

extra_commands="rebuild_zoneinfo"
start_cmd='localnet_start'
stop_cmd='localnet_stop'
rebuild_zoneinfo_cmd="localnet_build_zoneinfo"
rcvar='localnet_enable'

load_rc_config 'localnet'


localnet_build_zoneinfo()
{
    compute_addrs
    localnet_build_zoneinfo_impl
}
    

localnet_build_zoneinfo_impl()
{
    #build_zoneinfo ${isp_prefix} 31 ${router_conf_dir}/namedb/local-machines.defs 
    build_zoneinfo ${isp_prefix} ${localnet_generated_zone_subnet} ${rc_router_conf_dir}/namedb/local-machines.defs > ${rc_router_gen_dir}/zone.${localnet_generated_zone}
}

localnet_build_acls()
{
    gen_acls_dir=${rc_router_gen_dir}/namedb
    mkdir -p ${gen_acls_dir}
    cat ${rc_router_dir}/templates/named.acls.conf \
        | sed \
                -e "s/@ISP_PREFIX@/${isp_prefix}/g" \
                -e "s/@ULA_PREFIX@/${secret_ip6_net}/g" \
        > ${gen_acls_dir}/acls.conf
}

compute_addrs() {
    
    loop=0
    while [ -z "${v6addr}" -a ${loop} -lt 5 ]
    do
        [ ${loop} -ne 0 ] && sleep 5
		# todo: Adjust our ipv6 hint...  get from a var?
		v6addr=$(ifconfig ${localnet_first_nic} | grep "inet6 [23]...:" | head -1 | awk '{print $2}')
		echo "V6 addr is: ${v6addr}"
        loop=$(( ${loop} + 1 ))
    done
    
    echo "V6 addr is: ${v6addr}"
    three_quads=$(echo ${v6addr} | awk -F ':' '{print $1":"$2":"$3}')
    echo "First three quads are: ${three_quads}"
    last_quad=$(echo ${v6addr} | awk -F ':' '{print $4}')
    echo "Last quad is: ${last_quad}"
    last_prefix=$(echo ${last_quad} | rev | awk '{print $1"0000"}' | cut -c 3,4 | rev | sed -e 's/^0//')
    echo "Last prefix is: ${last_prefix}"

    isp_prefix="${three_quads}:${last_prefix}"
    base_addr="    inet6 ${isp_prefix}ff::1"
}


localnet_start() {
    cp ${rc_router_conf_dir}/resolv.conf.master ${rc_router_conf_dir}/resolv.conf
    compute_addrs
    ifconfig lo1 create ${base_addr} prefer_source

    # DO NOT USE prefer_source for this address...
    # It will cause confusion for the wireguard tunnels underneath...
    # It also could cause DNS recursion to fail -- routing as the nested
    # connections...

    localnet_build_acls
	if [ `option_selected ${localnet_build_zoneinfo}` = "YES" ]
	then
		localnet_build_zoneinfo_impl
	fi
}

localnet_stop() {
    compute_addrs
    ifconfig lo0 ${base_addr} delete

    ifconfig lo1 destroy
}

run_rc_command "$1"

# vim: ft=bash
