luci-app-https-dns-proxy: rewrite in javascript

Signed-off-by: Stan Grishin <stangri@melmac.ca>
This commit is contained in:
Stan Grishin 2023-08-29 18:42:10 +00:00
parent 48f0fc85f3
commit 6df7b92a50
139 changed files with 1772 additions and 1444 deletions

View file

@ -5,11 +5,11 @@ include $(TOPDIR)/rules.mk
PKG_LICENSE:=GPL-3.0-or-later
PKG_MAINTAINER:=Stan Grishin <stangri@melmac.ca>
PKG_VERSION:=2022-10-15-14
PKG_VERSION:=2023-05-25-4
LUCI_TITLE:=DNS Over HTTPS Proxy Web UI
LUCI_DESCRIPTION:=Provides Web UI for DNS Over HTTPS Proxy
LUCI_DEPENDS:=+luci-compat +luci-base +https-dns-proxy
LUCI_DEPENDS:=+luci-base +https-dns-proxy
LUCI_PKGARCH:=all
include ../../luci.mk

View file

@ -0,0 +1,436 @@
// Copyright MOSSDeF, 2023 Stan Grishin <stangri@melmac.ca>
// This code wouldn't have been possible without help from:
// - [@stokito](https://github.com/stokito)
// - [@vsviridov](https://github.com/vsviridov)
"require ui";
"require rpc";
"require uci";
"require form";
"require baseclass";
var pkg = {
get Name() {
return "https-dns-proxy";
},
get URL() {
return "https://docs.openwrt.melmac.net/" + pkg.Name + "/";
},
templateToRegexp: function (template) {
return RegExp(
"^" +
template
.split(/(\{\w+\})/g)
.map((part) => {
let placeholder = part.match(/^\{(\w+)\}$/);
if (placeholder) return `(?<${placeholder[1]}>.*?)`;
else return part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
})
.join("") +
"$"
);
},
};
var getInitList = rpc.declare({
object: "luci." + pkg.Name,
method: "getInitList",
params: ["name"],
});
var getInitStatus = rpc.declare({
object: "luci." + pkg.Name,
method: "getInitStatus",
params: ["name"],
});
var getPlatformSupport = rpc.declare({
object: "luci." + pkg.Name,
method: "getPlatformSupport",
params: ["name"],
});
var getProviders = rpc.declare({
object: "luci." + pkg.Name,
method: "getProviders",
params: ["name"],
});
var getRuntime = rpc.declare({
object: "luci." + pkg.Name,
method: "getRuntime",
params: ["name"],
});
var _setInitAction = rpc.declare({
object: "luci." + pkg.Name,
method: "setInitAction",
params: ["name", "action"],
expect: { result: false },
});
var RPC = {
listeners: [],
on: function (event, callback) {
var pair = { event: event, callback: callback };
this.listeners.push(pair);
return function unsubscribe() {
this.listeners = this.listeners.filter(function (listener) {
return listener !== pair;
});
}.bind(this);
},
emit: function (event, data) {
this.listeners.forEach(function (listener) {
if (listener.event === event) {
listener.callback(data);
}
});
},
getInitList: function (name) {
getInitList(name).then(
function (result) {
this.emit("getInitList", result);
}.bind(this)
);
},
getInitStatus: function (name) {
getInitStatus(name).then(
function (result) {
this.emit("getInitStatus", result);
}.bind(this)
);
},
getPlatformSupport: function (name) {
getPlatformSupport(name).then(
function (result) {
this.emit("getPlatformSupport", result);
}.bind(this)
);
},
getProviders: function (name) {
getProviders(name).then(
function (result) {
this.emit("getProviders", result);
}.bind(this)
);
},
getRuntime: function (name) {
getRuntime(name).then(
function (result) {
this.emit("getRuntime", result);
}.bind(this)
);
},
setInitAction: function (name, action) {
_setInitAction(name, action).then(
function (result) {
this.emit("setInitAction", result);
}.bind(this)
);
},
};
var status = baseclass.extend({
render: function () {
return Promise.all([
L.resolveDefault(getInitStatus(pkg.Name), {}),
L.resolveDefault(getProviders(pkg.Name), {}),
L.resolveDefault(getRuntime(pkg.Name), {}),
]).then(function (data) {
var text;
var reply = {
status: (data[0] && data[0][pkg.Name]) || {
enabled: null,
running: null,
force_dns_active: null,
version: null,
},
providers: (data[1] && data[1][pkg.Name]) || { providers: [] },
runtime: (data[2] && data[2][pkg.Name]) || { instances: [] },
};
reply.providers.sort(function (a, b) {
return _(a.title).localeCompare(_(b.title));
});
reply.providers.push({
title: "Custom",
template: "{option}",
params: { option: { type: "text" } },
});
var header = E("h2", {}, _("HTTPS DNS Proxy - Status"));
var statusTitle = E(
"label",
{ class: "cbi-value-title" },
_("Service Status")
);
if (reply.status.version) {
if (reply.status.running) {
text = _("Version %s - Running.").format(reply.status.version);
if (reply.status.force_dns_active) {
text += "<br />" + _("Force DNS ports:");
reply.status.force_dns_ports.forEach((element) => {
text += " " + element;
});
text += ".";
}
} else {
if (reply.status.enabled) {
text = _("Version %s - Stopped.").format(reply.status.version);
} else {
text = _("Version %s - Stopped (Disabled).").format(
reply.status.version
);
}
}
} else {
text = _("Not installed or not found");
}
var statusText = E("div", {}, text);
var statusField = E("div", { class: "cbi-value-field" }, statusText);
var statusDiv = E("div", { class: "cbi-value" }, [
statusTitle,
statusField,
]);
var instancesDiv = [];
if (reply.runtime.instances) {
var instancesTitle = E(
"label",
{ class: "cbi-value-title" },
_("Service Instances")
);
text = _("See the %sREADME%s for details.").format(
'<a href="' +
pkg.URL +
'#a-word-about-default-routing " target="_blank">',
"</a>"
);
var instancesDescr = E("div", { class: "cbi-value-description" }, "");
text = "";
Object.values(reply.runtime.instances).forEach((element) => {
var resolver;
var address;
var port;
var name;
var option;
var found;
element.command.forEach((param, index, arr) => {
if (param === "-r") resolver = arr[index + 1];
if (param === "-a") address = arr[index + 1];
if (param === "-p") port = arr[index + 1];
});
resolver = resolver || "Unknown";
address = address || "127.0.0.1";
port = port || "Unknown";
reply.providers.forEach((prov) => {
let regexp = pkg.templateToRegexp(prov.template);
if (!found && regexp.test(resolver)) {
found = true;
name = _(prov.title);
let match = resolver.match(regexp);
if (match[1] != null) {
if (
prov.params &&
prov.params.option &&
prov.params.option.options
) {
prov.params.option.options.forEach((opt) => {
if (opt.value === match[1]) option = _(opt.description);
});
name += " (" + option + ")";
} else {
if (match[1] != "") name += " (" + match[1] + ")";
}
}
}
});
if (address === "127.0.0.1")
text += _("%s%s%s proxy on port %s.%s").format(
"<strong>",
name,
"</strong>",
port,
"<br />"
);
else
text += _("%s%s%s proxy at %s on port %s.%s").format(
"<strong>",
name,
"</strong>",
address,
port,
"<br />"
);
});
var instancesText = E("div", {}, text);
var instancesField = E("div", { class: "cbi-value-field" }, [
instancesText,
instancesDescr,
]);
instancesDiv = E("div", { class: "cbi-value" }, [
instancesTitle,
instancesField,
]);
}
var btn_gap = E("span", {}, "&#160;&#160;");
var btn_gap_long = E(
"span",
{},
"&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;"
);
var btn_start = E(
"button",
{
class: "btn cbi-button cbi-button-apply",
disabled: true,
click: function (ev) {
ui.showModal(null, [
E(
"p",
{ class: "spinning" },
_("Starting %s service").format(pkg.Name)
),
]);
return RPC.setInitAction(pkg.Name, "start");
},
},
_("Start")
);
var btn_action = E(
"button",
{
class: "btn cbi-button cbi-button-apply",
disabled: true,
click: function (ev) {
ui.showModal(null, [
E(
"p",
{ class: "spinning" },
_("Restarting %s service").format(pkg.Name)
),
]);
return RPC.setInitAction(pkg.Name, "restart");
},
},
_("Restart")
);
var btn_stop = E(
"button",
{
class: "btn cbi-button cbi-button-reset",
disabled: true,
click: function (ev) {
ui.showModal(null, [
E(
"p",
{ class: "spinning" },
_("Stopping %s service").format(pkg.Name)
),
]);
return RPC.setInitAction(pkg.Name, "stop");
},
},
_("Stop")
);
var btn_enable = E(
"button",
{
class: "btn cbi-button cbi-button-apply",
disabled: true,
click: function (ev) {
ui.showModal(null, [
E(
"p",
{ class: "spinning" },
_("Enabling %s service").format(pkg.Name)
),
]);
return RPC.setInitAction(pkg.Name, "enable");
},
},
_("Enable")
);
var btn_disable = E(
"button",
{
class: "btn cbi-button cbi-button-reset",
disabled: true,
click: function (ev) {
ui.showModal(null, [
E(
"p",
{ class: "spinning" },
_("Disabling %s service").format(pkg.Name)
),
]);
return RPC.setInitAction(pkg.Name, "disable");
},
},
_("Disable")
);
if (reply.status.enabled) {
btn_enable.disabled = true;
btn_disable.disabled = false;
if (reply.status.running) {
btn_start.disabled = true;
btn_action.disabled = false;
btn_stop.disabled = false;
} else {
btn_start.disabled = false;
btn_action.disabled = true;
btn_stop.disabled = true;
}
} else {
btn_start.disabled = true;
btn_action.disabled = true;
btn_stop.disabled = true;
btn_enable.disabled = false;
btn_disable.disabled = true;
}
var buttonsTitle = E(
"label",
{ class: "cbi-value-title" },
_("Service Control")
);
var buttonsText = E("div", {}, [
btn_start,
btn_gap,
btn_action,
btn_gap,
btn_stop,
btn_gap_long,
btn_enable,
btn_gap,
btn_disable,
]);
var buttonsField = E("div", { class: "cbi-value-field" }, buttonsText);
var buttonsDiv = reply.status.version ?
E('div', {class: 'cbi-value'}, [
buttonsTitle,
buttonsField,
]) : '';
return E("div", {}, [header, statusDiv, instancesDiv, buttonsDiv]);
});
},
});
RPC.on("setInitAction", function (reply) {
ui.hideModal();
location.reload();
});
return L.Class.extend({
status: status,
getPlatformSupport: getPlatformSupport,
getProviders: getProviders,
getRuntime: getRuntime,
});

View file

@ -0,0 +1,383 @@
// Copyright 2023 MOSSDeF, Stan Grishin <stangri@melmac.ca>
// This code wouldn't have been possible without help from:
// - [@jow-](https://github.com/jow-)
// - [@stokito](https://github.com/stokito)
// - [@vsviridov](https://github.com/vsviridov)
"use strict";
"require form";
"require rpc";
"require uci";
"require view";
"require https-dns-proxy.status as hdp";
var pkg = {
get Name() {
return "https-dns-proxy";
},
get URL() {
return "https://docs.openwrt.melmac.net/" + pkg.Name + "/";
},
templateToRegexp: function (template) {
return RegExp(
"^" +
template
.split(/(\{\w+\})/g)
.map((part) => {
let placeholder = part.match(/^\{(\w+)\}$/);
if (placeholder) return `(?<${placeholder[1]}>.*?)`;
else return part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
})
.join("") +
"$"
);
},
templateToResolver: function (template, args) {
return template.replace(/{(\w+)}/g, (_, v) => args[v]);
},
};
return view.extend({
load: function () {
return Promise.all([
L.resolveDefault(hdp.getPlatformSupport(pkg.Name), {}),
L.resolveDefault(hdp.getProviders(pkg.Name), {}),
uci.load(pkg.Name),
uci.load("dhcp"),
]);
},
render: function (data) {
var reply = {
platform: (data[0] && data[0][pkg.Name]) || {
http2_support: null,
http3_support: null,
},
providers: (data[1] && data[1][pkg.Name]) || { providers: [] },
};
reply.providers.sort(function (a, b) {
return _(a.title).localeCompare(_(b.title));
});
reply.providers.push({
title: "Custom",
template: "{option}",
params: { option: { type: "text" } },
});
var status, m, s, o, p;
var text;
status = new hdp.status();
m = new form.Map(pkg.Name, _("HTTPS DNS Proxy - Configuration"));
s = m.section(form.NamedSection, "config", pkg.Name);
o = s.option(
form.ListValue,
"dnsmasq_config_update",
_("Update DNSMASQ Config on Start/Stop"),
_(
"If update option is selected, the %s'DNS forwardings' section of DHCP and DNS%s will be automatically updated to use selected DoH providers (%smore information%s)."
).format(
'<a href="' + L.url("admin", "network", "dhcp") + '">',
"</a>",
'<a href="' + pkg.URL + "#default-settings" + '" target="_blank">',
"</a>"
)
);
o.value("*", _("Update all configs"));
var sections = uci.sections("dhcp", "dnsmasq");
sections.forEach((element) => {
var description;
var key;
if (element[".name"] === uci.resolveSID("dhcp", element[".name"])) {
key = element[".index"];
description = "dnsmasq[" + element[".index"] + "]";
} else {
key = element[".name"];
description = element[".name"];
}
o.value(key, _("Update %s only").format(description));
});
o.value("-", _("Do not update configs"));
o.default = "*";
o = s.option(
form.ListValue,
"force_dns",
_("Force Router DNS"),
_("Forces Router DNS use on local devices, also known as DNS Hijacking.")
);
o.value("0", _("Let local devices use their own DNS servers if set"));
o.value("1", _("Force Router DNS server to all local devices"));
o.default = "1";
o = s.option(
form.ListValue,
"canary_domains_icloud",
_("Canary Domains iCloud"),
_(
"Blocks access to iCloud Private Relay resolvers, forcing local devices to use router for DNS resolution (%smore information%s)."
).format(
'<a href="' + pkg.URL + "#canary_domains_icloud" + '" target="_blank">',
"</a>"
)
);
o.value("0", _("Let local devices use iCloud Private Relay"));
o.value("1", _("Force Router DNS server to all local devices"));
o.depends("force_dns", "1");
o.default = "1";
o = s.option(
form.ListValue,
"canary_domains_mozilla",
_("Canary Domains Mozilla"),
_(
"Blocks access to Mozilla Encrypted resolvers, forcing local devices to use router for DNS resolution (%smore information%s)."
).format(
'<a href="' +
pkg.URL +
"#canary_domains_mozilla" +
'" target="_blank">',
"</a>"
)
);
o.value("0", _("Let local devices use Mozilla Private Relay"));
o.value("1", _("Force Router DNS server to all local devices"));
o.depends("force_dns", "1");
o.default = "1";
text = "";
if (!reply.platform.http2_support)
text +=
_(
"Please note that %s is not supported on this system (%smore information%s)."
).format(
"<i>HTTP/2</i>",
'<a href="' + pkg.URL + "#http2-support" + '" target="_blank">',
"</a>"
) + "<br />";
if (!reply.platform.http3_support)
text +=
_(
"Please note that %s is not supported on this system (%smore information%s)."
).format(
"<i>HTTP/3 (QUIC)</i>",
'<a href="' + pkg.URL + "#http3-quic-support" + '" target="_blank">',
"</a>"
) + "<br />";
s = m.section(
form.GridSection,
"https-dns-proxy",
_("HTTPS DNS Proxy - Instances"),
text
);
s.rowcolors = true;
s.sortable = true;
s.anonymous = true;
s.addremove = true;
s.sectiontitle = (section_id) => {
var provText;
var found;
reply.providers.forEach((prov) => {
var option;
let regexp = pkg.templateToRegexp(prov.template);
let resolver = uci.get(pkg.Name, section_id, "resolver_url");
resolver = resolver === undefined ? null : resolver;
if (!found && resolver && regexp.test(resolver)) {
found = true;
provText = _(prov.title);
let match = resolver.match(regexp);
if (match[1] != null) {
if (
prov.params &&
prov.params.option &&
prov.params.option.options
) {
prov.params.option.options.forEach((opt) => {
if (opt.value === match[1]) {
option = _(opt.description);
}
});
provText += " (" + option + ")";
} else {
if (match[1] !== "") provText += " (" + match[1] + ")";
}
}
}
});
return provText || _("Unknown");
};
var _provider;
_provider = s.option(form.ListValue, "_provider", _("Provider"));
_provider.modalonly = true;
_provider.cfgvalue = function (section_id) {
let resolver = this.map.data.get(
this.map.config,
section_id,
"resolver_url"
);
if (resolver === undefined || resolver === null) return null;
let found;
let ret;
reply.providers.forEach((prov, i) => {
let regexp = pkg.templateToRegexp(prov.template);
if (!found && regexp.test(resolver)) {
found = true;
ret = prov.template;
}
});
return ret || "";
};
_provider.write = function (section_id, formvalue) {
uci.set(pkg.Name, section_id, "resolver_url", formvalue);
};
reply.providers.forEach((prov, i) => {
if (prov.http2_only && !reply.platform.http2_support) return;
if (prov.http3_only && !reply.platform.http3_support) return;
_provider.value(prov.template, _(prov.title));
if (
prov.params &&
prov.params.option &&
prov.params.option.type &&
prov.params.option.type === "select"
) {
let optName = prov.params.option.description || _("Parameter");
var _paramList = s.option(form.ListValue, "_paramList_" + i, optName);
_paramList.template = prov.template;
_paramList.modalonly = true;
if (prov.params.option.default) {
_paramList.default = prov.params.option.default;
}
prov.params.option.options.forEach((opt) => {
let val = opt.value || "";
let descr = opt.description || "";
_paramList.value(val, descr);
});
_paramList.depends("_provider", prov.template);
_paramList.write = function (section_id, formvalue) {
let template = this.map.data.get(
this.map.config,
section_id,
"resolver_url"
);
if (_paramList.template !== template) return 0;
let resolver = pkg.templateToResolver(template, {
option: formvalue || "",
});
uci.set(pkg.Name, section_id, "resolver_url", resolver);
};
_paramList.remove = _paramList.write;
} else if (
prov.params &&
prov.params.option &&
prov.params.option.type &&
prov.params.option.type === "text"
) {
let optName = prov.params.option.description || _("Parameter");
var _paramText = s.option(form.Value, "_paramText_" + i, optName);
_paramText.template = prov.template;
_paramText.modalonly = true;
_paramText.depends("_provider", prov.template);
_paramText.optional = !(
prov.params.option.default && prov.params.option.default !== ""
);
_paramText.cfgvalue = function (section_id) {
let resolver = this.map.data.get(
this.map.config,
section_id,
"resolver_url"
);
if (resolver === undefined || resolver === null) return null;
let regexp = pkg.templateToRegexp(prov.template);
let match = resolver.match(regexp);
return (match && match[1]) || null;
};
_paramText.write = function (section_id, formvalue) {
let template = this.map.data.get(
this.map.config,
section_id,
"resolver_url"
);
if (_paramText.template !== template) return 0;
let resolver = pkg.templateToResolver(template, {
option: formvalue || "",
});
uci.set(pkg.Name, section_id, "resolver_url", resolver);
};
_paramText.remove = _paramText.write;
}
});
o = s.option(form.Value, "bootstrap_dns", _("Bootstrap DNS"));
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.Value, "listen_addr", _("Listen Address"));
o.datatype = "ipaddr";
o.default = "";
o.optional = true;
o.placeholder = "127.0.0.1";
var n = 0;
o = s.option(form.Value, "listen_port", _("Listen Port"));
o.datatype = "port";
o.default = "";
o.optional = true;
o.placeholder = n + 5053;
o = s.option(form.Value, "user", _("Run As User"));
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.Value, "group", _("Run As Group"));
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.Value, "dscp_codepoint", _("DSCP Codepoint"));
o.datatype = "and(uinteger, range(0,63))";
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.Value, "verbosity", _("Logging Verbosity"));
o.datatype = "and(uinteger, range(0,4))";
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.Value, "logfile", _("Logging File Path"));
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.Value, "polling_interval", _("Polling Interval"));
o.datatype = "and(uinteger, range(5,3600))";
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.Value, "proxy_server", _("Proxy Server"));
o.default = "";
o.modalonly = true;
o.optional = true;
o = s.option(form.ListValue, "use_http1", _("Use HTTP/1"));
o.modalonly = true;
o.optional = true;
o.rmempty = true;
o.value("", _("Use negotiated HTTP version"));
o.value("1", _("Force use of HTTP/1"));
o.default = "";
o = s.option(
form.ListValue,
"use_ipv6_resolvers_only",
_("Use IPv6 resolvers")
);
o.modalonly = true;
o.optional = true;
o.rmempty = true;
o.value("", _("Use any family DNS resolvers"));
o.value("1", _("Force use of IPv6 DNS resolvers"));
o.default = "";
return Promise.all([status.render(), m.render()]);
},
});

View file

@ -1,27 +0,0 @@
module("luci.controller.https-dns-proxy", package.seeall)
function index()
if nixio.fs.access("/etc/config/https-dns-proxy") then
entry({"admin", "services", "https-dns-proxy"}, cbi("https-dns-proxy"), _("DNS HTTPS Proxy")).acl_depends = { "luci-app-https-dns-proxy" }
entry({"admin", "services", "https-dns-proxy", "action"}, call("https_dns_proxy_action"), nil).leaf = true
end
end
function https_dns_proxy_action(name)
local packageName = "https-dns-proxy"
local http = require "luci.http"
local sys = require "luci.sys"
local util = require "luci.util"
if name == "start" then
sys.init.start(packageName)
elseif name == "action" then
util.exec("/etc/init.d/" .. packageName .. " reload >/dev/null 2>&1")
elseif name == "stop" then
sys.init.stop(packageName)
elseif name == "enable" then
sys.init.enable(packageName)
elseif name == "disable" then
sys.init.disable(packageName)
end
http.prepare_content("text/plain")
http.write("0")
end

View file

@ -1,8 +0,0 @@
return{
name="DnsCryptCa-DNS1",
label=_("DNSCrypt.ca (DNS1)"),
resolver_url="https://dns1.dnscrypt.ca:453/dns-query",
bootstrap_dns="45.76.37.222,185.112.145.13,93.95.226.53,2001:19f0:5001:185a:5400:ff:fe50:56d5",
help_link="https://dnscrypt.ca/",
help_link_text="dnscrypt.ca"
}

View file

@ -1,8 +0,0 @@
return{
name="DnsCryptCa-DNS2",
label=_("DNSCrypt.ca (DNS2)"),
resolver_url="https://dns2.dnscrypt.ca:453/dns-query",
bootstrap_dns="45.76.37.222,185.112.145.13,93.95.226.53,2001:19f0:5001:185a:5400:ff:fe50:56d5",
help_link="https://dnscrypt.ca/",
help_link_text="dnscrypt.ca"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.tiar.app",
label = _("Tiarap Public DNS - SG"),
resolver_url = "https://doh.tiar.app/dns-query",
bootstrap_dns = "174.138.21.128,2400:6180:0:d0::5f6e:4001",
help_link = "https://tiarap.org/",
help_link_text = "Tiarap.org"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.tiar.jp",
label = _("Tiarap Public DNS - JP"),
resolver_url = "https://doh.tiar.jp/dns-query",
bootstrap_dns = "172.104.93.80,2400:8902::f03c:91ff:feda:c514",
help_link = "https://tiarap.org/",
help_link_text = "Tiarap.org"
}

View file

@ -1,8 +0,0 @@
return {
name = "family.canadianshield.cira.ca",
label = _("CIRA Canadian Shield (Family)"),
resolver_url = "https://family.canadianshield.cira.ca/dns-query",
bootstrap_dns = "149.112.121.30,149.112.122.30,2620:10A:80BB::30,2620:10A:80BC::30",
help_link = "https://www.cira.ca/cybersecurity-services/canadian-shield/",
help_link_text = "CIRA Canadian Shield"
}

View file

@ -1,8 +0,0 @@
return {
name = "private.canadianshield.cira.ca",
label = _("CIRA Canadian Shield (Private)"),
resolver_url = "https://private.canadianshield.cira.ca/dns-query",
bootstrap_dns = "149.112.121.10,149.112.122.10,2620:10A:80BB::10,2620:10A:80BC::10",
help_link = "https://www.cira.ca/cybersecurity-services/canadian-shield/",
help_link_text = "CIRA Canadian Shield"
}

View file

@ -1,8 +0,0 @@
return {
name = "protected.canadianshield.cira.ca",
label = _("CIRA Canadian Shield (Protected)"),
resolver_url = "https://protected.canadianshield.cira.ca/dns-query",
bootstrap_dns = "149.112.121.20,149.112.122.20,2620:10A:80BB::20,2620:10A:80BC::20",
help_link = "https://www.cira.ca/cybersecurity-services/canadian-shield/",
help_link_text = "CIRA Canadian Shield"
}

View file

@ -1,9 +0,0 @@
return {
name = "dns.digitale-gesellschaft.ch",
label = _("Digitale Gesellschaft - CH"),
resolver_url = "https://dns.digitale-gesellschaft.ch/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
http2_only = true,
help_link = "https://www.digitale-gesellschaft.ch/dns/",
help_link_text = "Digitale Gesellschaft"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.switch.ch",
label = _("Switch DNS - CH"),
resolver_url = "https://dns.switch.ch/dns-query",
bootstrap_dns = "130.59.31.248,2001:620:0:ff::2",
help_link = "https://www.switch.ch/security/info/public-dns/",
help_link_text = "Switch.ch"
}

View file

@ -1,6 +0,0 @@
return {
name = "doh.360.cn",
label = _("360 Secure DNS - CN"),
resolver_url = "https://doh.360.cn/dns-query",
bootstrap_dns = "101.226.4.6,218.30.118.6,123.125.81.6,140.207.198.6"
}

View file

@ -1,6 +0,0 @@
return {
name = "dns.tuna.tsinghua.edu.cn",
label = _("Tsinghua University Secure DNS - CN"),
resolver_url = "https://dns.tuna.tsinghua.edu.cn:8443/dns-query",
bootstrap_dns = "208.67.222.222,208.67.220.220",
}

View file

@ -1,7 +0,0 @@
return {
name = "dns.rubyfish.cn",
label = _("rubyfish.cn"),
resolver_url = "https://dns.rubyfish.cn/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
http2_only = true
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.oszx.co",
label = _("OSZX DNS - UK"),
resolver_url = "https://dns.oszx.co/dns-query",
bootstrap_dns = "51.38.83.141,2001:41d0:801:2000::d64",
help_link = "https://dns.oszx.co/#mdoh",
help_link_text = "OSZX.co"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns-family.adguard.com",
label = _("AdGuard (Family Protection)"),
resolver_url = "https://dns-family.adguard.com/dns-query",
bootstrap_dns = "176.103.130.132,176.103.130.134",
help_link = "https://adguard.com/en/adguard-dns/overview.html",
help_link_text = "AdGuard.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.adguard.com",
label = _("AdGuard (Standard)"),
resolver_url = "https://dns.adguard.com/dns-query",
bootstrap_dns = "176.103.130.130,176.103.130.131",
help_link = "https://adguard.com/en/adguard-dns/overview.html",
help_link_text = "AdGuard.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "blitz.ahadns.com",
label = _("AhaDNS Blitz (Configurable)"),
resolver_url = "https://blitz.ahadns.com/",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://blitz-setup.ahadns.com/",
help_link_text = "AhaDNS Blitz"
}

View file

@ -1,8 +0,0 @@
return {
name="dns.alidns.com",
label=_("AliDNS - CN"),
resolver_url="https://dns.alidns.com/dns-query",
bootstrap_dns="223.5.5.5,223.6.6.6,2400:3200::1,2400:3200:baba::1",
help_link = "https://alidns.com/",
help_link_text = "AliDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh-ch.blahdns.com",
label = _("BlahDNS - CH"),
resolver_url = "https://doh-ch.blahdns.com/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://blahdns.com/",
help_link_text = "BlahDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh-de.blahdns.com",
label = _("BlahDNS - DE"),
resolver_url = "https://doh-de.blahdns.com/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://blahdns.com/",
help_link_text = "BlahDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh-fi.blahdns.com",
label = _("BlahDNS - FI"),
resolver_url = "https://doh-fi.blahdns.com/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://blahdns.com/",
help_link_text = "BlahDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh-jp.blahdns.com",
label = _("BlahDNS - JP"),
resolver_url = "https://doh-jp.blahdns.com/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://blahdns.com/",
help_link_text = "BlahDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh-sg.blahdns.com",
label = _("BlahDNS - SG"),
resolver_url = "https://doh-sg.blahdns.com/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://blahdns.com/",
help_link_text = "BlahDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "family.cloudflare-dns.com",
label = _("Cloudflare (Family Protection)"),
resolver_url = "https://family.cloudflare-dns.com/dns-query",
bootstrap_dns = "1.1.1.3,1.0.0.3,2606:4700:4700::1113,2606:4700:4700::1003",
help_link = "https://one.one.one.one/family/",
help_link_text = "Cloudflare.com"
}

View file

@ -1,9 +0,0 @@
return {
name = "cloudflare-dns.com",
label = _("Cloudflare"),
resolver_url = "https://cloudflare-dns.com/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001",
help_link = "https://one.one.one.one/family/",
help_link_text = "Cloudflare.com",
default = true
}

View file

@ -1,8 +0,0 @@
return {
name = "security.cloudflare-dns.com",
label = _("Cloudflare (Security Protection)"),
resolver_url = "https://security.cloudflare-dns.com/dns-query",
bootstrap_dns = "1.1.1.2,1.0.0.2,2606:4700:4700::1112,2606:4700:4700::1002",
help_link = "https://one.one.one.one/family/",
help_link_text = "Cloudflare.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "freedns.controld.com-family",
label = _("ControlD (Family)"),
resolver_url = "https://freedns.controld.com/family",
bootstrap_dns = "76.76.2.4,2606:1a40::4",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "ControlD-Malware-Ads-Social",
label = _("ControlD (Block Malware + Ads + Social)"),
resolver_url = "https://freedns.controld.com/p3",
bootstrap_dns = "76.76.2.3,2606:1a40::3",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD"
}

View file

@ -1,8 +0,0 @@
return {
name = "ControlD-Malware-Ads",
label = _("ControlD (Block Malware + Ads)"),
resolver_url = "https://freedns.controld.com/p2",
bootstrap_dns = "76.76.2.2,2606:1a40::2",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD"
}

View file

@ -1,8 +0,0 @@
return {
name = "ControlD-Malware",
label = _("ControlD (Block Malware)"),
resolver_url = "https://freedns.controld.com/p1",
bootstrap_dns = "76.76.2.1,2606:1a40::1",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD"
}

View file

@ -1,8 +0,0 @@
return {
name = "freedns.controld.com-p0",
label = _("ControlD (Unfiltered)"),
resolver_url = "https://freedns.controld.com/p0",
bootstrap_dns = "76.76.2.0,2606:1a40::0",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "freedns.controld.com-p1",
label = _("ControlD (Block Malware)"),
resolver_url = "https://freedns.controld.com/p1",
bootstrap_dns = "76.76.2.1,2606:1a40::1",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "freedns.controld.com-p2",
label = _("ControlD (Block Malware + Ads)"),
resolver_url = "https://freedns.controld.com/p2",
bootstrap_dns = "76.76.2.2,2606:1a40::2",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "freedns.controld.com-p3",
label = _("ControlD (Block Malware + Ads + Social)"),
resolver_url = "https://freedns.controld.com/p3",
bootstrap_dns = "76.76.2.3,2606:1a40::3",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "ControlD-Unfiltered",
label = _("ControlD (Unfiltered)"),
resolver_url = "https://freedns.controld.com/p0",
bootstrap_dns = "76.76.2.0,2606:1a40::0",
help_link = "https://kb.controld.com/tutorials",
help_link_text = "ControlD"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.decloudus.com",
label = _("DeCloudUs DNS"),
resolver_url = "https://dns.decloudus.com/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://decloudus.com/",
help_link_text = "DeCloudUs.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "dnsforfamily",
label = _("DNS For Family"),
resolver_url = "https://dns-doh.dnsforfamily.com/dns-query",
bootstrap_dns = "94.130.180.225,78.47.64.161",
help_link = "https://dnsforfamily.com/#DNS_Servers_DNS_Over_HTTPS",
help_link_text = "DNSForFamily.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.dnslify.com",
label = _("DNSlify DNS"),
resolver_url = "https://doh.dnslify.com/dns-query",
bootstrap_dns = "185.235.81.1,185.235.81.2,2a0d:4d00:81::1,2a0d:4d00:81::2",
help_link = "https://www.dnslify.com/services/doh/",
help_link_text = "DNSlify.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.opendns.com",
label = _("OpenDNS"),
resolver_url = "https://doh.opendns.com/dns-query",
bootstrap_dns = "208.67.222.222,208.67.220.220",
help_link = "https://support.opendns.com/hc/en-us/articles/360038086532-Using-DNS-over-HTTPS-DoH-with-OpenDNS",
help_link_text = "OpenDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.familyshield.opendns.com",
label = _("OpenDNS (Family Shield)"),
resolver_url = "https://doh.familyshield.opendns.com/dns-query",
bootstrap_dns = "208.67.222.123,208.67.220.123",
help_link = "https://support.opendns.com/hc/en-us/articles/360038086532-Using-DNS-over-HTTPS-DoH-with-OpenDNS",
help_link_text = "OpenDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.pumplex.com",
label = _("OSZX DNS (Pumplex)"),
resolver_url = "https://dns.pumplex.com/dns-query",
bootstrap_dns = "51.38.82.198,2001:41d0:801:2000::1b28",
help_link = "https://dns.oszx.co/#mdoh",
help_link_text = "OSZX.co"
}

View file

@ -1,8 +0,0 @@
return {
name = "basic.rethinkdns.com",
label = _("Rethink DNS (Configurable)"),
resolver_url = "https://basic.rethinkdns.com/",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://www.rethinkdns.com/configure",
help_link_text = "RethinkDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "odvr.nic.cz",
label = _("ODVR (nic.cz)"),
resolver_url = "https://odvr.nic.cz/doh",
bootstrap_dns = "193.17.47.1,185.43.135.1,2001:148f:ffff::1,2001:148f:fffe::1",
help_link = "https://www.nic.cz/odvr/",
help_link_text = "nic.cz"
}

View file

@ -1,8 +0,0 @@
return {
name = "dnsforge.de",
label = _("DNS Forge - DE"),
resolver_url = "https://dnsforge.de/dns-query",
bootstrap_dns = "176.9.93.198,176.9.1.117,2a01:4f8:151:34aa::198,2a01:4f8:141:316d::117",
help_link = "https://dnsforge.de/",
help_link_text = "DNSForge.de"
}

View file

@ -1,8 +0,0 @@
return {
name = "resolver-eu.lelux.fi",
label = _("Lelux DNS - FI"),
resolver_url = "https://resolver-eu.lelux.fi/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://lelux.fi/resolver/",
help_link_text = "Lelux.fi"
}

View file

@ -1,6 +0,0 @@
return {
name = "dns.google",
label = _("Google"),
resolver_url = "https://dns.google/dns-query",
bootstrap_dns = "8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.libredns.gr-ads",
label = _("LibreDNS - GR (No Ads)"),
resolver_url = "https://doh.libredns.gr/ads",
bootstrap_dns = "116.202.176.26,1.1.1.1",
help_link = "https://libredns.gr/",
help_link_text = "LibreDNS.gr"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.libredns.gr",
label = _("LibreDNS - GR"),
resolver_url = "https://doh.libredns.gr/dns-query",
bootstrap_dns = "116.202.176.26,1.1.1.1",
help_link = "https://libredns.gr/",
help_link_text = "LibreDNS.gr"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns-family.adguard.com",
label = _("AdGuard (Family Protection)"),
resolver_url = "https://dns-family.adguard.com/dns-query",
bootstrap_dns = "94.140.14.140,94.140.14.141,2a10:50c0::1:ff,2a10:50c0::2:ff",
help_link = "https://adguard-dns.io/en/public-dns.html",
help_link_text = "AdGuard.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns-unfiltered.adguard.com",
label = _("AdGuard (Non-filtering)"),
resolver_url = "https://dns-unfiltered.adguard.com/dns-query",
bootstrap_dns = "94.140.14.140,94.140.14.141,2a10:50c0::1:ff,2a10:50c0::2:ff",
help_link = "https://adguard-dns.io/en/public-dns.html",
help_link_text = "AdGuard.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.adguard.com",
label = _("AdGuard (Standard)"),
resolver_url = "https://dns.adguard.com/dns-query",
bootstrap_dns = "94.140.14.140,94.140.14.141,2a10:50c0::1:ff,2a10:50c0::2:ff",
help_link = "https://adguard-dns.io/en/public-dns.html",
help_link_text = "AdGuard.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.nextdns.io",
label = _("NextDNS.io (Configurable)"),
resolver_url = "https://dns.nextdns.io/",
bootstrap_dns = "45.90.28.49,45.90.30.49",
help_link = " https://my.nextdns.io",
help_link_text = "NextDNS.io"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh-2.seby.io",
label = _("Seby DNS - AU"),
resolver_url = "https://doh-2.seby.io/dns-query",
bootstrap_dns = "45.76.113.31,139.99.222.72",
help_link = "https://dns.seby.io/",
help_link_text = "Seby.io"
}

View file

@ -1,8 +0,0 @@
return {
name = "public.dns.iij.jp",
label = _("IIJ Public DNS - JP"),
resolver_url = "https://public.dns.iij.jp/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://www.iij.ad.jp/",
help_link_text = "IIJ.ad.jp"
}

View file

@ -1,8 +0,0 @@
return {
name = "kaitain.restena.lu",
label = _("Restena DNS - LU"),
resolver_url = "https://kaitain.restena.lu/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://www.restena.lu/en/service/public-dns-resolver",
help_link_text = "Restena.lu"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.au.ahadns.net",
label = _("AhaDNS - AU (Block Malware + Ads)"),
resolver_url = "https://doh.au.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.chi.ahadns.net",
label = _("AhaDNS - US/Chicago (Block Malware + Ads)"),
resolver_url = "https://doh.chi.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.es.ahadns.net",
label = _("AhaDNS - ES (Block Malware + Ads)"),
resolver_url = "https://doh.es.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.in.ahadns.net",
label = _("AhaDNS - IN (Block Malware + Ads)"),
resolver_url = "https://doh.in.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.it.ahadns.net",
label = _("AhaDNS - IT (Block Malware + Ads)"),
resolver_url = "https://doh.it.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.la.ahadns.net",
label = _("AhaDNS - US/Los Angeles (Block Malware + Ads)"),
resolver_url = "https://doh.la.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.nl.ahadns.net",
label = _("AhaDNS - NL (Block Malware + Ads)"),
resolver_url = "https://doh.nl.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.no.ahadns.net",
label = _("AhaDNS - NO (Block Malware + Ads)"),
resolver_url = "https://doh.no.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.ny.ahadns.net",
label = _("AhaDNS - US/New York (Block Malware + Ads)"),
resolver_url = "https://doh.ny.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.pl.ahadns.net",
label = _("AhaDNS - PL (Block Malware + Ads)"),
resolver_url = "https://doh.pl.ahadns.net/dns-query",
bootstrap_dns = "185.213.26.187,45.67.219.208,5.2.75.75,45.79.120.233,2a0d:5600:33:3::3,2a04:bdc7:100:70::70,2a04:52c0:101:75::75,2400:8904:e001:43::43",
help_link = "https://ahadns.com/dns-over-https/",
help_link_text = "AhaDNS.com"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.applied-privacy.net",
label = _("Applied Privacy DNS - AT/DE"),
resolver_url = "https://doh.applied-privacy.net/query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://applied-privacy.net/services/dns/",
help_link_text = "Applied-Privacy.net"
}

View file

@ -1,6 +0,0 @@
return {
name = "dns.cfiec.net",
label = _("CFIEC Public DNS (IPv6 Only)"),
resolver_url = "https://dns.cfiec.net/dns-query",
bootstrap_dns = "240C::6666,240C::6644"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.ffmuc.net",
label = _("FFMUC DNS - DE"),
resolver_url = "https://doh.ffmuc.net/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://ffmuc.net/wiki/doku.php?id=knb:dohdot",
help_link_text = "FFMUC.net"
}

View file

@ -1,8 +0,0 @@
return {
name = "ordns.he.net",
label = _("Hurricane Electric"),
resolver_url = "https://ordns.he.net/dns-query",
bootstrap_dns = "74.82.42.42,2001:470:20::2",
help_link = "https://forums.he.net/index.php?topic=3996.0",
help_link_text = "he.net"
}

View file

@ -1,6 +0,0 @@
return{
name = "doh.idnet.net",
label = _("IDNet.net - UK"),
resolver_url = "https://doh.idnet.net/dns-query",
bootstrap_dns = "212.69.36.23,212.69.40.23"
}

View file

@ -1,9 +0,0 @@
return {
name="adblock.doh.mullvad.net",
label=_("Mullvad (AdBlock)"),
resolver_url="https://adblock.doh.mullvad.net/dns-query",
bootstrap_dns="1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link="https://mullvad.net/en/help/dns-over-https-and-dns-over-tls/",
help_link_text="Mullvad.net",
http2_only = true
}

View file

@ -1,9 +0,0 @@
return {
name="doh.mullvad.net",
label=_("Mullvad"),
resolver_url="https://doh.mullvad.net/dns-query",
bootstrap_dns="1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link="https://mullvad.net/en/help/dns-over-https-and-dns-over-tls/",
help_link_text="Mullvad.net",
http2_only = true
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.quad9.net",
label = _("Quad 9 (Recommended)"),
resolver_url = "https://dns.quad9.net/dns-query",
bootstrap_dns = "9.9.9.9,149.112.112.112,2620:fe::fe,2620:fe::9",
help_link = "https://www.quad9.net/doh-quad9-dns-servers/",
help_link_text = "Quad9.net"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns10.quad9.net",
label = _("Quad 9 (Unsecured)"),
resolver_url = "https://dns10.quad9.net/dns-query",
bootstrap_dns = "9.9.9.10,149.112.112.10,2620:fe::10,2620:fe::fe:10",
help_link = "https://www.quad9.net/doh-quad9-dns-servers/",
help_link_text = "Quad9.net"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns11.quad9.net",
label = _("Quad 9 (Secured with ECS Support)"),
resolver_url = "https://dns11.quad9.net/dns-query",
bootstrap_dns = "9.9.9.11,149.112.112.11,2620:fe::11,2620:fe::fe:11",
help_link = "https://www.quad9.net/doh-quad9-dns-servers/",
help_link_text = "Quad9.net"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns9.quad9.net",
label = _("Quad 9 (Secured)"),
resolver_url = "https://dns9.quad9.net/dns-query",
bootstrap_dns = "9.9.9.9,149.112.112.9,2620:fe::fe,2620:fe::9",
help_link = "https://www.quad9.net/doh-quad9-dns-servers/",
help_link_text = "Quad9.net"
}

View file

@ -1,6 +0,0 @@
return {
name = "dns.comss.one",
label = _("Comss.ru DNS (West)"),
resolver_url = "https://dns.comss.one/dns-query",
bootstrap_dns = "92.38.152.163,93.115.24.204,2a03:90c0:56::1a5,2a02:7b40:5eb0:e95d::1"
}

View file

@ -1,6 +0,0 @@
return {
name = "dns.east.comss.one",
label = _("Comss.ru DNS (East)"),
resolver_url = "https://dns.east.comss.one/dns-query",
bootstrap_dns = "92.223.109.31,91.230.211.67,2a03:90c0:b5::1a,2a04:2fc0:39::47"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.cleanbrowsing.org-doh-adult-filter",
label = _("CleanBrowsing (Adult Filter)"),
resolver_url = "https://doh.cleanbrowsing.org/doh/adult-filter/",
bootstrap_dns = "185.228.168.168,1.1.1.1",
help_link = "https://cleanbrowsing.org/guides/dnsoverhttps",
help_link_text = "CleanBrowsing.org"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.cleanbrowsing.org-doh-family-filter",
label = _("CleanBrowsing (Family Filter)"),
resolver_url = "https://doh.cleanbrowsing.org/doh/family-filter/",
bootstrap_dns = "185.228.168.168,1.1.1.1",
help_link = "https://cleanbrowsing.org/guides/dnsoverhttps",
help_link_text = "CleanBrowsing.org"
}

View file

@ -1,8 +0,0 @@
return {
name = "doh.cleanbrowsing.org-doh-security-filter",
label = _("CleanBrowsing (Security Filter)"),
resolver_url = "https://doh.cleanbrowsing.org/doh/security-filter/",
bootstrap_dns = "185.228.168.168,1.1.1.1",
help_link = "https://cleanbrowsing.org/guides/dnsoverhttps",
help_link_text = "CleanBrowsing.org"
}

View file

@ -1,8 +0,0 @@
return {
name = "fi.doh.dns.snopyta.org",
label = _("Snopyta DNS - FI"),
resolver_url = "https://fi.doh.dns.snopyta.org/dns-query",
bootstrap_dns = "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
help_link = "https://snopyta.org/service/dns/",
help_link_text = "Snopyta.org"
}

View file

@ -1,8 +0,0 @@
return{
name = "doh.pub",
label = _("DNSPod Public DNS - CN"),
resolver_url = "https://doh.pub/dns-query",
bootstrap_dns = "119.29.29.29,119.28.28.28",
help_link = "https://www.dnspod.com/Products/Public.DNS",
help_link_text = "DNSPod.com"
}

View file

@ -1,9 +0,0 @@
return {
name = "doh.dns.sb",
label = _("DNS.SB"),
resolver_url = "https://doh.dns.sb/dns-query",
bootstrap_dns = "185.222.222.222,185.184.222.222",
http2_only = true,
help_link = "https://dns.sb/doh/",
help_link_text = "DNS.sb"
}

View file

@ -1,8 +0,0 @@
return {
name = "dns.twnic.tw",
label = _("Quad 101 - TW"),
resolver_url = "https://dns.twnic.tw/dns-query",
bootstrap_dns = "101.101.101.101,101.102.103.104,2001:de4::101,2001:de4::102",
help_link = "https://blog.twnic.tw/2018/12/28/1803/",
help_link_text = "TWNIC.tw"
}

View file

@ -1,212 +0,0 @@
local sys = require "luci.sys"
local util = require "luci.util"
local fs = require "nixio.fs"
local dispatcher = require "luci.dispatcher"
local i18n = require "luci.i18n"
local uci = require("luci.model.uci").cursor()
local packageName = "https-dns-proxy"
local readmeURL = "https://docs.openwrt.melmac.net/" .. packageName .. "/"
local providers_dir = "/usr/lib/lua/luci/" .. packageName .. "/providers/"
local helperText = ""
local http2Supported = false
function getPackageVersion()
local opkgFile = "/usr/lib/opkg/status"
local line
local flag = false
for line in io.lines(opkgFile) do
if flag then
return line:match('[%d%.$-]+') or ""
elseif line:find("Package: " .. packageName:gsub("%-", "%%%-")) then
flag = true
end
end
return ""
end
function createHelperText()
local initText = translate("For more information on different options check") .. " "
for filename in fs.dir(providers_dir) do
local p_func = loadfile(providers_dir .. filename)
setfenv(p_func, { _ = i18n.translate })
local p = p_func()
if p.help_link and (not p.http2_only or http2Supported) then
local url, domain
url = p.help_link
domain = p.help_link_text or url:match('^%w+://([^/]+)')
if not helperText:find(domain) then
if helperText == "" then
helperText = initText
else
helperText = helperText .. ", "
end
helperText = helperText .. [[<a href="]] .. url .. [[" target="_blank">]] .. domain .. [[</a>]]
end
end
end
if helperText ~= "" then
local a = helperText:gsub('(.*),%s.*$', '%1')
helperText = a .. " " .. translate("and") .. helperText:sub(#a + 2) .. "."
end
end
function getProviderName(value)
for filename in fs.dir(providers_dir) do
local p_func = loadfile(providers_dir .. filename)
setfenv(p_func, { _ = i18n.translate })
local p = p_func()
value = value:gsub('[%p%c%s]', '')
p.url_match = p.resolver_url:gsub('[%p%c%s]', '')
if value:match(p.url_match) then
return p.label
end
end
return translate("Unknown Provider")
end
local packageStatus, packageStatusCode
local ubusStatus = util.ubus("service", "list", { name = packageName })
local packageVersion = getPackageVersion()
if packageVersion == "" then
packageStatusCode, packageStatus = -1, translatef("%s is not installed or not found", packageName)
else
packageStatusCode, packageStatus = 1, ""
for n = 1,20 do
if ubusStatus and ubusStatus[packageName] and
ubusStatus[packageName]["instances"] and
ubusStatus[packageName]["instances"]["instance" .. n] and
ubusStatus[packageName]["instances"]["instance" .. n]["running"] then
local value, k, v, url, url_flag, la, la_flag, lp, lp_flag
for k, v in pairs(ubusStatus[packageName]["instances"]["instance" .. n]["command"]) do
if la_flag then la, la_flag = v, false end
if lp_flag then lp, lp_flag = v, false end
if url_flag then url, url_flag = v, false end
if v == "-a" then la_flag = true end
if v == "-p" then lp_flag = true end
if v == "-r" then url_flag = true end
end
la = la or "127.0.0.1"
lp = lp or n + 5053
packageStatus = packageStatus .. translatef("%s DoH at %s:%s", getProviderName(url), la, lp) .. "\n"
else
break
end
end
if packageStatus == "" then
packageStatusCode = 0
packageStatus = translate("Stopped")
if not sys.init.enabled(packageName) then
packageStatus = packageStatus .. " (" .. translate("disabled") .. ")"
end
end
end
if sys.call("grep -q 'Provides: libnghttp2' /usr/lib/opkg/status") == 0 then
http2Supported = true
end
m = Map("https-dns-proxy", translate("DNS HTTPS Proxy Settings"))
h = m:section(TypedSection, "_dummy", translatef("Service Status [%s %s]", packageName, packageVersion))
h.template = "cbi/nullsection"
ss = h:option(DummyValue, "_dummy", translate("Service Status"))
ss.template = packageName .. "/status"
ss.value = packageStatus
if packageStatusCode ~= -1 then
buttons = h:option(DummyValue, "_dummy", translate("Service Control"))
buttons.template = packageName .. "/buttons"
end
c = m:section(NamedSection, "config", "https-dns-proxy", translate("Configuration"))
d1 = c:option(ListValue, "dnsmasq_config_update", translate("Update DNSMASQ Config on Start/Stop"), translatef("If update option is selected, the 'DNS forwardings' section of %sDHCP and DNS%s will be automatically updated to use selected DoH providers (%smore information%s).", "<a href=\"" .. dispatcher.build_url("admin/network/dhcp") .. "\">", "</a>", "<a href=\"" .. readmeURL .. "#default-settings" .. "\" target=\"_blank\">", "</a>"))
d1:value('*', translate("Update all configs"))
local dnsmasq_num = 0
uci:foreach("dhcp", "dnsmasq", function(s)
d1:value(tostring(dnsmasq_num), translatef("Update %s config", "dhcp.@dnsmasq[" .. tostring(dnsmasq_num) .. "]"))
dnsmasq_num = dnsmasq_num + 1
end)
d1:value('-', translate("Do not update configs"))
d1.default = '*'
f1 = c:option(ListValue, "force_dns", translate("Force Router DNS"), translate("Forces Router DNS use on local devices, also known as DNS Hijacking."))
f1:value("0", translate("Let local devices use their own DNS servers if set"))
f1:value("1", translate("Force Router DNS server to all local devices"))
f1.default = "1"
cdi = c:option(ListValue, "canary_domains_icloud", translate("Canary Domains iCloud"), translatef("Blocks access to iCloud Private Relay resolvers, forcing local devices to use router for DNS resolution (%smore information%s).", "<a href=\"" .. readmeURL .. "#canary_domains_icloud" .. "\" target=\"_blank\">", "</a>"))
cdi:value("0", translate("Let local devices use iCloud Private Relay"))
cdi:value("1", translate("Force Router DNS server to all local devices"))
cdi:depends({force_dns="1"})
cdi.default = "1"
cdm = c:option(ListValue, "canary_domains_mozilla", translate("Canary Domains Mozilla"), translatef("Blocks access to Mozilla resolvers, forcing local devices to use router for DNS resolution (%smore information%s).", "<a href=\"" .. readmeURL .. "#canary_domains_mozilla" .. "\" target=\"_blank\">", "</a>"))
cdm:value("0", translate("Let local devices use Mozilla resolvers"))
cdm:value("1", translate("Force Router DNS server to all local devices"))
cdm:depends({force_dns="1"})
cdm.default = "1"
createHelperText()
s3 = m:section(TypedSection, "https-dns-proxy", translate("Instances"),
helperText)
s3.template = "cbi/tblsection"
s3.sortable = false
s3.anonymous = true
s3.addremove = true
prov = s3:option(ListValue, "resolver_url", translate("Resolver"))
for filename in fs.dir(providers_dir) do
local p_func = loadfile(providers_dir .. filename)
setfenv(p_func, { _ = i18n.translate })
local p = p_func()
if not p.http2_only or http2Supported then
prov:value(p.resolver_url, p.label)
end
if p.default then
prov.default = p.resolver_url
end
end
prov.forcewrite = true
prov.write = function(self, section, value)
if not value then return end
for filename in fs.dir(providers_dir) do
local p_func = loadfile(providers_dir .. filename)
setfenv(p_func, { _ = i18n.translate })
local p = p_func()
value = value:gsub('[%p%c%s]', '')
p.url_match = p.resolver_url:gsub('[%p%c%s]', '')
if value:match(p.url_match) then
if p.bootstrap_dns then
uci:set(packageName, section, "bootstrap_dns", p.bootstrap_dns)
end
if p.resolver_url then
uci:set(packageName, section, "resolver_url", p.resolver_url)
end
end
end
uci:save(packageName)
end
la = s3:option(Value, "listen_addr", translate("Listen Address"))
la.datatype = "host"
la.placeholder = "127.0.0.1"
la.rmempty = true
local n = 0
uci:foreach(packageName, packageName, function(s)
if s[".name"] == section then
return false
end
n = n + 1
end)
lp = s3:option(Value, "listen_port", translate("Listen Port"))
lp.datatype = "port"
lp.value = n + 5053
dscp = s3:option(Value, "dscp_codepoint", translate("DSCP Codepoint"))
dscp.datatype = "range(0,63)"
dscp.rmempty = true
ps = s3:option(Value, "proxy_server", translate("Proxy Server"))
ps.rmempty = true
return m

View file

@ -1,75 +0,0 @@
<%# Copyright 2020 Stan Grishin <stangri@melmac.ca> -%>
<%+https-dns-proxy/css%>
<%+https-dns-proxy/js%>
<%-
local packageName = "https-dns-proxy"
local serviceRunning, serviceEnabled = false, false;
serviceEnabled = luci.sys.init.enabled(packageName)
local ubusStatus = luci.util.ubus("service", "list", { name = packageName })
if ubusStatus and ubusStatus[packageName] then
serviceRunning = true
end
if serviceEnabled then
btn_start_status = true
btn_action_status = true
btn_stop_status = true
btn_enable_status = false
btn_disable_status = true
else
btn_start_status = false
btn_action_status = false
btn_stop_status = false
btn_enable_status = true
btn_disable_status = false
end
if serviceRunning then
btn_start_status = false
btn_action_status = true
btn_stop_status = true
else
btn_action_status = false
btn_stop_status = false
end
-%>
<%+cbi/valueheader%>
<input type="button" class="btn cbi-button cbi-button-apply" id="btn_start" name="start" value="<%:Start%>"
onclick="button_action(this)" />
<span id="btn_start_spinner" class="btn_spinner"></span>
<input type="button" class="btn cbi-button cbi-button-apply" id="btn_action" name="action" value="<%:Reload%>"
onclick="button_action(this)" />
<span id="btn_action_spinner" class="btn_spinner"></span>
<input type="button" class="btn cbi-button cbi-button-reset" id="btn_stop" name="stop" value="<%:Stop%>"
onclick="button_action(this)" />
<span id="btn_stop_spinner" class="btn_spinner"></span>
&#160;
&#160;
&#160;
&#160;
<input type="button" class="btn cbi-button cbi-button-apply" id="btn_enable" name="enable" value="<%:Enable%>"
onclick="button_action(this)" />
<span id="btn_enable_spinner" class="btn_spinner"></span>
<input type="button" class="btn cbi-button cbi-button-reset" id="btn_disable" name="disable" value="<%:Disable%>"
onclick="button_action(this)" />
<span id="btn_disable_spinner" class="btn_spinner"></span>
<%+cbi/valuefooter%>
<%-if not btn_start_status then%>
<script type="text/javascript">document.getElementById("btn_start").disabled = true;</script>
<%-end%>
<%-if not btn_action_status then%>
<script type="text/javascript">document.getElementById("btn_action").disabled = true;</script>
<%-end%>
<%-if not btn_stop_status then%>
<script type="text/javascript">document.getElementById("btn_stop").disabled = true;</script>
<%-end%>
<%-if not btn_enable_status then%>
<script type="text/javascript">document.getElementById("btn_enable").disabled = true;</script>
<%-end%>
<%-if not btn_disable_status then%>
<script type="text/javascript">document.getElementById("btn_disable").disabled = true;</script>
<%-end%>

View file

@ -1,9 +0,0 @@
<style type="text/css">
.btn_spinner
{
display: inline-block;
width: 0px;
height: 16px;
margin: 0 0px;
}
</style>

View file

@ -1,60 +0,0 @@
<script type="text/javascript">
//<![CDATA[
function button_action(action) {
var xhr = new XHR(false);
var btn_start = document.getElementById("btn_start");
var btn_action = document.getElementById("btn_action");
var btn_stop = document.getElementById("btn_stop");
var btn_enable = document.getElementById("btn_enable");
var btn_disable = document.getElementById("btn_disable");
var btn_spinner;
switch (action.name) {
case "start":
btn_spinner = document.getElementById("btn_start_spinner");
break;
case "action":
btn_spinner = document.getElementById("btn_action_spinner");
break;
case "stop":
btn_spinner = document.getElementById("btn_stop_spinner");
break;
case "enable":
btn_spinner = document.getElementById("btn_enable_spinner");
break;
case "disable":
btn_spinner = document.getElementById("btn_disable_spinner");
break;
}
btn_start.disabled = true;
btn_action.disabled = true;
btn_stop.disabled = true;
btn_enable.disabled = true;
btn_disable.disabled = true;
spinner(btn_spinner, 1);
xhr.get('<%=luci.dispatcher.build_url("admin", "services", "https-dns-proxy", "action")%>/' + action.name, null,
function (x) {
if (!x) {
return;
}
btn_start.disabled = false;
btn_action.disabled = false;
btn_stop.disabled = false;
btn_enable.disabled = false;
btn_disable.disabled = false;
spinner(btn_spinner, 0);
location.reload();
});
}
function spinner(element, state) {
if (state === 1) {
element.style.width = "16px";
element.innerHTML = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" />';
}
else {
element.style.width = "0px";
element.innerHTML = '';
}
}
//]]>
</script>

View file

@ -1,13 +0,0 @@
<%#
Copyright 2017-2019 Stan Grishin (stangri@melmac.net)
This is free software, licensed under the Apache License, Version 2.0
-%>
<%+cbi/valueheader%>
<textarea rows="<%=select(2, self:cfgvalue(section):gsub('\n', ''))%>"
style="border:none;box-shadow:none;background:transparent;font-weight:bold;line-height:20px;width:50em;padding:none;margin:6px;resize:none;overflow:hidden;"
disabled="disabled"><%=self:cfgvalue(section)%>
</textarea>
<%+cbi/valuefooter%>

View file

@ -1,12 +0,0 @@
<%#
Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
This is free software, licensed under the Apache License, Version 2.0
-%>
<%+cbi/valueheader%>
<div style="font-weight:bold;">
<%=self:cfgvalue(section):gsub('\n', '<br />' )%>
</div>
<%+cbi/valuefooter%>

View file

@ -1,493 +1,258 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:92
msgid "%s DoH at %s:%s"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:258
msgid "%s%s%s proxy at %s on port %s.%s"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:73
msgid "%s is not installed or not found"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:250
msgid "%s%s%s proxy on port %s.%s"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cn.360.doh.lua:3
msgid "360 Secure DNS - CN"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua:3
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/io.adguard-dns.dns-family.lua:3
msgid "AdGuard (Family Protection)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/io.adguard-dns.dns-nonfiltering.lua:3
msgid "AdGuard (Non-filtering)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua:3
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/io.adguard-dns.dns.lua:3
msgid "AdGuard (Standard)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.au.doh.lua:3
msgid "AhaDNS - AU (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.es.doh.lua:3
msgid "AhaDNS - ES (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.in.doh.lua:3
msgid "AhaDNS - IN (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.it.doh.lua:3
msgid "AhaDNS - IT (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.nl.doh.lua:3
msgid "AhaDNS - NL (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.no.doh.lua:3
msgid "AhaDNS - NO (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.pl.doh.lua:3
msgid "AhaDNS - PL (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.chi.doh.lua:3
msgid "AhaDNS - US/Chicago (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.la.doh.lua:3
msgid "AhaDNS - US/Los Angeles (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ahadns.ny.doh.lua:3
msgid "AhaDNS - US/New York (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.ahadns.blitz.lua:3
msgid "AhaDNS Blitz (Configurable)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.alidns.dns.lua:3
msgid "AliDNS - CN"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.applied-privacy.lua:3
msgid "Applied Privacy DNS - AT/DE"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.blahdns.doh-ch.lua:3
msgid "BlahDNS - CH"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.blahdns.doh-de.lua:3
msgid "BlahDNS - DE"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.blahdns.doh-fi.lua:3
msgid "BlahDNS - FI"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.blahdns.doh-jp.lua:3
msgid "BlahDNS - JP"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.blahdns.doh-sg.lua:3
msgid "BlahDNS - SG"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:141
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:136
msgid ""
"Blocks access to Mozilla resolvers, forcing local devices to use router for "
"DNS resolution (%smore information%s)."
"Blocks access to Mozilla Encrypted resolvers, forcing local devices to use "
"router for DNS resolution (%smore information%s)."
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:136
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:120
msgid ""
"Blocks access to iCloud Private Relay resolvers, forcing local devices to "
"use router for DNS resolution (%smore information%s)."
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.cfiec.dns.lua:3
msgid "CFIEC Public DNS (IPv6 Only)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:316
msgid "Bootstrap DNS"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/ca.cira.canadianshield.family.lua:3
msgid "CIRA Canadian Shield (Family)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/ca.cira.canadianshield.private.lua:3
msgid "CIRA Canadian Shield (Private)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/ca.cira.canadianshield.protected.lua:3
msgid "CIRA Canadian Shield (Protected)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:141
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:134
msgid "Canary Domains Mozilla"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:136
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:118
msgid "Canary Domains iCloud"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua:3
msgid "CleanBrowsing (Adult Filter)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua:3
msgid "CleanBrowsing (Family Filter)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua:3
msgid "CleanBrowsing (Security Filter)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua:3
msgid "Cloudflare"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.family.lua:3
msgid "Cloudflare (Family Protection)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.security.lua:3
msgid "Cloudflare (Security Protection)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/one.comss.east.dns.lua:3
msgid "Comss.ru DNS (East)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/one.comss.dns.lua:3
msgid "Comss.ru DNS (West)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:122
msgid "Configuration"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.malware-ads-social.lua:3
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.p3.lua:3
msgid "ControlD (Block Malware + Ads + Social)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.malware-ads.lua:3
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.p2.lua:3
msgid "ControlD (Block Malware + Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.malware.lua:3
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.p1.lua:3
msgid "ControlD (Block Malware)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.family.lua:3
msgid "ControlD (Family)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.p0.lua:3
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.controld.freedns.unfiltered.lua:3
msgid "ControlD (Unfiltered)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.dnsforfamily.dns-doh.lua:3
msgid "DNS For Family"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/de.dnsforge.lua:3
msgid "DNS Forge - DE"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua:4
msgid "DNS HTTPS Proxy"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:110
msgid "DNS HTTPS Proxy Settings"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/sb.dns.lua:3
msgid "DNS.SB"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ca.dnscrypt.dns1.lua:3
msgid "DNSCrypt.ca (DNS1)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ca.dnscrypt.dns2.lua:3
msgid "DNSCrypt.ca (DNS2)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/pub.doh.lua:3
msgid "DNSPod Public DNS - CN"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.dnslify.doh.lua:3
msgid "DNSlify DNS"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:205
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:339
msgid "DSCP Codepoint"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.decloudus.dns.lua:3
msgid "DeCloudUs DNS"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/ch.digitale-gesellschaft.dns.lua:3
msgid "Digitale Gesellschaft - CH"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm:56
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:376
msgid "Disable"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:130
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:370
msgid "Disabling %s service"
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:102
msgid "Do not update configs"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm:53
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:357
msgid "Enable"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.ffmuc.doh.lua:3
msgid "FFMUC DNS - DE"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:351
msgid "Enabling %s service"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:29
msgid "For more information on different options check"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:171
msgid "Force DNS ports:"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:132
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:108
msgid "Force Router DNS"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:134
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:138
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:143
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:112
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:127
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:146
msgid "Force Router DNS server to all local devices"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:132
msgid "Forces Router DNS use on local devices, also known as DNS Hijacking."
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:367
msgid "Force use of HTTP/1"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua:3
msgid "Google"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:378
msgid "Force use of IPv6 DNS resolvers"
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:109
msgid "Forces Router DNS use on local devices, also known as DNS Hijacking."
msgstr ""
#: applications/luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json:3
msgid "Grant UCI and file access for luci-app-https-dns-proxy"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.he.ordns.lua:3
msgid "Hurricane Electric"
#: applications/luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json:3
msgid "HTTPS DNS Proxy"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.idnet.doh.lua:3
msgid "IDNet.net - UK"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:72
msgid "HTTPS DNS Proxy - Configuration"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/jp.iij.dns.public.lua:3
msgid "IIJ Public DNS - JP"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:173
msgid "HTTPS DNS Proxy - Instances"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:123
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:161
msgid "HTTPS DNS Proxy - Status"
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:80
msgid ""
"If update option is selected, the 'DNS forwardings' section of %sDHCP and "
"If update option is selected, the %s'DNS forwardings' section of DHCP and "
"DNS%s will be automatically updated to use selected DoH providers (%smore "
"information%s)."
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:148
msgid "Instances"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:145
msgid "Let local devices use Mozilla Private Relay"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/fi.lelux.resolver-eu.lua:3
msgid "Lelux DNS - FI"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:142
msgid "Let local devices use Mozilla resolvers"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:137
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:126
msgid "Let local devices use iCloud Private Relay"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:133
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:111
msgid "Let local devices use their own DNS servers if set"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua:3
msgid "LibreDNS - GR"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua:3
msgid "LibreDNS - GR (No Ads)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:188
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:320
msgid "Listen Address"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:201
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:326
msgid "Listen Port"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm:52
msgid "Loading"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:349
msgid "Logging File Path"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.mullvad.doh.lua:3
msgid "Mullvad"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:344
msgid "Logging Verbosity"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.mullvad.doh.adblocker.lua:3
msgid "Mullvad (AdBlock)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:187
msgid "Not installed or not found"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/io.nextdns.dns.lua:3
msgid "NextDNS.io (Configurable)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:249
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:281
msgid "Parameter"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua:3
msgid "ODVR (nic.cz)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:154
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:163
msgid ""
"Please note that %s is not supported on this system (%smore information%s)."
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.pumplex.dns.lua:3
msgid "OSZX DNS (Pumplex)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:353
msgid "Polling Interval"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/co.osxz.dns.lua:3
msgid "OSZX DNS - UK"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:215
msgid "Provider"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.opendns.doh.lua:3
msgid "OpenDNS"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.opendns.familyshield.doh.lua:3
msgid "OpenDNS (Family Shield)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:209
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:358
msgid "Proxy Server"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/tw.twnic.dns.lua:3
msgid "Quad 101 - TW"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:319
msgid "Restart"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua:3
msgid "Quad 9 (Recommended)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:313
msgid "Restarting %s service"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua:3
msgid "Quad 9 (Secured with ECS Support)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:335
msgid "Run As Group"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua:3
msgid "Quad 9 (Secured)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:331
msgid "Run As User"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua:3
msgid "Quad 9 (Unsecured)"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:203
msgid "See the %sREADME%s for details."
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm:43
msgid "Reload"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:155
msgid "Resolver"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/lu.restena.kaitain.lua:3
msgid "Restena DNS - LU"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.rethinkdns.basic.lua:3
msgid "Rethink DNS (Configurable)"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/io.seby.doh-2.lua:3
msgid "Seby DNS - AU"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:118
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:402
msgid "Service Control"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:114
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:201
msgid "Service Instances"
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:165
msgid "Service Status"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:112
msgid "Service Status [%s %s]"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.snopyta.dns.doh.fi.lua:3
msgid "Snopyta DNS - FI"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm:40
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:300
msgid "Start"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm:46
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:294
msgid "Starting %s service"
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:338
msgid "Stop"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:99
msgid "Stopped"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:332
msgid "Stopping %s service"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/ch.switch.dns.lua:3
msgid "Switch DNS - CH"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:211
msgid "Unknown"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/app.tiar.jp.lua:3
msgid "Tiarap Public DNS - JP"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:100
msgid "Update %s only"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/app.tiar.doh.lua:3
msgid "Tiarap Public DNS - SG"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cn.edu.tsinghua.tuna.dns.lua:3
msgid "Tsinghua University Secure DNS - CN"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:65
msgid "Unknown Provider"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:127
msgid "Update %s config"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:123
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:78
msgid "Update DNSMASQ Config on Start/Stop"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:124
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:88
msgid "Update all configs"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:50
msgid "and"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:362
msgid "Use HTTP/1"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua:101
msgid "disabled"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:372
msgid "Use IPv6 resolvers"
msgstr ""
#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cn.rubyfish.dns.lua:3
msgid "rubyfish.cn"
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:377
msgid "Use any family DNS resolvers"
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/view/https-dns-proxy/overview.js:366
msgid "Use negotiated HTTP version"
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:169
msgid "Version %s - Running."
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:181
msgid "Version %s - Stopped (Disabled)."
msgstr ""
#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:179
msgid "Version %s - Stopped."
msgstr ""

View file

@ -0,0 +1,206 @@
#!/bin/sh
# Copyright 2023 MOSSDeF, Stan Grishin (stangri@melmac.ca)
# shellcheck disable=SC1091,SC2039,SC3043
# TechRef: https://openwrt.org/docs/techref/rpcd
# ubus -v list luci.https-dns-proxy
# ubus -S call luci.https-dns-proxy getInitList '{"name": "https-dns-proxy" }'
# ubus -S call luci.https-dns-proxy getInitStatus '{"name": "https-dns-proxy" }'
# ubus -S call luci.https-dns-proxy getPlatformSupport '{"name": "https-dns-proxy" }'
# ubus -S call luci.https-dns-proxy getProviders '{"name": "https-dns-proxy" }'
# ubus -S call luci.https-dns-proxy getRuntime '{"name": "https-dns-proxy" }'
readonly packageName="https-dns-proxy"
readonly providersDir="/usr/share/${packageName}/providers"
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
is_enabled() { "/etc/init.d/${1}" enabled; }
is_running() { [ "$(ubus call service list "{ 'name': '$1' }" | jsonfilter -q -e "@['$1'].instances[*].running" | uniq)" = 'true' ]; }
get_version() { grep -m1 -A2 -w "^Package: $1$" /usr/lib/opkg/status | sed -n 's/Version: //p'; }
check_http2() { grep -q 'Provides: libnghttp2' /usr/lib/opkg/status; }
check_http3() { grep -q 'Provides: libnghttp3' /usr/lib/opkg/status; }
ubus_get_ports() { ubus call service list "{ 'name': '$packageName' }" | jsonfilter -e "@['${packageName}'].instances[*].data.firewall.*.dest_port"; }
logger() { /usr/bin/logger -t "$packageName" "$@"; }
print_json_bool() { json_init; json_add_boolean "$1" "$2"; json_dump; json_cleanup; }
get_init_list() {
local name="$1"
json_init
json_add_object "$name"
if is_enabled "$name"; then
json_add_boolean 'enabled' '1'
else
json_add_boolean 'enabled' '0'
fi
if is_running "$name"; then
json_add_boolean 'running' '1'
else
json_add_boolean 'running' '0'
fi
json_close_object
json_dump
json_cleanup
}
get_init_status() {
local name
local i ports
local version
name="$(basename "$1")"
name="${name:-$packageName}"
ports="$(ubus_get_ports)"
[ -z "$version" ] && version="$(get_version "$name")"
json_init
json_add_object "$name"
if is_enabled "$name"; then
json_add_boolean 'enabled' '1'
else
json_add_boolean 'enabled' '0'
fi
if is_running "$name"; then
json_add_boolean 'running' '1'
else
json_add_boolean 'running' '0'
fi
if [ -n "$ports" ]; then
json_add_boolean 'force_dns_active' '1'
json_add_array 'force_dns_ports'
for i in $ports; do json_add_int '' "$i"; done
json_close_array
else
json_add_boolean 'force_dns_active' '0'
fi
json_add_string 'version' "$version"
json_close_array
json_close_object
json_dump
json_cleanup
}
get_platform_support() {
local name
name="$(basename "$1")"
name="${name:-$packageName}"
json_init
json_add_object "$name"
if check_http2; then
json_add_boolean 'http2_support' '1'
else
json_add_boolean 'http2_support' '0'
fi
if check_http3; then
json_add_boolean 'http3_support' '1'
else
json_add_boolean 'http3_support' '0'
fi
json_close_object
json_dump
json_cleanup
}
get_providers() {
local f
echo '{"https-dns-proxy":['
for f in "$providersDir"/*; do
cat "$f"
echo ','
done
# echo '{ "title": "Custom", "template": "{option}", "params": { "option": { "type": "text", }, }, },'
echo ']}'
}
get_runtime() { ubus call service list "{ 'verbose': true, 'name': '$1' }"; }
set_init_action() {
local name="$1" action="$2" cmd
case $action in
enable)
cmd="/etc/init.d/${name} enable";;
disable)
cmd="/etc/init.d/${name} disable";;
start|stop|restart)
cmd="/etc/init.d/${name} ${action}";;
esac
if [ -n "$cmd" ] && eval "${cmd}" >/dev/null 2>&1; then
print_json_bool "result" '1'
else
print_json_bool "result" '0'
fi
}
case "$1" in
list)
json_init
json_add_object "getInitList"
json_add_string 'name' "name"
json_close_object
json_add_object "getInitStatus"
json_add_string 'name' 'name'
json_close_object
json_add_object "getPlatformSupport"
json_add_string 'name' 'name'
json_close_object
json_add_object "getProviders"
json_add_string 'name' "name"
json_close_object
json_add_object "getRuntime"
json_add_string 'name' "name"
json_close_object
json_add_object "setInitAction"
json_add_string 'name' "name"
json_add_string 'action' "action"
json_close_object
json_dump
json_cleanup
;;
call)
case "$2" in
getInitList)
read -r input
json_load "$input"
json_get_var name "name"
json_cleanup
get_init_list "$name"
;;
getInitStatus)
read -r input
json_load "$input"
json_get_var name 'name'
json_cleanup
get_init_status "$name"
;;
getPlatformSupport)
read -r input
json_load "$input"
json_get_var name 'name'
json_cleanup
get_platform_support "$name"
;;
getProviders)
read -r input
json_load "$input"
json_get_var name "name"
json_cleanup
get_providers "$name"
;;
getRuntime)
read -r input
json_load "$input"
json_get_var name "name"
json_cleanup
get_runtime "$name"
;;
setInitAction)
read -r input
json_load "$input"
json_get_var name "name"
json_get_var action "action"
json_cleanup
set_init_action "$name" "$action"
;;
esac
;;
esac

View file

@ -0,0 +1,24 @@
{
"title": "Tiarap Public DNS (JP)",
"template": "https://doh.{option}/dns-query",
"bootstrap_dns": "172.104.93.80,2400:8902::f03c:91ff:feda:c514",
"help_link": "https://tiarap.org/",
"params": {
"option": {
"description": "Variant",
"type": "select",
"regex": "(tiar.app|tiarap.org)",
"options": [
{
"value": "tiar.app",
"description": "Direct"
},
{
"value": "tiarap.org",
"description": "Cloudlfare Cached"
}
],
"default": "tiar.app"
}
}
}

View file

@ -0,0 +1,28 @@
{
"title": "CIRA Canadian Shield",
"template": "https://{option}.canadianshield.cira.ca/dns-query",
"bootstrap_dns": "149.112.121.30,149.112.122.30,2620:10A:80BB::30,2620:10A:80BC::30",
"help_link": "https://www.cira.ca/cybersecurity-services/canadian-shield/",
"params": {
"option": {
"description": "Variant",
"type": "select",
"regex": "(family|private|protected)",
"options": [
{
"value": "family",
"description": "Family Filter"
},
{
"value": "private",
"description": "Private Filter"
},
{
"value": "Protected",
"description": "Protected Filter"
}
],
"default": "private"
}
}
}

View file

@ -0,0 +1,7 @@
{
"title": "Digitale Gesellschaft (CH)",
"template": "https://dns.digitale-gesellschaft.ch/dns-query",
"bootstrap_dns": "1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001,8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844",
"http2_only": true,
"help_link": "https://www.digitale-gesellschaft.ch/dns/"
}

View file

@ -0,0 +1,6 @@
{
"title": "Switch DNS (CH)",
"template": "https://dns.switch.ch/dns-query",
"bootstrap_dns": "130.59.31.248,2001:620:0:ff::2",
"help_link": "https://www.switch.ch/security/info/public-dns/"
}

Some files were not shown because too many files have changed in this diff Show more