small-package/luci-app-dnscrypt-proxy2/files/luci/model/cbi/dnscrypt-proxy/dnscrypt-resolvers-config.lua

211 lines
8.0 KiB
Lua

-- Copyright (C) 2019 github.com/peter-tank
-- Licensed to the public under the GNU General Public License v3.
local m, s, o, _, v, created
local fs = require "nixio.fs"
local sys = require "luci.sys"
local ds = require "luci.tools.dnscrypt".init()
local cfg, sid = arg[1], arg[2]
local protocol = {
"DNSCrypt",
"DoH",
}
function typicalmsg(self)
if not ds:typicalcfg(cfg) then
local c, init, exec = luci.model.uci.cursor()
c:load("ucitrack")
init = c:get_first("ucitrack", self.config, "init", "null")
exec = c:get_first("ucitrack", self.config, "exec", "null")
c:unload("ucitrack")
local error = {}
table.insert(error, translate("Not a typical dnscrypt-proxy resolvers configure!") .. " Original for: [%s]" % init)
table.insert(error, translate("Additional changes on apply:"))
table.insert(error, "init script: %s --> %s" % {init, "null"})
table.insert(error, "exec script: %s --> %s %s" % {exec, "/etc/init.d/dnscrypt-proxy_resolvers", self.config})
self.error = self.error and self.error or {}
self.error["global"] = self.error["global"] and table(self.error["global"], error) or error
end
end
function list_dns(m, cfg)
-- [[ Source Setting ]]--
s = m:section(NamedSection, "global", "source", translate("Configuration -: ") .. cfg)
s.description = translate("Update the resolvers here by a new apply. Permently cover your modifications on specific resolve, if the source resolved successfully.")
s.anonymous = false
s.addremove = true
typicalmsg(s)
-- section might not exist
function s.cfgvalue(self, section)
if not self.map:get(section) then
self.map:set(section, nil, self.sectiontype)
end
return self.map:get(section)
end
function s.remove(self, section)
self.map:del(section)
self.map.proceed = true
return self.map.uci:delete_all(self.config, "dnscrypt", function(section) return true end)
end
o = s:option(Value, "urls", translate("Source URL"), translate("Split MultiValues by a comma"))
o.rmempty = true
o.default = "https://download.dnscrypt.info/dnscrypt-resolvers/v3/public-resolvers.md"
o.placeholder = "https://xxx.xxx.xxx/public-resolvers.md"
--o = s:option(Value, "cache_file", translate("Cache File"), translate("Change this only on duplicating this resolver to another source when retrieving: ") .. "/usr/share/dnscrypt-proxy/{*}.md")
--o.default = "public-resolvers.md"
--o.placeholder = "eg: custom.md"
--o.rmempty = false
o = s:option(Value, "details_json", translate("Details File URL"), translate("Detailed resolvers JSON file `dnscrypt-proxy -json --list-all` or: ") .. "https://download.dnscrypt.info/dnscrypt-resolvers/json/{*}.json")
o.default = "https://download.dnscrypt.info/dnscrypt-resolvers/json/public-resolvers.json"
o.placeholder = "eg: custom.json"
o.rmempty = true
o = s:option(Flag, "cache_mode", translate("No resolvers update."), translate("Force cached resolvers only: ").. "/usr/share/dnscrypt-proxy/{.*}[.md|.minisig|.json]")
o.default = true
o.optional = false
o.rmempty = false
o = s:option(Flag, "selfsign", translate("Selfsign Resolvers"), translate("Mostly useful for build your own resolvers list on net probe fails. minisign binary needed: ") .. "https://github.com/peter-tank/openwrt-minisign")
o.default = false
o.optional = false
o.rmempty = true
o:depends("cache_mode", true)
o = s:option(Value, "minisign_key", translate("MiniSign Key"), translate("Resolvers singed by: ") .. "https://download.dnscrypt.info/dnscrypt-resolvers/v3/minisign.pub")
o.default = "RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3"
o.optional = false
o.placeholder = o.default
o.rmempty = false
o:depends("selfsign", false)
o = s:option(Value, "prefix", translate("Prefix"), translate("Change this only on filtering the resolvers: "))
o.optional = true
o.placeholder = "eg: quad9-"
o.rmempty = true
o = s:option(Value, "format", translate("Version"), translate("Configure file version."))
o.optional = true
o.default = "v3"
o.rmempty = true
s = m:section(TypedSection, 'dnscrypt', translate("DNSCrypt Resolver Info"))
s.anonymous = false
s.addremove = true
s.sortable = false
s.template = "cbi/tblsection"
s.extedit = luci.dispatcher.build_url("admin/services/dnscrypt-proxy/dnscrypt-resolvers", cfg, "%s")
function s.create(self, name)
AbstractSection.create(self, name)
luci.http.redirect( self.extedit:format(name) )
end
s:option(DummyValue, "country", translate("Country"))
s:option(DummyValue, "proto", translate("Protocol"))
s:option(DummyValue, "name", translate("Resolver"))
s:option(DummyValue, "description", translate("Description"))
s:option(Flag, "ipv6", translate("IPv6"))
s:option(Flag, "dnssec", translate("DNSSec Validation"))
s:option(Flag, "nolog", translate("NoLog"))
s:option(Flag, "nofilter", translate("NoFilter"))
s:option(DummyValue, "addrs", translate("Address"))
s:option(DummyValue, "ports", translate("Port"))
-- s:option(DummyValue, "stamp", translate("Stamp"))
end
-- [[ Servers Setting ]]--
function edit_list(m)
s = m:section(NamedSection, sid, "dnscrypt", translate("DNSCrypt Resolver Editing - ") .. sid)
s.anonymous = true
s.addremove = true
o = s:option(Value, "name", translate("Resolver"))
o.default = sid
o.rmempty = false
o = s:option(Value, "country", translate("Country"))
o.default = "China"
o = s:option(Value, "proto", translate("Protocol"))
for _, v in ipairs(protocol) do o:value(v) end
o.default = "DNSCrypt"
o.rmempty = false
o = s:option(Value, "description", translate("Description"))
o.default = "Dns-over-HTTPS protocol . Non-logging, supports DNSSEC. By https://www.google.com"
o = s:option(Flag, "dnssec", translate("DNSSec Validation"))
o.rmempty = false
o = s:option(Flag, "ipv6", translate("IPv6"))
o.rmempty = false
o = s:option(Flag, "nolog", translate("NoLog"))
o.rmempty = false
o = s:option(Flag, "nofilter", translate("NoFilter"))
o.rmempty = false
o = s:option(Value, "addrs", translate("Resolver Address"), translate("Split MultiValues by a comma"))
o.placeholder = "eg: 8.8.8.8,8.8.4.4"
o.rmempty = false
o = s:option(Value, "ports", translate("Port"), translate("Split MultiValues by a comma"))
o.placeholder = "eg: 443,5353"
o.rmempty = false
o = s:option(Value, "location", translate("Geography Coordinates"))
o.placeholder = "eg: 33.032501, 83.895699"
o = s:option(Value, "stamp", translate("Stamp"))
o.placeholder = "eg: sdns://AgcAAAAAAAAADjExNi4yMDMuNzAuMTU2ID4aGg9sU_PpekktVwhLW5gHBZ7gV6sVBYdv2D_aPbg4EWRvaC5kbnN3YXJkZW4uY29tCy91bmNlbnNvcmVk"
o.rmempty = false
end
m = Map(cfg, translate("DNSCrypt Resolvers Manage"))
m.on_before_commit = function (self)
local exec = "/etc/init.d/dnscrypt-proxy_resolvers"
local section, stype, on_remove = "global", "source", false
local sec = "DNSCrypt_resolvers_" .. self.config:gsub("[^%w_]", "_")
local c = luci.model.uci.cursor()
local changes = c:changes()
self.redirect = luci.dispatcher.build_url("admin/services/dnscrypt-proxy/dnscrypt-resolvers", self.config)
for r, tbl in pairs(changes or next(changes)) do
for s, os in pairs(tbl) do
if os['.type'] and os['.type'] == "" and r == self.config and s == section then on_remove = true end
end
end
c:load("ucitrack")
if self:get(section, "urls") and not on_remove then
if not c:get_first("ucitrack", self.config, "exec", nil) then
c:delete_all("ucitrack", self.config, function(section) return true end)
sec = c:section("ucitrack", self.config, sec)
c:set("ucitrack", sec, "init", "null")
c:set("ucitrack", sec, "test", "0")
c:set("ucitrack", sec, "exec", "%s %s" % {exec, self.config})
c:save("ucitrack"); c:commit("ucitrack");
end
else
if c:get_first("ucitrack", self.config, "exec", nil) == ("%s %s" %{exec, self.config}) then
c:delete_all("ucitrack", self.config, function(section) return true end)
c:save("ucitrack"); c:commit("ucitrack");
end
self.redirect = luci.dispatcher.build_url("admin/services/dnscrypt-proxy/dnscrypt-resolvers")
end
c:unload("ucitrack")
luci.util.exec("/etc/init.d/ucitrack reload")
end
if cfg then
if sid == nil then list_dns(m, cfg) else edit_list(m, cfg) end
else
luci.http.redirect(luci.dispatcher.build_url("admin/services/dnscrypt-proxy/dnscrypt-resolvers"))
return
end
return m