dnsmasq: write atomic config file
authorUlrich Weber <ulrich.weber@riverbed.com>
Mon, 13 Jun 2016 13:21:47 +0000 (15:21 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 29 Jul 2016 14:41:09 +0000 (16:41 +0200)
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@riverbed.com>
package/network/services/dnsmasq/files/dnsmasq.init

index 5f7afdb95715d563af4dbb35a758d9d39e5cc58e..3809e6c119ffc714517996ac916323162bb74194 100644 (file)
@@ -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"
@@ -21,7 +22,7 @@ TIMEVALIDFILE="/var/state/dnsmasqsec"
 xappend() {
        local value="$1"
 
-       echo "${value#--}" >> $CONFIGFILE
+       echo "${value#--}" >> $CONFIGFILE_TMP
 }
 
 hex_to_hostid() {
@@ -255,7 +256,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 ] && {
@@ -635,7 +636,7 @@ start_service() {
 
        [ -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
 
        # if we did this last, we could override auto-generated config
@@ -648,7 +649,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
@@ -682,19 +683,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" ] && {