small-package/luci-app-dnscrypt-proxy2/files/luci/controller/dnscrypt-proxy.lua

212 lines
6.1 KiB
Lua

-- Copyright (C) 2019 github.com/peter-tank
-- Licensed to the public under the GNU General Public License v3.
module("luci.controller.dnscrypt-proxy", package.seeall)
function index()
if not nixio.fs.access("/etc/config/dnscrypt-proxy") then
return
end
entry({"admin", "services", "dnscrypt-proxy"},alias("admin", "services", "dnscrypt-proxy", "global"),_("DNSCrypt Proxy"), 10).acl_depends = { "luci-app-dnscrypt-proxy2" }
entry({"admin", "services", "dnscrypt-proxy", "global"},cbi("dnscrypt-proxy/global"),_("Overview"), 10).leaf = true
entry({"admin", "services", "dnscrypt-proxy", "dnscrypt-resolvers"},cbi("dnscrypt-proxy/dnscrypt-resolvers"),_("Resolvers"), 20).leaf = true
entry({"admin", "services", "dnscrypt-proxy", "dnscrypt-resolvers"},arcombine(cbi("dnscrypt-proxy/dnscrypt-resolvers"), cbi("dnscrypt-proxy/dnscrypt-resolvers-config")),_("Resolvers"), 25).dependent = true
entry({"admin", "services", "dnscrypt-proxy", "dnscrypt-proxy-acl"},cbi("dnscrypt-proxy/dnscrypt-proxy-acl"),_("Resolver ACL"), 30).leaf = true
entry({"admin", "services", "dnscrypt-proxy", "dnscrypt-proxy"},cbi("dnscrypt-proxy/dnscrypt-proxy"),_("Proxy Setting"), 40).dependent = true
entry({"admin", "services", "dnscrypt-proxy", "refresh_c"}, call("refresh_cmd"))
entry({"admin", "services", "dnscrypt-proxy", "resolve_c"}, call("resolve_cmd"))
entry({"admin", "services", "dnscrypt-proxy", "update_c"}, call("update_cmd"))
entry({"admin", "services", "dnscrypt-proxy", "fileread"}, call("act_read"), nil).leaf=true
entry({"admin", "services", "dnscrypt-proxy", "logview"}, cbi("dnscrypt-proxy/logview"), _("Log") ,80).leaf=true
end
function update_cmd()
local dc = require "luci.tools.dnscrypt".init()
local set = luci.http.formvalue("set")
local surl = luci.http.formvalue("url")
local ecount, retstring = 0, "-1"
if set == "dnscrypt_bin" then
local bin_file = "/usr/sbin/dnscrypt-proxy"
local ret = action_update(surl)
retstring = type(ret) == "table" and table.concat(ret,", ") or ret
ecount = nixio.fs.chmod(bin_file, 755)
else
ecount = -1
retstring = "Unkown CMD: " .. set
end
luci.http.prepare_content("application/json")
luci.http.write_json({ err=ecount, status=retstring})
end
function refresh_cmd()
local set = luci.http.formvalue("set")
local icount, retstring = 0, "-1"
if set == "remove_caches" then
local dir = "/usr/share/dnscrypt-proxy"
local output = { }
exec("/bin/busybox", { "find", dir, "-type", "f" },
function(chunk) output[#output+1] = chunk:match("%S+") end)
exec("/bin/busybox", { "find", dir, "-type", "f", "-exec", "rm", "{}", ";" })
icount = #output
retstring = "[%d]<br />%s" % { icount, table.concat(output, "<br />") }
elseif set == "dump_resolver" then
local output = "/usr/share/dnscrypt-proxy/running.json"
luci.sys.exec("/usr/sbin/dnscrypt-proxy -json --list-all -config /var/etc/dnscrypt-proxy-ns1.conf > %s" % output)
local lua_data = luci.jsonc.parse(nixio.fs.readfile(output))
icount = #lua_data
retstring = "[%d] - %s" % { icount, output }
else
icount = -1
retstring = "Unkown CMD: " .. set
end
luci.http.prepare_content("application/json")
luci.http.write_json({ ret=retstring ,retcount=icount})
end
function resolve_cmd()
local set = luci.http.formvalue("set")
local retstring="<br /><br />"
retstring = luci.sys.exec("/usr/sbin/dnscrypt-proxy -resolve www.google.com,127.0.0.1:7915 -config /var/etc/dnscrypt-proxy-ns1.conf")
luci.http.prepare_content("application/json")
luci.http.write_json({ ret=retstring })
end
-- called by XHR.get from logview.htm
function act_read(lfile)
local fs = require "nixio.fs"
local http = require "luci.http"
local lfile = http.formvalue("lfile")
local ldata={}
ldata[#ldata+1] = fs.readfile(lfile) or "_nofile_"
if ldata[1] == "" then
ldata[1] = "_nodata_"
end
http.prepare_content("application/json")
http.write_json(ldata)
end
function action_data()
local http = require "luci.http"
local types = {
csv = "text/csv",
json = "application/json"
}
local args = { }
local mtype = http.formvalue("type") or "json"
http.prepare_content(types[mtype])
exec("/usr/sbin/dnscrypt-proxy", args, http.write)
end
function action_list()
local http = require "luci.http"
local fd = io.popen("/usr/sbin/dnscrypt-proxy -c list")
local periods = { }
if fd then
while true do
local period = fd:read("*l")
if not period then
break
end
periods[#periods+1] = period
end
fd:close()
end
http.prepare_content("application/json")
http.write_json(periods)
end
function action_update(surl)
local tmp = "/tmp/dnscrypt-proxy_bin.tar.gz"
local dir = "/tmp"
local stype = luci.util.exec("uname"):lower()
local sarch = luci.util.exec("uname -m")
exec("/usr/bin/wget-ssl", {"--no-check-certificate", "-O", tmp, surl})
exec("/usr/sbin/dnscrypt-proxy", {"-service", "stop" })
local files = { }
local tar = io.popen("/bin/tar -tzf %s" % tmp, "r")
if tar then
while true do
local file = tar:read("*l")
if not file then
break
elseif file:match("^(.*\/dnscrypt.proxy)$") then
files[#files+1] = file
end
end
tar:close()
end
if #files == 0 then
return {500, "Internal Server Error", stype, sarch}
end
local output = { }
exec("/usr/sbin/dnscrypt-proxy", {"-service", "stop" })
exec("/bin/mkdir", { "-p", dir })
exec("/bin/tar", { "-C", dir, "-vxzf", tmp, unpack(files) },
function(chunk) output[#output+1] = chunk:match("%S+") end)
exec("/bin/cp", { "-f", dir .. "/" .. files[1], "/usr/sbin/dnscrypt-proxy"})
exec("/bin/rm", { "-f", "%s/%s-%s/dnscrypt-proxy" % {dir, stype, sarch}})
exec("/bin/rm", { "-f", tmp })
exec("/usr/sbin/dnscrypt-proxy", {"-service", "start" })
return out
end
function exec(cmd, args, writer)
local os = require "os"
local nixio = require "nixio"
local fdi, fdo = nixio.pipe()
local pid = nixio.fork()
if pid > 0 then
fdo:close()
while true do
local buffer = fdi:read(2048)
if not buffer or #buffer == 0 then
break
end
if writer then
writer(buffer)
end
end
nixio.waitpid(pid)
elseif pid == 0 then
nixio.dup(fdo, nixio.stdout)
fdi:close()
fdo:close()
nixio.exece(cmd, args, nil)
nixio.stdout:close()
os.exit(1)
end
end