2023-02-04 20:34:44 +08:00
|
|
|
-- Copyright (C) 2022-2023 xiaorouji
|
2022-03-05 13:13:49 +08:00
|
|
|
|
2022-03-11 18:29:27 +08:00
|
|
|
module("luci.controller.passwall2", package.seeall)
|
2023-02-16 23:37:45 +08:00
|
|
|
local api = require "luci.passwall2.api"
|
2022-03-05 13:13:49 +08:00
|
|
|
local appname = api.appname
|
|
|
|
local ucic = luci.model.uci.cursor()
|
|
|
|
local http = require "luci.http"
|
|
|
|
local util = require "luci.util"
|
|
|
|
local i18n = require "luci.i18n"
|
2023-02-16 23:37:45 +08:00
|
|
|
local brook = require("luci.passwall2.brook")
|
|
|
|
local v2ray = require("luci.passwall2.v2ray")
|
|
|
|
local xray = require("luci.passwall2.xray")
|
|
|
|
local hysteria = require("luci.passwall2.hysteria")
|
2022-03-05 13:13:49 +08:00
|
|
|
|
|
|
|
function index()
|
2023-02-16 23:37:45 +08:00
|
|
|
appname = require "luci.passwall2.api".appname
|
2022-03-05 13:13:49 +08:00
|
|
|
entry({"admin", "services", appname}).dependent = true
|
|
|
|
entry({"admin", "services", appname, "reset_config"}, call("reset_config")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "show"}, call("show_menu")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "hide"}, call("hide_menu")).leaf = true
|
2022-03-11 18:29:27 +08:00
|
|
|
if not nixio.fs.access("/etc/config/passwall2") then return end
|
|
|
|
if nixio.fs.access("/etc/config/passwall2_show") then
|
|
|
|
e = entry({"admin", "services", appname}, alias("admin", "services", appname, "settings"), _("PassWall 2"), -1)
|
2022-03-05 13:13:49 +08:00
|
|
|
e.dependent = true
|
2022-03-11 18:29:27 +08:00
|
|
|
e.acl_depends = { "luci-app-passwall2" }
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
--[[ Client ]]
|
|
|
|
entry({"admin", "services", appname, "settings"}, cbi(appname .. "/client/global"), _("Basic Settings"), 1).dependent = true
|
|
|
|
entry({"admin", "services", appname, "node_list"}, cbi(appname .. "/client/node_list"), _("Node List"), 2).dependent = true
|
|
|
|
entry({"admin", "services", appname, "node_subscribe"}, cbi(appname .. "/client/node_subscribe"), _("Node Subscribe"), 3).dependent = true
|
|
|
|
entry({"admin", "services", appname, "auto_switch"}, cbi(appname .. "/client/auto_switch"), _("Auto Switch"), 4).leaf = true
|
|
|
|
entry({"admin", "services", appname, "other"}, cbi(appname .. "/client/other", {autoapply = true}), _("Other Settings"), 92).leaf = true
|
|
|
|
entry({"admin", "services", appname, "app_update"}, cbi(appname .. "/client/app_update"), _("App Update"), 95).leaf = true
|
|
|
|
entry({"admin", "services", appname, "rule"}, cbi(appname .. "/client/rule"), _("Rule Manage"), 96).leaf = true
|
|
|
|
entry({"admin", "services", appname, "node_subscribe_config"}, cbi(appname .. "/client/node_subscribe_config")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "node_config"}, cbi(appname .. "/client/node_config")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "shunt_rules"}, cbi(appname .. "/client/shunt_rules")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "acl"}, cbi(appname .. "/client/acl"), _("Access control"), 98).leaf = true
|
|
|
|
entry({"admin", "services", appname, "acl_config"}, cbi(appname .. "/client/acl_config")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "log"}, form(appname .. "/client/log"), _("Watch Logs"), 999).leaf = true
|
|
|
|
|
|
|
|
--[[ Server ]]
|
|
|
|
entry({"admin", "services", appname, "server"}, cbi(appname .. "/server/index"), _("Server-Side"), 99).leaf = true
|
|
|
|
entry({"admin", "services", appname, "server_user"}, cbi(appname .. "/server/user")).leaf = true
|
|
|
|
|
|
|
|
--[[ API ]]
|
|
|
|
entry({"admin", "services", appname, "server_user_status"}, call("server_user_status")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "server_user_log"}, call("server_user_log")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "server_get_log"}, call("server_get_log")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "server_clear_log"}, call("server_clear_log")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "link_add_node"}, call("link_add_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "autoswitch_add_node"}, call("autoswitch_add_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "autoswitch_remove_node"}, call("autoswitch_remove_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "get_now_use_node"}, call("get_now_use_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "get_redir_log"}, call("get_redir_log")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "get_log"}, call("get_log")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "clear_log"}, call("clear_log")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "status"}, call("status")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "socks_status"}, call("socks_status")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "connect_status"}, call("connect_status")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "ping_node"}, call("ping_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "urltest_node"}, call("urltest_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "set_node"}, call("set_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "copy_node"}, call("copy_node")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "clear_all_nodes"}, call("clear_all_nodes")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "delete_select_nodes"}, call("delete_select_nodes")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "update_rules"}, call("update_rules")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "brook_check"}, call("brook_check")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "brook_update"}, call("brook_update")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "v2ray_check"}, call("v2ray_check")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "v2ray_update"}, call("v2ray_update")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "xray_check"}, call("xray_check")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "xray_update"}, call("xray_update")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "hysteria_check"}, call("hysteria_check")).leaf = true
|
|
|
|
entry({"admin", "services", appname, "hysteria_update"}, call("hysteria_update")).leaf = true
|
|
|
|
end
|
|
|
|
|
|
|
|
local function http_write_json(content)
|
|
|
|
http.prepare_content("application/json")
|
|
|
|
http.write_json(content or {code = 1})
|
|
|
|
end
|
|
|
|
|
|
|
|
function reset_config()
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call('/etc/init.d/passwall2 stop')
|
|
|
|
luci.sys.call('[ -f "/usr/share/passwall2/0_default_config" ] && cp -f /usr/share/passwall2/0_default_config /etc/config/passwall2')
|
2022-03-05 13:13:49 +08:00
|
|
|
luci.http.redirect(api.url())
|
|
|
|
end
|
|
|
|
|
|
|
|
function show_menu()
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call("touch /etc/config/passwall2_show")
|
2022-03-05 13:13:49 +08:00
|
|
|
luci.sys.call("rm -rf /tmp/luci-*")
|
|
|
|
luci.sys.call("/etc/init.d/rpcd restart >/dev/null")
|
|
|
|
luci.http.redirect(api.url())
|
|
|
|
end
|
|
|
|
|
|
|
|
function hide_menu()
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call("rm -rf /etc/config/passwall2_show")
|
2022-03-05 13:13:49 +08:00
|
|
|
luci.sys.call("rm -rf /tmp/luci-*")
|
|
|
|
luci.sys.call("/etc/init.d/rpcd restart >/dev/null")
|
|
|
|
luci.http.redirect(luci.dispatcher.build_url("admin", "status", "overview"))
|
|
|
|
end
|
|
|
|
|
|
|
|
function link_add_node()
|
|
|
|
local lfile = "/tmp/links.conf"
|
|
|
|
local link = luci.http.formvalue("link")
|
|
|
|
luci.sys.call('echo \'' .. link .. '\' > ' .. lfile)
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call("lua /usr/share/passwall2/subscribe.lua add log")
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function autoswitch_add_node()
|
|
|
|
local key = luci.http.formvalue("key")
|
|
|
|
if key and key ~= "" then
|
2023-03-07 16:25:55 +08:00
|
|
|
local new_list = ucic:get(appname, "@auto_switch[0]", "node") or {}
|
|
|
|
for i = #new_list, 1, -1 do
|
|
|
|
if (ucic:get(appname, new_list[i], "remarks") or ""):find(key) then
|
|
|
|
table.remove(new_list, i)
|
|
|
|
end
|
|
|
|
end
|
2022-03-05 13:13:49 +08:00
|
|
|
for k, e in ipairs(api.get_valid_nodes()) do
|
|
|
|
if e.node_type == "normal" and e["remark"]:find(key) then
|
2023-03-07 16:25:55 +08:00
|
|
|
table.insert(new_list, e.id)
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
end
|
2023-03-07 16:25:55 +08:00
|
|
|
ucic:set_list(appname, "@auto_switch[0]", "node", new_list)
|
|
|
|
ucic:commit(appname)
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
luci.http.redirect(api.url("auto_switch"))
|
|
|
|
end
|
|
|
|
|
|
|
|
function autoswitch_remove_node()
|
|
|
|
local key = luci.http.formvalue("key")
|
|
|
|
if key and key ~= "" then
|
2023-03-07 16:25:55 +08:00
|
|
|
local new_list = ucic:get(appname, "@auto_switch[0]", "node") or {}
|
|
|
|
for i = #new_list, 1, -1 do
|
|
|
|
if (ucic:get(appname, new_list[i], "remarks") or ""):find(key) then
|
|
|
|
table.remove(new_list, i)
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
end
|
2023-03-07 16:25:55 +08:00
|
|
|
ucic:set_list(appname, "@auto_switch[0]", "node", new_list)
|
|
|
|
ucic:commit(appname)
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
luci.http.redirect(api.url("auto_switch"))
|
|
|
|
end
|
|
|
|
|
|
|
|
function get_now_use_node()
|
|
|
|
local e = {}
|
2022-03-11 18:29:27 +08:00
|
|
|
local data, code, msg = nixio.fs.readfile("/tmp/etc/passwall2/id/global")
|
2022-03-05 13:13:49 +08:00
|
|
|
if data then
|
2022-03-11 18:29:27 +08:00
|
|
|
e["global"] = util.trim(data)
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
luci.http.prepare_content("application/json")
|
|
|
|
luci.http.write_json(e)
|
|
|
|
end
|
|
|
|
|
|
|
|
function get_redir_log()
|
2022-03-11 18:29:27 +08:00
|
|
|
local id = luci.http.formvalue("id")
|
|
|
|
if nixio.fs.access("/tmp/etc/passwall2/" .. id .. ".log") then
|
|
|
|
local content = luci.sys.exec("cat /tmp/etc/passwall2/" .. id .. ".log")
|
2022-03-05 13:13:49 +08:00
|
|
|
content = content:gsub("\n", "<br />")
|
|
|
|
luci.http.write(content)
|
|
|
|
else
|
|
|
|
luci.http.write(string.format("<script>alert('%s');window.close();</script>", i18n.translate("Not enabled log")))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function get_log()
|
2022-03-11 18:29:27 +08:00
|
|
|
-- luci.sys.exec("[ -f /tmp/log/passwall2.log ] && sed '1!G;h;$!d' /tmp/log/passwall2.log > /tmp/log/passwall2_show.log")
|
|
|
|
luci.http.write(luci.sys.exec("[ -f '/tmp/log/passwall2.log' ] && cat /tmp/log/passwall2.log"))
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function clear_log()
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call("echo '' > /tmp/log/passwall2.log")
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function status()
|
|
|
|
local e = {}
|
2022-04-01 09:48:14 +08:00
|
|
|
e["global_status"] = luci.sys.call(string.format("top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep -i 'global\\.json' >/dev/null", appname)) == 0
|
2022-03-05 13:13:49 +08:00
|
|
|
luci.http.prepare_content("application/json")
|
|
|
|
luci.http.write_json(e)
|
|
|
|
end
|
|
|
|
|
|
|
|
function socks_status()
|
|
|
|
local e = {}
|
|
|
|
local index = luci.http.formvalue("index")
|
|
|
|
local id = luci.http.formvalue("id")
|
|
|
|
e.index = index
|
|
|
|
e.socks_status = luci.sys.call(string.format("top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep '%s' | grep 'SOCKS_' > /dev/null", appname, id)) == 0
|
|
|
|
local use_http = ucic:get(appname, id, "http_port") or 0
|
|
|
|
e.use_http = 0
|
|
|
|
if tonumber(use_http) > 0 then
|
|
|
|
e.use_http = 1
|
|
|
|
e.http_status = luci.sys.call(string.format("top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep '%s' | grep -E 'HTTP_|HTTP2SOCKS' > /dev/null", appname, id)) == 0
|
|
|
|
end
|
|
|
|
luci.http.prepare_content("application/json")
|
|
|
|
luci.http.write_json(e)
|
|
|
|
end
|
|
|
|
|
|
|
|
function connect_status()
|
|
|
|
local e = {}
|
|
|
|
e.use_time = ""
|
|
|
|
local url = luci.http.formvalue("url")
|
2023-03-07 16:25:55 +08:00
|
|
|
local result = luci.sys.exec('curl --connect-timeout 3 -o /dev/null -I -sk -w "%{http_code}:%{time_starttransfer}" ' .. url)
|
2022-03-05 13:13:49 +08:00
|
|
|
local code = tonumber(luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $1}'") or "0")
|
|
|
|
if code ~= 0 then
|
|
|
|
local use_time = luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $2}'")
|
|
|
|
if use_time:find("%.") then
|
|
|
|
e.use_time = string.format("%.2f", use_time * 1000)
|
|
|
|
else
|
|
|
|
e.use_time = string.format("%.2f", use_time / 1000)
|
|
|
|
end
|
|
|
|
e.ping_type = "curl"
|
|
|
|
end
|
|
|
|
luci.http.prepare_content("application/json")
|
|
|
|
luci.http.write_json(e)
|
|
|
|
end
|
|
|
|
|
|
|
|
function ping_node()
|
|
|
|
local index = luci.http.formvalue("index")
|
|
|
|
local address = luci.http.formvalue("address")
|
|
|
|
local port = luci.http.formvalue("port")
|
|
|
|
local e = {}
|
|
|
|
e.index = index
|
|
|
|
local nodes_ping = ucic:get(appname, "@global_other[0]", "nodes_ping") or ""
|
|
|
|
if nodes_ping:find("tcping") and luci.sys.exec("echo -n $(command -v tcping)") ~= "" then
|
2022-03-16 09:19:44 +08:00
|
|
|
if api.is_ipv6(address) then
|
|
|
|
address = api.get_ipv6_only(address)
|
|
|
|
end
|
2022-03-05 13:13:49 +08:00
|
|
|
e.ping = luci.sys.exec(string.format("echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null", port, address))
|
|
|
|
end
|
|
|
|
if e.ping == nil or tonumber(e.ping) == 0 then
|
|
|
|
e.ping = luci.sys.exec("echo -n $(ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null" % address)
|
|
|
|
end
|
|
|
|
luci.http.prepare_content("application/json")
|
|
|
|
luci.http.write_json(e)
|
|
|
|
end
|
|
|
|
|
|
|
|
function urltest_node()
|
|
|
|
local index = luci.http.formvalue("index")
|
|
|
|
local id = luci.http.formvalue("id")
|
|
|
|
local e = {}
|
|
|
|
e.index = index
|
2022-03-11 18:29:27 +08:00
|
|
|
local result = luci.sys.exec(string.format("/usr/share/passwall2/test.sh url_test_node %s %s", id, "urltest_node"))
|
2022-03-05 13:13:49 +08:00
|
|
|
local code = tonumber(luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $1}'") or "0")
|
|
|
|
if code ~= 0 then
|
|
|
|
local use_time = luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $2}'")
|
|
|
|
if use_time:find("%.") then
|
|
|
|
e.use_time = string.format("%.2f", use_time * 1000)
|
|
|
|
else
|
|
|
|
e.use_time = string.format("%.2f", use_time / 1000)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
luci.http.prepare_content("application/json")
|
|
|
|
luci.http.write_json(e)
|
|
|
|
end
|
|
|
|
|
|
|
|
function set_node()
|
2023-03-13 16:24:36 +08:00
|
|
|
local type = luci.http.formvalue("type")
|
|
|
|
local config = luci.http.formvalue("config")
|
2022-03-05 13:13:49 +08:00
|
|
|
local section = luci.http.formvalue("section")
|
2023-03-13 16:24:36 +08:00
|
|
|
ucic:set(appname, type, config, section)
|
2022-03-05 13:13:49 +08:00
|
|
|
ucic:commit(appname)
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call("/etc/init.d/passwall2 restart > /dev/null 2>&1 &")
|
2022-03-05 13:13:49 +08:00
|
|
|
luci.http.redirect(api.url("log"))
|
|
|
|
end
|
|
|
|
|
|
|
|
function copy_node()
|
|
|
|
local section = luci.http.formvalue("section")
|
|
|
|
local uuid = api.gen_uuid()
|
|
|
|
ucic:section(appname, "nodes", uuid)
|
|
|
|
for k, v in pairs(ucic:get_all(appname, section)) do
|
|
|
|
local filter = k:find("%.")
|
|
|
|
if filter and filter == 1 then
|
|
|
|
else
|
|
|
|
xpcall(function()
|
|
|
|
ucic:set(appname, uuid, k, v)
|
|
|
|
end,
|
|
|
|
function(e)
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
ucic:delete(appname, uuid, "add_from")
|
|
|
|
ucic:set(appname, uuid, "add_mode", 1)
|
|
|
|
ucic:commit(appname)
|
|
|
|
luci.http.redirect(api.url("node_config", uuid))
|
|
|
|
end
|
|
|
|
|
|
|
|
function clear_all_nodes()
|
|
|
|
ucic:set(appname, '@global[0]', "enabled", "0")
|
2022-03-11 18:29:27 +08:00
|
|
|
ucic:set(appname, '@global[0]', "node", "nil")
|
|
|
|
ucic:set_list(appname, "@auto_switch[0]", "node", {})
|
2022-03-05 13:13:49 +08:00
|
|
|
ucic:foreach(appname, "socks", function(t)
|
|
|
|
ucic:delete(appname, t[".name"])
|
|
|
|
end)
|
|
|
|
ucic:foreach(appname, "acl_rule", function(t)
|
2022-03-11 18:29:27 +08:00
|
|
|
ucic:set(appname, t[".name"], "node", "default")
|
2022-03-05 13:13:49 +08:00
|
|
|
end)
|
|
|
|
ucic:foreach(appname, "nodes", function(node)
|
|
|
|
ucic:delete(appname, node['.name'])
|
|
|
|
end)
|
|
|
|
|
|
|
|
ucic:commit(appname)
|
|
|
|
luci.sys.call("/etc/init.d/" .. appname .. " stop")
|
|
|
|
end
|
|
|
|
|
|
|
|
function delete_select_nodes()
|
|
|
|
local ids = luci.http.formvalue("ids")
|
2022-03-11 18:29:27 +08:00
|
|
|
local auto_switch_node_list = ucic:get(appname, "@auto_switch[0]", "node") or {}
|
2022-03-05 13:13:49 +08:00
|
|
|
string.gsub(ids, '[^' .. "," .. ']+', function(w)
|
2023-03-07 16:25:55 +08:00
|
|
|
for i = #auto_switch_node_list, 1, -1 do
|
|
|
|
if w == auto_switch_node_list[i] then
|
|
|
|
table.remove(auto_switch_node_list, i)
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
end
|
2023-03-07 16:25:55 +08:00
|
|
|
ucic:set_list(appname, "@auto_switch[0]", "node", auto_switch_node_list)
|
2022-03-11 18:29:27 +08:00
|
|
|
if (ucic:get(appname, "@global[0]", "node") or "nil") == w then
|
|
|
|
ucic:set(appname, '@global[0]', "node", "nil")
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
ucic:foreach(appname, "socks", function(t)
|
|
|
|
if t["node"] == w then
|
|
|
|
ucic:delete(appname, t[".name"])
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
ucic:foreach(appname, "acl_rule", function(t)
|
2022-03-11 18:29:27 +08:00
|
|
|
if t["node"] == w then
|
|
|
|
ucic:set(appname, t[".name"], "node", "default")
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
end)
|
|
|
|
ucic:delete(appname, w)
|
|
|
|
end)
|
|
|
|
ucic:commit(appname)
|
|
|
|
luci.sys.call("/etc/init.d/" .. appname .. " restart > /dev/null 2>&1 &")
|
|
|
|
end
|
|
|
|
|
|
|
|
function update_rules()
|
|
|
|
local update = luci.http.formvalue("update")
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call("lua /usr/share/passwall2/rule_update.lua log '" .. update .. "' > /dev/null 2>&1 &")
|
2022-03-05 13:13:49 +08:00
|
|
|
http_write_json()
|
|
|
|
end
|
|
|
|
|
|
|
|
function server_user_status()
|
|
|
|
local e = {}
|
|
|
|
e.index = luci.http.formvalue("index")
|
|
|
|
e.status = luci.sys.call(string.format("top -bn1 | grep -v 'grep' | grep '%s/bin/' | grep -i '%s' >/dev/null", appname .. "_server", luci.http.formvalue("id"))) == 0
|
|
|
|
http_write_json(e)
|
|
|
|
end
|
|
|
|
|
|
|
|
function server_user_log()
|
|
|
|
local id = luci.http.formvalue("id")
|
2022-03-11 18:29:27 +08:00
|
|
|
if nixio.fs.access("/tmp/etc/passwall2_server/" .. id .. ".log") then
|
|
|
|
local content = luci.sys.exec("cat /tmp/etc/passwall2_server/" .. id .. ".log")
|
2022-03-05 13:13:49 +08:00
|
|
|
content = content:gsub("\n", "<br />")
|
|
|
|
luci.http.write(content)
|
|
|
|
else
|
|
|
|
luci.http.write(string.format("<script>alert('%s');window.close();</script>", i18n.translate("Not enabled log")))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function server_get_log()
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.http.write(luci.sys.exec("[ -f '/tmp/log/passwall2_server.log' ] && cat /tmp/log/passwall2_server.log"))
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function server_clear_log()
|
2022-03-11 18:29:27 +08:00
|
|
|
luci.sys.call("echo '' > /tmp/log/passwall2_server.log")
|
2022-03-05 13:13:49 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function brook_check()
|
|
|
|
local json = brook.to_check("")
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|
|
|
|
function brook_update()
|
|
|
|
local json = nil
|
|
|
|
local task = http.formvalue("task")
|
|
|
|
if task == "move" then
|
|
|
|
json = brook.to_move(http.formvalue("file"))
|
|
|
|
else
|
|
|
|
json = brook.to_download(http.formvalue("url"), http.formvalue("size"))
|
|
|
|
end
|
|
|
|
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|
|
|
|
function v2ray_check()
|
|
|
|
local json = v2ray.to_check("")
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|
|
|
|
function v2ray_update()
|
|
|
|
local json = nil
|
|
|
|
local task = http.formvalue("task")
|
|
|
|
if task == "extract" then
|
|
|
|
json = v2ray.to_extract(http.formvalue("file"), http.formvalue("subfix"))
|
|
|
|
elseif task == "move" then
|
|
|
|
json = v2ray.to_move(http.formvalue("file"))
|
|
|
|
else
|
|
|
|
json = v2ray.to_download(http.formvalue("url"), http.formvalue("size"))
|
|
|
|
end
|
|
|
|
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|
|
|
|
function xray_check()
|
|
|
|
local json = xray.to_check("")
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|
|
|
|
function xray_update()
|
|
|
|
local json = nil
|
|
|
|
local task = http.formvalue("task")
|
|
|
|
if task == "extract" then
|
|
|
|
json = xray.to_extract(http.formvalue("file"), http.formvalue("subfix"))
|
|
|
|
elseif task == "move" then
|
|
|
|
json = xray.to_move(http.formvalue("file"))
|
|
|
|
else
|
|
|
|
json = xray.to_download(http.formvalue("url"), http.formvalue("size"))
|
|
|
|
end
|
|
|
|
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|
|
|
|
function hysteria_check()
|
|
|
|
local json = hysteria.to_check("")
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|
|
|
|
function hysteria_update()
|
|
|
|
local json = nil
|
|
|
|
local task = http.formvalue("task")
|
|
|
|
if task == "move" then
|
|
|
|
json = hysteria.to_move(http.formvalue("file"))
|
|
|
|
else
|
|
|
|
json = hysteria.to_download(http.formvalue("url"), http.formvalue("size"))
|
|
|
|
end
|
|
|
|
|
|
|
|
http_write_json(json)
|
|
|
|
end
|
|
|
|
|