From b6e348e7c13776d70cfb73c52e91fc5ec676ef06 Mon Sep 17 00:00:00 2001 From: kenzok8 Date: Sun, 17 Mar 2024 20:27:35 +0800 Subject: [PATCH] update 2024-03-17 20:27:35 --- luci-app-passwall/Makefile | 2 +- .../model/cbi/passwall/client/global.lua | 69 +++++++++------- .../model/cbi/passwall/client/other.lua | 6 +- .../model/cbi/passwall/client/type/ray.lua | 74 +++++++++++------- .../cbi/passwall/client/type/sing-box.lua | 43 +++++++--- .../model/cbi/passwall/server/type/ray.lua | 9 +++ luci-app-passwall/luasrc/passwall/com.lua | 2 +- .../luasrc/passwall/util_sing-box.lua | 64 +++++++-------- .../luasrc/passwall/util_xray.lua | 78 +++++++++++-------- .../luasrc/view/passwall/global/footer.htm | 19 +++-- 10 files changed, 223 insertions(+), 143 deletions(-) diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index f70d1b5b6..3513a6bab 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall -PKG_VERSION:=4.75-9 +PKG_VERSION:=4.75-10 PKG_RELEASE:= PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index fa54e9240..c26498f33 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -16,24 +16,49 @@ for k, e in ipairs(api.get_valid_nodes()) do nodes_table[#nodes_table + 1] = e end +local normal_list = {} +local balancing_list = {} +local shunt_list = {} +local iface_list = {} +for k, v in pairs(nodes_table) do + if v.node_type == "normal" then + normal_list[#normal_list + 1] = v + end + if v.protocol and v.protocol == "_balancing" then + balancing_list[#balancing_list + 1] = v + end + if v.protocol and v.protocol == "_shunt" then + shunt_list[#shunt_list + 1] = v + end + if v.protocol and v.protocol == "_iface" then + iface_list[#iface_list + 1] = v + end +end + +local socks_list = {} + local tcp_socks_server = "127.0.0.1" .. ":" .. (uci:get(appname, "@global[0]", "tcp_node_socks_port") or "1070") local socks_table = {} socks_table[#socks_table + 1] = { id = tcp_socks_server, - remarks = tcp_socks_server .. " - " .. translate("TCP Node") + remark = tcp_socks_server .. " - " .. translate("TCP Node") } uci:foreach(appname, "socks", function(s) if s.enabled == "1" and s.node then - local id, remarks + local id, remark for k, n in pairs(nodes_table) do if (s.node == n.id) then - remarks = n["remark"]; break + remark = n["remark"]; break end end id = "127.0.0.1" .. ":" .. s.port socks_table[#socks_table + 1] = { id = id, - remarks = id .. " - " .. (remarks or translate("Misconfigured")) + remark = id .. " - " .. (remark or translate("Misconfigured")) + } + socks_list[#socks_list + 1] = { + id = "Socks_" .. s[".name"], + remark = translate("Socks Config") .. " " .. string.format("[%s %s]", s.port, translate("Port")) } end end) @@ -84,25 +109,6 @@ udp_node:value("tcp", translate("Same as the tcp node")) -- 分流 if (has_singbox or has_xray) and #nodes_table > 0 then - local normal_list = {} - local balancing_list = {} - local shunt_list = {} - local iface_list = {} - for k, v in pairs(nodes_table) do - if v.node_type == "normal" then - normal_list[#normal_list + 1] = v - end - if v.protocol and v.protocol == "_balancing" then - balancing_list[#balancing_list + 1] = v - end - if v.protocol and v.protocol == "_shunt" then - shunt_list[#shunt_list + 1] = v - end - if v.protocol and v.protocol == "_iface" then - iface_list[#iface_list + 1] = v - end - end - local function get_cfgvalue(shunt_node_id, option) return function(self, section) return m:get(shunt_node_id, option) or "nil" @@ -134,8 +140,11 @@ if (has_singbox or has_xray) and #nodes_table > 0 then o.cfgvalue = get_cfgvalue(v.id, "preproxy_enabled") o.write = get_write(v.id, "preproxy_enabled") - o = s:taboption("Main", Value, vid .. "-main_node", string.format('%s', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including Default) has a separate switch that controls whether this rule uses the pre-proxy or not.")) + o = s:taboption("Main", ListValue, vid .. "-main_node", string.format('%s', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including Default) has a separate switch that controls whether this rule uses the pre-proxy or not.")) o:depends(vid .. "-preproxy_enabled", "1") + for k1, v1 in pairs(socks_list) do + o:value(v1.id, v1.remark) + end for k1, v1 in pairs(balancing_list) do o:value(v1.id, v1.remark) end @@ -158,7 +167,7 @@ if (has_singbox or has_xray) and #nodes_table > 0 then local id = e[".name"] local node_option = vid .. "-" .. id .. "_node" if id and e.remarks then - o = s:taboption("Main", Value, node_option, string.format('* %s', api.url("shunt_rules", id), e.remarks)) + o = s:taboption("Main", ListValue, node_option, string.format('* %s', api.url("shunt_rules", id), e.remarks)) o.cfgvalue = get_cfgvalue(v.id, id) o.write = get_write(v.id, id) o:depends("tcp_node", v.id) @@ -173,6 +182,9 @@ if (has_singbox or has_xray) and #nodes_table > 0 then pt:value("nil", translate("Close")) pt:value("main", translate("Preproxy Node")) pt.default = "nil" + for k1, v1 in pairs(socks_list) do + o:value(v1.id, v1.remark) + end for k1, v1 in pairs(balancing_list) do o:value(v1.id, v1.remark) end @@ -187,12 +199,15 @@ if (has_singbox or has_xray) and #nodes_table > 0 then end) local id = "default_node" - o = s:taboption("Main", Value, vid .. "-" .. id, string.format('* %s', translate("Default"))) + o = s:taboption("Main", ListValue, vid .. "-" .. id, string.format('* %s', translate("Default"))) o.cfgvalue = get_cfgvalue(v.id, id) o.write = get_write(v.id, id) o:depends("tcp_node", v.id) o:value("_direct", translate("Direct Connection")) o:value("_blackhole", translate("Blackhole")) + for k1, v1 in pairs(socks_list) do + o:value(v1.id, v1.remark) + end for k1, v1 in pairs(balancing_list) do o:value(v1.id, v1.remark) end @@ -294,7 +309,7 @@ o.write = function(self, section, value) end o = s:taboption("DNS", Value, "socks_server", translate("Socks Server"), translate("Make sure socks service is available on this address.")) -for k, v in pairs(socks_table) do o:value(v.id, v.remarks) end +for k, v in pairs(socks_table) do o:value(v.id, v.remark) end o.default = socks_table[1].id o.validate = function(self, value, t) if not datatypes.ipaddrport(value) then diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua index f1bdf5dcc..2e2800c9b 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua @@ -161,12 +161,14 @@ if has_xray then o = s_xray:option(ListValue, "fragment_packets", translate("Fragment Packets"), translate("\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \"tlshello\" is for TLS client hello packet fragmentation.")) o.default = "tlshello" - o:value("1-3", "1-3") o:value("tlshello", "tlshello") + o:value("1-2", "1-2") + o:value("1-3", "1-3") + o:value("1-5", "1-5") o:depends("fragment", true) o = s_xray:option(Value, "fragment_length", translate("Fragment Length"), translate("Fragmented packet length (byte)")) - o.default = "10-20" + o.default = "100-200" o:depends("fragment", true) o = s_xray:option(Value, "fragment_interval", translate("Fragment Interval"), translate("Fragmentation interval (ms)")) diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index 3276a32e3..cb18e7683 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -54,28 +54,38 @@ for k, e in ipairs(api.get_valid_nodes()) do if e.node_type == "normal" then nodes_table[#nodes_table + 1] = { id = e[".name"], - remarks = e["remark"], + remark = e["remark"], type = e["type"] } end if e.protocol == "_balancing" then balancers_table[#balancers_table + 1] = { id = e[".name"], - remarks = e["remark"] + remark = e["remark"] } end if e.protocol == "_iface" then iface_table[#iface_table + 1] = { id = e[".name"], - remarks = e["remark"] + remark = e["remark"] } end end +local socks_list = {} +uci:foreach(appname, "socks", function(s) + if s.enabled == "1" and s.node then + socks_list[#socks_list + 1] = { + id = "Socks_" .. s[".name"], + remark = translate("Socks Config") .. " " .. string.format("[%s %s]", s.port, translate("Port")) + } + end +end) + -- 负载均衡列表 local o = s:option(DynamicList, option_name("balancing_node"), translate("Load balancing node list"), translate("Load balancing node list, document")) o:depends({ [option_name("protocol")] = "_balancing" }) -for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end +for k, v in pairs(nodes_table) do o:value(v.id, v.remark) end local o = s:option(ListValue, option_name("balancingStrategy"), translate("Balancing Strategy")) o:depends({ [option_name("protocol")] = "_balancing" }) @@ -106,22 +116,25 @@ if #nodes_table > 0 then o = s:option(Flag, option_name("preproxy_enabled"), translate("Preproxy")) o:depends({ [option_name("protocol")] = "_shunt" }) - o = s:option(Value, option_name("main_node"), string.format('%s', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including Default) has a separate switch that controls whether this rule uses the pre-proxy or not.")) + o = s:option(ListValue, option_name("main_node"), string.format('%s', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including Default) has a separate switch that controls whether this rule uses the pre-proxy or not.")) o:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true }) + for k, v in pairs(socks_list) do + o:value(v.id, v.remark) + end for k, v in pairs(balancers_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end for k, v in pairs(iface_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end for k, v in pairs(nodes_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end o.default = "nil" end uci:foreach(appname, "shunt_rules", function(e) if e[".name"] and e.remarks then - o = s:option(Value, option_name(e[".name"]), string.format('* %s', api.url("shunt_rules", e[".name"]), e.remarks)) + o = s:option(ListValue, option_name(e[".name"]), string.format('* %s', api.url("shunt_rules", e[".name"]), e.remarks)) o:value("nil", translate("Close")) o:value("_default", translate("Default")) o:value("_direct", translate("Direct Connection")) @@ -129,18 +142,21 @@ uci:foreach(appname, "shunt_rules", function(e) o:depends({ [option_name("protocol")] = "_shunt" }) if #nodes_table > 0 then + for k, v in pairs(socks_list) do + o:value(v.id, v.remark) + end for k, v in pairs(balancers_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end for k, v in pairs(iface_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end local pt = s:option(ListValue, option_name(e[".name"] .. "_proxy_tag"), string.format('* %s', e.remarks .. " " .. translate("Preproxy"))) pt:value("nil", translate("Close")) pt:value("main", translate("Preproxy Node")) pt.default = "nil" for k, v in pairs(nodes_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) pt:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true, [option_name(e[".name"])] = v.id }) end end @@ -155,24 +171,27 @@ o.cfgvalue = function(t, n) end o:depends({ [option_name("protocol")] = "_shunt" }) -local o = s:option(Value, option_name("default_node"), string.format('* %s', translate("Default"))) +local o = s:option(ListValue, option_name("default_node"), string.format('* %s', translate("Default"))) o:depends({ [option_name("protocol")] = "_shunt" }) o:value("_direct", translate("Direct Connection")) o:value("_blackhole", translate("Blackhole")) if #nodes_table > 0 then + for k, v in pairs(socks_list) do + o:value(v.id, v.remark) + end for k, v in pairs(balancers_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end for k, v in pairs(iface_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end local dpt = s:option(ListValue, option_name("default_proxy_tag"), string.format('* %s', translate("Default Preproxy")), translate("When using, localhost will connect this node first and then use this node to connect the default node.")) dpt:value("nil", translate("Close")) dpt:value("main", translate("Preproxy Node")) dpt.default = "nil" for k, v in pairs(nodes_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) dpt:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true, [option_name("default_node")] = v.id }) end end @@ -328,20 +347,13 @@ o:value("h2", "HTTP/2") o:value("ds", "DomainSocket") o:value("quic", "QUIC") o:value("grpc", "gRPC") +o:value("httpupgrade", "HttpUpgrade") o:depends({ [option_name("protocol")] = "vmess" }) o:depends({ [option_name("protocol")] = "vless" }) o:depends({ [option_name("protocol")] = "socks" }) o:depends({ [option_name("protocol")] = "shadowsocks" }) o:depends({ [option_name("protocol")] = "trojan" }) ---[[ -o = s:option(ListValue, option_name("ss_transport"), translate("Transport")) -o:value("ws", "WebSocket") -o:value("h2", "HTTP/2") -o:value("h2+ws", "HTTP/2 & WebSocket") -o:depends({ [option_name("protocol")] = "shadowsocks" }) -]]-- - o = s:option(Value, option_name("wireguard_public_key"), translate("Public Key")) o:depends({ [option_name("protocol")] = "wireguard" }) @@ -423,22 +435,18 @@ o:depends({ [option_name("transport")] = "mkcp" }) -- [[ WebSocket部分 ]]-- o = s:option(Value, option_name("ws_host"), translate("WebSocket Host")) o:depends({ [option_name("transport")] = "ws" }) -o:depends({ [option_name("ss_transport")] = "ws" }) o = s:option(Value, option_name("ws_path"), translate("WebSocket Path")) o.placeholder = "/" o:depends({ [option_name("transport")] = "ws" }) -o:depends({ [option_name("ss_transport")] = "ws" }) -- [[ HTTP/2部分 ]]-- o = s:option(Value, option_name("h2_host"), translate("HTTP/2 Host")) o:depends({ [option_name("transport")] = "h2" }) -o:depends({ [option_name("ss_transport")] = "h2" }) o = s:option(Value, option_name("h2_path"), translate("HTTP/2 Path")) o.placeholder = "/" o:depends({ [option_name("transport")] = "h2" }) -o:depends({ [option_name("ss_transport")] = "h2" }) o = s:option(Flag, option_name("h2_health_check"), translate("Health check")) o:depends({ [option_name("transport")] = "h2" }) @@ -497,6 +505,14 @@ o = s:option(Value, option_name("grpc_initial_windows_size"), translate("Initial o.default = "0" o:depends({ [option_name("transport")] = "grpc" }) +-- [[ HttpUpgrade部分 ]]-- +o = s:option(Value, option_name("httpupgrade_host"), translate("HttpUpgrade Host")) +o:depends({ [option_name("transport")] = "httpupgrade" }) + +o = s:option(Value, option_name("httpupgrade_path"), translate("HttpUpgrade Path")) +o.placeholder = "/" +o:depends({ [option_name("transport")] = "httpupgrade" }) + -- [[ Mux ]]-- o = s:option(Flag, option_name("mux"), translate("Mux")) o:depends({ [option_name("protocol")] = "vmess" }) @@ -531,7 +547,7 @@ o.default = "" o:value("", translate("Close(Not use)")) for k, v in pairs(nodes_table) do if v.type == "Xray" then - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end end diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index cda6600a9..d8a7c0e79 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -70,36 +70,49 @@ for k, e in ipairs(api.get_valid_nodes()) do if e.node_type == "normal" then nodes_table[#nodes_table + 1] = { id = e[".name"], - remarks = e["remark"], + remark = e["remark"], type = e["type"] } end if e.protocol == "_iface" then iface_table[#iface_table + 1] = { id = e[".name"], - remarks = e["remark"] + remark = e["remark"] } end end +local socks_list = {} +uci:foreach(appname, "socks", function(s) + if s.enabled == "1" and s.node then + socks_list[#socks_list + 1] = { + id = "Socks_" .. s[".name"], + remark = translate("Socks Config") .. " " .. string.format("[%s %s]", s.port, translate("Port")) + } + end +end) + -- [[ 分流模块 ]] if #nodes_table > 0 then o = s:option(Flag, option_name("preproxy_enabled"), translate("Preproxy")) o:depends({ [option_name("protocol")] = "_shunt" }) - o = s:option(Value, option_name("main_node"), string.format('%s', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including Default) has a separate switch that controls whether this rule uses the pre-proxy or not.")) + o = s:option(ListValue, option_name("main_node"), string.format('%s', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including Default) has a separate switch that controls whether this rule uses the pre-proxy or not.")) o:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true }) + for k, v in pairs(socks_list) do + o:value(v.id, v.remark) + end for k, v in pairs(iface_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end for k, v in pairs(nodes_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end o.default = "nil" end uci:foreach(appname, "shunt_rules", function(e) if e[".name"] and e.remarks then - o = s:option(Value, option_name(e[".name"]), string.format('* %s', api.url("shunt_rules", e[".name"]), e.remarks)) + o = s:option(ListValue, option_name(e[".name"]), string.format('* %s', api.url("shunt_rules", e[".name"]), e.remarks)) o:value("nil", translate("Close")) o:value("_default", translate("Default")) o:value("_direct", translate("Direct Connection")) @@ -107,15 +120,18 @@ uci:foreach(appname, "shunt_rules", function(e) o:depends({ [option_name("protocol")] = "_shunt" }) if #nodes_table > 0 then + for k, v in pairs(socks_list) do + o:value(v.id, v.remark) + end for k, v in pairs(iface_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end local pt = s:option(ListValue, option_name(e[".name"] .. "_proxy_tag"), string.format('* %s', e.remarks .. " " .. translate("Preproxy"))) pt:value("nil", translate("Close")) pt:value("main", translate("Preproxy Node")) pt.default = "nil" for k, v in pairs(nodes_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) pt:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true, [option_name(e[".name"])] = v.id }) end end @@ -130,21 +146,24 @@ o.cfgvalue = function(t, n) end o:depends({ [option_name("protocol")] = "_shunt" }) -local o = s:option(Value, option_name("default_node"), string.format('* %s', translate("Default"))) +local o = s:option(ListValue, option_name("default_node"), string.format('* %s', translate("Default"))) o:depends({ [option_name("protocol")] = "_shunt" }) o:value("_direct", translate("Direct Connection")) o:value("_blackhole", translate("Blackhole")) if #nodes_table > 0 then + for k, v in pairs(socks_list) do + o:value(v.id, v.remark) + end for k, v in pairs(iface_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end local dpt = s:option(ListValue, option_name("default_proxy_tag"), string.format('* %s', translate("Default Preproxy")), translate("When using, localhost will connect this node first and then use this node to connect the default node.")) dpt:value("nil", translate("Close")) dpt:value("main", translate("Preproxy Node")) dpt.default = "nil" for k, v in pairs(nodes_table) do - o:value(v.id, v.remarks) + o:value(v.id, v.remark) dpt:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true, [option_name("default_node")] = v.id }) end end @@ -627,7 +646,7 @@ o.default = "" o:value("", translate("Close(Not use)")) for k, v in pairs(nodes_table) do if v.type == "sing-box" then - o:value(v.id, v.remarks) + o:value(v.id, v.remark) end end for i, v in ipairs(s.fields[option_name("protocol")].keylist) do diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/ray.lua b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/ray.lua index 7d41fb73f..0a853dfd8 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/ray.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/ray.lua @@ -202,6 +202,7 @@ o:value("h2", "HTTP/2") o:value("ds", "DomainSocket") o:value("quic", "QUIC") o:value("grpc", "gRPC") +o:value("httpupgrade", "HttpUpgrade") o:depends({ [option_name("protocol")] = "vmess" }) o:depends({ [option_name("protocol")] = "vless" }) o:depends({ [option_name("protocol")] = "socks" }) @@ -216,6 +217,14 @@ o:depends({ [option_name("transport")] = "ws" }) o = s:option(Value, option_name("ws_path"), translate("WebSocket Path")) o:depends({ [option_name("transport")] = "ws" }) +-- [[ HttpUpgrade部分 ]]-- +o = s:option(Value, option_name("httpupgrade_host"), translate("HttpUpgrade Host")) +o:depends({ [option_name("transport")] = "httpupgrade" }) + +o = s:option(Value, option_name("httpupgrade_path"), translate("HttpUpgrade Path")) +o.placeholder = "/" +o:depends({ [option_name("transport")] = "httpupgrade" }) + -- [[ HTTP/2部分 ]]-- o = s:option(Value, option_name("h2_host"), translate("HTTP/2 Host")) diff --git a/luci-app-passwall/luasrc/passwall/com.lua b/luci-app-passwall/luasrc/passwall/com.lua index b53a1dd78..d19b4acfe 100644 --- a/luci-app-passwall/luasrc/passwall/com.lua +++ b/luci-app-passwall/luasrc/passwall/com.lua @@ -26,7 +26,7 @@ _M.hysteria = { _M.singbox = { name = "Sing-Box", repo = "SagerNet/sing-box", - get_url = gh_pre_release_url, + get_url = gh_release_url, cmd_version = "version | awk '{print $3}' | sed -n 1P", zipped = true, zipped_suffix = "tar.gz", diff --git a/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/luci-app-passwall/luasrc/passwall/util_sing-box.lua index c5d165dd6..07969e92e 100644 --- a/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -930,22 +930,23 @@ function gen_config(var) local preproxy_node_id = node["main_node"] local preproxy_node = preproxy_enabled and preproxy_node_id and uci:get_all(appname, preproxy_node_id) or nil - if not preproxy_node and preproxy_node_id and api.parseURL(preproxy_node_id) then - local parsed1 = api.parseURL(preproxy_node_id) - local _node = { - type = "sing-box", - protocol = parsed1.protocol, - username = parsed1.username, - password = parsed1.password, - address = parsed1.host, - port = parsed1.port, - uot = "1", - } - local preproxy_outbound = gen_outbound(flag, _node, preproxy_tag) - if preproxy_outbound then - table.insert(outbounds, preproxy_outbound) - else - preproxy_enabled = false + if preproxy_node_id and preproxy_node_id:find("Socks_") then + local socks_id = preproxy_node_id:sub(1 + #"Socks_") + local socks_node = uci:get_all(appname, socks_id) or nil + if socks_node then + local _node = { + type = "sing-box", + protocol = "socks", + address = "127.0.0.1", + port = socks_node.port, + uot = "1", + } + local preproxy_outbound = gen_outbound(flag, _node, preproxy_tag) + if preproxy_outbound then + table.insert(outbounds, preproxy_outbound) + else + preproxy_enabled = false + end end elseif preproxy_node and api.is_normal_node(preproxy_node) then local preproxy_outbound = gen_outbound(flag, preproxy_node, preproxy_tag) @@ -967,21 +968,22 @@ function gen_config(var) rule_outboundTag = "block" elseif _node_id == "_default" and rule_name ~= "default" then rule_outboundTag = "default" - elseif api.parseURL(_node_id) then - local parsed1 = api.parseURL(_node_id) - local _node = { - type = "sing-box", - protocol = parsed1.protocol, - username = parsed1.username, - password = parsed1.password, - address = parsed1.host, - port = parsed1.port, - uot = "1", - } - local _outbound = gen_outbound(flag, _node, rule_name) - if _outbound then - table.insert(outbounds, _outbound) - rule_outboundTag = rule_name + elseif _node_id:find("Socks_") then + local socks_id = _node_id:sub(1 + #"Socks_") + local socks_node = uci:get_all(appname, socks_id) or nil + if socks_node then + local _node = { + type = "sing-box", + protocol = "socks", + address = "127.0.0.1", + port = socks_node.port, + uot = "1", + } + local _outbound = gen_outbound(flag, _node, rule_name) + if _outbound then + table.insert(outbounds, _outbound) + rule_outboundTag = rule_name + end end elseif _node_id ~= "nil" then local _node = uci:get_all(appname, _node_id) diff --git a/luci-app-passwall/luasrc/passwall/util_xray.lua b/luci-app-passwall/luasrc/passwall/util_xray.lua index 7b18c5605..d7c5b2a77 100644 --- a/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -200,7 +200,11 @@ function gen_outbound(flag, node, tag, proxy_table) health_check_timeout = tonumber(node.grpc_health_check_timeout) or nil, permit_without_stream = (node.grpc_permit_without_stream == "1") and true or nil, initial_windows_size = tonumber(node.grpc_initial_windows_size) or nil - } or nil + } or nil, + httpupgradeSettings = (node.transport == "httpupgrade") and { + path = node.httpupgrade_path or "/", + host = node.httpupgrade_host + } or nil, } or nil, settings = { vnext = (node.protocol == "vmess" or node.protocol == "vless") and { @@ -473,6 +477,10 @@ function gen_config_server(node) grpcSettings = (node.transport == "grpc") and { serviceName = node.grpc_serviceName } or nil, + httpupgradeSettings = (node.transport == "httpupgrade") and { + path = node.httpupgrade_path or "/", + host = node.httpupgrade_host + } or nil, sockopt = { acceptProxyProtocol = (node.acceptProxyProtocol and node.acceptProxyProtocol == "1") and true or false } @@ -734,23 +742,24 @@ function gen_config(var) local preproxy_node = preproxy_enabled and preproxy_node_id and uci:get_all(appname, preproxy_node_id) or nil local preproxy_is_balancer - if not preproxy_node and preproxy_node_id and api.parseURL(preproxy_node_id) then - local parsed1 = api.parseURL(preproxy_node_id) - local _node = { - type = "Xray", - protocol = parsed1.protocol, - username = parsed1.username, - password = parsed1.password, - address = parsed1.host, - port = parsed1.port, - transport = "tcp", - stream_security = "none" - } - local preproxy_outbound = gen_outbound(flag, _node, preproxy_tag) - if preproxy_outbound then - table.insert(outbounds, preproxy_outbound) - else - preproxy_enabled = false + if preproxy_node_id and preproxy_node_id:find("Socks_") then + local socks_id = preproxy_node_id:sub(1 + #"Socks_") + local socks_node = uci:get_all(appname, socks_id) or nil + if socks_node then + local _node = { + type = "Xray", + protocol = "socks", + address = "127.0.0.1", + port = socks_node.port, + transport = "tcp", + stream_security = "none" + } + local preproxy_outbound = gen_outbound(flag, _node, preproxy_tag) + if preproxy_outbound then + table.insert(outbounds, preproxy_outbound) + else + preproxy_enabled = false + end end elseif preproxy_node and api.is_normal_node(preproxy_node) then local preproxy_outbound = gen_outbound(flag, preproxy_node, preproxy_tag, { fragment = xray_settings.fragment == "1" or nil }) @@ -782,22 +791,23 @@ function gen_config(var) rule_outboundTag = "blackhole" elseif _node_id == "_default" and rule_name ~= "default" then rule_outboundTag = "default" - elseif api.parseURL(_node_id) then - local parsed1 = api.parseURL(_node_id) - local _node = { - type = "Xray", - protocol = parsed1.protocol, - username = parsed1.username, - password = parsed1.password, - address = parsed1.host, - port = parsed1.port, - transport = "tcp", - stream_security = "none" - } - local _outbound = gen_outbound(flag, _node, rule_name) - if _outbound then - table.insert(outbounds, _outbound) - rule_outboundTag = rule_name + elseif _node_id:find("Socks_") then + local socks_id = _node_id:sub(1 + #"Socks_") + local socks_node = uci:get_all(appname, socks_id) or nil + if socks_node then + local _node = { + type = "Xray", + protocol = "socks", + address = "127.0.0.1", + port = socks_node.port, + transport = "tcp", + stream_security = "none" + } + local _outbound = gen_outbound(flag, _node, rule_name) + if _outbound then + table.insert(outbounds, _outbound) + rule_outboundTag = rule_name + end end elseif _node_id ~= "nil" then local _node = uci:get_all(appname, _node_id) diff --git a/luci-app-passwall/luasrc/view/passwall/global/footer.htm b/luci-app-passwall/luasrc/view/passwall/global/footer.htm index 657ea4d65..59afbb364 100644 --- a/luci-app-passwall/luasrc/view/passwall/global/footer.htm +++ b/luci-app-passwall/luasrc/view/passwall/global/footer.htm @@ -53,7 +53,7 @@ local api = require "luci.passwall.api" var dom_id = dom.id.split(cbi_id).join(cbi_id.split("-").join(".")).split("cbi.").join("cbid.") var node_select = document.getElementsByName(dom_id)[0]; var node_select_value = node_select.value; - if (node_select_value && node_select_value != "nil" && node_select_value.indexOf("socks://") != 0 && node_select_value.indexOf("_default") != 0 && node_select_value.indexOf("_direct") != 0 && node_select_value.indexOf("_blackhole") != 0) { + if (node_select_value && node_select_value != "nil" && node_select_value.indexOf("_default") != 0 && node_select_value.indexOf("_direct") != 0 && node_select_value.indexOf("_blackhole") != 0) { if (global_id != null && node_select_value.indexOf("tcp") == 0) { var d = global_id + "-tcp_node"; d = d.replace("cbi-", "cbid-").replace(new RegExp("-", 'g'), "."); @@ -68,11 +68,18 @@ local api = require "luci.passwall.api" node_select = document.getElementById("cbi.combobox." + dom_id); } - var new_a = document.createElement("a"); - new_a.innerHTML = "<%:Edit%>"; - new_a.href = "#"; - new_a.setAttribute("onclick", "location.href='" + '<%=api.url("node_config")%>' + "/" + node_select_value + "'"); - var new_html = new_a.outerHTML; + var new_html = "" + if (true) { + var to_url = '<%=api.url("node_config")%>/' + node_select_value; + if (node_select_value.indexOf("Socks_") == 0) { + to_url = '<%=api.url("socks_config")%>/' + node_select_value.substring("Socks_".length); + } + var new_a = document.createElement("a"); + new_a.innerHTML = "<%:Edit%>"; + new_a.href = "#"; + new_a.setAttribute("onclick", "location.href='" + to_url + "'"); + new_html = new_a.outerHTML; + } if (s[0] == "tcp" || s[0] == "udp") { var log_a = document.createElement("a");