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 <ulrich.weber@riverbed.com>
Ulrich Weber 2016-06-13 15:21:47 +02:00 committed by Felix Fietkau
parent d9ff187003
commit 712b6fdc5c
1 changed files with 10 additions and 8 deletions

View File

@ -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" ] && {