[LEDE-DEV] [PATCH] dnsmasq: write atomic config file

Ulrich Weber ulrich.weber at riverbed.com
Mon Jun 13 06:21:47 PDT 2016


multiple invocation of dnsmasq script (e.g. by procd and hotplugd)
might cause procd to restart dnsmasq with an incomplete config file.
Config file generation might take quite a long time on larger configs
due ubus calls for each listening interface...

Signed-off-by: Ulrich Weber <ulrich.weber at riverbed.com>
---
 package/network/services/dnsmasq/files/dnsmasq.init | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init
index 1a9903e..6967049 100644
--- a/package/network/services/dnsmasq/files/dnsmasq.init
+++ b/package/network/services/dnsmasq/files/dnsmasq.init
@@ -13,6 +13,7 @@ ADD_LOCAL_DOMAIN=1
 ADD_LOCAL_HOSTNAME=1
 
 CONFIGFILE="/var/etc/dnsmasq.conf"
+CONFIGFILE_TMP="/var/etc/dnsmasq.conf.$$"
 HOSTFILE="/tmp/hosts/dhcp"
 TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
 TIMESTAMPFILE="/etc/dnsmasq.time"
@@ -20,7 +21,7 @@ TIMESTAMPFILE="/etc/dnsmasq.time"
 xappend() {
 	local value="$1"
 
-	echo "${value#--}" >> $CONFIGFILE
+	echo "${value#--}" >> $CONFIGFILE_TMP
 }
 
 hex_to_hostid() {
@@ -249,7 +250,7 @@ dnsmasq() {
 	xappend "--user=dnsmasq"
 	xappend "--group=dnsmasq"
 
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 
 	config_get_bool enable_tftp "$cfg" enable_tftp 0
 	[ "$enable_tftp" -gt 0 ] && {
@@ -632,7 +633,7 @@ start_service() {
 		chown dnsmasq.dnsmasq "$TIMESTAMPFILE"
 	fi
 
-	echo "# auto-generated config file from /etc/config/dhcp" > $CONFIGFILE
+	echo "# auto-generated config file from /etc/config/dhcp" > $CONFIGFILE_TMP
 	echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE
 
 	# if we did this last, we could override auto-generated config
@@ -645,7 +646,7 @@ start_service() {
 	args=""
 	config_foreach dnsmasq dnsmasq
 	config_foreach dhcp_host_add host
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 	config_foreach dhcp_boot_add boot
 	config_foreach dhcp_mac_add mac
 	config_foreach dhcp_tag_add tag
@@ -679,19 +680,20 @@ start_service() {
 		}
 	}
 
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 	config_foreach dhcp_srv_add srvhost
 	config_foreach dhcp_mx_add mxhost
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 
 	config_get odhcpd_is_active odhcpd maindhcp
 	if [ "$odhcpd_is_active" != "1" ]; then
 		config_foreach dhcp_add dhcp
 	fi
 
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 	config_foreach dhcp_cname_add cname
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
+	mv -f $CONFIGFILE_TMP $CONFIGFILE
 
 	rm -f /tmp/resolv.conf
 	[ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
-- 
1.9.1




More information about the Lede-dev mailing list