Revert "dnsmasq: use "hostsdir" instead of "addn-hosts""
[openwrt/openwrt.git] / package / network / services / dnsmasq / files / dnsmasq.init
index 065d1fd8c2be8bb397cab4a4d02c19eb983e0c85..2c71a777c33bec788650a666a1da2fb2b6fa1cfb 100644 (file)
@@ -13,7 +13,6 @@ ADD_LOCAL_FQDN=""
 
 BASECONFIGFILE="/var/etc/dnsmasq.conf"
 BASEHOSTFILE="/tmp/hosts/dhcp"
-BASETIMESTAMPFILE="/etc/dnsmasq.time"
 TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
 TIMEVALIDFILE="/var/state/dnsmasqsec"
 BASEDHCPSTAMPFILE="/var/run/dnsmasq"
@@ -125,6 +124,10 @@ append_server() {
        xappend "--server=$1"
 }
 
+append_rev_server() {
+        xappend "--rev-server=$1"
+}
+
 append_address() {
        xappend "--address=$1"
 }
@@ -134,12 +137,16 @@ append_ipset() {
 }
 
 append_interface() {
-       network_get_device ifname "$1" || return
+       network_get_device ifname "$1" || ifname="$1"
        xappend "--interface=$ifname"
 }
 
+append_listenaddress() {
+       xappend "--listen-address=$1"
+}
+
 append_notinterface() {
-       network_get_device ifname "$1" || return
+       network_get_device ifname "$1" || ifname="$1"
        xappend "--except-interface=$ifname"
 }
 
@@ -269,7 +276,7 @@ dhcp_match_add() {
 
 dhcp_host_add() {
        local cfg="$1"
-       local hosttag nametime addrs duids
+       local hosttag nametime addrs duids macs tags
 
        config_get_bool force "$cfg" force 0
 
@@ -287,7 +294,7 @@ dhcp_host_add() {
 
        config_get_bool dns "$cfg" dns 0
        [ "$dns" = "1" -a -n "$ip" -a -n "$name" ] && {
-               echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE
+               echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE_TMP
        }
 
        config_get mac "$cfg" mac
@@ -297,7 +304,6 @@ dhcp_host_add() {
        if [ -n "$mac" ]; then
                # --dhcp-host=00:20:e0:3b:13:af,192.168.0.199,lap
                # many MAC are possible to track a laptop ON/OFF dock
-               macs=""
                for m in $mac; do append macs "$m" ","; done
        fi
 
@@ -315,7 +321,11 @@ dhcp_host_add() {
        fi
 
        if [ -n "$hostid" ]; then
-                       hex_to_hostid hostid "$hostid"
+               hex_to_hostid hostid "$hostid"
+       fi
+
+       if [ -n "$tag" ]; then
+               for t in $tag; do append tags "$t" ",set:"; done
        fi
 
        config_get_bool broadcast "$cfg" broadcast 0
@@ -323,7 +333,7 @@ dhcp_host_add() {
 
        [ "$broadcast" = "0" ] && broadcast= || broadcast=",set:needs-broadcast"
 
-       hosttag="${networkid:+,set:${networkid}}${tag:+,set:${tag}}$broadcast"
+       hosttag="${networkid:+,set:${networkid}}${tags:+,set:${tags}}$broadcast"
        nametime="${name:+,$name}${leasetime:+,$leasetime}"
 
        if [ $DNSMASQ_DHCP_VER -eq 6 ]; then
@@ -374,8 +384,8 @@ dhcp_this_host_add() {
                                for lanaddr6 in $lanaddrs6 ; do
                                        case "$lanaddr6" in
                                        "${ulaprefix%%:/*}"*)
-                                                       dhcp_domain_add "" "$routername" "$lanaddr6"
-                                                       ;;
+                                               dhcp_domain_add "" "$routername" "$lanaddr6"
+                                               ;;
                                        esac
                                done
                        fi
@@ -448,9 +458,7 @@ dhcp_add() {
        config_get networkid "$cfg" networkid
        [ -n "$networkid" ] || networkid="$net"
 
-       network_get_subnet subnet "$net" || return 0
        network_get_device ifname "$net" || return 0
-       network_get_protocol proto "$net" || return 0
 
        [ "$cachelocal" = "0" ] && network_get_dnsserver dnsserver "$net" && {
                DNS_SERVERS="$DNS_SERVERS $dnsserver"
@@ -462,6 +470,9 @@ dhcp_add() {
                return 0
        }
 
+       network_get_subnet subnet "$net" || return 0
+       network_get_protocol proto "$net" || return 0
+
        # Do not support non-static interfaces for now
        [ static = "$proto" ] || return 0
 
@@ -571,7 +582,8 @@ dhcp_add() {
                dhcp_option_append "option6:dns-server,$dnss" "$networkid"
        fi
 
-       dhcp_option_add "$cfg" "$networkid"
+       dhcp_option_add "$cfg" "$networkid" 0
+       dhcp_option_add "$cfg" "$networkid" 2
 }
 
 dhcp_option_append() {
@@ -587,18 +599,20 @@ dhcp_option_add() {
        local cfg="$1"
        local networkid="$2"
        local force="$3"
+       local opt="dhcp_option"
 
        [ "$force" = "0" ] && force=
+       [ "$force" = "2" ] && opt="dhcp_option_force"
 
        local list_len
-       config_get list_len "$cfg" dhcp_option_LENGTH
+       config_get list_len "$cfg" "${opt}_LENGTH"
 
        if [ -n "$list_len" ]; then
-               config_list_foreach "$cfg" dhcp_option dhcp_option_append "$networkid" "$force"
+               config_list_foreach "$cfg" "$opt" dhcp_option_append "$networkid" "$force"
        else
-               config_get dhcp_option "$cfg" dhcp_option
+               config_get dhcp_option "$cfg" "$opt"
 
-               [ -n "$dhcp_option" ] && echo "Warning: the 'option dhcp_option' syntax is deprecated, use 'list dhcp_option'" >&2
+               [ -n "$dhcp_option" ] && echo "Warning: the 'option $opt' syntax is deprecated, use 'list $opt'" >&2
 
                local option
                for option in $dhcp_option; do
@@ -621,7 +635,7 @@ dhcp_domain_add() {
                record="${record:+$record }$name"
        done
 
-       echo "$ip $record" >> $HOSTFILE
+       echo "$ip $record" >> $HOSTFILE_TMP
 }
 
 dhcp_srv_add() {
@@ -727,7 +741,7 @@ dnsmasq_start()
        CONFIGFILE="${BASECONFIGFILE}.${cfg}"
        CONFIGFILE_TMP="${CONFIGFILE}.$$"
        HOSTFILE="${BASEHOSTFILE}.${cfg}"
-       TIMESTAMPFILE="${BASETIMESTAMPFILE}.${cfg}"
+       HOSTFILE_TMP="${HOSTFILE}.$$"
        BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
 
        # before we can call xappend
@@ -737,14 +751,17 @@ dnsmasq_start()
        mkdir -p /var/lib/misc
        chown dnsmasq:dnsmasq /var/run/dnsmasq
 
-       [ -f "$TIMESTAMPFILE" ] && rm -f "$TIMESTAMPFILE"
-
        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_TMP
+
+       local dnsmasqconffile="/etc/dnsmasq.${cfg}.conf"
+       if [ ! -r "$dnsmasqconffile" ]; then
+               dnsmasqconffile=/etc/dnsmasq.conf
+       fi
 
        # if we did this last, we could override auto-generated config
-       [ -f /etc/dnsmasq.conf ] && {
-               xappend "--conf-file=/etc/dnsmasq.conf"
+       [ -f "${dnsmasqconffile}" ] && {
+               xappend "--conf-file=${dnsmasqconffile}"
        }
 
        $PROG --version | grep -osqE "^Compile time options:.* DHCPv6( |$)" && DHCPv6CAPABLE=1 || DHCPv6CAPABLE=0
@@ -822,7 +839,9 @@ dnsmasq_start()
        append_parm "$cfg" "maxport" "--max-port"
        append_parm "$cfg" "domain" "--domain"
        append_parm "$cfg" "local" "--server"
+       config_list_foreach "$cfg" "listen_address" append_listenaddress
        config_list_foreach "$cfg" "server" append_server
+       config_list_foreach "$cfg" "rev_server" append_rev_server
        config_list_foreach "$cfg" "address" append_address
        config_list_foreach "$cfg" "ipset" append_ipset
        config_list_foreach "$cfg" "interface" append_interface
@@ -915,6 +934,7 @@ dnsmasq_start()
        }
 
        dhcp_option_add "$cfg" "" 0
+       dhcp_option_add "$cfg" "" 2
 
        xappend "--dhcp-broadcast=tag:needs-broadcast"
 
@@ -979,6 +999,7 @@ dnsmasq_start()
 
        echo >> $CONFIGFILE_TMP
        mv -f $CONFIGFILE_TMP $CONFIGFILE
+       mv -f $HOSTFILE_TMP $HOSTFILE
 
        [ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
                rm -f /tmp/resolv.conf
@@ -997,11 +1018,6 @@ dnsmasq_start()
        [ -n "$user_dhcpscript" ] && procd_set_param env USER_DHCPSCRIPT="$user_dhcpscript"
        procd_set_param respawn
 
-       local dnsmasqconffile="/etc/dnsmasq.${cfg}.conf"
-       if [ ! -r "$dnsmasqconffile" ]; then
-               dnsmasqconffile=/etc/dnsmasq.conf
-       fi
-
        procd_add_jail dnsmasq ubus log
        procd_add_jail_mount $CONFIGFILE $TRUSTANCHORSFILE $HOSTFILE $RFC6761FILE /etc/passwd /etc/group /etc/TZ /dev/null /dev/urandom $dnsmasqconffile $dnsmasqconfdir $resolvfile $user_dhcpscript /etc/hosts /etc/ethers /sbin/hotplug-call $EXTRA_MOUNT $DHCPSCRIPT
        procd_add_jail_mount_rw /var/run/dnsmasq/ $leasefile
@@ -1011,7 +1027,7 @@ dnsmasq_start()
 
 dnsmasq_stop()
 {
-       local cfg="$1"
+       local cfg="$1" resolvfile
 
        config_get resolvfile "$cfg" "resolvfile"
 
@@ -1026,10 +1042,22 @@ dnsmasq_stop()
        rm -f ${BASEDHCPSTAMPFILE}.${cfg}.*.dhcp
 }
 
+add_interface_trigger()
+{
+       local interface ignore
+
+       config_get interface "$1" interface
+       config_get_bool ignore "$1" ignore 0
+
+       [ -n "$interface" -a $ignore -eq 0 ] && procd_add_interface_trigger "interface.*" "$interface" /etc/init.d/dnsmasq reload
+}
+
 service_triggers()
 {
-       procd_add_reload_trigger "dhcp"
-       procd_add_raw_trigger "interface.*" 2000 /etc/init.d/dnsmasq reload
+       procd_add_reload_trigger "dhcp" "system"
+
+       config_load dhcp
+       config_foreach add_interface_trigger dhcp
 }
 
 boot()
@@ -1068,7 +1096,7 @@ start_service() {
 
 reload_service() {
        rc_procd start_service "$@"
-       return 0
+       procd_send_signal dnsmasq "$@"
 }
 
 stop_service() {