dnsmasq: nftset: serve from ipset config
[openwrt/staging/mkresin.git] / package / network / services / dnsmasq / files / dnsmasq.init
old mode 100644 (file)
new mode 100755 (executable)
index 9748c09..b13f352
@@ -33,6 +33,7 @@ dnsmasq_ignore_opt() {
                [ "${dnsmasq_features#* DNSSEC }" = "$dnsmasq_features" ] || dnsmasq_has_dnssec=1
                [ "${dnsmasq_features#* TFTP }" = "$dnsmasq_features" ] || dnsmasq_has_tftp=1
                [ "${dnsmasq_features#* ipset }" = "$dnsmasq_features" ] || dnsmasq_has_ipset=1
+               [ "${dnsmasq_features#* nftset }" = "$dnsmasq_features" ] || dnsmasq_has_nftset=1
        fi
 
        case "$opt" in
@@ -55,6 +56,8 @@ dnsmasq_ignore_opt() {
                        [ -z "$dnsmasq_has_tftp" ] ;;
                ipset)
                        [ -z "$dnsmasq_has_ipset" ] ;;
+               nftset)
+                       [ -z "$dnsmasq_has_nftset" ] ;;
                *)
                        return 1
        esac
@@ -169,10 +172,6 @@ append_address() {
        xappend "--address=$1"
 }
 
-append_ipset() {
-       xappend "--ipset=$1"
-}
-
 append_connmark_allowlist() {
        xappend "--connmark-allowlist=$1"
 }
@@ -197,12 +196,12 @@ ismounted() {
        for dirname in $EXTRA_MOUNT ; do
                case "$filename" in
                        "${dirname}/"* | "${dirname}" )
-                               return 1
+                               return 0
                                ;;
                esac
        done
 
-       return 0
+       return 1
 }
 
 append_addnhosts() {
@@ -241,7 +240,7 @@ dhcp_subscrid_add() {
        config_get subscriberid "$cfg" subscriberid
        [ -n "$subscriberid" ] || return 0
 
-       xappend "--dhcp-subscrid=$networkid,$subscriberid"
+       xappend "--dhcp-subscrid=set:$networkid,$subscriberid"
 
        config_get_bool force "$cfg" force 0
 
@@ -257,7 +256,7 @@ dhcp_remoteid_add() {
        config_get remoteid "$cfg" remoteid
        [ -n "$remoteid" ] || return 0
 
-       xappend "--dhcp-remoteid=$networkid,$remoteid"
+       xappend "--dhcp-remoteid=set:$networkid,$remoteid"
 
        config_get_bool force "$cfg" force 0
 
@@ -274,7 +273,7 @@ dhcp_circuitid_add() {
        config_get circuitid "$cfg" circuitid
        [ -n "$circuitid" ] || return 0
 
-       xappend "--dhcp-circuitid=$networkid,$circuitid"
+       xappend "--dhcp-circuitid=set:$networkid,$circuitid"
 
        config_get_bool force "$cfg" force 0
 
@@ -290,7 +289,7 @@ dhcp_userclass_add() {
        config_get userclass "$cfg" userclass
        [ -n "$userclass" ] || return 0
 
-       xappend "--dhcp-userclass=$networkid,$userclass"
+       xappend "--dhcp-userclass=set:$networkid,$userclass"
 
        config_get_bool force "$cfg" force 0
 
@@ -307,7 +306,7 @@ dhcp_vendorclass_add() {
        config_get vendorclass "$cfg" vendorclass
        [ -n "$vendorclass" ] || return 0
 
-       xappend "--dhcp-vendorclass=$networkid,$vendorclass"
+       xappend "--dhcp-vendorclass=set:$networkid,$vendorclass"
 
        config_get_bool force "$cfg" force 0
 
@@ -323,7 +322,7 @@ dhcp_match_add() {
        config_get match "$cfg" match
        [ -n "$match" ] || return 0
 
-       xappend "--dhcp-match=$networkid,$match"
+       xappend "--dhcp-match=set:$networkid,$match"
 
        config_get_bool force "$cfg" force 0
 
@@ -332,7 +331,7 @@ dhcp_match_add() {
 
 dhcp_host_add() {
        local cfg="$1"
-       local hosttag nametime addrs duids macs tags
+       local hosttag nametime addrs duids macs tags mtags
 
        config_get_bool force "$cfg" force 0
 
@@ -357,6 +356,11 @@ dhcp_host_add() {
        config_get duid "$cfg" duid
        config_get tag "$cfg" tag
 
+       add_tag() {
+               mtags="${mtags}tag:$1,"
+       }
+       config_list_foreach "$cfg" match_tag add_tag
+
        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
@@ -394,9 +398,9 @@ dhcp_host_add() {
 
        if [ $DNSMASQ_DHCP_VER -eq 6 ]; then
                addrs="${ip:+,$ip}${hostid:+,[::$hostid]}"
-               xappend "--dhcp-host=$macs${duids:+,$duids}$hosttag$addrs$nametime"
+               xappend "--dhcp-host=$mtags$macs${duids:+,$duids}$hosttag$addrs$nametime"
        else
-               xappend "--dhcp-host=$macs$hosttag${ip:+,$ip}$nametime"
+               xappend "--dhcp-host=$mtags$macs$hosttag${ip:+,$ip}$nametime"
        fi
 }
 
@@ -791,31 +795,37 @@ dhcp_relay_add() {
 
 dnsmasq_ipset_add() {
        local cfg="$1"
-       local ipsets domains
+       local ipsets nftsets domains
 
        add_ipset() {
                ipsets="${ipsets:+$ipsets,}$1"
        }
 
+       add_nftset() {
+               nftsets="${nftsets:+$nftsets,}inet#fw4#$1"
+       }
+
        add_domain() {
                # leading '/' is expected
                domains="$domains/$1"
        }
 
        config_list_foreach "$cfg" "name" add_ipset
+       config_list_foreach "$cfg" "name" add_nftset
        config_list_foreach "$cfg" "domain" add_domain
 
-       if [ -z "$ipsets" ] || [ -z "$domains" ]; then
+       if [ -z "$ipsets" ] || [ -z "$nftsets" ] || [ -z "$domains" ]; then
                return 0
        fi
 
        xappend "--ipset=$domains/$ipsets"
+       xappend "--nftset=$domains/$nftsets"
 }
 
 dnsmasq_start()
 {
        local cfg="$1"
-       local disabled user_dhcpscript
+       local disabled user_dhcpscript logfacility
        local resolvfile resolvdir localuse=0
 
        config_get_bool disabled "$cfg" disabled 0
@@ -829,12 +839,14 @@ dnsmasq_start()
        CONFIGFILE_TMP="${CONFIGFILE}.$$"
        HOSTFILE="${BASEHOSTFILE}.${cfg}"
        HOSTFILE_TMP="${HOSTFILE}.$$"
+       HOSTFILE_DIR="$(dirname "$HOSTFILE")"
        BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
 
        # before we can call xappend
+       umask u=rwx,g=rx,o=rx
        mkdir -p /var/run/dnsmasq/
        mkdir -p $(dirname $CONFIGFILE)
-       mkdir -p $(dirname $HOSTFILE)
+       mkdir -p "$HOSTFILE_DIR"
        mkdir -p /var/lib/misc
        chown dnsmasq:dnsmasq /var/run/dnsmasq
 
@@ -926,7 +938,7 @@ dnsmasq_start()
        append_bool "$cfg" scriptarp "--script-arp"
 
        append_parm "$cfg" logfacility "--log-facility"
-
+       config_get logfacility "$cfg" "logfacility"
        append_parm "$cfg" cachesize "--cache-size"
        append_parm "$cfg" dnsforwardmax "--dns-forward-max"
        append_parm "$cfg" port "--port"
@@ -941,7 +953,6 @@ dnsmasq_start()
        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
 
        local connmark_allowlist_enable
        config_get connmark_allowlist_enable "$cfg" connmark_allowlist_enable 0
@@ -959,13 +970,20 @@ dnsmasq_start()
                xappend "--addn-hosts=$HOSTFILE"
                append EXTRA_MOUNT "$HOSTFILE"
        else
-               xappend "--addn-hosts=$(dirname $HOSTFILE)"
-               append EXTRA_MOUNT "$(dirname $HOSTFILE)"
+               xappend "--addn-hosts=$HOSTFILE_DIR"
+               append EXTRA_MOUNT "$HOSTFILE_DIR"
        fi
        config_list_foreach "$cfg" "addnhosts" append_addnhosts
        config_list_foreach "$cfg" "bogusnxdomain" append_bogusnxdomain
        append_parm "$cfg" "leasefile" "--dhcp-leasefile" "/tmp/dhcp.leases"
-       append_parm "$cfg" "serversfile" "--servers-file"
+
+       local serversfile
+       config_get serversfile "$cfg" "serversfile"
+       [ -n "$serversfile" ] && {
+               xappend "--servers-file=$serversfile"
+               append EXTRA_MOUNT "$serversfile"
+       }
+
        append_parm "$cfg" "tftp_root" "--tftp-root"
        append_parm "$cfg" "dhcp_boot" "--dhcp-boot"
        append_parm "$cfg" "local_ttl" "--local-ttl"
@@ -1149,12 +1167,21 @@ dnsmasq_start()
        [ -n "$user_dhcpscript" ] && procd_set_param env USER_DHCPSCRIPT="$user_dhcpscript"
        procd_set_param respawn
 
+       local instance_ifc instance_netdev
+       config_get instance_ifc "$cfg" interface
+       [ -n "$instance_ifc" ] && network_get_device instance_netdev "$instance_ifc" &&
+               [ -n "$instance_netdev" ] && procd_set_param netdev $instance_netdev
+
        procd_add_jail dnsmasq ubus log
        procd_add_jail_mount $CONFIGFILE $DHCPBOGUSHOSTNAMEFILE $DHCPSCRIPT $DHCPSCRIPT_DEPENDS
        procd_add_jail_mount $EXTRA_MOUNT $RFC6761FILE $TRUSTANCHORSFILE
        procd_add_jail_mount $dnsmasqconffile $dnsmasqconfdir $resolvdir $user_dhcpscript
        procd_add_jail_mount /etc/passwd /etc/group /etc/TZ /etc/hosts /etc/ethers
        procd_add_jail_mount_rw /var/run/dnsmasq/ $leasefile
+       case "$logfacility" in */*)
+               [ ! -e "$logfacility" ] && touch "$logfacility"
+               procd_add_jail_mount_rw "$logfacility"
+       esac
 
        procd_close_instance
 }