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
--- /dev/null
+// 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,
+});
--- /dev/null
+// 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()]);
+ },
+});
+++ /dev/null
-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
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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",
-}
+++ /dev/null
-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
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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
-}
+++ /dev/null
-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
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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"
-}
+++ /dev/null
-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
+++ /dev/null
-<%# 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%>
+++ /dev/null
-<style type="text/css">
- .btn_spinner
- {
- display: inline-block;
- width: 0px;
- height: 16px;
- margin: 0 0px;
- }
-</style>
+++ /dev/null
-
-<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>
+++ /dev/null
-<%#
-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%>
+++ /dev/null
-<%#
-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%>
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/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/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"
+#: 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/view/https-dns-proxy/buttons.htm:56
-msgid "Disable"
+#: 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/luasrc/model/cbi/https-dns-proxy.lua:130
+#: 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/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/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: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/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/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:173
+msgid "HTTPS DNS Proxy - Instances"
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/https-dns-proxy/status.js:161
+msgid "HTTPS DNS Proxy - Status"
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: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"
-msgstr ""
-
-#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/fi.lelux.resolver-eu.lua:3
-msgid "Lelux DNS - FI"
+#: 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/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"
-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:349
+msgid "Logging File Path"
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/view/https-dns-proxy/overview.js:344
+msgid "Logging Verbosity"
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/https-dns-proxy/status.js:187
+msgid "Not installed or not found"
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: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/com.pumplex.dns.lua:3
-msgid "OSZX DNS (Pumplex)"
-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: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.opendns.doh.lua:3
-msgid "OpenDNS"
+#: 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/com.opendns.familyshield.doh.lua:3
-msgid "OpenDNS (Family Shield)"
+#: 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/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"
-msgstr ""
-
-#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua:3
-msgid "Quad 9 (Recommended)"
-msgstr ""
-
-#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua:3
-msgid "Quad 9 (Secured with ECS Support)"
-msgstr ""
-
-#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua:3
-msgid "Quad 9 (Secured)"
-msgstr ""
-
-#: applications/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua:3
-msgid "Quad 9 (Unsecured)"
-msgstr ""
-
-#: applications/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm:43
-msgid "Reload"
+#: 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/model/cbi/https-dns-proxy.lua:155
-msgid "Resolver"
+#: 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/lu.restena.kaitain.lua:3
-msgid "Restena DNS - LU"
+#: 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/com.rethinkdns.basic.lua:3
-msgid "Rethink DNS (Configurable)"
+#: 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/io.seby.doh-2.lua:3
-msgid "Seby DNS - AU"
+#: 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/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
-msgid "Service Status"
+#: 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/luasrc/model/cbi/https-dns-proxy.lua:112
-msgid "Service Status [%s %s]"
+#: 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/https-dns-proxy/providers/org.snopyta.dns.doh.fi.lua:3
-msgid "Snopyta DNS - FI"
+#: 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:40
-msgid "Start"
+#: 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/luasrc/view/https-dns-proxy/buttons.htm:46
+#: 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"
+#: 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/https-dns-proxy/providers/cn.edu.tsinghua.tuna.dns.lua:3
-msgid "Tsinghua University Secure DNS - CN"
+#: 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:65
-msgid "Unknown Provider"
+#: 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:127
-msgid "Update %s config"
+#: 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/model/cbi/https-dns-proxy.lua:123
-msgid "Update DNSMASQ Config on Start/Stop"
+#: 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/luasrc/model/cbi/https-dns-proxy.lua:124
-msgid "Update all configs"
+#: 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/luasrc/model/cbi/https-dns-proxy.lua:50
-msgid "and"
+#: 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/luasrc/model/cbi/https-dns-proxy.lua:101
-msgid "disabled"
+#: 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/luasrc/https-dns-proxy/providers/cn.rubyfish.dns.lua:3
-msgid "rubyfish.cn"
+#: applications/luci-app-https-dns-proxy/htdocs/luci-static/resources/https-dns-proxy/status.js:179
+msgid "Version %s - Stopped."
msgstr ""
--- /dev/null
+#!/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
--- /dev/null
+{
+ "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"
+ }
+ }
+}
--- /dev/null
+{
+ "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"
+ }
+ }
+}
--- /dev/null
+{
+ "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/"
+}
--- /dev/null
+{
+ "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/"
+}
--- /dev/null
+{
+ "title": "DoH 360 DNS (CN)",
+ "template": "https://doh.360.cn/dns-query",
+ "bootstrap_dns": "101.226.4.6,218.30.118.6,123.125.81.6,140.207.198.6"
+}
--- /dev/null
+{
+ "title": "RubyFish (CN)",
+ "template": "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
+}
--- /dev/null
+{
+ "title": "OSZX DNS (UK)",
+ "template": "https://doh.{option}/dns-query",
+ "bootstrap_dns": "51.38.82.198,2001:41d0:801:2000::1b28",
+ "help_link": "https://dns.oszx.co/#mdoh",
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(oszx.co|pumplex.com)",
+ "options": [
+ {
+ "value": "oszx.co",
+ "description": "AdBlocking Filter"
+ },
+ {
+ "value": "pumplex.com",
+ "description": "Standard"
+ }
+ ],
+ "default": "oszx.co"
+ }
+ }
+}
--- /dev/null
+{
+ "title": "AdGuard",
+ "template": "https://dns{option}.adguard.com/dns-query",
+ "bootstrap_dns": "176.103.130.130,176.103.130.131",
+ "help_link": "https://adguard.com/en/adguard-dns/overview.html",
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(-family|)",
+ "options": [
+ {
+ "value": "-family",
+ "description": "Family Filter"
+ },
+ {
+ "value": "",
+ "description": "Standard"
+ }
+ ],
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "AhaDNS Blitz",
+ "template": "https://blitz.ahadns.com/{option}",
+ "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/",
+ "params": {
+ "option": {
+ "description": "Filters",
+ "type": "text",
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "AliDNS",
+ "template": "https://dns.alidns.com/dns-query",
+ "bootstrap_dns": "223.5.5.5,223.6.6.6,2400:3200::1,2400:3200:baba::1"
+}
--- /dev/null
+{
+ "title": "BlahDNS",
+ "template": "https://doh-{option}.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/",
+ "params": {
+ "option": {
+ "description": "Location",
+ "type": "select",
+ "regex": "(ch|de|fi|jp|sg)",
+ "options": [
+ {
+ "value": "ch",
+ "description": "Switzerland"
+ },
+ {
+ "value": "de",
+ "description": "Germany"
+ },
+ {
+ "value": "fi",
+ "description": "Finland"
+ },
+ {
+ "value": "jp",
+ "description": "Japan"
+ },
+ {
+ "value": "sg",
+ "description": "Singapore"
+ }
+ ],
+ "default": "ch"
+ }
+ }
+}
--- /dev/null
+{
+ "title": "Cloudflare",
+ "template": "https://{option}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/",
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(family.||security.)",
+ "options": [
+ {
+ "value": "family.",
+ "description": "Family Filter"
+ },
+ {
+ "value": "",
+ "description": "Standard"
+ },
+ {
+ "value": "security.",
+ "description": "Security Filter"
+ }
+ ],
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "ControlD",
+ "template": "https://freedns.controld.com/{option}",
+ "bootstrap_dns": "76.76.2.0,2606:1a40::0",
+ "help_link": "https://kb.controld.com/tutorials",
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(family|p0|p1|p2|p3)",
+ "options": [
+ {
+ "value": "family",
+ "description": "Family Filter"
+ },
+ {
+ "value": "p0",
+ "description": "Standard"
+ },
+ {
+ "value": "p1",
+ "description": "Malware Filter"
+ },
+ {
+ "value": "p2",
+ "description": "Ads + Malware Filter"
+ },
+ {
+ "value": "p3",
+ "description": "Ads + Malware + Social Filter"
+ }
+ ],
+ "default": "p0"
+ }
+ }
+}
--- /dev/null
+{
+ "title": "DeCloudUs DNS",
+ "template": "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/"
+}
--- /dev/null
+{
+ "title": "DNS For Family",
+ "template": "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"
+}
--- /dev/null
+{
+ "title": "DNSlify DNS",
+ "template": "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/"
+}
--- /dev/null
+{
+ "title": "OpenDNS",
+ "template": "https://doh.{option}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",
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(family.|)",
+ "options": [
+ {
+ "value": "family.",
+ "description": "Family Filter"
+ },
+ {
+ "value": "",
+ "description": "Standard"
+ }
+ ],
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "Rethink DNS",
+ "template": "https://sky.rethinkdns.com/{option}",
+ "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",
+ "params": {
+ "option": {
+ "description": "Filters",
+ "type": "text",
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "ODVR (CZ)",
+ "template": "https://odvr.nic.cz/doh",
+ "bootstrap_dns": "193.17.47.1,185.43.135.1"
+}
--- /dev/null
+{
+ "title": "DNS Forge (DE)",
+ "template": "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/"
+}
--- /dev/null
+{
+ "title": "Lelux DNS (FI)",
+ "template": "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/"
+}
--- /dev/null
+{
+ "title": "Google",
+ "template": "https://dns.google/dns-query",
+ "bootstrap_dns": "8.8.8.8,8.8.4.4",
+ "default": true
+}
--- /dev/null
+{
+ "title": "LibreDNS (GR)",
+ "template": "https://doh.libredns.gr/{option}",
+ "bootstrap_dns": "116.202.176.26",
+ "help_link": "https://libredns.gr/",
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(ads|dns-query)",
+ "options": [
+ {
+ "value": "ads",
+ "description": "AdBlocking Filter"
+ },
+ {
+ "value": "dns-query",
+ "description": "Standard"
+ }
+ ],
+ "default": "dns-query"
+ }
+ }
+}
--- /dev/null
+{
+ "title": "NextDNS.io",
+ "template": "https://dns.nextdns.io/{option}",
+ "bootstrap_dns": "45.90.28.49,45.90.30.49",
+ "help_link": "https://my.nextdns.io",
+ "params": {
+ "option": {
+ "description": "Username",
+ "type": "text",
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "Seby DNS (AU)",
+ "template": "https://doh-2.seby.io/dns-query",
+ "bootstrap_dns": "45.76.113.31,139.99.222.72",
+ "help_link": "https://dns.seby.io/"
+}
--- /dev/null
+{
+ "title": "IIJ Public DNS (JP)",
+ "template": "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/"
+}
--- /dev/null
+{
+ "title": "Restena DNS (LU)",
+ "template": "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",
+ "http2_only": true
+}
--- /dev/null
+{
+ "title": "AhaDNS Regional",
+ "template": "https://doh.{option}.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/",
+ "params": {
+ "option": {
+ "description": "Location",
+ "type": "select",
+ "regex": "(au|chi|es|in|it|la|nl|no|ny|pl)",
+ "options": [
+ {
+ "value": "au",
+ "description": "Australia"
+ },
+ {
+ "value": "chi",
+ "description": "US/Chicago"
+ },
+ {
+ "value": "es",
+ "description": "Spain"
+ },
+ {
+ "value": "in",
+ "description": "India"
+ },
+ {
+ "value": "it",
+ "description": "Italy"
+ },
+ {
+ "value": "la",
+ "description": "US/Los Angeles"
+ },
+ {
+ "value": "nl",
+ "description": "Netherlands"
+ },
+ {
+ "value": "no",
+ "description": "Norway"
+ },
+ {
+ "value": "ny",
+ "description": "US/New York"
+ },
+ {
+ "value": "pl",
+ "description": "Poland"
+ }
+ ],
+ "default": "chi"
+ }
+ }
+}
--- /dev/null
+{
+ "title": "Applied Privacy DNS (AT)",
+ "template": "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/"
+}
--- /dev/null
+{
+ "title": "CFIEC Public IPv6 Only DNS (CN)",
+ "template": "https://dns.cfiec.net/dns-query",
+ "bootstrap_dns": "240C::6666,240C::6644"
+}
--- /dev/null
+{
+ "title": "FFMUC DNS (DE)",
+ "template": "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"
+}
--- /dev/null
+{
+ "title": "Hurricane Electric",
+ "template": "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"
+}
--- /dev/null
+{
+ "title": "IDNet (UK)",
+ "template": "https://doh.idnet.net/dns-query",
+ "bootstrap_dns": "212.69.36.23,212.69.40.23"
+}
--- /dev/null
+{
+ "title": "Mullvad",
+ "template": "https://{option}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/",
+ "http2_only": true,
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(adblock.|)",
+ "options": [
+ {
+ "value": "adblock.",
+ "description": "AdBlocking Filter"
+ },
+ {
+ "value": "",
+ "description": "Standard"
+ }
+ ],
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "Quad 9",
+ "template": "https://{option}.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/",
+ "params": {
+ "option": {
+ "description": "Variant",
+ "type": "select",
+ "regex": "(dns|dns9|dns10|dns11)",
+ "options": [
+ {
+ "value": "dns",
+ "description": "Standard"
+ },
+ {
+ "value": "dns9",
+ "description": "Secured"
+ },
+ {
+ "value": "dns10",
+ "description": "Unsecured"
+ },
+ {
+ "value": "dns11",
+ "description": "Secured with ECS Support"
+ }
+ ],
+ "default": "dns"
+ }
+ }
+}
--- /dev/null
+{
+ "title": "Comss DNS (RU)",
+ "template": "https://dns.{option}comss.one/dns-query",
+ "bootstrap_dns": "92.38.152.163,93.115.24.204,2a03:90c0:56::1a5,2a02:7b40:5eb0:e95d::1",
+ "params": {
+ "option": {
+ "description": "Location",
+ "type": "select",
+ "regex": "(east.|)",
+ "options": [
+ {
+ "value": "east.",
+ "description": "Siberia"
+ },
+ {
+ "value": "",
+ "description": "Moscow, St Petersburg"
+ }
+ ],
+ "default": ""
+ }
+ }
+}
--- /dev/null
+{
+ "title": "CleanBrowsing",
+ "template": "https://doh.cleanbrowsing.org/doh/{option}-filter/",
+ "bootstrap_dns": "185.228.168.168",
+ "help_link": "https://cleanbrowsing.org/guides/dnsoverhttps",
+ "params": {
+ "option": {
+ "description": "Filter",
+ "type": "select",
+ "regex": "(adult|family|security)",
+ "options": [
+ {
+ "value": "adult",
+ "description": "Adult Content Filter"
+ },
+ {
+ "value": "family",
+ "description": "Family Filter"
+ },
+ {
+ "value": "security",
+ "description": "Security Filter"
+ }
+ ],
+ "default": "security"
+ }
+ }
+}
--- /dev/null
+{
+ "title": "Snopyta DNS (FI)",
+ "template": "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/"
+}
--- /dev/null
+{
+ "title": "DNSPod Public DNS (CN)",
+ "template": "https://doh.pub/dns-query",
+ "bootstrap_dns": "119.29.29.29,119.28.28.28"
+}
--- /dev/null
+{
+ "title": "DoH DNS (SB)",
+ "template": "https://doh.dns.sb/dns-query",
+ "bootstrap_dns": "185.222.222.222,185.184.222.222",
+ "help_link": "https://dns.sb/doh/",
+ "http2_only": true
+}
--- /dev/null
+{
+ "title": "Quad 101 (TW)",
+ "template": "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/"
+}
--- /dev/null
+{
+ "admin/services/https-dns-proxy": {
+ "title": "HTTPS DNS Proxy",
+ "order": 90,
+ "action": {
+ "type": "view",
+ "path": "https-dns-proxy/overview"
+ },
+ "depends": {
+ "acl": [
+ "luci-app-https-dns-proxy"
+ ]
+ }
+ }
+}
"luci-app-https-dns-proxy": {
"description": "Grant UCI and file access for luci-app-https-dns-proxy",
"read": {
- "cgi-io": [
- "exec"
- ],
- "file": {
- "/usr/lib/opkg/status": [
- "read"
- ],
- "/usr/lib/lua/luci/https-dns-proxy/providers/*": [
- "read"
- ],
- "/etc/init.d/https-dns-proxy *": [
- "exec"
+ "ubus": {
+ "luci.https-dns-proxy": [
+ "getInitList",
+ "getInitStatus",
+ "getPlatformSupport",
+ "getProviders",
+ "getRuntime"
]
},
"uci": [
+ "dhcp",
"https-dns-proxy"
]
},
"write": {
"uci": [
"https-dns-proxy"
- ]
+ ],
+ "ubus": {
+ "luci.https-dns-proxy": [
+ "setInitAction"
+ ]
+ }
}
}
}