summaryrefslogtreecommitdiff
path: root/package/network/services
diff options
context:
space:
mode:
authorjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-12-21 13:31:28 +0000
committerjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-12-21 13:31:28 +0000
commit52c231ba861bcaae4969e99d8d8b7942fbebe7bf (patch)
treec5e026bfc357903d28976a06366558b2a696f00f /package/network/services
parentf738e7b819a4d436edc2c3b8f10f9726e61c7958 (diff)
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> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@39152 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/network/services')
-rw-r--r--package/network/services/dnsmasq/Makefile2
-rw-r--r--package/network/services/dnsmasq/files/dnsmasq.hotplug5
-rw-r--r--package/network/services/dnsmasq/files/dnsmasq.init50
3 files changed, 46 insertions, 11 deletions
diff --git a/package/network/services/dnsmasq/Makefile b/package/network/services/dnsmasq/Makefile
index 02712bdc7d..06734651e2 100644
--- a/package/network/services/dnsmasq/Makefile
+++ b/package/network/services/dnsmasq/Makefile
@@ -83,6 +83,8 @@ define Package/dnsmasq/install
$(INSTALL_DATA) ./files/dnsmasq.conf $(1)/etc/dnsmasq.conf
$(INSTALL_DIR) $(1)/etc/init.d
$(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
Package/dnsmasq-dhcpv6/install = $(Package/dnsmasq/install)
diff --git a/package/network/services/dnsmasq/files/dnsmasq.hotplug b/package/network/services/dnsmasq/files/dnsmasq.hotplug
new file mode 100644
index 0000000000..ca5d10c2ed
--- /dev/null
+++ b/package/network/services/dnsmasq/files/dnsmasq.hotplug
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+[ "$ACTION" = ifup ] || exit 0
+
+/etc/init.d/dnsmasq enabled && /etc/init.d/dnsmasq start
diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init
index 045fc7eb4c..0ff987f69c 100644
--- a/package/network/services/dnsmasq/files/dnsmasq.init
+++ b/package/network/services/dnsmasq/files/dnsmasq.init
@@ -33,6 +33,29 @@ dhcp_calc() {
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() {
local section="$1"
local option="$2"
@@ -141,7 +164,7 @@ dnsmasq() {
local rebind
config_get_bool rebind "$cfg" rebind_protection 1
[ $rebind -gt 0 ] && {
- logger -t dnsmasq \
+ log_once \
"DNS rebinding protection is active," \
"will discard upstream RFC1918 responses!"
xappend "--stop-dns-rebind"
@@ -149,12 +172,12 @@ dnsmasq() {
local rebind_localhost
config_get_bool rebind_localhost "$cfg" rebind_localhost 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"
}
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"
}
@@ -356,14 +379,7 @@ dhcp_add() {
#check for an already active dhcp server on the interface, unless 'force' is set
config_get_bool force "$cfg" force 0
- [ $force -gt 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
- }
- }
+ [ $force -gt 0 ] || dhcp_check "$ifname" || return 0
config_get start "$cfg" start
config_get limit "$cfg" limit
@@ -492,6 +508,11 @@ service_triggers()
procd_add_reload_trigger "dhcp"
}
+boot() {
+ # Will be launched through hotplug
+ return 0
+}
+
start_service() {
include /lib/functions
@@ -499,6 +520,7 @@ start_service() {
procd_open_instance
procd_set_param command $PROG -C $CONFIGFILE -k
+ procd_set_param file $CONFIGFILE
procd_close_instance
# before we can call xappend
@@ -552,9 +574,15 @@ start_service() {
done
}
+reload_service() {
+ rc_procd start_service "$@"
+ return 0
+}
+
stop_service() {
[ -f /tmp/resolv.conf ] && {
rm -f /tmp/resolv.conf
ln -s /tmp/resolv.conf.auto /tmp/resolv.conf
}
+ rm -f /var/run/dnsmasq.*.dhcp
}