dnsmasq: manage resolv.conf if when listening on 127.0.0.1#53
[openwrt/openwrt.git] / package / network / services / dnsmasq / files / dnsmasq.init
index 2d05b77873c26be20889ee4a2f33ce1349c151cd..fda11401db6f8e47912809ae1b506401d0570ffb 100644 (file)
@@ -103,8 +103,10 @@ append_bool() {
        local section="$1"
        local option="$2"
        local value="$3"
+       local default="$4"
        local _loctmp
-       config_get_bool _loctmp "$section" "$option" 0
+       [ -z "$default" ] && default="0"
+       config_get_bool _loctmp "$section" "$option" "$default"
        [ $_loctmp -gt 0 ] && xappend "$value"
 }
 
@@ -705,6 +707,21 @@ dhcp_relay_add() {
        fi
 }
 
+dnsmasq_ismain()
+{
+       local cfg="$1"
+       local port notinterfaces
+
+       config_get port "$cfg" port "53"
+       [ $port = "53" ] || return 1
+
+       config_get notinterfaces "$cfg" notinterface ""
+       [ -n $notinterfaces ] && list_contains $notinterfaces "loopback" || return 1
+
+       # dnsmasq instance is designated to listen on 127.0.0.1#53.
+       return 0
+}
+
 dnsmasq_start()
 {
        local cfg="$1" disabled resolvfile user_dhcpscript
@@ -791,7 +808,7 @@ dnsmasq_start()
        config_get tftp_root "$cfg" "tftp_root"
        [ -n "$tftp_root" ] && mkdir -p "$tftp_root" && append_bool "$cfg" enable_tftp "--enable-tftp"
        append_bool "$cfg" tftp_no_fail "--tftp-no-fail"
-       append_bool "$cfg" nonwildcard "--bind-dynamic"
+       append_bool "$cfg" nonwildcard "--bind-dynamic" 1
        append_bool "$cfg" fqdn "--dhcp-fqdn"
        append_bool "$cfg" proxydnssec "--proxy-dnssec"
        append_bool "$cfg" localservice "--local-service"
@@ -851,14 +868,10 @@ dnsmasq_start()
        [ -n "$leasefile" -a \! -e "$leasefile" ] && touch "$leasefile"
        config_get_bool cachelocal "$cfg" cachelocal 1
 
-       config_get_bool noresolv "$cfg" noresolv 0
-       if [ "$noresolv" != "1" ]; then
-               config_get resolvfile "$cfg" resolvfile "/tmp/resolv.conf.auto"
-               # So jail doesn't complain if file missing
-               [ -n "$resolvfile" -a \! -e "$resolvfile" ] && touch "$resolvfile"
-       fi
-
-       [ -n "$resolvfile" ] && xappend "--resolv-file=$resolvfile"
+       config_get resolvfile "$cfg" resolvfile "/tmp/resolv.conf.auto"
+       xappend "--resolv-file=$resolvfile"
+       # So jail doesn't complain if file missing
+       [ \! -e "$resolvfile" ] && touch "$resolvfile"
 
        config_get hostsfile "$cfg" dhcphostsfile
        [ -e "$hostsfile" ] && xappend "--dhcp-hostsfile=$hostsfile"
@@ -971,16 +984,6 @@ dnsmasq_start()
        echo >> $CONFIGFILE_TMP
        mv -f $CONFIGFILE_TMP $CONFIGFILE
 
-       [ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
-               rm -f /tmp/resolv.conf
-               [ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
-                       echo "search $DOMAIN" >> /tmp/resolv.conf
-               }
-               DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
-               for DNS_SERVER in $DNS_SERVERS ; do
-                       echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
-               done
-       }
 
        procd_open_instance $cfg
        procd_set_param command $PROG -C $CONFIGFILE -k -x /var/run/dnsmasq/dnsmasq."${cfg}".pid
@@ -998,20 +1001,29 @@ dnsmasq_start()
        procd_add_jail_mount_rw /var/run/dnsmasq/ $leasefile
 
        procd_close_instance
+
+
+       # write /tmp/resolve.conf only for main instance
+       dnsmasq_ismain $cfg && {
+               rm -f /tmp/resolv.conf
+               [ $ADD_LOCAL_DOMAIN -eq 1 ] && [ -n "$DOMAIN" ] && {
+                       echo "search $DOMAIN" >> /tmp/resolv.conf
+               }
+               DNS_SERVERS="$DNS_SERVERS 127.0.0.1"
+               for DNS_SERVER in $DNS_SERVERS ; do
+                       echo "nameserver $DNS_SERVER" >> /tmp/resolv.conf
+               done
+       }
 }
 
 dnsmasq_stop()
 {
        local cfg="$1"
 
-       config_get resolvfile "$cfg" "resolvfile"
-
        #relink /tmp/resolve.conf only for main instance
-       [ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
-               [ -f /tmp/resolv.conf ] && {
-                       rm -f /tmp/resolv.conf
-                       ln -s "$resolvfile" /tmp/resolv.conf
-               }
+       dnsmasq_ismain $cfg && {
+               [ -f /tmp/resolv.conf ] && rm -f /tmp/resolv.conf
+               ln -s /tmp/resolv.conf.auto /tmp/resolv.conf
        }
 
        rm -f ${BASEDHCPSTAMPFILE}.${cfg}.*.dhcp