dnsmasq: rework init procedure

- cache udhcp check results to speed up subsequent reloads
	- enable procd file tracking for /var/etc/dnsmasq.conf to only reload service if needed
	- implement reload action to only restart dnsmasq if /var/etc/dnsmasq.conf actually changed
	- launch dnsmasq from interface hotplug to avoid race conditions with network bringup

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>

SVN-Revision: 39152
This commit is contained in:
Jo-Philipp Wich 2013-12-21 13:31:28 +00:00
parent 72f00c8de4
commit efce764f0e
3 changed files with 46 additions and 11 deletions

View file

@ -83,6 +83,8 @@ define Package/dnsmasq/install
$(INSTALL_DATA) ./files/dnsmasq.conf $(1)/etc/dnsmasq.conf $(INSTALL_DATA) ./files/dnsmasq.conf $(1)/etc/dnsmasq.conf
$(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/dnsmasq.init $(1)/etc/init.d/dnsmasq $(INSTALL_BIN) ./files/dnsmasq.init $(1)/etc/init.d/dnsmasq
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
$(INSTALL_DATA) ./files/dnsmasq.hotplug $(1)/etc/hotplug.d/iface/25-dnsmasq
endef endef
Package/dnsmasq-dhcpv6/install = $(Package/dnsmasq/install) Package/dnsmasq-dhcpv6/install = $(Package/dnsmasq/install)

View file

@ -0,0 +1,5 @@
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
/etc/init.d/dnsmasq enabled && /etc/init.d/dnsmasq start

View file

@ -33,6 +33,29 @@ dhcp_calc() {
echo "$res" echo "$res"
} }
dhcp_check() {
local ifname="$1"
local stamp="/var/run/dnsmasq.$ifname.dhcp"
local rv=0
[ -s "$stamp" ] && return $(cat "$stamp")
udhcpc -n -q -s /bin/true -t 1 -i "$ifname" >&- && rv=1 || rv=0
[ $rv -eq 1 ] && \
logger -t dnsmasq \
"found already running DHCP-server on interface '$ifname'" \
"refusing to start, use 'option force 1' to override"
echo $rv > "$stamp"
return $rv
}
log_once() {
pidof dnsmasq >/dev/null || \
logger -t dnsmasq "$@"
}
append_bool() { append_bool() {
local section="$1" local section="$1"
local option="$2" local option="$2"
@ -141,7 +164,7 @@ dnsmasq() {
local rebind local rebind
config_get_bool rebind "$cfg" rebind_protection 1 config_get_bool rebind "$cfg" rebind_protection 1
[ $rebind -gt 0 ] && { [ $rebind -gt 0 ] && {
logger -t dnsmasq \ log_once \
"DNS rebinding protection is active," \ "DNS rebinding protection is active," \
"will discard upstream RFC1918 responses!" "will discard upstream RFC1918 responses!"
xappend "--stop-dns-rebind" xappend "--stop-dns-rebind"
@ -149,12 +172,12 @@ dnsmasq() {
local rebind_localhost local rebind_localhost
config_get_bool rebind_localhost "$cfg" rebind_localhost 0 config_get_bool rebind_localhost "$cfg" rebind_localhost 0
[ $rebind_localhost -gt 0 ] && { [ $rebind_localhost -gt 0 ] && {
logger -t dnsmasq "Allowing 127.0.0.0/8 responses" log_once "Allowing 127.0.0.0/8 responses"
xappend "--rebind-localhost-ok" xappend "--rebind-localhost-ok"
} }
append_rebind_domain() { append_rebind_domain() {
logger -t dnsmasq "Allowing RFC1918 responses for domain $1" log_once "Allowing RFC1918 responses for domain $1"
xappend "--rebind-domain-ok=$1" xappend "--rebind-domain-ok=$1"
} }
@ -356,14 +379,7 @@ dhcp_add() {
#check for an already active dhcp server on the interface, unless 'force' is set #check for an already active dhcp server on the interface, unless 'force' is set
config_get_bool force "$cfg" force 0 config_get_bool force "$cfg" force 0
[ $force -gt 0 ] || { [ $force -gt 0 ] || dhcp_check "$ifname" || return 0
udhcpc -n -q -s /bin/true -t 1 -i $ifname >&- && {
logger -t dnsmasq \
"found already running DHCP-server on interface '$ifname'" \
"refusing to start, use 'option force 1' to override"
return 0
}
}
config_get start "$cfg" start config_get start "$cfg" start
config_get limit "$cfg" limit config_get limit "$cfg" limit
@ -492,6 +508,11 @@ service_triggers()
procd_add_reload_trigger "dhcp" procd_add_reload_trigger "dhcp"
} }
boot() {
# Will be launched through hotplug
return 0
}
start_service() { start_service() {
include /lib/functions include /lib/functions
@ -499,6 +520,7 @@ start_service() {
procd_open_instance procd_open_instance
procd_set_param command $PROG -C $CONFIGFILE -k procd_set_param command $PROG -C $CONFIGFILE -k
procd_set_param file $CONFIGFILE
procd_close_instance procd_close_instance
# before we can call xappend # before we can call xappend
@ -552,9 +574,15 @@ start_service() {
done done
} }
reload_service() {
rc_procd start_service "$@"
return 0
}
stop_service() { stop_service() {
[ -f /tmp/resolv.conf ] && { [ -f /tmp/resolv.conf ] && {
rm -f /tmp/resolv.conf rm -f /tmp/resolv.conf
ln -s /tmp/resolv.conf.auto /tmp/resolv.conf ln -s /tmp/resolv.conf.auto /tmp/resolv.conf
} }
rm -f /var/run/dnsmasq.*.dhcp
} }