dnsmasq: rework network interface ignore
[openwrt/staging/jow.git] / package / network / services / dnsmasq / files / dnsmasq.init
index 21910f5fd19907248f3979ca837c31c39e049ae2..c5e673029187555d1a81e8ec88fefb18b39c08d1 100755 (executable)
@@ -204,8 +204,12 @@ ismounted() {
        return 1
 }
 
-append_addnhosts() {
+append_extramount() {
        ismounted "$1" || append EXTRA_MOUNT "$1"
+}
+
+append_addnhosts() {
+       append_extramount "$1"
        xappend "--addn-hosts=$1"
 }
 
@@ -505,7 +509,6 @@ dhcp_boot_add() {
        dhcp_option_add "$cfg" "$networkid" "$force"
 }
 
-
 dhcp_add() {
        local cfg="$1"
        local dhcp6range="::"
@@ -536,23 +539,21 @@ dhcp_add() {
        # Do not support non-static interfaces for now
        [ static = "$proto" ] || return 0
 
+       ipaddr="${subnet%%/*}"
+       prefix_or_netmask="${subnet##*/}"
+
        # Override interface netmask with dhcp config if applicable
-       config_get netmask "$cfg" netmask "${subnet##*/}"
+       config_get netmask "$cfg" netmask
 
-       #check for an already active dhcp server on the interface, unless 'force' is set
-       config_get_bool force "$cfg" force 0
-       [ $force -gt 0 ] || dhcp_check "$ifname" || {
-               logger -t dnsmasq \
-                       "found already running DHCP-server on interface '$ifname'" \
-                       "refusing to start, use 'option force 1' to override"
-               return 0
-       }
+       [ -n "$netmask" ] && prefix_or_netmask="$netmask"
 
        config_get start "$cfg" start 100
        config_get limit "$cfg" limit 150
        config_get leasetime "$cfg" leasetime 12h
        config_get options "$cfg" options
        config_get_bool dynamicdhcp "$cfg" dynamicdhcp 1
+       config_get_bool dynamicdhcpv4 "$cfg" dynamicdhcpv4 $dynamicdhcp
+       config_get_bool dynamicdhcpv6 "$cfg" dynamicdhcpv6 $dynamicdhcp
 
        config_get dhcpv4 "$cfg" dhcpv4
        config_get dhcpv6 "$cfg" dhcpv6
@@ -561,6 +562,7 @@ dhcp_add() {
        config_get ra_management "$cfg" ra_management
        config_get ra_preference "$cfg" ra_preference
        config_get dns "$cfg" dns
+       config_get dns_sl "$cfg" domain
 
        config_list_foreach "$cfg" "interface_name" append_interface_name "$ifname"
 
@@ -576,25 +578,20 @@ dhcp_add() {
 
        nettag="${networkid:+set:${networkid},}"
 
-       if [ "$limit" -gt 0 ] ; then
-               limit=$((limit-1))
-       fi
+       # make sure the DHCP range is not empty
+       if [ "$dhcpv4" != "disabled" ] && ipcalc "$ipaddr/$prefix_or_netmask" "$start" "$limit" ; then
+               [ "$dynamicdhcpv4" = "0" ] && END="static"
 
-       eval "$(ipcalc.sh "${subnet%%/*}" $netmask $start $limit)"
+               xappend "--dhcp-range=$tags$nettag$START,$END,$NETMASK,$leasetime${options:+ $options}"
+       fi
 
-       if [ "$dynamicdhcp" = "0" ] ; then
-               END="static"
+       if [ "$dynamicdhcpv6" = "0" ] ; then
                dhcp6range="::,static"
        else
                dhcp6range="::1000,::ffff"
        fi
 
 
-       if [ "$dhcpv4" != "disabled" ] ; then
-               xappend "--dhcp-range=$tags$nettag$START,$END,$NETMASK,$leasetime${options:+ $options}"
-       fi
-
-
        if [ $DNSMASQ_DHCP_VER -eq 6 ] && [ "$ra" = "server" ] ; then
                # Note: dnsmasq cannot just be a DHCPv6 server (all-in-1)
                # and let some other machine(s) send RA pointing to it.
@@ -645,6 +642,13 @@ dhcp_add() {
                fi
 
                dhcp_option_append "option6:dns-server,$dnss" "$networkid"
+
+               if [ -n "$dns_sl" ]; then
+                       ddssl=""
+                       for dd in $dns_sl; do append ddssl "$dd" ","; done
+               fi
+
+               dhcp_option_append "option6:domain-search,$ddssl" "$networkid"
        fi
 
        dhcp_option_add "$cfg" "$networkid" 0
@@ -849,7 +853,7 @@ dnsmasq_start()
 {
        local cfg="$1"
        local disabled user_dhcpscript logfacility
-       local resolvfile resolvdir localuse=0
+       local resolvfile resolvdir localuse=1
 
        config_get_bool disabled "$cfg" disabled 0
        [ "$disabled" -gt 0 ] && return 0
@@ -886,6 +890,12 @@ dnsmasq_start()
                xappend "--conf-file=${dnsmasqconffile}"
        }
 
+       config_get_bool boguspriv "$cfg" boguspriv 1
+       [ "$boguspriv" -gt 0 ] && {
+               xappend "--bogus-priv"
+               [ -r "$RFC6761FILE" ] && xappend "--conf-file=$RFC6761FILE"
+       }
+
        $PROG --version | grep -osqE "^Compile time options:.* DHCPv6( |$)" && DHCPv6CAPABLE=1 || DHCPv6CAPABLE=0
 
 
@@ -948,7 +958,25 @@ 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" 1
+
+       config_get bind "$cfg" "bind"
+       case "$bind" in
+               dynamic|interfaces)
+                       xappend "--bind-$bind"
+                       ;;
+               "")
+                       # for compatibility reasons
+                       append_bool "$cfg" nonwildcard "--bind-dynamic" 1
+                       ;;
+       esac
+
+       config_get dnsfilter "$cfg" "dnsfilter"
+       case "$dnsfilter" in
+               A|AAAA)
+                       xappend "--filter-$dnsfilter"
+                       ;;
+       esac
+
        append_bool "$cfg" fqdn "--dhcp-fqdn"
        append_bool "$cfg" proxydnssec "--proxy-dnssec"
        append_bool "$cfg" localservice "--local-service"
@@ -996,8 +1024,8 @@ dnsmasq_start()
                xappend "--addn-hosts=$HOSTFILE"
                append EXTRA_MOUNT "$HOSTFILE"
        else
-               xappend "--addn-hosts=$HOSTFILE_DIR"
-               append EXTRA_MOUNT "$HOSTFILE_DIR"
+               xappend "--addn-hosts=$(dirname $HOSTFILE)"
+               append EXTRA_MOUNT "$(dirname $HOSTFILE)"
        fi
        config_list_foreach "$cfg" "addnhosts" append_addnhosts
        config_list_foreach "$cfg" "bogusnxdomain" append_bogusnxdomain
@@ -1046,7 +1074,7 @@ dnsmasq_start()
                config_get resolvfile "$cfg" resolvfile /tmp/resolv.conf.d/resolv.conf.auto
                [ -n "$resolvfile" ] && [ ! -e "$resolvfile" ] && touch "$resolvfile"
                xappend "--resolv-file=$resolvfile"
-               [ "$resolvfile" = "/tmp/resolv.conf.d/resolv.conf.auto" ] && localuse=1
+               [ "$resolvfile" != "/tmp/resolv.conf.d/resolv.conf.auto" ] && localuse=0
                resolvdir="$(dirname "$resolvfile")"
        fi
        config_get_bool localuse "$cfg" localuse "$localuse"
@@ -1101,7 +1129,6 @@ dnsmasq_start()
 
        xappend "--dhcp-broadcast=tag:needs-broadcast"
 
-
        config_get dnsmasqconfdir "$cfg" confdir "/tmp/dnsmasq.d"
        xappend "--conf-dir=$dnsmasqconfdir"
        dnsmasqconfdir="${dnsmasqconfdir%%,*}"
@@ -1143,11 +1170,6 @@ dnsmasq_start()
        config_foreach filter_dnsmasq mxhost dhcp_mx_add "$cfg"
        echo >> $CONFIGFILE_TMP
 
-       config_get_bool boguspriv "$cfg" boguspriv 1
-       [ "$boguspriv" -gt 0 ] && {
-               xappend "--bogus-priv"
-               [ -r "$RFC6761FILE" ] && xappend "--conf-file=$RFC6761FILE"
-       }
 
        if [ "$DNSMASQ_DHCP_VER" -gt 4 ] ; then
                # Enable RA feature for when/if it is constructed,
@@ -1186,6 +1208,8 @@ dnsmasq_start()
                done
        }
 
+       config_list_foreach "$cfg" addnmount append_extramount
+
        procd_open_instance $cfg
        procd_set_param command $PROG -C $CONFIGFILE -k -x /var/run/dnsmasq/dnsmasq."${cfg}".pid
        procd_set_param file $CONFIGFILE
@@ -1207,6 +1231,7 @@ dnsmasq_start()
                [ ! -e "$logfacility" ] && touch "$logfacility"
                procd_add_jail_mount_rw "$logfacility"
        esac
+       [ -e "$hostsfile" ] && procd_add_jail_mount $hostsfile
 
        procd_close_instance
 }
@@ -1214,12 +1239,12 @@ dnsmasq_start()
 dnsmasq_stop()
 {
        local cfg="$1"
-       local noresolv resolvfile localuse=0
+       local noresolv resolvfile localuse=1
 
        config_get_bool noresolv "$cfg" noresolv 0
        config_get resolvfile "$cfg" "resolvfile"
 
-       [ "$noresolv" = 0 ] && [ "$resolvfile" = "/tmp/resolv.conf.d/resolv.conf.auto" ] && localuse=1
+       [ "$noresolv" = 0 ] && [ "$resolvfile" != "/tmp/resolv.conf.d/resolv.conf.auto" ] && localuse=0
        config_get_bool localuse "$cfg" localuse "$localuse"
        [ "$localuse" -gt 0 ] && ln -sf "/tmp/resolv.conf.d/resolv.conf.auto" /tmp/resolv.conf
 
@@ -1228,10 +1253,11 @@ dnsmasq_stop()
 
 add_interface_trigger()
 {
-       local interface ignore
+       local interface ifname ignore
 
        config_get interface "$1" interface
        config_get_bool ignore "$1" ignore 0
+       network_get_device ifname "$interface" || ignore=0
 
        [ -n "$interface" ] && [ $ignore -eq 0 ] && procd_add_interface_trigger "interface.*" "$interface" /etc/init.d/dnsmasq reload
 }