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

# This is a bit hacky, but I think I can live with it for now.
#
# 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
# the IMP_NET address for this machine to another loopback device.

router_conf_dir="/home/adam/proj/rc.router"
. ${router_conf_dir}/rc.conf
#. /etc/rc.subr

name='localnet'

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

#load_rc_config 'localnet'

localnet_first_nic="re0.301"

[ -z "$localnet_enable" ] && localnet_enable='NO'
[ -z "$localnet_zoneinfo_enable" ] && localnet_zoneinfo_enable='NO'

localnet_build_zoneinfo()
{
    #compute_addrs
    isp_prefix="2001:db8:42:ab"
    localnet_build_zoneinfo_impl
}
    

localnet_build_zoneinfo_impl()
{
	if [ $(option_selected localnet_zoneinfo_enable) = "YES" ]
	then
		#build_zoneinfo ${isp_prefix} 31 ${router_conf_dir}/namedb/local-machines.defs 
		build_zoneinfo ${isp_prefix} ${localnet_zoneinfo_subnet} ${router_conf_dir}/namedb/local-machines.defs > ${router_conf_dir}/gen/${localnet_zone_file}
	fi
}

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

localnet_build_rtadv()
{
    gen_rtadv_dir=${router_conf_dir}/gen
    rtadvd_conf=${gen_rtadv_dir}/rtadvd.conf
    mkdir -p ${gen_rtadv_dir}
    _search_list=$( echo ${rtadvd_dns_search_list} | sed -e 's/  */,/g' -e 's/^,//' -e 's/,$//' )
    cat ${router_conf_dir}/rtadvd.template.conf \
        | sed \
            -e "s/@PREF64_PREFIX@/${rtadvd_pref64_prefix}/" \
            -e "s/@DNS_SERVER@/${rtadvd_dns_server}/" \
            -e "s/@DNSSL@/${_search_list}/" \
        > ${rtadvd_conf}

    echo "" >> ${rtadvd_conf}
    echo "" >> ${rtadvd_conf}

    for interface in ${rtadvd_interfaces}
    do
        echo "${interface}:tc=settings" >> ${rtadvd_conf}
    done
}

compute_addrs() {
    # 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=0
    while [ -z "${v6addr}" -a ${loop} -lt 4 ]
    do
        sleep 5
        v6addr=$(ifconfig re0.301 | grep "2600:4040:" | 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 ${router_conf_dir}/resolv.conf.master ${router_conf_dir}/resolv.conf
    compute_addrs
    ifconfig lo1 create ${base_addr} prefer_source
    ifconfig lo3 create inet 198.18.0.1/32

    # 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...
    ifconfig lo2 create inet6 2602:f6a8:1::/64 anycast # DO NOT USE prefer_source
    ifconfig lo4 create inet 155.103.215.15/32 anycast

    localnet_build_rtadv
    localnet_build_acls
    localnet_build_zoneinfo_impl
}

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

    ifconfig lo1 destroy
    ifconfig lo2 destroy
    ifconfig lo3 destroy
    ifconfig lo4 destroy
}

#run_rc_command "$1"


localnet_build_zoneinfo

# vim: ft=bash
