luci: add hint when set dnsmasq failure.

This commit is contained in:
Nick Peng
2022-09-14 23:45:39 +08:00
parent 1f1fd118de
commit 1991a0b102
6 changed files with 482 additions and 446 deletions

View File

@@ -37,6 +37,20 @@ end
function act_status() function act_status()
local e={} local e={}
local ipv6_server;
local dnsmasq_server = luci.sys.exec("uci get dhcp.@dnsmasq[0].server")
local auto_set_dnsmasq = smartdns.get_config_option("smartdns", "smartdns", "auto_set_dnsmasq", nil);
e.auto_set_dnsmasq = auto_set_dnsmasq
e.dnsmasq_server = dnsmasq_server
e.local_port = smartdns.get_config_option("smartdns", "smartdns", "port", nil);
if e.local_port ~= nil and e.local_port ~= "53" and auto_set_dnsmasq ~= nil and auto_set_dnsmasq == "1" then
local str;
str = "127.0.0.1#" .. e.local_port
if string.sub(dnsmasq_server,1,string.len(str)) ~= str then
e.dnsmasq_redirect_failure = 1
end
end
e.running = is_running() e.running = is_running()
luci.http.prepare_content("application/json") luci.http.prepare_content("application/json")
luci.http.write_json(e) luci.http.write_json(e)

View File

@@ -52,6 +52,9 @@ msgstr "协议类型"
msgid "DNS domain result cache size" msgid "DNS domain result cache size"
msgstr "缓存DNS的结果缓存大小配置零则不缓存" msgstr "缓存DNS的结果缓存大小配置零则不缓存"
msgid "Dnsmasq Forwared To Smartdns Failure"
msgstr "重定向dnsmasq到smartdns失败"
msgid "Do not check certificate." msgid "Do not check certificate."
msgstr "不校验证书的合法性。" msgstr "不校验证书的合法性。"

View File

@@ -6,6 +6,9 @@ XHR.poll(3, '<%=luci.dispatcher.build_url("admin", "services", "smartdns", "stat
var links = ""; var links = "";
if (data.running) { if (data.running) {
links = '<b><font color=green>SmartDNS - <%:RUNNING%></font></b></em>'; links = '<b><font color=green>SmartDNS - <%:RUNNING%></font></b></em>';
if (data.dnsmasq_redirect_failure == 1) {
links += "<br></br><b><font color=red><%:Dnsmasq Forwared To Smartdns Failure%></font></b>"
}
} else { } else {
links = '<b><font color=red>SmartDNS - <%:NOT RUNNING%></font></b>'; links = '<b><font color=red>SmartDNS - <%:NOT RUNNING%></font></b>';
} }

View File

@@ -52,6 +52,9 @@ msgstr "协议类型"
msgid "DNS domain result cache size" msgid "DNS domain result cache size"
msgstr "缓存DNS的结果缓存大小配置零则不缓存" msgstr "缓存DNS的结果缓存大小配置零则不缓存"
msgid "Dnsmasq Forwared To Smartdns Failure"
msgstr "重定向dnsmasq到smartdns失败"
msgid "Do not check certificate." msgid "Do not check certificate."
msgstr "不校验证书的合法性。" msgstr "不校验证书的合法性。"

View File

@@ -17,448 +17,461 @@
*/ */
'use strict'; 'use strict';
'require fs'; 'require fs';
'require uci'; 'require uci';
'require form'; 'require form';
'require view'; 'require view';
'require poll'; 'require poll';
'require rpc'; 'require rpc';
var conf = 'smartdns';
var callServiceList = rpc.declare({
object: 'service',
method: 'list',
params: ['name'],
expect: { '': {} }
});
function getServiceStatus() {
return L.resolveDefault(callServiceList(conf), {})
.then(function (res) {
var isrunning = false;
try {
isrunning = res[conf]['instances']['smartdns']['running'];
} catch (e) { }
return isrunning;
});
}
function smartdnsServiceStatus() {
return Promise.all([
getServiceStatus()
]);
}
function smartdnsRenderStatus(res) {
var renderHTML = "";
var isRunning = res[0];
if (isRunning) {
renderHTML += "<span style=\"color:green;font-weight:bold\">SmartDNS - " + _("RUNNING") + "</span>";
} else {
renderHTML += "<span style=\"color:red;font-weight:bold\">SmartDNS - " + _("NOT RUNNING") + "</span>";
return renderHTML;
}
return renderHTML;
}
return view.extend({
load: function () {
return Promise.all([
uci.load('smartdns'),
uci.load('dhcp')
]);
},
render: function (stats) {
var m, s, o;
m = new form.Map('smartdns', _('SmartDNS'));
m.title = _("SmartDNS Server");
m.description = _("SmartDNS is a local high-performance DNS server, supports finding fastest IP, "
+ "supports ad filtering, and supports avoiding DNS poisoning.");
s = m.section(form.NamedSection, '_status');
s.anonymous = true;
s.render = function (section_id) {
var renderStatus = function () {
return L.resolveDefault(smartdnsServiceStatus()).then(function (res) {
var view = document.getElementById("service_status");
if (view == null) {
return;
}
view.innerHTML = smartdnsRenderStatus(res);
});
}
poll.add(renderStatus);
setTimeout(renderStatus, 1000);
return E('div', { class: 'cbi-map' },
E('div', { class: 'cbi-section' }, [
E('div', { id: 'service_status' },
_('Collecting data ...'))
])
);
}
// Basic;
s = m.section(form.TypedSection, "smartdns", _("Settings"), _("General Settings"));
s.anonymous = true;
s.tab("settings", _("General Settings"));
s.tab("seconddns", _("Second Server Settings"));
s.tab("custom", _("Custom Settings"));
o = s.taboption("settings", form.Flag, "enabled", _("Enable"), _("Enable or disable smartdns server"));
o.rmempty = false;
o.default = o.disabled;
// server name;
o = s.taboption("settings", form.Value, "server_name", _("Server Name"), _("Smartdns server name"));
o.default = "smartdns";
o.datatype = "hostname";
o.rempty = false;
// Port;
o = s.taboption("settings", form.Value, "port", _("Local Port"),
_("Smartdns local server port, smartdns will be automatically set as main dns when the port is 53."));
o.placeholder = 53;
o.default = 53;
o.datatype = "port";
o.rempty = false;
// Enable TCP server;
o = s.taboption("settings", 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.rmempty = false;
o.default = o.enabled;
// Support DualStack ip selection;
o = s.taboption("settings", form.Flag, "dualstack_ip_selection", _("Dual-stack IP Selection"),
_("Enable IP selection between IPV4 and IPV6"));
o.rmempty = false;
o.default = o.enabled;
// Domain prefetch load ;
o = s.taboption("settings", form.Flag, "prefetch_domain", _("Domain prefetch"),
_("Enable domain prefetch, accelerate domain response speed."));
o.rmempty = false;
o.default = o.disabled;
// Domain Serve expired
o = s.taboption("settings", form.Flag, "serve_expired", _("Serve expired"),
_("Attempts to serve old responses from cache with a TTL of 0 in the response without waiting for the actual resolution to finish."));
o.rmempty = false;
o.default = o.enabled;
// cache-size;
o = s.taboption("settings", form.Value, "cache_size", _("Cache Size"), _("DNS domain result cache size"));
o.rempty = true;
// cache-size;
o = s.taboption("settings", form.Flag, "resolve_local_hostnames", _("Resolve Local Hostnames"), _("Resolve local hostnames by reading Dnsmasq lease file."));
o.rmempty = false;
o.default = o.enabled;
// auto-conf-dnsmasq; var conf = 'smartdns';
o = s.taboption("settings", form.Flag, "auto_set_dnsmasq", _("Automatically Set Dnsmasq"), _("Automatically set as upstream of dnsmasq when port changes.")); var callServiceList = rpc.declare({
o.rmempty = false; object: 'service',
o.default = o.enabled; method: 'list',
params: ['name'],
// Force AAAA SOA expect: { '': {} }
o = s.taboption("settings", form.Flag, "force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA.")); });
o.rmempty = false;
o.default = o.disabled; function getServiceStatus() {
return L.resolveDefault(callServiceList(conf), {})
// Force HTTPS SOA .then(function (res) {
o = s.taboption("settings", form.Flag, "force_https_soa", _("Force HTTPS SOA"), _("Force HTTPS SOA.")); var isrunning = false;
o.rmempty = false; try {
o.default = o.disabled; isrunning = res[conf]['instances']['smartdns']['running'];
} catch (e) { }
// rr-ttl; return isrunning;
o = s.taboption("settings", form.Value, "rr_ttl", _("Domain TTL"), _("TTL for all domain result.")); });
o.rempty = true; }
// rr-ttl-min; function smartdnsServiceStatus() {
o = s.taboption("settings", form.Value, "rr_ttl_min", _("Domain TTL Min"), return Promise.all([
_("Minimum TTL for all domain result.")); getServiceStatus()
o.rempty = true; ]);
o.placeholder = "600"; }
o.default = 600;
o.optional = true; function smartdnsRenderStatus(res) {
var renderHTML = "";
// rr-ttl-max; var isRunning = res[0];
o = s.taboption("settings", form.Value, "rr_ttl_max", _("Domain TTL Max"),
_("Maximum TTL for all domain result.")); var autoSetDnsmasq = uci.get_first('smartdns', 'smartdns', 'auto_set_dnsmasq');
o.rempty = true; var smartdnsPort = uci.get_first('smartdns', 'smartdns', 'port');
var dnsmasqServer = uci.get_first('dhcp', 'dnsmasq', 'server');
// rr-ttl-reply-max; uci.unload('dhcp');
o = s.taboption("settings", form.Value, "rr_ttl_reply_max", _("Reply Domain TTL Max"),
_("Reply maximum TTL for all domain result.")); if (isRunning) {
o.rempty = true; renderHTML += "<span style=\"color:green;font-weight:bold\">SmartDNS - " + _("RUNNING") + "</span>";
} else {
// second dns server; renderHTML += "<span style=\"color:red;font-weight:bold\">SmartDNS - " + _("NOT RUNNING") + "</span>";
// Eanble; return renderHTML;
o = s.taboption("seconddns", form.Flag, "seconddns_enabled", _("Enable"), }
_("Enable or disable second DNS server."));
o.default = o.disabled; if (autoSetDnsmasq === '1' && smartdnsPort != '53') {
o.rempty = false; var matchLine = "127.0.0.1#" + smartdnsPort;
var dnsmasqServer = uci.get_first('dhcp', 'dnsmasq', 'server') || "";
// Port;
o = s.taboption("seconddns", form.Value, "seconddns_port", _("Local Port"), _("Smartdns local server port")); if (dnsmasqServer.indexOf(matchLine) < 0) {
o.placeholder = 6553; renderHTML += "<br /><span style=\"color:red;font-weight:bold\">" + _("Dnsmasq Forwared To Smartdns Failure") + "</span>";
o.default = 6553; }
o.datatype = "port"; }
o.rempty = false;
return renderHTML;
// Enable TCP server; }
o = s.taboption("seconddns", form.Flag, "seconddns_tcp_server", _("TCP Server"), _("Enable TCP DNS Server"));
o.rmempty = false; return view.extend({
o.default = o.enabled; load: function () {
return Promise.all([
// dns server group; uci.load('dhcp'),
o = s.taboption("seconddns", form.Value, "seconddns_server_group", _("Server Group"), uci.load('smartdns'),
_("Query DNS through specific dns server group, such as office, home.")); ]);
o.rmempty = true; },
o.placeholder = "default"; render: function (stats) {
o.datatype = "hostname"; var m, s, o;
o.rempty = true;
m = new form.Map('smartdns', _('SmartDNS'));
o = s.taboption("seconddns", form.Flag, "seconddns_no_speed_check", _("Skip Speed Check"), m.title = _("SmartDNS Server");
_("Do not check speed.")); m.description = _("SmartDNS is a local high-performance DNS server, supports finding fastest IP, "
o.rmempty = false; + "supports ad filtering, and supports avoiding DNS poisoning.");
o.default = o.disabled;
s = m.section(form.NamedSection, '_status');
// skip address rules; s.anonymous = true;
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_addr", _("Skip Address Rules"), s.render = function (section_id) {
_("Skip address rules.")); var renderStatus = function () {
o.rmempty = false; return L.resolveDefault(smartdnsServiceStatus()).then(function (res) {
o.default = o.disabled; var view = document.getElementById("service_status");
if (view == null) {
// skip name server rules; return;
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_nameserver", _("Skip Nameserver Rule"), }
_("Skip nameserver rules."));
o.rmempty = false; view.innerHTML = smartdnsRenderStatus(res);
o.default = o.disabled; });
}
// skip ipset rules; poll.add(renderStatus);
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_ipset", _("Skip Ipset Rule"), setTimeout(renderStatus, 1000);
_("Skip ipset rules."));
o.rmempty = false; return E('div', { class: 'cbi-map' },
o.default = o.disabled; E('div', { class: 'cbi-section' }, [
E('div', { id: 'service_status' },
// skip soa address rule; _('Collecting data ...'))
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_soa", _("Skip SOA Address Rule"), ])
_("Skip SOA address rules.")); );
o.rmempty = false; }
o.default = o.disabled;
// Basic;
o = s.taboption("seconddns", form.Flag, "seconddns_no_dualstack_selection", _("Skip Dualstack Selection"), s = m.section(form.TypedSection, "smartdns", _("Settings"), _("General Settings"));
_("Skip Dualstack Selection.")); s.anonymous = true;
o.rmempty = false;
o.default = o.disabled; s.tab("settings", _("General Settings"));
s.tab("seconddns", _("Second Server Settings"));
// skip cache; s.tab("custom", _("Custom Settings"));
o = s.taboption("seconddns", form.Flag, "seconddns_no_cache", _("Skip Cache"), _("Skip Cache."));
o.rmempty = false; o = s.taboption("settings", form.Flag, "enabled", _("Enable"), _("Enable or disable smartdns server"));
o.default = o.disabled; o.rmempty = false;
o.default = o.disabled;
// Force AAAA SOA
o = s.taboption("seconddns", form.Flag, "seconddns_force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA.")); // server name;
o.rmempty = false; o = s.taboption("settings", form.Value, "server_name", _("Server Name"), _("Smartdns server name"));
o.default = o.disabled; o.default = "smartdns";
o.datatype = "hostname";
// custom settings; o.rempty = false;
o = s.taboption("custom", form.TextValue, "custom_conf",
"", _("smartdns custom settings")); // Port;
o = s.taboption("settings", form.Value, "port", _("Local Port"),
o.rows = 20; _("Smartdns local server port, smartdns will be automatically set as main dns when the port is 53."));
o.cfgvalue = function (section_id) { o.placeholder = 53;
return fs.trimmed('/etc/smartdns/custom.conf'); o.default = 53;
}; o.datatype = "port";
o.write = function (section_id, formvalue) { o.rempty = false;
return fs.write('/etc/smartdns/custom.conf', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
}; // Enable TCP server;
o = s.taboption("settings", form.Flag, "tcp_server", _("TCP Server"), _("Enable TCP DNS Server"));
o = s.taboption("custom", form.Flag, "coredump", _("Generate Coredump"), o.rmempty = false;
_("Generate Coredump file when smartdns crash, coredump file is located at /tmp/smartdns.xxx.core.")); o.default = o.enabled;
o.rmempty = false;
o.default = o.disabled; // Support IPV6;
// Upstream servers; o = s.taboption("settings", form.Flag, "ipv6_server", _("IPV6 Server"), _("Enable IPV6 DNS Server"));
s = m.section(form.GridSection, "server", _("Upstream Servers"), o.rmempty = false;
_("Upstream Servers, support UDP, TCP protocol. Please configure multiple DNS servers, " o.default = o.enabled;
+ "including multiple foreign DNS servers."));
s.anonymous = true; // Support DualStack ip selection;
s.addremove = true; o = s.taboption("settings", form.Flag, "dualstack_ip_selection", _("Dual-stack IP Selection"),
_("Enable IP selection between IPV4 and IPV6"));
s.tab('general', _('General Settings')); o.rmempty = false;
s.tab('advanced', _('Advanced Settings')); o.default = o.enabled;
// enable flag; // Domain prefetch load ;
o = s.taboption("general", form.Flag, "enabled", _("Enable"), _("Enable")); o = s.taboption("settings", form.Flag, "prefetch_domain", _("Domain prefetch"),
o.rmempty = false; _("Enable domain prefetch, accelerate domain response speed."));
o.default = o.enabled; o.rmempty = false;
o.editable = true; o.default = o.disabled;
// name; // Domain Serve expired
o = s.taboption("general", form.Value, "name", _("DNS Server Name"), _("DNS Server Name")); o = s.taboption("settings", form.Flag, "serve_expired", _("Serve expired"),
_("Attempts to serve old responses from cache with a TTL of 0 in the response without waiting for the actual resolution to finish."));
// IP address; o.rmempty = false;
o = s.taboption("general", form.Value, "ip", _("ip"), _("DNS Server ip")); o.default = o.enabled;
o.datatype = "or(ipaddr, string)";
o.rmempty = false; // cache-size;
o = s.taboption("settings", form.Value, "cache_size", _("Cache Size"), _("DNS domain result cache size"));
// port; o.rempty = true;
o = s.taboption("general", form.Value, "port", _("port"), _("DNS Server port"));
o.placeholder = "default"; // cache-size;
o.datatype = "port"; o = s.taboption("settings", form.Flag, "resolve_local_hostnames", _("Resolve Local Hostnames"), _("Resolve local hostnames by reading Dnsmasq lease file."));
o.rempty = true; o.rmempty = false;
o.depends("type", "udp"); o.default = o.enabled;
o.depends("type", "tcp");
o.depends("type", "tls"); // auto-conf-dnsmasq;
o = s.taboption("settings", form.Flag, "auto_set_dnsmasq", _("Automatically Set Dnsmasq"), _("Automatically set as upstream of dnsmasq when port changes."));
// type; o.rmempty = false;
o = s.taboption("general", form.ListValue, "type", _("type"), _("DNS Server type")); o.default = o.enabled;
o.placeholder = "udp";
o.value("udp", _("udp")); // Force AAAA SOA
o.value("tcp", _("tcp")); o = s.taboption("settings", form.Flag, "force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA."));
o.value("tls", _("tls")); o.rmempty = false;
o.value("https", _("https")); o.default = o.disabled;
o.default = "udp";
o.rempty = false; // Force HTTPS SOA
o = s.taboption("settings", form.Flag, "force_https_soa", _("Force HTTPS SOA"), _("Force HTTPS SOA."));
// Advanced Options o.rmempty = false;
// server group o.default = o.disabled;
o = s.taboption("advanced", form.Value, "server_group", _("Server Group"), _("DNS Server group belongs to, "
+ "used with nameserver, such as office, home.")) // rr-ttl;
o.rmempty = true o = s.taboption("settings", form.Value, "rr_ttl", _("Domain TTL"), _("TTL for all domain result."));
o.placeholder = "default" o.rempty = true;
o.datatype = "hostname"
o.rempty = true // rr-ttl-min;
o.modalonly = true; o = s.taboption("settings", form.Value, "rr_ttl_min", _("Domain TTL Min"),
_("Minimum TTL for all domain result."));
// blacklist_ip o.rempty = true;
o = s.taboption("advanced", form.Flag, "blacklist_ip", _("IP Blacklist Filtering"), o.placeholder = "600";
_("Filtering IP with blacklist")) o.default = 600;
o.rmempty = false o.optional = true;
o.default = o.disabled
o.modalonly = true; // rr-ttl-max;
o = s.taboption("settings", form.Value, "rr_ttl_max", _("Domain TTL Max"),
// TLS host verify _("Maximum TTL for all domain result."));
o = s.taboption("advanced", form.Value, "tls_host_verify", _("TLS Hostname Verify"), o.rempty = true;
_("Set TLS hostname to verify."))
o.default = "" // rr-ttl-reply-max;
o.datatype = "string" o = s.taboption("settings", form.Value, "rr_ttl_reply_max", _("Reply Domain TTL Max"),
o.rempty = true _("Reply maximum TTL for all domain result."));
o.modalonly = true; o.rempty = true;
o.depends("type", "tls")
o.depends("type", "https") // second dns server;
// Eanble;
// certificate verify o = s.taboption("seconddns", form.Flag, "seconddns_enabled", _("Enable"),
o = s.taboption("advanced", form.Flag, "no_check_certificate", _("No check certificate"), _("Enable or disable second DNS server."));
_("Do not check certificate.")) o.default = o.disabled;
o.rmempty = false o.rempty = false;
o.default = o.disabled
o.modalonly = true; // Port;
o.depends("type", "tls") o = s.taboption("seconddns", form.Value, "seconddns_port", _("Local Port"), _("Smartdns local server port"));
o.depends("type", "https") o.placeholder = 6553;
o.default = 6553;
// SNI host name o.datatype = "port";
o = s.taboption("advanced", form.Value, "host_name", _("TLS SNI name"), o.rempty = false;
_("Sets the server name indication for query."))
o.default = "" // Enable TCP server;
o.datatype = "hostname" o = s.taboption("seconddns", form.Flag, "seconddns_tcp_server", _("TCP Server"), _("Enable TCP DNS Server"));
o.rempty = true o.rmempty = false;
o.modalonly = true; o.default = o.enabled;
o.depends("type", "tls")
o.depends("type", "https") // dns server group;
o = s.taboption("seconddns", form.Value, "seconddns_server_group", _("Server Group"),
// http host _("Query DNS through specific dns server group, such as office, home."));
o = s.taboption("advanced", form.Value, "http_host", _("HTTP Host"), o.rmempty = true;
_("Set the HTTP host used for the query. Use this parameter when the host of the URL address is an IP address.")) o.placeholder = "default";
o.default = "" o.datatype = "hostname";
o.datatype = "hostname" o.rempty = true;
o.rempty = true
o.modalonly = true; o = s.taboption("seconddns", form.Flag, "seconddns_no_speed_check", _("Skip Speed Check"),
o.depends("type", "https") _("Do not check speed."));
o.rmempty = false;
// SPKI pin o.default = o.disabled;
o = s.taboption("advanced", form.Value, "spki_pin", _("TLS SPKI Pinning"),
_("Used to verify the validity of the TLS server, The value is Base64 encoded SPKI fingerprint, " // skip address rules;
+ "leaving blank to indicate that the validity of TLS is not verified.")) o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_addr", _("Skip Address Rules"),
o.default = "" _("Skip address rules."));
o.datatype = "string" o.rmempty = false;
o.rempty = true o.default = o.disabled;
o.modalonly = true;
o.depends("type", "tls") // skip name server rules;
o.depends("type", "https") o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_nameserver", _("Skip Nameserver Rule"),
_("Skip nameserver rules."));
// other args o.rmempty = false;
o = s.taboption("advanced", form.Value, "addition_arg", _("Additional Server Args"), o.default = o.disabled;
_("Additional Args for upstream dns servers"))
o.default = "" // skip ipset rules;
o.rempty = true o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_ipset", _("Skip Ipset Rule"),
o.modalonly = true; _("Skip ipset rules."));
o.rmempty = false;
// Doman addresss; o.default = o.disabled;
s = m.section(form.TypedSection, "smartdns", _("Advanced Settings"), _("Advanced Settings"));
s.anonymous = true; // skip soa address rule;
o = s.taboption("seconddns", form.Flag, "seconddns_no_rule_soa", _("Skip SOA Address Rule"),
s.tab("domain-address", _("Domain Address"), _("Set Specific domain ip address.")); _("Skip SOA address rules."));
s.tab("blackip-list", _("IP Blacklist"), _("Set Specific ip blacklist.")); o.rmempty = false;
o.default = o.disabled;
o = s.taboption("domain-address", form.TextValue, "address_conf",
"", o = s.taboption("seconddns", form.Flag, "seconddns_no_dualstack_selection", _("Skip Dualstack Selection"),
_("Specify an IP address to return for any host in the given domains, Queries in the domains are never " _("Skip Dualstack Selection."));
+ "forwarded and always replied to with the specified IP address which may be IPv4 or IPv6.")); o.rmempty = false;
o.rows = 20; o.default = o.disabled;
o.cfgvalue = function (section_id) {
return fs.trimmed('/etc/smartdns/address.conf'); // skip cache;
}; o = s.taboption("seconddns", form.Flag, "seconddns_no_cache", _("Skip Cache"), _("Skip Cache."));
o.write = function (section_id, formvalue) { o.rmempty = false;
return fs.write('/etc/smartdns/address.conf', formvalue.trim().replace(/\r\n/g, '\n') + '\n'); o.default = o.disabled;
};
// Force AAAA SOA
// IP Blacklist; o = s.taboption("seconddns", form.Flag, "seconddns_force_aaaa_soa", _("Force AAAA SOA"), _("Force AAAA SOA."));
// blacklist; o.rmempty = false;
o = s.taboption("blackip-list", form.TextValue, "blackip_ip_conf", o.default = o.disabled;
"", _("Configure IP blacklists that will be filtered from the results of specific DNS server."));
o.rows = 20; // custom settings;
o.cfgvalue = function (section_id) { o = s.taboption("custom", form.TextValue, "custom_conf",
return fs.trimmed('/etc/smartdns/blacklist-ip.conf'); "", _("smartdns custom settings"));
};
o.write = function (section_id, formvalue) { o.rows = 20;
return fs.write('/etc/smartdns/blacklist-ip.conf', formvalue.trim().replace(/\r\n/g, '\n') + '\n'); o.cfgvalue = function (section_id) {
}; return fs.trimmed('/etc/smartdns/custom.conf');
};
// Doman addresss; o.write = function (section_id, formvalue) {
s = m.section(form.TypedSection, "smartdns", _("Technical Support"), return fs.write('/etc/smartdns/custom.conf', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
_("If you like this software, please buy me a cup of coffee.")); };
s.anonymous = true;
o = s.taboption("custom", form.Flag, "coredump", _("Generate Coredump"),
o = s.option(form.Button, "web"); _("Generate Coredump file when smartdns crash, coredump file is located at /tmp/smartdns.xxx.core."));
o.title = _("SmartDNS official website"); o.rmempty = false;
o.inputtitle = _("open website"); o.default = o.disabled;
o.inputstyle = "apply"; // Upstream servers;
o.onclick = function () { s = m.section(form.GridSection, "server", _("Upstream Servers"),
window.open("https://pymumu.github.io/smartdns", '_blank'); _("Upstream Servers, support UDP, TCP protocol. Please configure multiple DNS servers, "
}; + "including multiple foreign DNS servers."));
s.anonymous = true;
o = s.option(form.Button, "Donate"); s.addremove = true;
o.title = _("Donate to smartdns");
o.inputtitle = _("Donate"); s.tab('general', _('General Settings'));
o.inputstyle = "apply"; s.tab('advanced', _('Advanced Settings'));
o.onclick = function () {
window.open("https://pymumu.github.io/smartdns/#donate", '_blank'); // enable flag;
}; o = s.taboption("general", form.Flag, "enabled", _("Enable"), _("Enable"));
o.rmempty = false;
return m.render(); o.default = o.enabled;
} o.editable = true;
});
// name;
o = s.taboption("general", form.Value, "name", _("DNS Server Name"), _("DNS Server Name"));
// IP address;
o = s.taboption("general", form.Value, "ip", _("ip"), _("DNS Server ip"));
o.datatype = "or(ipaddr, string)";
o.rmempty = false;
// port;
o = s.taboption("general", form.Value, "port", _("port"), _("DNS Server port"));
o.placeholder = "default";
o.datatype = "port";
o.rempty = true;
o.depends("type", "udp");
o.depends("type", "tcp");
o.depends("type", "tls");
// type;
o = s.taboption("general", form.ListValue, "type", _("type"), _("DNS Server type"));
o.placeholder = "udp";
o.value("udp", _("udp"));
o.value("tcp", _("tcp"));
o.value("tls", _("tls"));
o.value("https", _("https"));
o.default = "udp";
o.rempty = false;
// Advanced Options
// server group
o = s.taboption("advanced", form.Value, "server_group", _("Server Group"), _("DNS Server group belongs to, "
+ "used with nameserver, such as office, home."))
o.rmempty = true
o.placeholder = "default"
o.datatype = "hostname"
o.rempty = true
o.modalonly = true;
// blacklist_ip
o = s.taboption("advanced", form.Flag, "blacklist_ip", _("IP Blacklist Filtering"),
_("Filtering IP with blacklist"))
o.rmempty = false
o.default = o.disabled
o.modalonly = true;
// TLS host verify
o = s.taboption("advanced", form.Value, "tls_host_verify", _("TLS Hostname Verify"),
_("Set TLS hostname to verify."))
o.default = ""
o.datatype = "string"
o.rempty = true
o.modalonly = true;
o.depends("type", "tls")
o.depends("type", "https")
// certificate verify
o = s.taboption("advanced", form.Flag, "no_check_certificate", _("No check certificate"),
_("Do not check certificate."))
o.rmempty = false
o.default = o.disabled
o.modalonly = true;
o.depends("type", "tls")
o.depends("type", "https")
// SNI host name
o = s.taboption("advanced", form.Value, "host_name", _("TLS SNI name"),
_("Sets the server name indication for query."))
o.default = ""
o.datatype = "hostname"
o.rempty = true
o.modalonly = true;
o.depends("type", "tls")
o.depends("type", "https")
// http host
o = s.taboption("advanced", form.Value, "http_host", _("HTTP Host"),
_("Set the HTTP host used for the query. Use this parameter when the host of the URL address is an IP address."))
o.default = ""
o.datatype = "hostname"
o.rempty = true
o.modalonly = true;
o.depends("type", "https")
// SPKI pin
o = s.taboption("advanced", form.Value, "spki_pin", _("TLS SPKI Pinning"),
_("Used to verify the validity of the TLS server, The value is Base64 encoded SPKI fingerprint, "
+ "leaving blank to indicate that the validity of TLS is not verified."))
o.default = ""
o.datatype = "string"
o.rempty = true
o.modalonly = true;
o.depends("type", "tls")
o.depends("type", "https")
// other args
o = s.taboption("advanced", form.Value, "addition_arg", _("Additional Server Args"),
_("Additional Args for upstream dns servers"))
o.default = ""
o.rempty = true
o.modalonly = true;
// Doman addresss;
s = m.section(form.TypedSection, "smartdns", _("Advanced Settings"), _("Advanced Settings"));
s.anonymous = true;
s.tab("domain-address", _("Domain Address"), _("Set Specific domain ip address."));
s.tab("blackip-list", _("IP Blacklist"), _("Set Specific ip blacklist."));
o = s.taboption("domain-address", form.TextValue, "address_conf",
"",
_("Specify an IP address to return for any host in the given domains, Queries in the domains are never "
+ "forwarded and always replied to with the specified IP address which may be IPv4 or IPv6."));
o.rows = 20;
o.cfgvalue = function (section_id) {
return fs.trimmed('/etc/smartdns/address.conf');
};
o.write = function (section_id, formvalue) {
return fs.write('/etc/smartdns/address.conf', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
};
// IP Blacklist;
// blacklist;
o = s.taboption("blackip-list", form.TextValue, "blackip_ip_conf",
"", _("Configure IP blacklists that will be filtered from the results of specific DNS server."));
o.rows = 20;
o.cfgvalue = function (section_id) {
return fs.trimmed('/etc/smartdns/blacklist-ip.conf');
};
o.write = function (section_id, formvalue) {
return fs.write('/etc/smartdns/blacklist-ip.conf', formvalue.trim().replace(/\r\n/g, '\n') + '\n');
};
// Doman addresss;
s = m.section(form.TypedSection, "smartdns", _("Technical Support"),
_("If you like this software, please buy me a cup of coffee."));
s.anonymous = true;
o = s.option(form.Button, "web");
o.title = _("SmartDNS official website");
o.inputtitle = _("open website");
o.inputstyle = "apply";
o.onclick = function () {
window.open("https://pymumu.github.io/smartdns", '_blank');
};
o = s.option(form.Button, "Donate");
o.title = _("Donate to smartdns");
o.inputtitle = _("Donate");
o.inputstyle = "apply";
o.onclick = function () {
window.open("https://pymumu.github.io/smartdns/#donate", '_blank');
};
return m.render();
}
});

View File

@@ -23,9 +23,9 @@ ifndef CFLAGS
CFLAGS =-O2 -g -Wall -Wstrict-prototypes -fno-omit-frame-pointer -Wstrict-aliasing -funwind-tables -Wmissing-prototypes -Wshadow -Wextra -Wno-unused-parameter -Wno-implicit-fallthrough CFLAGS =-O2 -g -Wall -Wstrict-prototypes -fno-omit-frame-pointer -Wstrict-aliasing -funwind-tables -Wmissing-prototypes -Wshadow -Wextra -Wno-unused-parameter -Wno-implicit-fallthrough
endif endif
override CFLAGS +=-Iinclude override CFLAGS +=-Iinclude
override CFLAGS += -DBASE_FILE_NAME=\"$(notdir $<)\" override CFLAGS += -DBASE_FILE_NAME='"$(notdir $<)"'
ifdef VER ifdef VER
override CFLAGS += -DSMARTDNS_VERION=\"$(VER)\" override CFLAGS += -DSMARTDNS_VERION='"$(VER)"'
endif endif
CXXFLAGS=-O2 -g -Wall -std=c++11 CXXFLAGS=-O2 -g -Wall -std=c++11