150 lines
4.2 KiB
Bash
Executable File
150 lines
4.2 KiB
Bash
Executable File
#!/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
|