Преглед изворни кода

dnsmasq: write atomic config file

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 <[email protected]>
Ulrich Weber пре 9 година
родитељ
комит
712b6fdc5c
1 измењених фајлова са 10 додато и 8 уклоњено
  1. 10 8
      package/network/services/dnsmasq/files/dnsmasq.init

+ 10 - 8
package/network/services/dnsmasq/files/dnsmasq.init

@@ -13,6 +13,7 @@ ADD_LOCAL_DOMAIN=1
 ADD_LOCAL_HOSTNAME=1
 ADD_LOCAL_HOSTNAME=1
 
 
 CONFIGFILE="/var/etc/dnsmasq.conf"
 CONFIGFILE="/var/etc/dnsmasq.conf"
+CONFIGFILE_TMP="/var/etc/dnsmasq.conf.$$"
 HOSTFILE="/tmp/hosts/dhcp"
 HOSTFILE="/tmp/hosts/dhcp"
 TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
 TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
 TIMESTAMPFILE="/etc/dnsmasq.time"
 TIMESTAMPFILE="/etc/dnsmasq.time"
@@ -21,7 +22,7 @@ TIMEVALIDFILE="/var/state/dnsmasqsec"
 xappend() {
 xappend() {
 	local value="$1"
 	local value="$1"
 
 
-	echo "${value#--}" >> $CONFIGFILE
+	echo "${value#--}" >> $CONFIGFILE_TMP
 }
 }
 
 
 hex_to_hostid() {
 hex_to_hostid() {
@@ -255,7 +256,7 @@ dnsmasq() {
 	xappend "--user=dnsmasq"
 	xappend "--user=dnsmasq"
 	xappend "--group=dnsmasq"
 	xappend "--group=dnsmasq"
 
 
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 
 
 	config_get_bool enable_tftp "$cfg" enable_tftp 0
 	config_get_bool enable_tftp "$cfg" enable_tftp 0
 	[ "$enable_tftp" -gt 0 ] && {
 	[ "$enable_tftp" -gt 0 ] && {
@@ -635,7 +636,7 @@ start_service() {
 
 
 	[ -f "$TIMESTAMPFILE" ] && rm -f "$TIMESTAMPFILE"
 	[ -f "$TIMESTAMPFILE" ] && rm -f "$TIMESTAMPFILE"
 
 
-	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
 	echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE
 
 
 	# if we did this last, we could override auto-generated config
 	# if we did this last, we could override auto-generated config
@@ -648,7 +649,7 @@ start_service() {
 	args=""
 	args=""
 	config_foreach dnsmasq dnsmasq
 	config_foreach dnsmasq dnsmasq
 	config_foreach dhcp_host_add host
 	config_foreach dhcp_host_add host
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 	config_foreach dhcp_boot_add boot
 	config_foreach dhcp_boot_add boot
 	config_foreach dhcp_mac_add mac
 	config_foreach dhcp_mac_add mac
 	config_foreach dhcp_tag_add tag
 	config_foreach dhcp_tag_add tag
@@ -682,19 +683,20 @@ start_service() {
 		}
 		}
 	}
 	}
 
 
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 	config_foreach dhcp_srv_add srvhost
 	config_foreach dhcp_srv_add srvhost
 	config_foreach dhcp_mx_add mxhost
 	config_foreach dhcp_mx_add mxhost
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 
 
 	config_get odhcpd_is_active odhcpd maindhcp
 	config_get odhcpd_is_active odhcpd maindhcp
 	if [ "$odhcpd_is_active" != "1" ]; then
 	if [ "$odhcpd_is_active" != "1" ]; then
 		config_foreach dhcp_add dhcp
 		config_foreach dhcp_add dhcp
 	fi
 	fi
 
 
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
 	config_foreach dhcp_cname_add cname
 	config_foreach dhcp_cname_add cname
-	echo >> $CONFIGFILE
+	echo >> $CONFIGFILE_TMP
+	mv -f $CONFIGFILE_TMP $CONFIGFILE
 
 
 	rm -f /tmp/resolv.conf
 	rm -f /tmp/resolv.conf
 	[ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
 	[ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {