diff --git a/luci-app-passwall2/Makefile b/luci-app-passwall2/Makefile
index ee7af1f0b..5172ce6bd 100644
--- a/luci-app-passwall2/Makefile
+++ b/luci-app-passwall2/Makefile
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2
-PKG_VERSION:=24.11.18
-PKG_RELEASE:=2
+PKG_VERSION:=24.11.19
+PKG_RELEASE:=1
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
diff --git a/luci-app-passwall2/luasrc/controller/passwall2.lua b/luci-app-passwall2/luasrc/controller/passwall2.lua
index 0f4b00371..5521ece0f 100644
--- a/luci-app-passwall2/luasrc/controller/passwall2.lua
+++ b/luci-app-passwall2/luasrc/controller/passwall2.lua
@@ -76,6 +76,7 @@ function index()
entry({"admin", "services", appname, "update_rules"}, call("update_rules")).leaf = true
--[[Components update]]
+ entry({"admin", "services", appname, "check_passwall2"}, call("app_check")).leaf = true
local coms = require "luci.passwall2.com"
local com
for com, _ in pairs(coms) do
@@ -403,6 +404,11 @@ function server_clear_log()
luci.sys.call("echo '' > /tmp/log/passwall2_server.log")
end
+function app_check()
+ local json = api.to_check_self()
+ http_write_json(json)
+end
+
function com_check(comname)
local json = api.to_check("", comname)
http_write_json(json)
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe.lua
index 222ff7d13..e561c2cea 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe.lua
@@ -100,6 +100,14 @@ if #hysteria2_type > 0 then
end
end
+o = s:option(ListValue, "domain_strategy", "Sing-box " .. translate("Domain Strategy"), translate("Set the default domain resolution strategy for the sing-box node."))
+o.default = ""
+o:value("", translate("Auto"))
+o:value("prefer_ipv4", translate("Prefer IPv4"))
+o:value("prefer_ipv6", translate("Prefer IPv6"))
+o:value("ipv4_only", translate("IPv4 Only"))
+o:value("ipv6_only", translate("IPv6 Only"))
+
---- Subscribe Delete All
o = s:option(Button, "_stop", translate("Delete All Subscribe Node"))
o.inputstyle = "remove"
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua
index 9f88ff268..cd13e9aaa 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua
@@ -121,6 +121,15 @@ if #hysteria2_type > 0 then
end
end
+o = s:option(ListValue, "domain_strategy", "Sing-box " .. translate("Domain Strategy"), translate("Set the default domain resolution strategy for the sing-box node."))
+o.default = "global"
+o:value("global", translate("Use global config"))
+o:value("", translate("Auto"))
+o:value("prefer_ipv4", translate("Prefer IPv4"))
+o:value("prefer_ipv6", translate("Prefer IPv6"))
+o:value("ipv4_only", translate("IPv4 Only"))
+o:value("ipv6_only", translate("IPv6 Only"))
+
---- Enable auto update subscribe
o = s:option(Flag, "auto_update", translate("Enable auto update subscribe"))
o.default = 0
@@ -163,11 +172,11 @@ o:depends("week_update", "8")
o.rmempty = true
o = s:option(Value, "user_agent", translate("User-Agent"))
-o.default = "sing-box/9.9.9"
-o:value("curl", "Curl Default")
+o.default = "v2rayN/9.99"
+o:value("curl", "Curl")
o:value("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0", "Edge for Linux")
o:value("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0", "Edge for Windows")
o:value("Passwall2/OpenWrt", "PassWall2")
-o:value("sing-box/9.9.9", "Xboard(V2board)")
+o:value("v2rayN/9.99", "V2rayN")
return m
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
index 63ab75fce..9aec55d44 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
@@ -321,7 +321,7 @@ o = s:option(ListValue, option_name("flow"), translate("flow"))
o.default = ""
o:value("", translate("Disable"))
o:value("xtls-rprx-vision")
-o:depends({ [option_name("protocol")] = "vless" })
+o:depends({ [option_name("protocol")] = "vless", [option_name("tls")] = true, [option_name("transport")] = "raw" })
o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
index c7e27de05..ce424b751 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
@@ -666,11 +666,23 @@ o = s:option(Value, option_name("plugin_opts"), translate("opts"))
o:depends({ [option_name("plugin_enabled")] = true })
o = s:option(ListValue, option_name("domain_strategy"), translate("Domain Strategy"), translate("If is domain name, The requested domain name will be resolved to IP before connect."))
-o.default = "prefer_ipv6"
-o:value("prefer_ipv4")
-o:value("prefer_ipv6")
-o:value("ipv4_only")
-o:value("ipv6_only")
+o.default = ""
+o:value("", translate("Auto"))
+o:value("prefer_ipv4", translate("Prefer IPv4"))
+o:value("prefer_ipv6", translate("Prefer IPv6"))
+o:value("ipv4_only", translate("IPv4 Only"))
+o:value("ipv6_only", translate("IPv6 Only"))
+o:depends({ [option_name("protocol")] = "socks" })
+o:depends({ [option_name("protocol")] = "http" })
+o:depends({ [option_name("protocol")] = "shadowsocks" })
+o:depends({ [option_name("protocol")] = "shadowsocksr" })
+o:depends({ [option_name("protocol")] = "vmess" })
+o:depends({ [option_name("protocol")] = "trojan" })
+o:depends({ [option_name("protocol")] = "wireguard" })
+o:depends({ [option_name("protocol")] = "hysteria" })
+o:depends({ [option_name("protocol")] = "vless" })
+o:depends({ [option_name("protocol")] = "tuic" })
+o:depends({ [option_name("protocol")] = "hysteria2" })
o = s:option(ListValue, option_name("to_node"), translate("Landing node"), translate("Only support a layer of proxy."))
o.default = ""
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua
index bf11e18ec..fe75553d5 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua
@@ -109,7 +109,7 @@ o = s:option(ListValue, option_name("flow"), translate("flow"))
o.default = ""
o:value("", translate("Disable"))
o:value("xtls-rprx-vision")
-o:depends({ [option_name("protocol")] = "vless" })
+o:depends({ [option_name("protocol")] = "vless", [option_name("tls")] = true, [option_name("transport")] = "raw" })
o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0
@@ -197,7 +197,7 @@ o.validate = function(self, value, t)
end
o = s:option(ListValue, option_name("transport"), translate("Transport"))
-o:value("tcp", "TCP")
+o:value("raw", "RAW")
o:value("mkcp", "mKCP")
o:value("ws", "WebSocket")
o:value("h2", "HTTP/2")
@@ -205,7 +205,7 @@ o:value("ds", "DomainSocket")
o:value("quic", "QUIC")
o:value("grpc", "gRPC")
o:value("httpupgrade", "HttpUpgrade")
-o:value("splithttp", "SplitHTTP")
+o:value("xhttp", "XHTTP")
o:depends({ [option_name("protocol")] = "vmess" })
o:depends({ [option_name("protocol")] = "vless" })
o:depends({ [option_name("protocol")] = "socks" })
@@ -235,12 +235,20 @@ o = s:option(Value, option_name("h2_path"), translate("HTTP/2 Path"))
o:depends({ [option_name("transport")] = "h2" })
-- [[ SplitHTTP部分 ]]--
-o = s:option(Value, option_name("splithttp_host"), translate("SplitHTTP Host"))
-o:depends({ [option_name("transport")] = "splithttp" })
+o = s:option(Value, option_name("xhttp_host"), translate("XHTTP Host"))
+o:depends({ [option_name("transport")] = "xhttp" })
-o = s:option(Value, option_name("splithttp_path"), translate("SplitHTTP Path"))
+o = s:option(Value, option_name("xhttp_path"), translate("XHTTP Path"))
o.placeholder = "/"
-o:depends({ [option_name("transport")] = "splithttp" })
+o:depends({ [option_name("transport")] = "xhttp" })
+
+o = s:option(Value, option_name("xhttp_maxuploadsize"), translate("maxUploadSize"))
+o.default = "1000000"
+o:depends({ [option_name("transport")] = "xhttp" })
+
+o = s:option(Value, option_name("xhttp_maxconcurrentuploads"), translate("maxConcurrentUploads"))
+o.default = "10"
+o:depends({ [option_name("transport")] = "xhttp" })
o = s:option(Value, option_name("splithttp_maxuploadsize"), translate("maxUploadSize"))
o.default = "1000000"
@@ -256,7 +264,7 @@ o:depends({ [option_name("transport")] = "splithttp" })
o = s:option(ListValue, option_name("tcp_guise"), translate("Camouflage Type"))
o:value("none", "none")
o:value("http", "http")
-o:depends({ [option_name("transport")] = "tcp" })
+o:depends({ [option_name("transport")] = "raw" })
-- HTTP域名
o = s:option(DynamicList, option_name("tcp_guise_http_host"), translate("HTTP Host"))
@@ -328,8 +336,8 @@ o.default = "0"
-- [[ Fallback部分 ]]--
o = s:option(Flag, option_name("fallback"), translate("Fallback"))
-o:depends({ [option_name("protocol")] = "vless", [option_name("transport")] = "tcp" })
-o:depends({ [option_name("protocol")] = "trojan", [option_name("transport")] = "tcp" })
+o:depends({ [option_name("protocol")] = "vless", [option_name("transport")] = "raw" })
+o:depends({ [option_name("protocol")] = "trojan", [option_name("transport")] = "raw" })
--[[
o = s:option(Value, option_name("fallback_alpn"), "Fallback alpn")
diff --git a/luci-app-passwall2/luasrc/passwall2/api.lua b/luci-app-passwall2/luasrc/passwall2/api.lua
index bd969d484..16fa181f2 100644
--- a/luci-app-passwall2/luasrc/passwall2/api.lua
+++ b/luci-app-passwall2/luasrc/passwall2/api.lua
@@ -964,6 +964,47 @@ function to_move(app_name,file)
return {code = 0}
end
+function get_version()
+ local version = sys.exec("opkg list-installed luci-app-passwall2 2>/dev/null | awk '{print $3}'")
+ if not version or #version == 0 then
+ version = sys.exec("apk info luci-app-passwall2 2>/dev/null | awk 'NR == 1 {print $1}' | cut -d'-' -f4-")
+ end
+ return version or ""
+end
+
+function to_check_self()
+ local url = "https://raw.githubusercontent.com/xiaorouji/openwrt-passwall2/main/luci-app-passwall2/Makefile"
+ local tmp_file = "/tmp/passwall2_makefile"
+ local return_code, result = curl_logic(url, tmp_file, curl_args)
+ result = return_code == 0
+ if not result then
+ exec("/bin/rm", {"-f", tmp_file})
+ return {
+ code = 1,
+ error = i18n.translatef("Failed")
+ }
+ end
+ local local_version = get_version()
+ local remote_version = sys.exec("echo -n $(grep 'PKG_VERSION' /tmp/passwall2_makefile|awk -F '=' '{print $2}')")
+ .. "-" .. sys.exec("echo -n $(grep 'PKG_RELEASE' /tmp/passwall2_makefile|awk -F '=' '{print $2}')")
+
+ local has_update = compare_versions(local_version, "<", remote_version)
+ if not has_update then
+ return {
+ code = 0,
+ local_version = local_version,
+ remote_version = remote_version
+ }
+ end
+ return {
+ code = 1,
+ has_update = true,
+ local_version = local_version,
+ remote_version = remote_version,
+ error = i18n.translatef("The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.", remote_version)
+ }
+end
+
function cacheFileCompareToLogic(file, str)
local result = nil
if file and str then
diff --git a/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/luci-app-passwall2/luasrc/passwall2/util_xray.lua
index 121d4d96a..ad61cefda 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_xray.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_xray.lua
@@ -264,7 +264,7 @@ function gen_outbound(flag, node, tag, proxy_table)
level = 0,
security = (node.protocol == "vmess") and node.security or nil,
encryption = node.encryption or "none",
- flow = (node.protocol == "vless" and node.tls == '1' and node.flow) and node.flow or nil
+ flow = (node.protocol == "vless" and node.tls == "1" and node.transport == "raw" and node.flow and node.flow ~= "") and node.flow or nil
}
}
}
@@ -367,7 +367,7 @@ function gen_config_server(node)
for i = 1, #node.uuid do
clients[i] = {
id = node.uuid[i],
- flow = ("vless" == node.protocol and "1" == node.tls and node.flow) and node.flow or nil
+ flow = ("vless" == node.protocol and "1" == node.tls and "raw" == node.transport and node.flow and node.flow ~= "") and node.flow or nil
}
end
settings = {
@@ -561,11 +561,11 @@ function gen_config_server(node)
path = node.httpupgrade_path or "/",
host = node.httpupgrade_host
} or nil,
- splithttpSettings = (node.transport == "splithttp") and {
- path = node.splithttp_path or "/",
- host = node.splithttp_host,
- maxUploadSize = node.splithttp_maxuploadsize,
- maxConcurrentUploads = node.splithttp_maxconcurrentuploads
+ xhttpSettings = (node.transport == "xhttp") and {
+ path = node.xhttp_path or "/",
+ host = node.xhttp_host,
+ maxUploadSize = node.xhttp_maxuploadsize,
+ maxConcurrentUploads = node.xhttp_maxconcurrentuploads
} or nil,
sockopt = {
acceptProxyProtocol = (node.acceptProxyProtocol and node.acceptProxyProtocol == "1") and true or false
diff --git a/luci-app-passwall2/luasrc/view/passwall2/app_update/app_version.htm b/luci-app-passwall2/luasrc/view/passwall2/app_update/app_version.htm
index 107c87222..98e58061c 100644
--- a/luci-app-passwall2/luasrc/view/passwall2/app_update/app_version.htm
+++ b/luci-app-passwall2/luasrc/view/passwall2/app_update/app_version.htm
@@ -177,6 +177,18 @@ local version = {}
//]]>
+
+
+
+
+ 【 <%=api.get_version()%> 】
+
+
+
+
+
+
<%for k, v in pairs(com) do
version[k] = api.get_app_version(k)%>
diff --git a/luci-app-passwall2/luasrc/view/passwall2/node_list/link_share_man.htm b/luci-app-passwall2/luasrc/view/passwall2/node_list/link_share_man.htm
index 5071216db..03e6cca6c 100644
--- a/luci-app-passwall2/luasrc/view/passwall2/node_list/link_share_man.htm
+++ b/luci-app-passwall2/luasrc/view/passwall2/node_list/link_share_man.htm
@@ -210,7 +210,7 @@ local api = require "luci.passwall2.api"
v_transport = "http";
params += opt.query("host", dom_prefix + "h2_host");
params += opt.query("path", dom_prefix + "h2_path");
- } else if (v_transport === "tcp") {
+ } else if (v_transport === "raw" || v_transport === "tcp") {
params += opt.query("headerType", dom_prefix + "tcp_guise");
params += opt.query("host", dom_prefix + "tcp_guise_http_host");
params += opt.query("path", dom_prefix + "tcp_guise_http_path");
@@ -300,7 +300,7 @@ local api = require "luci.passwall2.api"
} else if (v_transport === "h2") {
info.host = opt.get(dom_prefix + "h2_host").value;
info.path = opt.get(dom_prefix + "h2_path").value;
- } else if (v_transport === "tcp") {
+ } else if (v_transport === "raw" || v_transport === "tcp") {
info.type = opt.get(dom_prefix + "tcp_guise").value;
if (info.type === "http") {
info.host = opt.get(dom_prefix + "tcp_guise_http_host").value;
@@ -349,7 +349,7 @@ local api = require "luci.passwall2.api"
v_transport = "http";
params += opt.query("host", dom_prefix + "h2_host");
params += opt.query("path", dom_prefix + "h2_path");
- } else if (v_transport === "tcp") {
+ } else if (v_transport === "raw" || v_transport === "tcp") {
params += opt.query("headerType", dom_prefix + "tcp_guise");
params += opt.query("host", dom_prefix + "tcp_guise_http_host");
params += opt.query("path", dom_prefix + "tcp_guise_http_path");
@@ -364,12 +364,7 @@ local api = require "luci.passwall2.api"
params += opt.query("path", dom_prefix + "grpc_serviceName");
params += opt.query("serviceName", dom_prefix + "grpc_serviceName");
params += opt.query("mode", dom_prefix + "grpc_mode");
- } else if (v_transport === "splithttp") {
- v_transport = "splithttp";
- params += opt.query("host", dom_prefix + "splithttp_host");
- params += opt.query("path", dom_prefix + "splithttp_path");
} else if (v_transport === "xhttp") {
- v_transport = "xhttp";
params += opt.query("host", dom_prefix + "xhttp_host");
params += opt.query("path", dom_prefix + "xhttp_path");
}
@@ -423,7 +418,7 @@ local api = require "luci.passwall2.api"
v_transport = "http";
params += opt.query("host", dom_prefix + "h2_host");
params += opt.query("path", dom_prefix + "h2_path");
- } else if (v_transport === "tcp") {
+ } else if (v_transport === "raw" || v_transport === "tcp") {
params += opt.query("headerType", dom_prefix + "tcp_guise");
params += opt.query("host", dom_prefix + "tcp_guise_http_host");
params += opt.query("path", dom_prefix + "tcp_guise_http_path");
@@ -800,7 +795,7 @@ local api = require "luci.passwall2.api"
if (queryParam.type === "h2" || queryParam.type === "http")
queryParam.type = "h2"
opt.set(dom_prefix + 'transport', queryParam.type);
- if (queryParam.type === "tcp") {
+ if (queryParam.type === "raw" || queryParam.type === "tcp") {
opt.set(dom_prefix + 'tcp_guise', queryParam.headerType || "none");
if (queryParam.headerType && queryParam.headerType != "none") {
opt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || "");
@@ -909,7 +904,7 @@ local api = require "luci.passwall2.api"
if (queryParam.type === "h2" || queryParam.type === "http")
queryParam.type = "h2"
opt.set(dom_prefix + 'transport', queryParam.type);
- if (queryParam.type === "tcp") {
+ if (queryParam.type === "raw" || queryParam.type === "tcp") {
opt.set(dom_prefix + 'tcp_guise', queryParam.headerType || "none");
if (queryParam.headerType && queryParam.headerType != "none") {
opt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || "");
@@ -989,7 +984,7 @@ local api = require "luci.passwall2.api"
if (ssm.net === "kcp" || ssm.net === "mkcp")
ssm.net = "mkcp"
opt.set(dom_prefix + 'transport', ssm.net);
- if (ssm.net === "tcp") {
+ if (ssm.net === "raw") {
opt.set(dom_prefix + 'tcp_guise', (ssm.host && ssm.path) ? "http" : "none");
if (ssm.host && ssm.path) {
opt.set(dom_prefix + 'tcp_guise_http_host', ssm.host);
@@ -1097,7 +1092,7 @@ local api = require "luci.passwall2.api"
if (queryParam.type === "h2" || queryParam.type === "http")
queryParam.type = "h2"
opt.set(dom_prefix + 'transport', queryParam.type);
- if (queryParam.type === "tcp") {
+ if (queryParam.type === "raw" || queryParam.type === "tcp") {
opt.set(dom_prefix + 'tcp_guise', queryParam.headerType || "none");
if (queryParam.headerType && queryParam.headerType != "none") {
opt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || "");
@@ -1136,10 +1131,7 @@ local api = require "luci.passwall2.api"
} else if (queryParam.type === "grpc") {
opt.set(dom_prefix + 'grpc_serviceName', (queryParam.serviceName || queryParam.path) || "");
opt.set(dom_prefix + 'grpc_mode', queryParam.mode);
- } else if (queryParam.type === "splithttp") {
- opt.set(dom_prefix + 'splithttp_host', queryParam.host || "");
- opt.set(dom_prefix + 'splithttp_path', queryParam.path || "");
- } else if (queryParam.type === "xhttp") {
+ } else if (queryParam.type === "xhttp" || queryParam.type === "splithttp") {
opt.set(dom_prefix + 'xhttp_host', queryParam.host || "");
opt.set(dom_prefix + 'xhttp_path', queryParam.path || "");
}
diff --git a/luci-app-passwall2/po/zh-cn/passwall2.po b/luci-app-passwall2/po/zh-cn/passwall2.po
index 2bf6ca592..f255d4dd0 100644
--- a/luci-app-passwall2/po/zh-cn/passwall2.po
+++ b/luci-app-passwall2/po/zh-cn/passwall2.po
@@ -760,6 +760,9 @@ msgstr "检查更新"
msgid "Force update"
msgstr "强制更新"
+msgid "The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install."
+msgstr "最新版本:%s,目前暂不支持自动更新,如需更新,请自行编译或下载ipk然后手动安装。"
+
msgid "Enable custom URL"
msgstr "启用自定义规则地址"
@@ -1566,3 +1569,18 @@ msgstr "落地节点"
msgid "Only support a layer of proxy."
msgstr "仅支持一层代理。"
+
+msgid "Set the default domain resolution strategy for the sing-box node."
+msgstr "为 sing-box 节点设置默认的域名解析策略。"
+
+msgid "Prefer IPv4"
+msgstr "IPv4 优先"
+
+msgid "Prefer IPv6"
+msgstr "IPv6 优先"
+
+msgid "IPv4 Only"
+msgstr "仅 IPv4"
+
+msgid "IPv6 Only"
+msgstr "仅 IPv6"
diff --git a/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua b/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
index a1a8900b3..1df45f1da 100755
--- a/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
+++ b/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
@@ -33,6 +33,8 @@ local trojan_type_default = uci:get(appname, "@global_subscribe[0]", "trojan_typ
local vmess_type_default = uci:get(appname, "@global_subscribe[0]", "vmess_type") or "xray"
local vless_type_default = uci:get(appname, "@global_subscribe[0]", "vless_type") or "xray"
local hysteria2_type_default = uci:get(appname, "@global_subscribe[0]", "hysteria2_type") or "hysteria2"
+local domain_strategy_default = uci:get(appname, "@global_subscribe[0]", "domain_strategy") or ""
+local domain_strategy_node = ""
-- 判断是否过滤节点关键字
local filter_keyword_mode_default = uci:get(appname, "@global_subscribe[0]", "filter_keyword_mode") or "0"
local filter_keyword_discard_list_default = uci:get(appname, "@global_subscribe[0]", "filter_discard_list") or {}
@@ -454,7 +456,7 @@ local function processData(szType, content, add_mode, add_from)
result.h2_host = info.host
result.h2_path = info.path
end
- if info.net == 'tcp' then
+ if info.net == 'raw' or info.net == 'tcp' then
if info.type and info.type ~= "http" then
info.type = "none"
end
@@ -480,9 +482,9 @@ local function processData(szType, content, add_mode, add_from)
if info.net == 'grpc' then
result.grpc_serviceName = info.path
end
- if info.net == 'splithttp' then
- result.splithttp_host = info.host
- result.splithttp_path = info.path
+ if info.net == 'xhttp' or info.net == 'splithttp' then
+ result.xhttp_host = info.host
+ result.xhttp_path = info.path
end
if not info.security then result.security = "auto" end
if info.tls == "tls" or info.tls == "1" then
@@ -493,7 +495,7 @@ local function processData(szType, content, add_mode, add_from)
result.tls = "0"
end
- if result.type == "sing-box" and (result.transport == "mkcp" or result.transport == "splithttp") then
+ if result.type == "sing-box" and (result.transport == "mkcp" or result.transport == "xhttp" or result.transport == "raw" or result.transport == "splithttp") then
log("跳过节点:" .. result.remarks ..",因Sing-Box不支持" .. szType .. "协议的" .. result.transport .. "传输方式,需更换Xray。")
return nil
end
@@ -653,7 +655,7 @@ local function processData(szType, content, add_mode, add_from)
result.h2_path = params.path
end
end
- if params.type == 'tcp' then
+ if params.type == 'raw' or params.type == 'tcp' then
result.tcp_guise = params.headerType or "none"
result.tcp_guise_http_host = params.host
result.tcp_guise_http_path = params.path
@@ -800,7 +802,7 @@ local function processData(szType, content, add_mode, add_from)
result.h2_path = params.path
end
end
- if params.type == 'tcp' then
+ if params.type == 'raw' or params.type == 'tcp' then
result.tcp_guise = params.headerType or "none"
result.tcp_guise_http_host = params.host
result.tcp_guise_http_path = params.path
@@ -826,16 +828,16 @@ local function processData(szType, content, add_mode, add_from)
if params.serviceName then result.grpc_serviceName = params.serviceName end
result.grpc_mode = params.mode
end
- if params.type == 'splithttp' then
- result.splithttp_host = params.host
- result.splithttp_path = params.path
+ if info.net == 'xhttp' or info.net == 'splithttp' then
+ result.xhttp_host = params.host
+ result.xhttp_path = params.path
end
result.encryption = params.encryption or "none"
result.flow = params.flow or nil
- if result.type == "sing-box" and (result.transport == "mkcp" or result.transport == "splithttp") then
+ if result.type == "sing-box" and (result.transport == "mkcp" or result.transport == "xhttp" or result.transport == "raw" or result.transport == "splithttp") then
log("跳过节点:" .. result.remarks ..",因Sing-Box不支持" .. szType .. "协议的" .. result.transport .. "传输方式,需更换Xray。")
return nil
end
@@ -932,7 +934,7 @@ local function processData(szType, content, add_mode, add_from)
result.h2_path = params.path
end
end
- if params.type == 'tcp' then
+ if params.type == 'raw' or params.type == 'tcp' then
result.tcp_guise = params.headerType or "none"
result.tcp_guise_http_host = params.host
result.tcp_guise_http_path = params.path
@@ -957,9 +959,9 @@ local function processData(szType, content, add_mode, add_from)
if params.serviceName then result.grpc_serviceName = params.serviceName end
result.grpc_mode = params.mode
end
- if params.type == 'splithttp' then
- result.splithttp_host = params.host
- result.splithttp_path = params.path
+ if info.net == 'xhttp' or info.net == 'splithttp' then
+ result.xhttp_host = params.host
+ result.xhttp_path = params.path
end
result.encryption = params.encryption or "none"
@@ -983,7 +985,7 @@ local function processData(szType, content, add_mode, add_from)
result.port = port
result.tls_allowInsecure = allowInsecure_default and "1" or "0"
- if result.type == "sing-box" and (result.transport == "mkcp" or result.transport == "splithttp") then
+ if result.type == "sing-box" and (result.transport == "mkcp" or result.transport == "xhttp" or result.transport == "raw" or result.transport == "splithttp") then
log("跳过节点:" .. result.remarks ..",因Sing-Box不支持" .. szType .. "协议的" .. result.transport .. "传输方式,需更换Xray。")
return nil
end
@@ -1351,6 +1353,10 @@ local function update_node(manual)
local cfgid = uci:section(appname, "nodes", api.gen_short_uuid())
for kkk, vvv in pairs(vv) do
uci:set(appname, cfgid, kkk, vvv)
+ -- sing-box 域名解析策略
+ if kkk == "type" and vvv == "sing-box" then
+ uci:set(appname, cfgid, "domain_strategy", domain_strategy_node)
+ end
end
end
end
@@ -1544,6 +1550,12 @@ local execute = function()
if hysteria2_type ~= "global" then
hysteria2_type_default = hysteria2_type
end
+ local domain_strategy = value.domain_strategy or "global"
+ if domain_strategy ~= "global" then
+ domain_strategy_node = domain_strategy
+ else
+ domain_strategy_node = domain_strategy_default
+ end
local ua = value.user_agent
log('正在订阅:【' .. remark .. '】' .. url)
local raw = curl(url, "/tmp/" .. cfgid, ua)
diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua
index 33ca9fef6..d786864b3 100755
--- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua
+++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua
@@ -10,15 +10,40 @@ local icount = 0
local args = arg[1]
local uci = luci.model.uci.cursor()
--- 以下设置更新数据库至 DNSMASQ 路径
--- 获取 DEFAULT_DNSMASQ_CFGID
+-- 以下设置更新数据库至 DNSMASQ 配置路径
+-- 获取 DNSMasq 配置 ID
local DEFAULT_DNSMASQ_CFGID = uci:get_first("dhcp", "dnsmasq", ".name")
+
+if not DEFAULT_DNSMASQ_CFGID then
+ error("未找到默认的 DNSMasq 配置 ID")
+end
+
-- 查找包含 conf-dir 选项的 dnsmasq.conf 文件路径
-local DNSMASQ_CONF_PATH = string.format("grep -l '^conf-dir=' /tmp/etc/dnsmasq.conf.%s*", DEFAULT_DNSMASQ_CFGID):gsub("%s+", "") -- 去除空白字符
--- 获取 DNSMASQ_CONF_DIR
-local DNSMASQ_CONF_DIR = string.format("grep '^conf-dir=' %s | cut -d'=' -f2 | head -n 1", DNSMASQ_CONF_PATH):gsub("%s+", "") -- 去除空白字符
--- 设置 TMP_DNSMASQ_PATH 路径
-local TMP_DNSMASQ_PATH = DNSMASQ_CONF_DIR .. "/dnsmasq-ssrplus.d"
+local DNSMASQ_CONF_PATH_CMD = string.format("grep -l '^conf-dir=' /tmp/etc/dnsmasq.conf.%s*", DEFAULT_DNSMASQ_CFGID)
+local DNSMASQ_CONF_PATH = io.popen(DNSMASQ_CONF_PATH_CMD):read("*l")
+
+if not DNSMASQ_CONF_PATH or DNSMASQ_CONF_PATH:match("^%s*$") then
+ error("无法找到包含 conf-dir 选项的 dnsmasq.conf 文件路径")
+end
+
+DNSMASQ_CONF_PATH = DNSMASQ_CONF_PATH:gsub("%s+", "") -- 去除空白字符
+
+-- 获取 DNSMASQ 配置路径
+local DNSMASQ_CONF_DIR_CMD = string.format("grep '^conf-dir=' %s | cut -d'=' -f2 | head -n 1", DNSMASQ_CONF_PATH)
+local DNSMASQ_CONF_DIR = io.popen(DNSMASQ_CONF_DIR_CMD):read("*l")
+
+if not DNSMASQ_CONF_DIR or DNSMASQ_CONF_DIR:match("^%s*$") then
+ error("无法提取 conf-dir 配置,请检查 dnsmasq.conf 文件内容")
+end
+
+DNSMASQ_CONF_DIR = DNSMASQ_CONF_DIR:gsub("%s+", "") -- 去除空白字符
+
+-- 设置 dnsmasq-ssrplus.d 目录路径,并去除路径末尾的斜杠
+local TMP_DNSMASQ_PATH = DNSMASQ_CONF_DIR:match("^(.-)/?$") .. "/dnsmasq-ssrplus.d"
+
+if not TMP_DNSMASQ_PATH or TMP_DNSMASQ_PATH:match("^%s*$") then
+ error("无法找到包含 dnsmasq 选项的 dnsmasq-ssrplus.d 目录路径")
+end
local TMP_PATH = "/var/etc/ssrplus"
-- match comments/title/whitelist/ip address/excluded_domain