luci-app-https-dns-proxy: rewrite in javascript
Signed-off-by: Stan Grishin <stangri@melmac.ca>
This commit is contained in:
parent
48f0fc85f3
commit
6df7b92a50
139 changed files with 1772 additions and 1444 deletions
|
@ -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
|
||||
|
|
|
@ -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", {}, "  ");
|
||||
var btn_gap_long = E(
|
||||
"span",
|
||||
{},
|
||||
"        "
|
||||
);
|
||||
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,
|
||||
});
|
|
@ -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()]);
|
||||
},
|
||||
});
|
|
@ -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
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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",
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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
|
|
@ -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>
|
||||
 
|
||||
 
|
||||
 
|
||||
 
|
||||
<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%>
|
|
@ -1,9 +0,0 @@
|
|||
<style type="text/css">
|
||||
.btn_spinner
|
||||
{
|
||||
display: inline-block;
|
||||
width: 0px;
|
||||
height: 16px;
|
||||
margin: 0 0px;
|
||||
}
|
||||
</style>
|
|
@ -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>
|
|
@ -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%>
|
|
@ -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%>
|
|
@ -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 ""
|
||||
|
|
206
applications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy
Executable file
206
applications/luci-app-https-dns-proxy/root/usr/libexec/rpcd/luci.https-dns-proxy
Executable 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
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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/"
|
||||
}
|
|
@ -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
Loading…
Reference in a new issue