2021-09-24 23:37:27 +08:00
-- 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
2021-11-22 09:02:33 +08:00
o.default = " v3 "
2021-09-24 23:37:27 +08:00
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