diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index 8adffdeb60..ec21bb418f 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=3.9 -PKG_RELEASE:=20 -PKG_DATE:=20200719 +PKG_RELEASE:=22 +PKG_DATE:=20200724 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) @@ -118,10 +118,10 @@ endef define Package/$(PKG_NAME)/conffiles /etc/config/passwall /etc/config/passwall_server -/usr/share/passwall/rules/blacklist_host -/usr/share/passwall/rules/blacklist_ip -/usr/share/passwall/rules/whitelist_host -/usr/share/passwall/rules/whitelist_ip +/usr/share/passwall/rules/proxy_host +/usr/share/passwall/rules/proxy_ip +/usr/share/passwall/rules/direct_host +/usr/share/passwall/rules/direct_ip endef define Package/$(PKG_NAME)/install diff --git a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua index bb91db2301..9d180b2f12 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -10,59 +10,57 @@ local trojan_go = require "luci.model.cbi.passwall.api.trojan_go" function index() if not nixio.fs.access("/etc/config/passwall") then return end - entry({"admin", "vpn"}, firstchild(), "VPN", 45).dependent = false - entry({"admin", "vpn", "passwall", "reset_config"}, call("reset_config")).leaf = true - entry({"admin", "vpn", "passwall", "show"}, call("show_menu")).leaf = true - entry({"admin", "vpn", "passwall", "hide"}, call("hide_menu")).leaf = true - if nixio.fs.access("/etc/config/passwall") and - nixio.fs.access("/etc/config/passwall_show") then - entry({"admin", "vpn", "passwall"}, alias("admin", "vpn", "passwall", "settings"), _("Pass Wall"), 1).dependent = true + entry({"admin", "services", "passwall", "reset_config"}, call("reset_config")).leaf = true + entry({"admin", "services", "passwall", "show"}, call("show_menu")).leaf = true + entry({"admin", "services", "passwall", "hide"}, call("hide_menu")).leaf = true + if nixio.fs.access("/etc/config/passwall_show") then + entry({"admin", "services", "passwall"}, alias("admin", "services", "passwall", "settings"), _("Pass Wall"), 1).dependent = true end - entry({"admin", "vpn", "passwall", "settings"}, cbi("passwall/global"), _("Basic Settings"), 1).dependent = true - entry({"admin", "vpn", "passwall", "node_list"}, cbi("passwall/node_list"), _("Node List"), 2).dependent = true - entry({"admin", "vpn", "passwall", "auto_switch"}, cbi("passwall/auto_switch"), _("Auto Switch"), 3).leaf = true - entry({"admin", "vpn", "passwall", "other"}, cbi("passwall/other", {autoapply = true}), _("Other Settings"), 93).leaf = true + entry({"admin", "services", "passwall", "settings"}, cbi("passwall/global"), _("Basic Settings"), 1).dependent = true + entry({"admin", "services", "passwall", "node_list"}, cbi("passwall/node_list"), _("Node List"), 2).dependent = true + entry({"admin", "services", "passwall", "auto_switch"}, cbi("passwall/auto_switch"), _("Auto Switch"), 3).leaf = true + entry({"admin", "services", "passwall", "other"}, cbi("passwall/other", {autoapply = true}), _("Other Settings"), 93).leaf = true if nixio.fs.access("/usr/sbin/haproxy") then - entry({"admin", "vpn", "passwall", "haproxy"}, cbi("passwall/haproxy"), _("Load Balancing"), 94).leaf = true + entry({"admin", "services", "passwall", "haproxy"}, cbi("passwall/haproxy"), _("Load Balancing"), 94).leaf = true end - entry({"admin", "vpn", "passwall", "node_subscribe"}, cbi("passwall/node_subscribe"), _("Node Subscribe"), 95).dependent = true - entry({"admin", "vpn", "passwall", "rule"}, cbi("passwall/rule"), _("Rule Update"), 96).leaf = true - entry({"admin", "vpn", "passwall", "node_config"}, cbi("passwall/node_config")).leaf = true - entry({"admin", "vpn", "passwall", "shunt_rules"}, cbi("passwall/shunt_rules")).leaf = true - entry({"admin", "vpn", "passwall", "acl"}, cbi("passwall/acl"), _("Access control"), 97).leaf = true - entry({"admin", "vpn", "passwall", "log"}, form("passwall/log"), _("Watch Logs"), 999).leaf = true - entry({"admin", "vpn", "passwall", "server"}, cbi("passwall/server/index"), _("Server-Side"), 99).leaf = true - entry({"admin", "vpn", "passwall", "server_user"}, cbi("passwall/server/user")).leaf = true + entry({"admin", "services", "passwall", "node_subscribe"}, cbi("passwall/node_subscribe"), _("Node Subscribe"), 95).dependent = true + entry({"admin", "services", "passwall", "rule"}, cbi("passwall/rule"), _("Rule Update"), 96).leaf = true + entry({"admin", "services", "passwall", "node_config"}, cbi("passwall/node_config")).leaf = true + entry({"admin", "services", "passwall", "shunt_rules"}, cbi("passwall/shunt_rules")).leaf = true + entry({"admin", "services", "passwall", "acl"}, cbi("passwall/acl"), _("Access control"), 97).leaf = true + entry({"admin", "services", "passwall", "log"}, form("passwall/log"), _("Watch Logs"), 999).leaf = true + entry({"admin", "services", "passwall", "server"}, cbi("passwall/server/index"), _("Server-Side"), 99).leaf = true + entry({"admin", "services", "passwall", "server_user"}, cbi("passwall/server/user")).leaf = true - entry({"admin", "vpn", "passwall", "server_user_status"}, call("server_user_status")).leaf = true - entry({"admin", "vpn", "passwall", "server_get_log"}, call("server_get_log")).leaf = true - entry({"admin", "vpn", "passwall", "server_clear_log"}, call("server_clear_log")).leaf = true - entry({"admin", "vpn", "passwall", "link_append_temp"}, call("link_append_temp")).leaf = true - entry({"admin", "vpn", "passwall", "link_load_temp"}, call("link_load_temp")).leaf = true - entry({"admin", "vpn", "passwall", "link_clear_temp"}, call("link_clear_temp")).leaf = true - entry({"admin", "vpn", "passwall", "link_add_node"}, call("link_add_node")).leaf = true - entry({"admin", "vpn", "passwall", "get_log"}, call("get_log")).leaf = true - entry({"admin", "vpn", "passwall", "clear_log"}, call("clear_log")).leaf = true - entry({"admin", "vpn", "passwall", "status"}, call("status")).leaf = true - entry({"admin", "vpn", "passwall", "socks_status"}, call("socks_status")).leaf = true - entry({"admin", "vpn", "passwall", "connect_status"}, call("connect_status")).leaf = true - entry({"admin", "vpn", "passwall", "check_port"}, call("check_port")).leaf = true - entry({"admin", "vpn", "passwall", "ping_node"}, call("ping_node")).leaf = true - entry({"admin", "vpn", "passwall", "set_node"}, call("set_node")).leaf = true - entry({"admin", "vpn", "passwall", "copy_node"}, call("copy_node")).leaf = true - entry({"admin", "vpn", "passwall", "clear_all_nodes"}, call("clear_all_nodes")).leaf = true - entry({"admin", "vpn", "passwall", "delete_select_nodes"}, call("delete_select_nodes")).leaf = true - entry({"admin", "vpn", "passwall", "update_rules"}, call("update_rules")).leaf = true - entry({"admin", "vpn", "passwall", "luci_check"}, call("luci_check")).leaf = true - entry({"admin", "vpn", "passwall", "luci_update"}, call("luci_update")).leaf = true - entry({"admin", "vpn", "passwall", "kcptun_check"}, call("kcptun_check")).leaf = true - entry({"admin", "vpn", "passwall", "kcptun_update"}, call("kcptun_update")).leaf = true - entry({"admin", "vpn", "passwall", "brook_check"}, call("brook_check")).leaf = true - entry({"admin", "vpn", "passwall", "brook_update"}, call("brook_update")).leaf = true - entry({"admin", "vpn", "passwall", "v2ray_check"}, call("v2ray_check")).leaf = true - entry({"admin", "vpn", "passwall", "v2ray_update"}, call("v2ray_update")).leaf = true - entry({"admin", "vpn", "passwall", "trojan_go_check"}, call("trojan_go_check")).leaf = true - entry({"admin", "vpn", "passwall", "trojan_go_update"}, call("trojan_go_update")).leaf = true + entry({"admin", "services", "passwall", "server_user_status"}, call("server_user_status")).leaf = true + entry({"admin", "services", "passwall", "server_get_log"}, call("server_get_log")).leaf = true + entry({"admin", "services", "passwall", "server_clear_log"}, call("server_clear_log")).leaf = true + entry({"admin", "services", "passwall", "link_append_temp"}, call("link_append_temp")).leaf = true + entry({"admin", "services", "passwall", "link_load_temp"}, call("link_load_temp")).leaf = true + entry({"admin", "services", "passwall", "link_clear_temp"}, call("link_clear_temp")).leaf = true + entry({"admin", "services", "passwall", "link_add_node"}, call("link_add_node")).leaf = true + entry({"admin", "services", "passwall", "get_log"}, call("get_log")).leaf = true + entry({"admin", "services", "passwall", "clear_log"}, call("clear_log")).leaf = true + entry({"admin", "services", "passwall", "status"}, call("status")).leaf = true + entry({"admin", "services", "passwall", "socks_status"}, call("socks_status")).leaf = true + entry({"admin", "services", "passwall", "connect_status"}, call("connect_status")).leaf = true + entry({"admin", "services", "passwall", "check_port"}, call("check_port")).leaf = true + entry({"admin", "services", "passwall", "ping_node"}, call("ping_node")).leaf = true + entry({"admin", "services", "passwall", "set_node"}, call("set_node")).leaf = true + entry({"admin", "services", "passwall", "copy_node"}, call("copy_node")).leaf = true + entry({"admin", "services", "passwall", "clear_all_nodes"}, call("clear_all_nodes")).leaf = true + entry({"admin", "services", "passwall", "delete_select_nodes"}, call("delete_select_nodes")).leaf = true + entry({"admin", "services", "passwall", "update_rules"}, call("update_rules")).leaf = true + entry({"admin", "services", "passwall", "luci_check"}, call("luci_check")).leaf = true + entry({"admin", "services", "passwall", "luci_update"}, call("luci_update")).leaf = true + entry({"admin", "services", "passwall", "kcptun_check"}, call("kcptun_check")).leaf = true + entry({"admin", "services", "passwall", "kcptun_update"}, call("kcptun_update")).leaf = true + entry({"admin", "services", "passwall", "brook_check"}, call("brook_check")).leaf = true + entry({"admin", "services", "passwall", "brook_update"}, call("brook_update")).leaf = true + entry({"admin", "services", "passwall", "v2ray_check"}, call("v2ray_check")).leaf = true + entry({"admin", "services", "passwall", "v2ray_update"}, call("v2ray_update")).leaf = true + entry({"admin", "services", "passwall", "trojan_go_check"}, call("trojan_go_check")).leaf = true + entry({"admin", "services", "passwall", "trojan_go_update"}, call("trojan_go_update")).leaf = true end local function http_write_json(content) @@ -72,12 +70,12 @@ end function reset_config() luci.sys.call('[ -f "/usr/share/passwall/config.default" ] && cp -f /usr/share/passwall/config.default /etc/config/passwall && /etc/init.d/passwall reload') - luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall")) + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "passwall")) end function show_menu() luci.sys.call("touch /etc/config/passwall_show") - luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall")) + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "passwall")) end function hide_menu() @@ -200,7 +198,7 @@ function set_node() ucic:set(appname, "@global[0]", protocol .. "_node" .. number, section) ucic:commit(appname) luci.sys.call("/etc/init.d/passwall restart > /dev/null 2>&1 &") - luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", "passwall", "log")) + luci.http.redirect(luci.dispatcher.build_url("admin", "services", "passwall", "log")) end function copy_node() diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua index a25334607f..74997fc152 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua @@ -8,70 +8,55 @@ m = Map(appname) s = m:section(TypedSection, "global_rules") s.anonymous = true ----- Whitelist Hosts -s:tab("w_hosts", translate("Whitelist Hosts"), "" .. - translate("Join the white list of domain names will not go agent.") .. - "") -local w_host_file = string.format("/usr/share/%s/rules/whitelist_host", appname) -o = s:taboption("w_hosts", TextValue, "whitelist_host") -o.rows = 8 -o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(w_host_file) or "" end -o.write = function(self, section, value) - fs.writefile(w_host_file, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub( - "http://", "")) -end -o.remove = function(self, section, value) fs.writefile(w_host_file, "") end +s:tab("direct_list", translate("Direct List")) +s:tab("proxy_list", translate("Proxy List")) ----- Whitelist IP -s:tab("w_ip", translate("Whitelist IP"), "" .. translate( - "These had been joined ip addresses will not use proxy.Please input the ip address or ip address segment,every line can input only one ip address.For example,192.168.0.0/24 or 223.5.5.5.") .. - "") -local w_ip_file = string.format("/usr/share/%s/rules/whitelist_ip", appname) -o = s:taboption("w_ip", TextValue, "whitelist_ip") +---- Direct Hosts +local direct_host = string.format("/usr/share/%s/rules/direct_host", appname) +o = s:taboption("direct_list", TextValue, "direct_hosts", "", "" .. translate("Join the direct hosts list of domain names will not proxy.") .. "") o.rows = 8 o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(w_ip_file) or "" end +o.cfgvalue = function(self, section) return fs.readfile(direct_host) or "" end o.write = function(self, section, value) - fs.writefile(w_ip_file, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub( - "http://", "")) + fs.writefile(direct_host, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub("http://", "")) end -o.remove = function(self, section, value) fs.writefile(w_ip_file, "") end +o.remove = function(self, section, value) fs.writefile(direct_host, "") end ----- Blacklist Hosts -s:tab("b_hosts", translate("Blacklist Hosts"), - "" .. translate( - "These had been joined websites will use proxy.Please input the domain names of websites,every line can input only one website domain.For example,google.com.") .. - "") -local b_host_file = string.format("/usr/share/%s/rules/blacklist_host", appname) -o = s:taboption("b_hosts", TextValue, "blacklist_host") +---- Direct IP +local direct_ip = string.format("/usr/share/%s/rules/direct_ip", appname) +o = s:taboption("direct_list", TextValue, "direct_ip", "", "" .. translate("These had been joined ip addresses will not proxy. Please input the ip address or ip address segment,every line can input only one ip address. For example: 192.168.0.0/24 or 223.5.5.5.") .. "") o.rows = 8 o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(b_host_file) or "" end +o.cfgvalue = function(self, section) return fs.readfile(direct_ip) or "" end o.write = function(self, section, value) - fs.writefile(b_host_file, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub( - "http://", "")) + fs.writefile(direct_ip, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub("http://", "")) end -o.remove = function(self, section, value) fs.writefile(b_host_file, "") end +o.remove = function(self, section, value) fs.writefile(direct_ip, "") end ----- Blacklist IP -s:tab("b_ip", translate("Blacklist IP"), "" .. translate( - "These had been joined ip addresses will use proxy.Please input the ip address or ip address segment,every line can input only one ip address.For example,35.24.0.0/24 or 8.8.4.4.") .. - "") -local b_ip_file = string.format("/usr/share/%s/rules/blacklist_ip", appname) -o = s:taboption("b_ip", TextValue, "blacklist_ip") +---- Proxy Hosts +local proxy_host = string.format("/usr/share/%s/rules/proxy_host", appname) +o = s:taboption("proxy_list", TextValue, "proxy_host", "", "" .. translate("These had been joined websites will use proxy. Please input the domain names of websites,every line can input only one website domain. For example: google.com.") .. "") o.rows = 8 o.wrap = "off" -o.cfgvalue = function(self, section) return fs.readfile(b_ip_file) or "" end +o.cfgvalue = function(self, section) return fs.readfile(proxy_host) or "" end o.write = function(self, section, value) - fs.writefile(b_ip_file, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub( - "http://", "")) + fs.writefile(proxy_host, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub("http://", "")) end -o.remove = function(self, section, value) fs.writefile(b_ip_file, "") end +o.remove = function(self, section, value) fs.writefile(proxy_host, "") end + +---- Proxy IP +local proxy_ip = string.format("/usr/share/%s/rules/proxy_ip", appname) +o = s:taboption("proxy_list", TextValue, "blacklist_ip", "", "" .. translate("These had been joined ip addresses will use proxy.Please input the ip address or ip address segment,every line can input only one ip address.For example: 35.24.0.0/24 or 8.8.4.4.") .. "") +o.rows = 8 +o.wrap = "off" +o.cfgvalue = function(self, section) return fs.readfile(proxy_ip) or "" end +o.write = function(self, section, value) + fs.writefile(proxy_ip, value:gsub("\r\n", "\n"):gsub("https://", ""):gsub("http://", "")) +end +o.remove = function(self, section, value) fs.writefile(proxy_ip, "") end -- [[ ACLs Settings ]]-- -s = m:section(TypedSection, "acl_rule", translate("ACLs"), "" .. translate( - "ACLs is a tools which used to designate specific IP proxy mode, IP or MAC address can be entered.") .. "") +s = m:section(TypedSection, "acl_rule", translate("ACLs"), "" .. translate("ACLs is a tools which used to designate specific IP proxy mode, IP or MAC address can be entered.") .. "") s.template = "cbi/tblsection" s.sortable = true s.anonymous = true diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua index 1a6fed51c2..e5c0f8cf36 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_trojan.lua @@ -52,7 +52,7 @@ if node.type == "Trojan-Go" then enabled = node.plugin_type ~= nil, type = node.plugin_type or "plaintext", command = node.plugin_type ~= "plaintext" and node.plugin_cmd or nil, - plugin_option = node.plugin_type ~= "plaintext" and node.plugin_option or nil, + option = node.plugin_type ~= "plaintext" and node.plugin_option or nil, arg = node.plugin_type ~= "plaintext" and { node.plugin_arg } or nil, env = {} } or nil diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua index d17549f924..61f5247a99 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua @@ -27,7 +27,7 @@ local function gen_outbound(node, tag) local node_type = (proto and proto ~= "nil") and proto or "socks" local new_port = sys.exec(string.format("echo -n $(/usr/share/%s/app.sh get_new_port auto tcp)", appname)) node.port = new_port - sys.call(string.format("/usr/share/%s/app.sh run_socks %s %s %s %s %s", + sys.call(string.format("/usr/share/%s/app.sh run_socks %s %s %s %s %s > /dev/null", appname, node_id, "127.0.0.1", diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua index 7bc3647e1a..b9e615e72b 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua @@ -2,6 +2,7 @@ local o = require "luci.dispatcher" local sys = require "luci.sys" local ipkg = require("luci.model.ipkg") local uci = require"luci.model.uci".cursor() +local _api = require "luci.model.cbi.passwall.api.api" local appname = "passwall" local function is_installed(e) return ipkg.installed(e) end @@ -32,6 +33,32 @@ uci:foreach(appname, "nodes", function(e) end end) +local socks_table = {} +socks_table[#socks_table + 1] = { + id = "", + remarks = "127.0.0.1:9050 - dns2sock" .. translate(" Default") +} +uci:foreach(appname, "socks", function(s) + if s.enabled == "1" and s.node then + local id, remarks + local same, i = s.node:match("^(tcp)([1-9])$") + if same then + remarks = translatef("Same as the tcp %s node", i) + else + for k, n in pairs(nodes_table) do + if (s.node == n.id) then + remarks = n.remarks; break + end + end + end + id = "0.0.0.0" .. ":" .. s.port + socks_table[#socks_table + 1] = { + id = id, + remarks = id .. " - " .. (remarks or translate("Misconfigured")) + } + end +end) + m = Map(appname) local status_use_big_icon = m:get("@global_other[0]", "status_use_big_icon") or 1 if status_use_big_icon and tonumber(status_use_big_icon) == 1 then @@ -41,23 +68,25 @@ else end -- [[ Global Settings ]]-- -s = m:section(TypedSection, "global", translate("Global Settings")) +s = m:section(TypedSection, "global", translate("Main Settings")) -- s.description = translate("If you can use it, very stable. If not, GG !!!") s.anonymous = true s.addremove = false +s:tab("Main", translate("Main Settings")) + ---- Main switch -o = s:option(Flag, "enabled", translate("Main switch")) +o = s:taboption("Main", Flag, "enabled", translate("Main switch")) o.rmempty = false ---- TCP Node local tcp_node_num = tonumber(m:get("@global_other[0]", "tcp_node_num") or 1) for i = 1, tcp_node_num, 1 do if i == 1 then - o = s:option(ListValue, "tcp_node" .. i, translate("TCP Node")) + o = s:taboption("Main", ListValue, "tcp_node" .. i, translate("TCP Node")) -- o.description = translate("For used to surf the Internet.") else - o = s:option(ListValue, "tcp_node" .. i, + o = s:taboption("Main", ListValue, "tcp_node" .. i, translate("TCP Node") .. " " .. i) end o:value("nil", translate("Close")) @@ -68,20 +97,22 @@ end local udp_node_num = tonumber(m:get("@global_other[0]", "udp_node_num") or 1) for i = 1, udp_node_num, 1 do if i == 1 then - o = s:option(ListValue, "udp_node" .. i, translate("UDP Node")) + o = s:taboption("Main", ListValue, "udp_node" .. i, translate("UDP Node")) -- o.description = translate("For Game Mode or DNS resolution and more.") .. translate("The selected server will not use Kcptun.") o:value("nil", translate("Close")) o:value("tcp", translate("Same as the tcp node")) o:value("tcp_", translate("Same as the tcp node") .. "(" .. translate("New process") .. ")") else - o = s:option(ListValue, "udp_node" .. i, + o = s:taboption("Main", ListValue, "udp_node" .. i, translate("UDP Node") .. " " .. i) o:value("nil", translate("Close")) end for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end end -o = s:option(Value, "up_china_dns", translate("China DNS Server") .. "(UDP)") +s:tab("DNS", translate("DNS Settings")) + +o = s:taboption("DNS", Value, "up_china_dns", translate("China DNS Server") .. "(UDP)") -- o.description = translate("If you want to work with other DNS acceleration services, use the default.
Only use two at most, english comma separation, If you do not fill in the # and the following port, you are using port 53.") o.default = "default" o:value("default", translate("Default")) @@ -97,7 +128,7 @@ o:value("210.2.4.8", "210.2.4.8 (CNNIC DNS)") o:value("180.76.76.76", "180.76.76.76 (" .. translate("Baidu") .. "DNS)") ---- DNS Forward Mode -o = s:option(ListValue, "dns_mode", translate("DNS Mode")) +o = s:taboption("DNS", ListValue, "dns_mode", translate("DNS Mode")) -- o.description = translate("if has problem, please try another mode.
if you use no patterns are used, DNS of wan will be used by default as upstream of dnsmasq.") o.rmempty = false o:reset_values() @@ -114,7 +145,7 @@ o:value("local_7913", translate("Use local port 7913 as DNS")) o:value("nonuse", translate("No patterns are used")) ---- Upstream trust DNS Server for ChinaDNS-NG -o = s:option(ListValue, "up_trust_chinadns_ng_dns", +o = s:taboption("DNS", ListValue, "up_trust_chinadns_ng_dns", translate("Upstream trust DNS Server for ChinaDNS-NG") .. "(UDP)") -- o.description = translate("You can use other resolving DNS services as trusted DNS, Example: dns2socks, dns-forwarder... 127.0.0.1#5353
Only use two at most, english comma separation, If you do not fill in the # and the following port, you are using port 53.") o.default = "pdnsd" @@ -129,24 +160,25 @@ o:depends("dns_mode", "chinadns-ng") ---- Use TCP Node Resolve DNS --[[ if is_installed("pdnsd") or is_installed("pdnsd-alt") or is_finded("pdnsd") then - o = s:option(Flag, "use_tcp_node_resolve_dns", translate("Use TCP Node Resolve DNS")) + o = s:taboption("DNS", Flag, "use_tcp_node_resolve_dns", translate("Use TCP Node Resolve DNS")) o.description = translate("If checked, DNS is resolved using the TCP node.") o.default = 1 o:depends("dns_mode", "pdnsd") end --]] -o = s:option(Value, "socks_server", translate("Socks Server")) -o.default = "127.0.0.1:1080" +o = s:taboption("DNS", Value, "socks_server", translate("Socks Server")) +o.default = "" o:depends({dns_mode = "dns2socks"}) o:depends({dns_mode = "chinadns-ng", up_trust_chinadns_ng_dns = "dns2socks"}) +for k, v in pairs(socks_table) do o:value(v.id, v.remarks) end -o = s:option(Flag, "fair_mode", translate("Fair Mode")) +o = s:taboption("DNS", Flag, "fair_mode", translate("Fair Mode")) o.default = "1" o:depends({dns_mode = "chinadns-ng"}) ---- DNS Forward -o = s:option(Value, "dns_forward", translate("DNS Address")) +o = s:taboption("DNS", Value, "dns_forward", translate("DNS Address")) o.default = "8.8.4.4" o:value("8.8.4.4", "8.8.4.4 (Google DNS)") o:value("8.8.8.8", "8.8.8.8 (Google DNS)") @@ -156,15 +188,17 @@ o:depends({dns_mode = "chinadns-ng"}) o:depends({dns_mode = "dns2socks"}) o:depends({dns_mode = "pdnsd"}) -o = s:option(Flag, "dns_cache", translate("DNS Cache")) +o = s:taboption("DNS", Flag, "dns_cache", translate("DNS Cache")) o.default = "1" o:depends({dns_mode = "chinadns-ng", up_trust_chinadns_ng_dns = "pdnsd"}) o:depends({dns_mode = "chinadns-ng", up_trust_chinadns_ng_dns = "dns2socks"}) o:depends({dns_mode = "dns2socks"}) o:depends({dns_mode = "pdnsd"}) +s:tab("Mode", translate("Proxy Mode")) + ---- TCP Default Proxy Mode -o = s:option(ListValue, "tcp_proxy_mode", +o = s:taboption("Mode", ListValue, "tcp_proxy_mode", "TCP" .. translate("Default") .. translate("Proxy Mode")) -- o.description = translate("If not available, try clearing the cache.") o.default = "chnroute" @@ -176,7 +210,7 @@ o:value("chnroute", translate("China WhiteList")) o:value("returnhome", translate("Return Home")) ---- UDP Default Proxy Mode -o = s:option(ListValue, "udp_proxy_mode", +o = s:taboption("Mode", ListValue, "udp_proxy_mode", "UDP" .. translate("Default") .. translate("Proxy Mode")) o.default = "chnroute" o.rmempty = false @@ -187,7 +221,7 @@ o:value("chnroute", translate("Game Mode") .. "(" .. translate("China WhiteLis o:value("returnhome", translate("Return Home")) ---- Localhost TCP Proxy Mode -o = s:option(ListValue, "localhost_tcp_proxy_mode", +o = s:taboption("Mode", ListValue, "localhost_tcp_proxy_mode", translate("Router Localhost") .. "TCP" .. translate("Proxy Mode")) -- o.description = translate("The server client can also use this rule to scientifically surf the Internet.") o:value("default", translate("Default")) @@ -198,7 +232,7 @@ o.default = "default" o.rmempty = false ---- Localhost UDP Proxy Mode -o = s:option(ListValue, "localhost_udp_proxy_mode", +o = s:taboption("Mode", ListValue, "localhost_udp_proxy_mode", translate("Router Localhost") .. "UDP" .. translate("Proxy Mode")) o:value("disable", translate("No Proxy")) o:value("default", translate("Default")) @@ -208,8 +242,38 @@ o:value("global", translate("Global Proxy")) o.default = "default" o.rmempty = false +-- [[ Socks Server ]]-- +s = m:section(TypedSection, "socks", translate("Socks Config")) +s.anonymous = true +s.addremove = true +s.template = "cbi/tblsection" +function s.create(e, t) + TypedSection.create(e, _api.gen_uuid()) +end + +o = s:option(DummyValue, "status", translate("Status")) +o.template = appname .. "/global/socks_status" + +---- Enable +o = s:option(Flag, "enabled", translate("Enable")) +o.default = 1 +o.rmempty = false + +o = s:option(ListValue, "node", translate("Socks Node")) +local tcp_node_num = tonumber(m:get("@global_other[0]", "tcp_node_num") or 1) +for i = 1, tcp_node_num, 1 do + o:value("tcp" .. i, translatef("Same as the tcp %s node", i)) +end +for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end + +o = s:option(Value, "port", translate("Listen Port")) +o.datatype = "port" +o.rmempty = false + ---- Tips -s:append(Template(appname .. "/global/tips")) +m:append(Template(appname .. "/global/tips")) + +m:append(Template(appname .. "/global/footer")) --[[ local apply = luci.http.formvalue("cbi.apply") diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua index 8929d77a1f..8475882e29 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua @@ -66,7 +66,7 @@ local encrypt_methods_ss_aead = { } m = Map(appname, translate("Node Config")) -m.redirect = d.build_url("admin", "vpn", appname) +m.redirect = d.build_url("admin", "services", appname) s = m:section(NamedSection, arg[1], "nodes", "") s.addremove = false diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua index b573e4b5d6..958adc4808 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_list.lua @@ -38,7 +38,7 @@ s = m:section(TypedSection, "nodes") s.anonymous = true s.addremove = true s.template = "cbi/tblsection" -s.extedit = d.build_url("admin", "vpn", appname, "node_config", "%s") +s.extedit = d.build_url("admin", "services", appname, "node_config", "%s") function s.create(e, t) local uuid = _api.gen_uuid() t = uuid @@ -49,7 +49,7 @@ end function s.remove(e, t) s.map.proceed = true s.map:del(t) - luci.http.redirect(d.build_url("admin", "vpn", appname, "node_list")) + luci.http.redirect(d.build_url("admin", "services", appname, "node_list")) end if m:get("@global_other[0]", "show_group") == "1" then diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua index 0afd1a1726..37879ba92a 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_subscribe.lua @@ -36,7 +36,7 @@ o = s:option(Button, "_update", translate("Manual subscription")) o.inputstyle = "apply" function o.write(e, e) luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua start log > /dev/null 2>&1 &") - luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", appname, "log")) + luci.http.redirect(luci.dispatcher.build_url("admin", "services", appname, "log")) end ---- Subscribe Delete All @@ -44,7 +44,7 @@ o = s:option(Button, "_stop", translate("Delete All Subscribe Node")) o.inputstyle = "remove" function o.write(e, e) luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua truncate log > /dev/null 2>&1 &") - luci.http.redirect(luci.dispatcher.build_url("admin", "vpn", appname, "log")) + luci.http.redirect(luci.dispatcher.build_url("admin", "services", appname, "log")) end filter_enabled = s:option(Flag, "filter_enabled", translate("Filter keyword switch"), translate("When checked, below options can only be take effect.")) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua index 3fe56770cc..adcba7b5dd 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua @@ -1,4 +1,3 @@ -local _api = require "luci.model.cbi.passwall.api.api" local uci = require"luci.model.uci".cursor() local appname = "passwall" @@ -181,34 +180,4 @@ uci:foreach(appname, "nodes", function(e) end end) --- [[ Node List ]]-- -s = m:section(TypedSection, "socks", translate("Socks Config")) -s.anonymous = true -s.addremove = true -s.template = "cbi/tblsection" -function s.create(e, t) - TypedSection.create(e, _api.gen_uuid()) -end - -o = s:option(DummyValue, "status", translate("Status")) -o.template = appname .. "/other/socks_status" - ----- Enable -o = s:option(Flag, "enabled", translate("Enable")) -o.default = 1 -o.rmempty = false - -o = s:option(ListValue, "node", translate("Socks Node")) -local tcp_node_num = tonumber(m:get("@global_other[0]", "tcp_node_num") or 1) -for i = 1, tcp_node_num, 1 do - o:value("tcp" .. i, translatef("Same as the tcp %s node", i)) -end -for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end - -o = s:option(Value, "port", translate("Listen Port")) -o.datatype = "port" -o.rmempty = false - -m:append(Template(appname .. "/other/footer")) - return m diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua index ffac408df9..e9e82b5093 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/rule.lua @@ -13,23 +13,25 @@ o.rmempty = false ]]-- ---- Enable custom url +--[[ o = s:option(Flag, "enable_custom_url", translate("Enable custom url")) o.default = 0 o.rmempty = false +]]-- ---- gfwlist URL o = s:option(Value, "gfwlist_url", translate("gfwlist Update url")) o:value("https://cdn.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt", translate("Loukky/gfwlist-by-loukky")) o:value("https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt", translate("gfwlist/gfwlist")) o.default = "https://cdn.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt" -o:depends("enable_custom_url", 1) +--o:depends("enable_custom_url", 1) ----chnroute URL o = s:option(Value, "chnroute_url", translate("Chnroute Update url")) o:value("https://ispip.clang.cn/all_cn.txt", translate("Clang.CN")) o:value("https://ispip.clang.cn/all_cn_cidr.txt", translate("Clang.CN.CIDR")) o.default = "https://ispip.clang.cn/all_cn.txt" -o:depends("enable_custom_url", 1) +--o:depends("enable_custom_url", 1) ---- Auto Update o = s:option(Flag, "auto_update", translate("Enable auto update rules")) @@ -54,7 +56,7 @@ s = m:section(TypedSection, "shunt_rules", "V2ray" .. translate("Shunt") .. tran s.template = "cbi/tblsection" s.anonymous = false s.addremove = true -s.extedit = d.build_url("admin", "vpn", appname, "shunt_rules", "%s") +s.extedit = d.build_url("admin", "services", appname, "shunt_rules", "%s") function s.create(e, t) TypedSection.create(e, t) luci.http.redirect(e.extedit:format(t)) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua index b1c80c3333..144ea8fa6b 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua @@ -33,7 +33,7 @@ function gen_config(user) enabled = user.plugin_type ~= nil, type = user.plugin_type or "plaintext", command = user.plugin_type ~= "plaintext" and user.plugin_cmd or nil, - plugin_option = user.plugin_type ~= "plaintext" and user.plugin_option or nil, + option = user.plugin_type ~= "plaintext" and user.plugin_option or nil, arg = user.plugin_type ~= "plaintext" and { user.plugin_arg } or nil, env = {} } or nil, diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua index c16f3a4c1c..f346fe2550 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua @@ -15,7 +15,7 @@ t = m:section(TypedSection, "user", translate("Users Manager")) t.anonymous = true t.addremove = true t.template = "cbi/tblsection" -t.extedit = d.build_url("admin", "vpn", "passwall", "server_user", "%s") +t.extedit = d.build_url("admin", "services", "passwall", "server_user", "%s") function t.create(e, t) local uuid = _api.gen_uuid() t = uuid @@ -25,7 +25,7 @@ end function t.remove(e, t) e.map.proceed = true e.map:del(t) - luci.http.redirect(d.build_url("admin", "vpn", "passwall", "server")) + luci.http.redirect(d.build_url("admin", "services", "passwall", "server")) end e = t:option(Flag, "enable", translate("Enable")) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua index bda28b2bbc..27bd046fcf 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua @@ -50,7 +50,7 @@ local encrypt_methods_ss_aead = { } map = Map("passwall_server", translate("Server Config")) -map.redirect = d.build_url("admin", "vpn", "passwall", "server") +map.redirect = d.build_url("admin", "services", "passwall", "server") s = map:section(NamedSection, arg[1], "user", "") s.addremove = false diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/shunt_rules.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/shunt_rules.lua index d53c26af7c..fed88a783f 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/shunt_rules.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/shunt_rules.lua @@ -2,7 +2,7 @@ local d = require "luci.dispatcher" local appname = "passwall" m = Map(appname, "V2ray" .. translate("Shunt") .. translate("Rule")) -m.redirect = d.build_url("admin", "vpn", appname) +m.redirect = d.build_url("admin", "services", appname) s = m:section(NamedSection, arg[1], "shunt_rules", "") s.addremove = false diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/other/footer.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/footer.htm similarity index 86% rename from package/lienol/luci-app-passwall/luasrc/view/passwall/other/footer.htm rename to package/lienol/luci-app-passwall/luasrc/view/passwall/global/footer.htm index 446bf04ff1..447fe2d993 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/other/footer.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/footer.htm @@ -3,7 +3,7 @@ var _status = document.getElementsByClassName('_status'); for (var i = 0; i < _status.length; i++) { var id = _status[i].getAttribute("socks_id"); - XHR.get('<%=url([[admin]], [[vpn]], [[passwall]], [[socks_status]])%>', { + XHR.get('<%=url([[admin]], [[services]], [[passwall]], [[socks_status]])%>', { index: i, id: id }, diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/other/socks_status.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/socks_status.htm similarity index 100% rename from package/lienol/luci-app-passwall/luasrc/view/passwall/other/socks_status.htm rename to package/lienol/luci-app-passwall/luasrc/view/passwall/global/socks_status.htm diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm index 7dadda6b64..c1e00c144b 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status.htm @@ -241,7 +241,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md document.getElementsByTagName('img')[i].setAttribute("oncontextmenu","return false;"); document.getElementsByTagName('img')[i].setAttribute("ondragstart","return false;"); } - XHR.poll(5, '<%=dsp.build_url("admin/vpn/passwall/status")%>', null, + XHR.poll(5, '<%=dsp.build_url("admin/services/passwall/status")%>', null, function (x, data) { var status_dns = document.getElementById('status_dns'); var status_haproxy = document.getElementById('status_haproxy'); @@ -334,7 +334,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md div.removeAttribute('onclick'); s.innerHTML = '<%:Check...%>'; var sendDate = (new Date()).getTime(); - XHR.get('<%=dsp.build_url("admin/vpn/passwall/connect_status")%>', { + XHR.get('<%=dsp.build_url("admin/services/passwall/connect_status")%>', { type: type, url : url }, @@ -369,7 +369,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md if (s) { dom.removeAttribute('onclick'); s.innerHTML = '<%:Check...%>'; - XHR.get('<%=dsp.build_url("admin/vpn/passwall/check_port")%>', null, + XHR.get('<%=dsp.build_url("admin/services/passwall/check_port")%>', null, function(x, rv) { if (rv.ret) { s.innerHTML = rv.ret; diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm index 61f169cb19..722531d294 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/status2.htm @@ -169,7 +169,7 @@ local status_show_ip111 = api.uci_get_type("global_other", "status_show_ip111", var kcptun_status = document.getElementById('_kcptun_status'); var baidu_status = document.getElementById('_baidu_status'); var google_status = document.getElementById('_google_status'); - XHR.poll(3, '<%=dsp.build_url("admin/vpn/passwall/status")%>', null, + XHR.poll(3, '<%=dsp.build_url("admin/services/passwall/status")%>', null, function(x, json) { if (x && x.status == 200) { var tcp_node_status = document.getElementById('_tcp_node_status'); @@ -247,7 +247,7 @@ local status_show_ip111 = api.uci_get_type("global_other", "status_show_ip111", btn.disabled = true; btn.value = '<%:Check...%>'; var sendDate = (new Date()).getTime(); - XHR.get('<%=dsp.build_url("admin/vpn/passwall/connect_status")%>', { + XHR.get('<%=dsp.build_url("admin/services/passwall/connect_status")%>', { type: type, url: url }, @@ -286,7 +286,7 @@ local status_show_ip111 = api.uci_get_type("global_other", "status_show_ip111", function check_port(btn) { btn.disabled = true; btn.value = '<%:Check...%>'; - XHR.get('<%=dsp.build_url("admin/vpn/passwall/check_port")%>', null, + XHR.get('<%=dsp.build_url("admin/services/passwall/check_port")%>', null, function(x, rv) { var s = document.getElementById('_node_status'); if (s) { diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/tips.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/tips.htm index c71b0f7da4..d28b1742ab 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/global/tips.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/global/tips.htm @@ -1,12 +1,11 @@ -
- -
- <%:Tips%>:<%:You can use load balancing for failover.%> +

<%:Tips%>

+
+ <%:You can use load balancing for failover.%>
- <%:Restore the default configuration method. Input example in the address bar:%> http://192.168.1.1/cgi-bin/luci/admin/vpn/passwall/reset_config + <%:Restore the default configuration method. Input example in the address bar:%> http://192.168.1.1/cgi-bin/luci/admin/services/passwall/reset_config
- <%:Hide menu method, input example in the address bar:%> http://192.168.1.1/cgi-bin/luci/admin/vpn/passwall/hide + <%:Hide menu method, input example in the address bar:%> http://192.168.1.1/cgi-bin/luci/admin/services/passwall/hide
- <%:After the hidden to the display, input example in the address bar:%> http://192.168.1.1/cgi-bin/luci/admin/vpn/passwall/show + <%:After the hidden to the display, input example in the address bar:%> http://192.168.1.1/cgi-bin/luci/admin/services/passwall/show
diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/haproxy/status.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/haproxy/status.htm index 813749dc6e..7e36c4b22f 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/haproxy/status.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/haproxy/status.htm @@ -1,7 +1,7 @@