123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #!/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'
- #
- ##############################################################################
- . /lib/functions.sh
- . /usr/lib/unbound/defaults.sh
- ##############################################################################
- odhcpd_zonedata() {
- local longconf dateconf
- local dns_ls_add=$UNBOUND_VARDIR/dhcp_dns.add
- local dns_ls_del=$UNBOUND_VARDIR/dhcp_dns.del
- local dhcp_ls_new=$UNBOUND_VARDIR/dhcp_lease.new
- local dhcp_ls_old=$UNBOUND_VARDIR/dhcp_lease.old
- local dhcp_ls_add=$UNBOUND_VARDIR/dhcp_lease.add
- local dhcp_ls_del=$UNBOUND_VARDIR/dhcp_lease.del
- 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 [ "$dhcp_link" = "odhcpd" -a -f "$dhcp_origin" ] ; then
- # Capture the lease file which could be changing often
- sort $dhcp_origin > $dhcp_ls_new
- if [ ! -f $UNBOUND_DHCP_CONF -o ! -f $dhcp_ls_old ] ; then
- longconf=2
- else
- dateconf=$(( $( date +%s ) - $( date -r $UNBOUND_DHCP_CONF +%s ) ))
- if [ $dateconf > 150 ] ; then
- longconf=1
- else
- longconf=0
- fi
- fi
- if [ $longconf -gt 0 ] ; then
- # Go through the messy business of coding up A, AAAA, and PTR records
- # This static conf will be available if Unbound restarts asynchronously
- awk -v hostfile=$UNBOUND_DHCP_CONF -v domain=$dhcp_domain \
- -v bslaac=$dhcp4_slaac6 -v bisolt=0 -v bconf=1 \
- -f /usr/lib/unbound/odhcpd.awk $dhcp_ls_new
- fi
- if [ $longconf -lt 2 ] ; then
- # Deleting and adding all records into Unbound can be a burden in a
- # high density environment. Use unbound-control incrementally.
- sort $dhcp_ls_old $dhcp_ls_new $dhcp_ls_new | uniq -u > $dhcp_ls_del
- awk -v hostfile=$dns_ls_del -v domain=$dhcp_domain \
- -v bslaac=$dhcp4_slaac6 -v bisolt=0 -v bconf=0 \
- -f /usr/lib/unbound/odhcpd.awk $dhcp_ls_del
- sort $dhcp_ls_new $dhcp_ls_old $dhcp_ls_old | uniq -u > $dhcp_ls_add
- awk -v hostfile=$dns_ls_add -v domain=$dhcp_domain \
- -v bslaac=$dhcp4_slaac6 -v bisolt=0 -v bconf=0 \
- -f /usr/lib/unbound/odhcpd.awk $dhcp_ls_add
- else
- awk -v hostfile=$dns_ls_add -v domain=$dhcp_domain \
- -v bslaac=$dhcp4_slaac6 -v bisolt=0 -v bconf=0 \
- -f /usr/lib/unbound/odhcpd.awk $dhcp_ls_new
- fi
- if [ -f "$dns_ls_del" ] ; then
- cat $dns_ls_del | $UNBOUND_CONTROL_CFG local_datas_remove
- fi
- if [ -f "$dns_ls_add" ] ; then
- cat $dns_ls_add | $UNBOUND_CONTROL_CFG local_datas
- fi
- # prepare next round
- mv $dhcp_ls_new $dhcp_ls_old
- rm -f $dns_ls_del $dns_ls_add $dhcp_ls_del $dhcp_ls_add
- fi
- }
- ##############################################################################
- odhcpd_zonedata
- ##############################################################################
|