op-packages/luci-app-dnscrypt-proxy2/files/luci/tools/dnscrypt.lua
github-actions[bot] 32600acc60 🌴 Sync 2026-03-05 23:51:42
2026-03-05 23:51:42 +08:00

127 lines
2.6 KiB
Lua

local type, pairs, ipairs, table, luci, math
= type, pairs, ipairs, table, luci, math
local tpl = require "luci.template.parser"
local utl = require "luci.util"
local uci = require "luci.model.uci"
local fs = require "nixio.fs"
module "luci.tools.dnscrypt"
local uci_r, uci_s
local dsec, dlst = "dnscrypt", "resolvers"
local dglb, dsrc = "source", "urls"
function _valid_id(x)
return (x and #x > 0 and x:match("^[a-zA-Z0-9_]+$"))
end
function _get(c, s, o)
return uci_r:get(c, s, o)
end
function _set(c, s, o, v)
if v ~= nil then
if type(v) == "boolean" then v = v and "1" or "0" end
return uci_r:set(c, s, o, v)
else
return uci_r:delete(c, s, o)
end
end
function typicalcfg(self, cfg)
local dnscrypt_types, all_val, k, t = {"source", "dnscrypt"}, uci_r:get_all(cfg)
if not all_val then return true end
for k, t in pairs(all_val) do
if not luci.util.contains(dnscrypt_types, t[".type"]) then return false end
end
return true
end
function resolvers_list(self, with_src)
local _, cfg, r = nil, nil, { }
for cfg in (fs.glob(uci_r:get_confdir() .. "/*")) do
cfg=fs.basename(cfg)
uci_r:foreach(cfg, dsec,
function(s)
if s.name and s.stamp and s.proto and s.country then
local src = uci_r:get_first(cfg, dglb, dsrc)
r[#r+1] = with_src and "%s|%s" %{cfg, src or "Unknown"} or cfg
end
return false
end)
end
return r
end
function country_list(self)
local _, cfg, r = nil, nil, { }
for _, cfg in pairs(self:resolvers_list(false)) do
uci_r:foreach(cfg, dsec,
function(s)
if s.country then
r[s.country] = s.country
end
end)
end
return r
end
function proto_list(self)
local _, cfg, r = nil, nil, { }
for _, cfg in pairs(self:resolvers_list(false)) do
uci_r:foreach(cfg, dsec,
function(s)
if s.proto then
r[s.proto] = s.proto
end
end)
end
return r
end
function dns_list(self, rf, cf, prf)
local _, cfg, r = nil, nil, { }
for _, cfg in pairs(self:resolvers_list(false)) do
uci_r:foreach(cfg, dsec,
function(s)
if rf and cfg ~= rf then return false end
if s.name and s.stamp and s.proto then
if cf and cf ~= s.country then return true end
if prf and prf ~= s.proto then return true end
r[#r+1] = {
['resolver'] = cfg,
['proto'] = s.proto,
['country'] = s.country,
['name'] = s.name,
['stamp'] = s.stamp,
['addrs'] = s.addrs,
['ports'] = s.ports,
}
end
end)
end
return r
end
function init(cursor)
uci_r = cursor or uci_r or uci.cursor()
uci_s = uci_r:substate()
return _M
end
function save(self, ...)
uci_r:save(...)
uci_r:load(...)
end
function commit(self, ...)
uci_r:commit(...)
uci_r:load(...)
end
function get_defaults()
return defaults()
end