packages/net/unbound/files/odhcpd.sh
Eric Luehrsen 658c27ea97 unbound: clean up interface interpretation in UCI
DNS flag day 2020, software should reflect the minimum EDNS 1232 bytes.
Added iface_wan and iface_lan to control internal DNS assignemnts and
to control what is local service ACL. Interface wild cards are not
explicitly set so that they can be customized in extended conf.

Signed-off-by: Eric Luehrsen <ericluehrsen@gmail.com>
2020-11-04 19:25:08 -05:00

150 lines
4.9 KiB
Bash

#!/bin/sh
##############################################################################
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# Copyright (C) 2016 Eric Luehrsen
#
##############################################################################
#
# This script facilitates alternate installation of Unbound+odhcpd and no
# need for dnsmasq. There are some limitations, but it works and is small.
# The lease file is parsed to make "zone-data:" and "local-data:" entries.
#
# config odhcpd 'odhcpd'
# option leasetrigger '/usr/lib/unbound/odhcpd.sh'
#
##############################################################################
# while useful (sh)ellcheck is pedantic and noisy
# shellcheck disable=1091,2002,2004,2034,2039,2086,2094,2140,2154,2155
UB_ODHCPD_BLANK=
##############################################################################
odhcpd_zonedata() {
. /lib/functions.sh
. /usr/lib/unbound/defaults.sh
local dhcp_link=$( uci_get unbound.@unbound[0].dhcp_link )
local dhcp4_slaac6=$( uci_get unbound.@unbound[0].dhcp4_slaac6 )
local dhcp_domain=$( uci_get unbound.@unbound[0].domain )
local dhcp_origin=$( uci_get dhcp.@odhcpd[0].leasefile )
if [ -f "$UB_TOTAL_CONF" ] && [ -f "$dhcp_origin" ] \
&& [ "$dhcp_link" = "odhcpd" ] && [ -n "$dhcp_domain" ] ; then
local longconf dateconf dateoldf
local dns_ls_add=$UB_VARDIR/dhcp_dns.add
local dns_ls_del=$UB_VARDIR/dhcp_dns.del
local dns_ls_new=$UB_VARDIR/dhcp_dns.new
local dns_ls_old=$UB_VARDIR/dhcp_dns.old
local dhcp_ls_new=$UB_VARDIR/dhcp_lease.new
if [ ! -f $UB_DHCP_CONF ] || [ ! -f $dns_ls_old ] ; then
# no old files laying around
touch $dns_ls_old
sort $dhcp_origin > $dhcp_ls_new
longconf=freshstart
else
# incremental at high load or full refresh about each 5 minutes
dateconf=$(( $( date +%s ) - $( date -r $UB_DHCP_CONF +%s ) ))
dateoldf=$(( $( date +%s ) - $( date -r $dns_ls_old +%s ) ))
if [ $dateconf -gt 300 ] ; then
touch $dns_ls_old
sort $dhcp_origin > $dhcp_ls_new
longconf=longtime
elif [ $dateoldf -gt 1 ] ; then
touch $dns_ls_old
sort $dhcp_origin > $dhcp_ls_new
longconf=increment
else
# odhcpd is rapidly updating leases a race condition could occur
longconf=skip
fi
fi
case $longconf in
freshstart)
awk -v conffile=$UB_DHCP_CONF -v pipefile=$dns_ls_new \
-v domain=$dhcp_domain -v bslaac=$dhcp4_slaac6 \
-v bisolt=0 -v bconf=1 \
-f /usr/lib/unbound/odhcpd.awk $dhcp_ls_new
cp $dns_ls_new $dns_ls_add
cp $dns_ls_new $dns_ls_old
cat $dns_ls_add | $UB_CONTROL_CFG local_datas
rm -f $dns_ls_new $dns_ls_del $dns_ls_add $dhcp_ls_new
;;
longtime)
awk -v conffile=$UB_DHCP_CONF -v pipefile=$dns_ls_new \
-v domain=$dhcp_domain -v bslaac=$dhcp4_slaac6 \
-v bisolt=0 -v bconf=1 \
-f /usr/lib/unbound/odhcpd.awk $dhcp_ls_new
awk '{ print $1 }' $dns_ls_old | sort | uniq > $dns_ls_del
cp $dns_ls_new $dns_ls_add
cp $dns_ls_new $dns_ls_old
cat $dns_ls_del | $UB_CONTROL_CFG local_datas_remove
cat $dns_ls_add | $UB_CONTROL_CFG local_datas
rm -f $dns_ls_new $dns_ls_del $dns_ls_add $dhcp_ls_new
;;
increment)
# incremental add and prepare the old list for delete later
# unbound-control can be slow so high DHCP rates cannot run a full list
awk -v conffile=$UB_DHCP_CONF -v pipefile=$dns_ls_new \
-v domain=$dhcp_domain -v bslaac=$dhcp4_slaac6 \
-v bisolt=0 -v bconf=0 \
-f /usr/lib/unbound/odhcpd.awk $dhcp_ls_new
sort $dns_ls_new $dns_ls_old $dns_ls_old | uniq -u > $dns_ls_add
sort $dns_ls_new $dns_ls_old | uniq > $dns_ls_old
cat $dns_ls_add | $UB_CONTROL_CFG local_datas
rm -f $dns_ls_new $dns_ls_del $dns_ls_add $dhcp_ls_new
;;
*)
echo "do nothing" >/dev/null
;;
esac
fi
}
##############################################################################
UB_ODHPCD_LOCK=/tmp/unbound_odhcpd.lock
if [ ! -f $UB_ODHPCD_LOCK ] ; then
# imperfect but it should avoid collisions
touch $UB_ODHPCD_LOCK
odhcpd_zonedata
rm -f $UB_ODHPCD_LOCK
else
UB_ODHCPD_LOCK_AGE=$(( $( date +%s ) - $( date -r $UB_ODHPCD_LOCK +%s ) ))
if [ $UB_ODHCPD_LOCK_AGE -gt 100 ] ; then
# unlock because something likely broke but do not write this time through
rm -f $UB_ODHPCD_LOCK
fi
fi
##############################################################################