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>
This commit is contained in:
Ulrich Weber 2016-06-13 15:21:47 +02:00 committed by Felix Fietkau
parent d9ff187003
commit 712b6fdc5c

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