diff --git a/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua b/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua index 60c4231..93564d7 100644 --- a/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua +++ b/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua @@ -56,7 +56,7 @@ o.datatype = "port" o.rempty = false ---- Enable TCP server -o = s:taboption("settings", Flag, "tcp_server", translate("TCP Server"), translate("Enable TCP DNS Server")) +o = s:taboption("advanced", Flag, "tcp_server", translate("TCP Server"), translate("Enable TCP DNS Server")) o.rmempty = false o.default = o.enabled o.cfgvalue = function(...) @@ -64,7 +64,7 @@ o.cfgvalue = function(...) end ---- Support IPV6 -o = s:taboption("settings", Flag, "ipv6_server", translate("IPV6 Server"), translate("Enable IPV6 DNS Server")) +o = s:taboption("advanced", Flag, "ipv6_server", translate("IPV6 Server"), translate("Enable IPV6 DNS Server")) o.rmempty = false o.default = o.enabled o.cfgvalue = function(...) diff --git a/package/luci/files/luci/i18n/smartdns.zh-cn.po b/package/luci/files/luci/i18n/smartdns.zh-cn.po index 76a0779..e437587 100644 --- a/package/luci/files/luci/i18n/smartdns.zh-cn.po +++ b/package/luci/files/luci/i18n/smartdns.zh-cn.po @@ -19,6 +19,12 @@ msgstr "自动设置Dnsmasq" msgid "Automatically set as upstream of dnsmasq when port changes." msgstr "端口更改时自动设为 dnsmasq 的上游。" +msgid "Block domain type" +msgstr "屏蔽域名类型" + +msgid "Block domain type." +msgstr "屏蔽域名类型。" + msgid "Cache Size" msgstr "缓存大小" @@ -33,6 +39,9 @@ msgstr "配置需要从指定域名服务器结果过滤的IP黑名单。" msgid "Configure block domain list." msgstr "配置屏蔽域名列表" +msgid "Configure domain rule list." +msgstr "配置域名规则列表" + msgid "Configure forwarding domain name list." msgstr "配置分流域名列表" @@ -87,6 +96,12 @@ msgstr "域名列表" msgid "Domain List File" msgstr "域名列表文件" +msgid "Domain Rule List" +msgstr "域名规则列表" + +msgid "Domain Rule Name" +msgstr "域名规则名称" + msgid "Domain Rules" msgstr "域名规则" @@ -253,6 +268,9 @@ msgstr "未运行" msgid "No check certificate" msgstr "停用证书校验" +msgid "None" +msgstr "无" + msgid "Query DNS through specific dns server group, such as office, home." msgstr "使用指定服务器组查询,比如office, home。" @@ -265,6 +283,9 @@ msgstr "回应的域名TTL最大值" msgid "Reply maximum TTL for all domain result." msgstr "设置返回给客户端的域名TTL最大值。" +msgid "Report bugs" +msgstr "报告BUG" + msgid "Resolve Local Hostnames" msgstr "解析本地主机名" @@ -295,6 +316,9 @@ msgstr "服务器名称" msgid "Set Specific domain ip address." msgstr "设置指定域名的IP地址。" +msgid "Set Specific domain rule list." +msgstr "设置指定域名的规则列表。" + msgid "Set Specific ip blacklist." msgstr "设置指定的 IP 黑名单列表。" @@ -385,9 +409,6 @@ msgstr "" "配置特定域名返回特定的IP地址,域名查询将不到上游服务器请求,直接返回配置的IP" "地址,可用于广告屏蔽。" -msgid "Report bugs" -msgstr "报告BUG" - msgid "TCP Server" msgstr "TCP服务器" diff --git a/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js b/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js index a3faaad..f42b2a4 100644 --- a/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js +++ b/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js @@ -155,19 +155,19 @@ return view.extend({ o.datatype = "port"; o.rempty = false; + /////////////////////////////////////// + // advanced settings; + /////////////////////////////////////// // Enable TCP server; - o = s.taboption("settings", form.Flag, "tcp_server", _("TCP Server"), _("Enable TCP DNS Server")); + o = s.taboption("advanced", form.Flag, "tcp_server", _("TCP Server"), _("Enable TCP DNS Server")); o.rmempty = false; o.default = o.enabled; // Support IPV6; - o = s.taboption("settings", form.Flag, "ipv6_server", _("IPV6 Server"), _("Enable IPV6 DNS Server")); + o = s.taboption("advanced", form.Flag, "ipv6_server", _("IPV6 Server"), _("Enable IPV6 DNS Server")); o.rmempty = false; o.default = o.enabled; - /////////////////////////////////////// - // advanced settings; - /////////////////////////////////////// // Support DualStack ip selection; o = s.taboption("advanced", form.Flag, "dualstack_ip_selection", _("Dual-stack IP Selection"), _("Enable IP selection between IPV4 and IPV6")); @@ -334,7 +334,6 @@ return view.extend({ o.rmempty = true o.datatype = "file" o.rempty = true - o.editable = true o.root_directory = "/etc/smartdns/conf.d" o = s.taboption("files", form.FileUpload, "upload_list_file", _("Upload Domain List File"), @@ -342,7 +341,6 @@ return view.extend({ o.rmempty = true o.datatype = "file" o.rempty = true - o.editable = true o.root_directory = "/etc/smartdns/domain-set" o = s.taboption('files', form.DummyValue, "_update", _("Update Files")); @@ -562,6 +560,7 @@ return view.extend({ s.tab("forwarding", _('DNS Forwarding Setting')); s.tab("block", _("DNS Block Setting")); + s.tab("domain-rule-list", _("Domain Rule List"), _("Set Specific domain rule list.")); s.tab("domain-address", _("Domain Address"), _("Set Specific domain ip address.")); s.tab("blackip-list", _("IP Blacklist"), _("Set Specific ip blacklist.")); @@ -680,6 +679,104 @@ return view.extend({ }); }; + /////////////////////////////////////// + // domain rule list; + /////////////////////////////////////// + o = s.taboption('domain-rule-list', form.SectionValue, '__domain-rule-list__', form.GridSection, 'domain-rule-list', _('Domain Rule List'), + _('Configure domain rule list.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + + // enable flag; + so = ss.option(form.Flag, "enabled", _("Enable"), _("Enable")); + so.rmempty = false; + so.default = so.enabled; + so.editable = true; + + // name; + so = ss.option(form.Value, "name", _("Domain Rule Name"), _("Domain Rule Name")); + + so = ss.option(form.Value, "server_group", _("Server Group"), _("DNS Server group belongs to, such as office, home.")) + so.rmempty = true + so.placeholder = "default" + so.datatype = "hostname" + so.rempty = true + for (const groupname of groupnames) { + so.value(groupname); + } + so.validate = function (section_id, value) { + if (value == "") { + return true; + } + + var val = uci.sections('smartdns', 'server'); + for (var i = 0; i < val.length; i++) { + if (value == val[i].server_group) { + return true; + } + } + + return _('Server Group %s not exists').format(value); + + } + + so = ss.option(form.FileUpload, "domain_list_file", _("Domain List File"), + _("Upload domain list file, or configure auto download from Download File Setting page.")); + so.rmempty = true + so.datatype = "file" + so.rempty = true + so.root_directory = "/etc/smartdns/domain-set" + + so = ss.option(form.ListValue, "block_domain_type", _("Block domain type"), _("Block domain type.")); + so.rmempty = true; + so.value("none", _("None")); + so.value("all", "IPv4/IPv6"); + so.value("ipv4", "IPv4"); + so.value("ipv6", "IPv6"); + so.modalonly = true; + + so = ss.option(form.Flag, "no_speed_check", _("Skip Speed Check"), + _("Do not check speed.")); + so.rmempty = true; + so.default = so.disabled; + so.modalonly = true; + + so = ss.option(form.Flag, "force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA.")); + so.rmempty = true; + so.default = so.disabled; + so.modalonly = true; + + + so = ss.option(form.Value, "ipset_name", _("IPset Name"), _("IPset name.")); + so.rmempty = true; + so.datatype = "hostname"; + so.rempty = true; + so.modalonly = true; + + so = ss.option(form.Value, "nftset_name", _("NFTset Name"), _("NFTset name, format: [#[4|6]:[family#table#set]]")); + so.rmempty = true; + so.datatype = "string"; + so.rempty = true; + so.modalonly = true; + so.validate = function (section_id, value) { + if (value == "") { + return true; + } + + var nftset = value.split(",") + for (var i = 0; i < nftset.length; i++) { + if (!nftset[i].match(/#[4|6]:[a-zA-Z0-9\-_]+#[a-zA-Z0-9\-_]+#[a-zA-Z0-9\-_]+$/)) { + return _("NFTset name format error, format: [#[4|6]:[family#table#set]]"); + } + } + + return true; + } + /////////////////////////////////////// // IP Blacklist; /////////////////////////////////////// diff --git a/package/openwrt/files/etc/init.d/smartdns b/package/openwrt/files/etc/init.d/smartdns index fede15b..a3e99b8 100644 --- a/package/openwrt/files/etc/init.d/smartdns +++ b/package/openwrt/files/etc/init.d/smartdns @@ -300,6 +300,42 @@ load_domain_rules() conf_append "domain-rules" "/domain-set:${domain_set_name}-block-list/ --address #" } +load_domain_rule_list() +{ + local section="$1" + local domain_set_args="" + local domain_set_name="$section" + + config_get_bool enabled "$section" "enabled" "0" + [ "$enabled" != "1" ] && return + + config_get server_group "$section" "server_group" "" + [ ! -z "$server_group" ] && domain_set_args="$domain_set_args -nameserver $server_group" + + config_get block_domain_type "$section" "block_domain_type" "" + [ "$block_domain_type" = "all" ] && domain_set_args="$domain_set_args -address #" + [ "$block_domain_type" = "ipv4" ] && domain_set_args="$domain_set_args -address #4" + [ "$block_domain_type" = "ipv6" ] && domain_set_args="$domain_set_args -address #6" + + config_get_bool no_speed_check "$section" "no_speed_check" "0" + [ "$no_speed_check" = "1" ] && domain_set_args="$domain_set_args -speed-check-mode none" + + config_get_bool force_aaaa_soa "$section" "force_aaaa_soa" "0" + [ "$force_aaaa_soa" = "1" ] && domain_set_args="$domain_set_args -address #6" + + config_get ipset_name "$section" "ipset_name" "" + [ ! -z "$ipset_name" ] && domain_set_args="$domain_set_args -ipset $ipset_name" + + config_get ipset_name "$section" "nftset_name" "" + [ ! -z "$nftset_name" ] && domain_set_args="$domain_set_args -nftset '$nftset_name'" + + config_get domain_list_file "$section" "domain_list_file" "" + [ -z "$domain_list_file" ] && return + + conf_append "domain-set" "-name domain-rule-list-${domain_set_name} -file '$domain_list_file'" + conf_append "domain-rules" "/domain-set:domain-rule-list-${domain_set_name}/ $domain_set_args" +} + load_second_server() { local section="$1" @@ -531,6 +567,8 @@ load_service() config_foreach load_domain_rules "domain-rule" + config_foreach load_domain_rule_list "domain-rule-list" + { echo "conf-file $ADDRESS_CONF" echo "conf-file $BLACKLIST_IP_CONF"