浏览代码

luci: add domain rule list tab

Nick Peng 2 年之前
父节点
当前提交
f300d6ba82

+ 2 - 2
package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua

@@ -56,7 +56,7 @@ o.datatype    = "port"
 o.rempty      = false
 o.rempty      = false
 
 
 ---- Enable TCP server
 ---- 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.rmempty     = false
 o.default     = o.enabled
 o.default     = o.enabled
 o.cfgvalue    = function(...)
 o.cfgvalue    = function(...)
@@ -64,7 +64,7 @@ o.cfgvalue    = function(...)
 end
 end
 
 
 ---- Support IPV6
 ---- 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.rmempty     = false
 o.default     = o.enabled
 o.default     = o.enabled
 o.cfgvalue    = function(...)
 o.cfgvalue    = function(...)

+ 24 - 3
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."
 msgid "Automatically set as upstream of dnsmasq when port changes."
 msgstr "端口更改时自动设为 dnsmasq 的上游。"
 msgstr "端口更改时自动设为 dnsmasq 的上游。"
 
 
+msgid "Block domain type"
+msgstr "屏蔽域名类型"
+
+msgid "Block domain type."
+msgstr "屏蔽域名类型。"
+
 msgid "Cache Size"
 msgid "Cache Size"
 msgstr "缓存大小"
 msgstr "缓存大小"
 
 
@@ -33,6 +39,9 @@ msgstr "配置需要从指定域名服务器结果过滤的IP黑名单。"
 msgid "Configure block domain list."
 msgid "Configure block domain list."
 msgstr "配置屏蔽域名列表"
 msgstr "配置屏蔽域名列表"
 
 
+msgid "Configure domain rule list."
+msgstr "配置域名规则列表"
+
 msgid "Configure forwarding domain name list."
 msgid "Configure forwarding domain name list."
 msgstr "配置分流域名列表"
 msgstr "配置分流域名列表"
 
 
@@ -87,6 +96,12 @@ msgstr "域名列表"
 msgid "Domain List File"
 msgid "Domain List File"
 msgstr "域名列表文件"
 msgstr "域名列表文件"
 
 
+msgid "Domain Rule List"
+msgstr "域名规则列表"
+
+msgid "Domain Rule Name"
+msgstr "域名规则名称"
+
 msgid "Domain Rules"
 msgid "Domain Rules"
 msgstr "域名规则"
 msgstr "域名规则"
 
 
@@ -253,6 +268,9 @@ msgstr "未运行"
 msgid "No check certificate"
 msgid "No check certificate"
 msgstr "停用证书校验"
 msgstr "停用证书校验"
 
 
+msgid "None"
+msgstr "无"
+
 msgid "Query DNS through specific dns server group, such as office, home."
 msgid "Query DNS through specific dns server group, such as office, home."
 msgstr "使用指定服务器组查询,比如office, home。"
 msgstr "使用指定服务器组查询,比如office, home。"
 
 
@@ -265,6 +283,9 @@ msgstr "回应的域名TTL最大值"
 msgid "Reply maximum TTL for all domain result."
 msgid "Reply maximum TTL for all domain result."
 msgstr "设置返回给客户端的域名TTL最大值。"
 msgstr "设置返回给客户端的域名TTL最大值。"
 
 
+msgid "Report bugs"
+msgstr "报告BUG"
+
 msgid "Resolve Local Hostnames"
 msgid "Resolve Local Hostnames"
 msgstr "解析本地主机名"
 msgstr "解析本地主机名"
 
 
@@ -295,6 +316,9 @@ msgstr "服务器名称"
 msgid "Set Specific domain ip address."
 msgid "Set Specific domain ip address."
 msgstr "设置指定域名的IP地址。"
 msgstr "设置指定域名的IP地址。"
 
 
+msgid "Set Specific domain rule list."
+msgstr "设置指定域名的规则列表。"
+
 msgid "Set Specific ip blacklist."
 msgid "Set Specific ip blacklist."
 msgstr "设置指定的 IP 黑名单列表。"
 msgstr "设置指定的 IP 黑名单列表。"
 
 
@@ -385,9 +409,6 @@ msgstr ""
 "配置特定域名返回特定的IP地址,域名查询将不到上游服务器请求,直接返回配置的IP"
 "配置特定域名返回特定的IP地址,域名查询将不到上游服务器请求,直接返回配置的IP"
 "地址,可用于广告屏蔽。"
 "地址,可用于广告屏蔽。"
 
 
-msgid "Report bugs"
-msgstr "报告BUG"
-
 msgid "TCP Server"
 msgid "TCP Server"
 msgstr "TCP服务器"
 msgstr "TCP服务器"
 
 

+ 104 - 7
package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js

@@ -155,19 +155,19 @@ return view.extend({
 		o.datatype = "port";
 		o.datatype = "port";
 		o.rempty = false;
 		o.rempty = false;
 
 
+		///////////////////////////////////////
+		// advanced settings;
+		///////////////////////////////////////
 		// Enable TCP server;
 		// 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.rmempty = false;
 		o.default = o.enabled;
 		o.default = o.enabled;
 
 
 		// Support IPV6;
 		// 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.rmempty = false;
 		o.default = o.enabled;
 		o.default = o.enabled;
 
 
-		///////////////////////////////////////
-		// advanced settings;
-		///////////////////////////////////////
 		// Support DualStack ip selection;
 		// Support DualStack ip selection;
 		o = s.taboption("advanced", form.Flag, "dualstack_ip_selection", _("Dual-stack IP Selection"),
 		o = s.taboption("advanced", form.Flag, "dualstack_ip_selection", _("Dual-stack IP Selection"),
 			_("Enable IP selection between IPV4 and IPV6"));
 			_("Enable IP selection between IPV4 and IPV6"));
@@ -334,7 +334,6 @@ return view.extend({
 		o.rmempty = true
 		o.rmempty = true
 		o.datatype = "file"
 		o.datatype = "file"
 		o.rempty = true
 		o.rempty = true
-		o.editable = true
 		o.root_directory = "/etc/smartdns/conf.d"
 		o.root_directory = "/etc/smartdns/conf.d"
 
 
 		o = s.taboption("files", form.FileUpload, "upload_list_file", _("Upload Domain List File"),
 		o = s.taboption("files", form.FileUpload, "upload_list_file", _("Upload Domain List File"),
@@ -342,7 +341,6 @@ return view.extend({
 		o.rmempty = true
 		o.rmempty = true
 		o.datatype = "file"
 		o.datatype = "file"
 		o.rempty = true
 		o.rempty = true
-		o.editable = true
 		o.root_directory = "/etc/smartdns/domain-set"
 		o.root_directory = "/etc/smartdns/domain-set"
 
 
 		o = s.taboption('files', form.DummyValue, "_update", _("Update Files"));
 		o = s.taboption('files', form.DummyValue, "_update", _("Update Files"));
@@ -562,6 +560,7 @@ return view.extend({
 
 
 		s.tab("forwarding", _('DNS Forwarding Setting'));
 		s.tab("forwarding", _('DNS Forwarding Setting'));
 		s.tab("block", _("DNS Block 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("domain-address", _("Domain Address"), _("Set Specific domain ip address."));
 		s.tab("blackip-list", _("IP Blacklist"), _("Set Specific ip blacklist."));
 		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;
 		// IP Blacklist;
 		///////////////////////////////////////
 		///////////////////////////////////////

+ 38 - 0
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 #"
 	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()
 load_second_server()
 {
 {
 	local section="$1"
 	local section="$1"
@@ -531,6 +567,8 @@ load_service()
 
 
 	config_foreach load_domain_rules "domain-rule"
 	config_foreach load_domain_rules "domain-rule"
 
 
+	config_foreach load_domain_rule_list "domain-rule-list"
+
 	{
 	{
 		echo "conf-file $ADDRESS_CONF"
 		echo "conf-file $ADDRESS_CONF"
 		echo "conf-file $BLACKLIST_IP_CONF"
 		echo "conf-file $BLACKLIST_IP_CONF"