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:
parent
72f00c8de4
commit
efce764f0e
3 changed files with 46 additions and 11 deletions
|
@ -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)
|
||||||
|
|
5
package/network/services/dnsmasq/files/dnsmasq.hotplug
Normal file
5
package/network/services/dnsmasq/files/dnsmasq.hotplug
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
[ "$ACTION" = ifup ] || exit 0
|
||||||
|
|
||||||
|
/etc/init.d/dnsmasq enabled && /etc/init.d/dnsmasq start
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue