dnsmasq: change 'add_local_hostname' to use dnsmasq '--interface-name'

'add_local_hostname' previous implementation may drop some addresses.
Soft addition of IP6 addresses may not cause a reload or restart event.
dnsmasq '--interface-name' robustly applies DNS to all addresses per
interface (except fe80::/10).

Change UCI 'add_local_hostname' to expand during each interface assignement
during add_dhcp().
Assign '<iface>.<host>.<domain>' as true name (reflexive A, AAAA, and PTR).
Assign '<host>.<domain>' and '<host>' as convinience aliases (no PTR, not
technically CNAME).
This is accomplished with the '--interface-name' order, first is PTR.
We could also assign each <ip4/6>.<iface>.<host>.<domain> to the respective
dual stack on the interface.
That seemed excessive so it was skipped (/4 or /6 suffix to the interface).
Add UCI 'add_wan_hostname' similar to 'add_local_hostname' function for
external WAN.

WAN IP4 are less often named by the ISP and rarely WAN IP6 due to complexity.
For logs, LuCI connection graph, and other uses assigning a WAN name is desired.
'add_local_hostname' only applies with DHCP and 'add_wam_hostname' only applies
without DHCP. Common residential users will want to set both options TRUE.
Businesses will probably have global DNS, static IP, and 'add_wan_hostname' FALSE.

Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
This commit is contained in:
Eric Luehrsen 2016-12-20 22:08:54 -05:00 committed by Hans Dedecker
parent 06e26363d8
commit 612e2276b4
2 changed files with 31 additions and 23 deletions

View file

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=dnsmasq PKG_NAME:=dnsmasq
PKG_VERSION:=2.76 PKG_VERSION:=2.76
PKG_RELEASE:=6 PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq

View file

@ -8,6 +8,7 @@ PROG=/usr/sbin/dnsmasq
ADD_LOCAL_DOMAIN=1 ADD_LOCAL_DOMAIN=1
ADD_LOCAL_HOSTNAME=1 ADD_LOCAL_HOSTNAME=1
ADD_WAN_HOSTNAME=0
BASECONFIGFILE="/var/etc/dnsmasq.conf" BASECONFIGFILE="/var/etc/dnsmasq.conf"
BASEHOSTFILE="/tmp/hosts/dhcp" BASEHOSTFILE="/tmp/hosts/dhcp"
@ -293,6 +294,26 @@ dhcp_host_add() {
xappend "--dhcp-host=$macs${duid:+,id:$duid}${networkid:+,net:$networkid}${broadcast:+,set:needs-broadcast}${tag:+,set:$tag}${ip:+,$ip${hostid:+,[::$hostid]}}${name:+,$name}${leasetime:+,$leasetime}" xappend "--dhcp-host=$macs${duid:+,id:$duid}${networkid:+,net:$networkid}${broadcast:+,set:needs-broadcast}${tag:+,set:$tag}${ip:+,$ip${hostid:+,[::$hostid]}}${name:+,$name}${leasetime:+,$leasetime}"
} }
dhcp_this_host_add() {
# TODO: case-in do/not short-host or FQDN; UCI already intended ...
local ifname="$1"
local do_enable="$2"
local routerstub routername ifdashname
if [ "$do_enable" -gt 0 ] ; then
# All IP addresses discovered by dnsmasq will be labeled robustly (except fe80::)
ifdashname="${ifname//./-}"
routerstub="$( md5sum /etc/os-release )"
routerstub="router-${routerstub// */}"
routername="$( uci_get system @system[0] hostname $routerstub )"
xappend "--interface-name=$ifdashname.$routername.$DOMAIN,$ifname"
xappend "--interface-name=$routername.$DOMAIN,$ifname"
xappend "--interface-name=$routername,$ifname"
fi
}
dhcp_tag_add() { dhcp_tag_add() {
local cfg="$1" local cfg="$1"
@ -363,7 +384,11 @@ dhcp_add() {
DNS_SERVERS="$DNS_SERVERS $dnsserver" DNS_SERVERS="$DNS_SERVERS $dnsserver"
} }
append_bool "$cfg" ignore "--no-dhcp-interface=$ifname" && return 0 append_bool "$cfg" ignore "--no-dhcp-interface=$ifname" && {
# Many ISP do not have useful names for DHCP customers (your WAN).
dhcp_this_host_add $ifname $ADD_WAN_HOSTNAME
return 0
}
# Do not support non-static interfaces for now # Do not support non-static interfaces for now
[ static = "$proto" ] || return 0 [ static = "$proto" ] || return 0
@ -381,6 +406,9 @@ dhcp_add() {
config_get options "$cfg" options config_get options "$cfg" options
config_get_bool dynamicdhcp "$cfg" dynamicdhcp 1 config_get_bool dynamicdhcp "$cfg" dynamicdhcp 1
# Put the router host name on this DHCP served interface address(es)
dhcp_this_host_add $ifname $ADD_LOCAL_HOSTNAME
leasetime="${leasetime:-12h}" leasetime="${leasetime:-12h}"
start="$(dhcp_calc "${start:-100}")" start="$(dhcp_calc "${start:-100}")"
limit="${limit:-150}" limit="${limit:-150}"
@ -605,6 +633,7 @@ dnsmasq_start()
config_get_bool ADD_LOCAL_DOMAIN "$cfg" add_local_domain 1 config_get_bool ADD_LOCAL_DOMAIN "$cfg" add_local_domain 1
config_get_bool ADD_LOCAL_HOSTNAME "$cfg" add_local_hostname 1 config_get_bool ADD_LOCAL_HOSTNAME "$cfg" add_local_hostname 1
config_get_bool ADD_WAN_HOSTNAME "$cfg" add_wan_hostname 0
config_get_bool readethers "$cfg" readethers config_get_bool readethers "$cfg" readethers
[ "$readethers" = "1" -a \! -e "/etc/ethers" ] && touch /etc/ethers [ "$readethers" = "1" -a \! -e "/etc/ethers" ] && touch /etc/ethers
@ -702,27 +731,6 @@ dnsmasq_start()
config_foreach filter_dnsmasq hostrecord dhcp_hostrecord_add "$cfg" config_foreach filter_dnsmasq hostrecord dhcp_hostrecord_add "$cfg"
config_foreach filter_dnsmasq relay dhcp_relay_add "$cfg" config_foreach filter_dnsmasq relay dhcp_relay_add "$cfg"
# add own hostname
[ $ADD_LOCAL_HOSTNAME -eq 1 ] && {
local lanaddr lanaddr6
local ulaprefix="$(uci_get network @globals[0] ula_prefix)"
local hostname="$(uci_get system @system[0] hostname Lede)"
network_get_ipaddr lanaddr "lan" && {
dhcp_domain_add "" "$hostname" "$lanaddr"
}
[ -n "$ulaprefix" ] && network_get_ipaddrs6 lanaddr6 "lan" && {
for lanaddr6 in $lanaddr6; do
case "$lanaddr6" in
"${ulaprefix%%:/*}"*)
dhcp_domain_add "" "$hostname" "$lanaddr6"
;;
esac
done
}
}
echo >> $CONFIGFILE_TMP echo >> $CONFIGFILE_TMP
config_foreach filter_dnsmasq srvhost dhcp_srv_add "$cfg" config_foreach filter_dnsmasq srvhost dhcp_srv_add "$cfg"
config_foreach filter_dnsmasq mxhost dhcp_mx_add "$cfg" config_foreach filter_dnsmasq mxhost dhcp_mx_add "$cfg"