luci-app-passwall2: sync

* 942c32f8554f27508a4934ad575b7c84114caff4
This commit is contained in:
sbwml 2023-09-04 04:35:24 +08:00
parent f152d28d69
commit c9ad18fb87
22 changed files with 964 additions and 830 deletions

View File

@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2 PKG_NAME:=luci-app-passwall2
PKG_VERSION:=1.19-3 PKG_VERSION:=1.19-6
PKG_RELEASE:= PKG_RELEASE:=
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \

View File

@ -16,7 +16,7 @@ function index()
entry({"admin", "services", appname, "hide"}, call("hide_menu")).leaf = true entry({"admin", "services", appname, "hide"}, call("hide_menu")).leaf = true
if not nixio.fs.access("/etc/config/passwall2") then return end if not nixio.fs.access("/etc/config/passwall2") then return end
if nixio.fs.access("/etc/config/passwall2_show") then if nixio.fs.access("/etc/config/passwall2_show") then
e = entry({"admin", "services", appname}, alias("admin", "services", appname, "settings"), _("PassWall 2"), 0) e = entry({"admin", "services", appname}, alias("admin", "services", appname, "settings"), _("PassWall 2"), -1)
e.dependent = true e.dependent = true
e.acl_depends = { "luci-app-passwall2" } e.acl_depends = { "luci-app-passwall2" }
end end

View File

@ -127,30 +127,33 @@ o:depends("ipv6_tproxy", true)
o.default = 0 o.default = 0
if has_v2ray or has_xray then if has_v2ray or has_xray then
o = s:option(Flag, "sniffing", translate("Sniffing (V2Ray/Xray)"), translate("When using the V2ray/Xray shunt, must be enabled, otherwise the shunt will invalid.")) s = m:section(TypedSection, "global_xray", "V2Ray/Xray " .. translate("Settings"))
s.anonymous = true
s.addremove = false
o = s:option(Flag, "sniffing", translate("Sniffing"), translate("When using the shunt, must be enabled, otherwise the shunt will invalid."))
o.default = 1 o.default = 1
o.rmempty = false o.rmempty = false
if has_xray then if has_xray then
route_only = s:option(Flag, "route_only", translate("Sniffing Route Only (Xray)"), translate("When enabled, the server not will resolve the domain name again.")) o = s:option(Flag, "route_only", translate("Sniffing Route Only"))
route_only.default = 0 o.default = 0
route_only:depends("sniffing", true) o:depends("sniffing", true)
local domains_excluded = string.format("/usr/share/%s/domains_excluded", appname) local domains_excluded = string.format("/usr/share/%s/domains_excluded", appname)
o = s:option(TextValue, "no_sniffing_hosts", translate("No Sniffing Lists"), translate("Hosts added into No Sniffing Lists will not resolve again on server (Xray only).")) o = s:option(TextValue, "no_sniffing_hosts", translate("No Sniffing Lists"), translate("Hosts added into No Sniffing Lists will not resolve again on server."))
o.rows = 15 o.rows = 15
o.wrap = "off" o.wrap = "off"
o.cfgvalue = function(self, section) return fs.readfile(domains_excluded) or "" end o.cfgvalue = function(self, section) return fs.readfile(domains_excluded) or "" end
o.write = function(self, section, value) fs.writefile(domains_excluded, value:gsub("\r\n", "\n")) end o.write = function(self, section, value) fs.writefile(domains_excluded, value:gsub("\r\n", "\n")) end
o.remove = function(self, section, value) o.remove = function(self, section, value)
if route_only:formvalue(section) == "0" then if s.fields["route_only"]:formvalue(section) == "0" then
fs.writefile(domains_excluded, "") fs.writefile(domains_excluded, "")
end end
end end
o:depends({sniffing = true, route_only = false}) o:depends({sniffing = true, route_only = false})
o = s:option(Value, "buffer_size", translate("Buffer Size (Xray)"), translate("Buffer size for every connection (kB)")) o = s:option(Value, "buffer_size", translate("Buffer Size"), translate("Buffer size for every connection (kB)"))
o.rmempty = true
o.datatype = "uinteger" o.datatype = "uinteger"
end end
end end

View File

@ -6,6 +6,20 @@ m = Map(appname)
s = m:section(TypedSection, "global_rules", translate("Rule status")) s = m:section(TypedSection, "global_rules", translate("Rule status"))
s.anonymous = true s.anonymous = true
o = s:option(Value, "v2ray_location_asset", translate("Location of V2ray/Xray asset"), translate("This variable specifies a directory where geoip.dat and geosite.dat files are."))
o.default = "/usr/share/v2ray/"
o.rmempty = false
---- Custom geo file url
o = s:option(Value, "geoip_url", translate("Custom geoip URL"))
o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest"
o.rmempty = false
o = s:option(Value, "geosite_url", translate("Custom geosite URL"))
o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest"
o.rmempty = false
----
s:append(Template(appname .. "/rule/rule_version")) s:append(Template(appname .. "/rule/rule_version"))
---- Auto Update ---- Auto Update
@ -27,20 +41,6 @@ for e = 0, 23 do o:value(e, e .. translate("oclock")) end
o.default = 0 o.default = 0
o:depends("auto_update", true) o:depends("auto_update", true)
o = s:option(Value, "v2ray_location_asset", translate("Location of V2ray/Xray asset"), translate("This variable specifies a directory where geoip.dat and geosite.dat files are."))
o.default = "/usr/share/v2ray/"
o.rmempty = false
---- Custom geo file url
o = s:option(Value, "geoip_url", translate("Custom geoip URL"))
o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest"
o.rmempty = false
o = s:option(Value, "geosite_url", translate("Custom geosite URL"))
o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest"
o.rmempty = false
----
s = m:section(TypedSection, "shunt_rules", "V2ray/Xray " .. translate("Shunt Rule"), "<a style='color: red'>" .. translate("Please note attention to the priority, the higher the order, the higher the priority.") .. "</a>") s = m:section(TypedSection, "shunt_rules", "V2ray/Xray " .. translate("Shunt Rule"), "<a style='color: red'>" .. translate("Please note attention to the priority, the higher the order, the higher the priority.") .. "</a>")
s.template = "cbi/tblsection" s.template = "cbi/tblsection"
s.anonymous = false s.anonymous = false

View File

@ -6,6 +6,8 @@ if not api.is_finded("brook") then
return return
end end
local type_name = "Brook"
local option_prefix = "brook_" local option_prefix = "brook_"
local function option_name(name) local function option_name(name)
@ -18,32 +20,41 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
-- [[ Brook ]] -- [[ Brook ]]
s.fields["type"]:value("Brook", translate("Brook")) s.fields["type"]:value(type_name, translate("Brook"))
o = s:option(ListValue, "brook_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("client", translate("Brook")) o:value("client", translate("Brook"))
o:value("wsclient", translate("WebSocket")) o:value("wsclient", translate("WebSocket"))
o = s:option(Value, "brook_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
o = s:option(Value, "brook_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "brook_ws_path", translate("WebSocket Path")) o = s:option(Value, option_name("ws_path"), translate("WebSocket Path"))
o.placeholder = "/" o.placeholder = "/"
o:depends({ brook_protocol = "wsclient" }) o:depends({ [option_name("protocol")] = "wsclient" })
o = s:option(Flag, "brook_tls", translate("Use TLS")) o = s:option(Flag, option_name("tls"), translate("Use TLS"))
o:depends({ brook_protocol = "wsclient" }) o:depends({ [option_name("protocol")] = "wsclient" })
o = s:option(Value, "brook_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
@ -51,15 +62,16 @@ for key, value in pairs(s.fields) do
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "Brook" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "Brook" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("hysteria") then
return return
end end
local type_name = "Hysteria"
local option_prefix = "hysteria_" local option_prefix = "hysteria_"
local function option_name(name) local function option_name(name)
@ -18,82 +20,90 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
-- [[ Hysteria ]] -- [[ Hysteria ]]
s.fields["type"]:value("Hysteria", translate("Hysteria")) s.fields["type"]:value(type_name, translate("Hysteria"))
o = s:option(ListValue, "hysteria_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("udp", "UDP") o:value("udp", "UDP")
o:value("faketcp", "faketcp") o:value("faketcp", "faketcp")
o:value("wechat-video", "wechat-video") o:value("wechat-video", "wechat-video")
o = s:option(Value, "hysteria_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
o = s:option(Value, "hysteria_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "hysteria_hop", translate("Additional ports for hysteria hop")) o = s:option(Value, option_name("hop"), translate("Additional ports for hysteria hop"))
o:depends("type", "Hysteria")
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_obfs", translate("Obfs Password")) o = s:option(Value, option_name("obfs"), translate("Obfs Password"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(ListValue, "hysteria_auth_type", translate("Auth Type")) o = s:option(ListValue, option_name("auth_type"), translate("Auth Type"))
o:value("disable", translate("Disable")) o:value("disable", translate("Disable"))
o:value("string", translate("STRING")) o:value("string", translate("STRING"))
o:value("base64", translate("BASE64")) o:value("base64", translate("BASE64"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_auth_password", translate("Auth Password")) o = s:option(Value, option_name("auth_password"), translate("Auth Password"))
o.password = true o.password = true
o:depends({ hysteria_auth_type = "string"}) o:depends({ [option_name("auth_type")] = "string"})
o:depends({ hysteria_auth_type = "base64"}) o:depends({ [option_name("auth_type")] = "base64"})
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_alpn", translate("QUIC TLS ALPN")) o = s:option(Value, option_name("alpn"), translate("QUIC TLS ALPN"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "hysteria_fast_open", translate("Fast Open")) o = s:option(Flag, option_name("fast_open"), translate("Fast Open"))
o.default = "0" o.default = "0"
o = s:option(Value, "hysteria_tls_serverName", translate("Domain")) o = s:option(Value, option_name("tls_serverName"), translate("Domain"))
o = s:option(Flag, "hysteria_tls_allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) o = s:option(Flag, option_name("tls_allowInsecure"), translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped."))
o.default = "0" o.default = "0"
o = s:option(Value, "hysteria_up_mbps", translate("Max upload Mbps")) o = s:option(Value, option_name("up_mbps"), translate("Max upload Mbps"))
o.default = "10" o.default = "10"
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_down_mbps", translate("Max download Mbps")) o = s:option(Value, option_name("down_mbps"), translate("Max download Mbps"))
o.default = "50" o.default = "50"
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_recv_window_conn", translate("QUIC stream receive window")) o = s:option(Value, option_name("recv_window_conn"), translate("QUIC stream receive window"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_recv_window", translate("QUIC connection receive window")) o = s:option(Value, option_name("recv_window"), translate("QUIC connection receive window"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_handshake_timeout", translate("Handshake Timeout")) o = s:option(Value, option_name("handshake_timeout"), translate("Handshake Timeout"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_idle_timeout", translate("Idle Timeout")) o = s:option(Value, option_name("idle_timeout"), translate("Idle Timeout"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_hop_interval", translate("Hop Interval")) o = s:option(Value, option_name("hop_interval"), translate("Hop Interval"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "hysteria_disable_mtu_discovery", translate("Disable MTU detection")) o = s:option(Flag, option_name("disable_mtu_discovery"), translate("Disable MTU detection"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "hysteria_lazy_start", translate("Lazy Start")) o = s:option(Flag, option_name("lazy_start"), translate("Lazy Start"))
o.not_rewrite = true o.not_rewrite = true
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
@ -101,15 +111,16 @@ for key, value in pairs(s.fields) do
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "Hysteria" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "Hysteria" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("naive") then
return return
end end
local type_name = "Naiveproxy"
local option_prefix = "naive_" local option_prefix = "naive_"
local function option_name(name) local function option_name(name)
@ -18,27 +20,36 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
-- [[ Naive ]] -- [[ Naive ]]
s.fields["type"]:value("Naiveproxy", translate("NaiveProxy")) s.fields["type"]:value(type_name, translate("NaiveProxy"))
o = s:option(ListValue, "naive_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("https", translate("HTTPS")) o:value("https", translate("HTTPS"))
o:value("quic", translate("QUIC")) o:value("quic", translate("QUIC"))
o = s:option(Value, "naive_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
o = s:option(Value, "naive_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "naive_username", translate("Username")) o = s:option(Value, option_name("username"), translate("Username"))
o = s:option(Value, "naive_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
@ -46,15 +57,16 @@ for key, value in pairs(s.fields) do
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "Naiveproxy" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "Naiveproxy" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -21,15 +21,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" or s.fields["type"]:formvalue(arg[1]) == "V2ray" then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value) local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" or s.fields["type"]:formvalue(arg[1]) == "V2ray" then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix)) m:del(section, self.option:sub(1 + #option_prefix))
end end
end end
end
local function add_xray_depends(o, field, value) local function add_xray_depends(o, field, value)
local deps = { type = "Xray" } local deps = { type = "Xray" }
@ -82,7 +86,7 @@ if api.is_finded("v2ray") then
s.fields["type"]:value("V2ray", translate("V2ray")) s.fields["type"]:value("V2ray", translate("V2ray"))
end end
o = s:option(ListValue, "xray_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("vmess", translate("Vmess")) o:value("vmess", translate("Vmess"))
o:value("vless", translate("VLESS")) o:value("vless", translate("VLESS"))
o:value("http", translate("HTTP")) o:value("http", translate("HTTP"))
@ -95,14 +99,10 @@ o:value("_shunt", translate("Shunt"))
o:value("_iface", translate("Custom Interface") .. " (Only Support Xray)") o:value("_iface", translate("Custom Interface") .. " (Only Support Xray)")
add_xray_depends(o) add_xray_depends(o)
add_v2ray_depends(o) add_v2ray_depends(o)
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_iface", translate("Interface")) o = s:option(Value, option_name("iface"), translate("Interface"))
o.default = "eth1" o.default = "eth1"
add_xray_depends(o, { xray_protocol = "_iface" }) o:depends({ [option_name("protocol")] = "_iface" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
local nodes_table = {} local nodes_table = {}
local balancers_table = {} local balancers_table = {}
@ -129,54 +129,45 @@ for k, e in ipairs(api.get_valid_nodes()) do
end end
-- 负载均衡列表 -- 负载均衡列表
local o = s:option(DynamicList, "xray_balancing_node", translate("Load balancing node list"), translate("Load balancing node list, <a target='_blank' href='https://toutyrater.github.io/routing/balance2.html'>document</a>")) local o = s:option(DynamicList, option_name("balancing_node"), translate("Load balancing node list"), translate("Load balancing node list, <a target='_blank' href='https://toutyrater.github.io/routing/balance2.html'>document</a>"))
add_xray_depends(o, { xray_protocol = "_balancing" }) o:depends({ [option_name("protocol")] = "_balancing" })
add_v2ray_depends(o, { xray_protocol = "_balancing" }) add_v2ray_depends(o, { [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.remarks) end
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
local o = s:option(ListValue, "xray_balancingStrategy", translate("Balancing Strategy")) local o = s:option(ListValue, option_name("balancingStrategy"), translate("Balancing Strategy"))
add_xray_depends(o, { xray_protocol = "_balancing" }) add_xray_depends(o, { [option_name("protocol")] = "_balancing" })
add_v2ray_depends(o, { xray_protocol = "_balancing" }) add_v2ray_depends(o, { [option_name("protocol")] = "_balancing" })
o:value("random") o:value("random")
o:value("leastPing") o:value("leastPing")
o.default = "random" o.default = "random"
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
-- 探测地址 -- 探测地址
local o = s:option(Flag, "xray_useCustomProbeUrl", translate("Use Custome Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL.")) local o = s:option(Flag, option_name("useCustomProbeUrl"), translate("Use Custome Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL."))
add_xray_depends(o, { xray_balancingStrategy = "leastPing" }) add_xray_depends(o, { [option_name("balancingStrategy")] = "leastPing" })
add_v2ray_depends(o, { xray_balancingStrategy = "leastPing" }) add_v2ray_depends(o, { [option_name("balancingStrategy")] = "leastPing" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
local o = s:option(Value, "xray_probeUrl", translate("Probe URL")) local o = s:option(Value, option_name("probeUrl"), translate("Probe URL"))
add_xray_depends(o, { xray_useCustomProbeUrl = true }) add_xray_depends(o, { [option_name("useCustomProbeUrl")] = true })
add_v2ray_depends(o, { xray_useCustomProbeUrl = true }) add_v2ray_depends(o, { [option_name("useCustomProbeUrl")] = true })
o.default = "https://www.google.com/generate_204" o.default = "https://www.google.com/generate_204"
o.description = translate("The URL used to detect the connection status.") o.description = translate("The URL used to detect the connection status.")
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
-- 探测间隔 -- 探测间隔
local o = s:option(Value, "xray_probeInterval", translate("Probe Interval")) local o = s:option(Value, option_name("probeInterval"), translate("Probe Interval"))
add_xray_depends(o, { xray_balancingStrategy = "leastPing" }) add_xray_depends(o, { [option_name("balancingStrategy")] = "leastPing" })
add_v2ray_depends(o, { xray_balancingStrategy = "leastPing" }) add_v2ray_depends(o, { [option_name("balancingStrategy")] = "leastPing" })
o.default = "1m" o.default = "1m"
o.description = translate("The interval between initiating probes. Every time this time elapses, a server status check is performed on a server. The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>ns</code>, <code>us</code>, <code>ms</code>, <code>s</code>, <code>m</code>, <code>h</code>, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively.") o.description = translate("The interval between initiating probes. Every time this time elapses, a server status check is performed on a server. The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>ns</code>, <code>us</code>, <code>ms</code>, <code>s</code>, <code>m</code>, <code>h</code>, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively.")
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
-- [[ 分流模块 ]] -- [[ 分流模块 ]]
if #nodes_table > 0 then if #nodes_table > 0 then
o = s:option(Flag, "preproxy_enabled", translate("Preproxy")) o = s:option(Flag, option_name("preproxy_enabled"), translate("Preproxy"))
add_xray_depends(o, { xray_protocol = "_shunt" }) o:depends({ [option_name("protocol")] = "_shunt" })
add_v2ray_depends(o, { xray_protocol = "_shunt" }) add_v2ray_depends(o, { [option_name("protocol")] = "_shunt" })
o = s:option(Value, "main_node", string.format('<a style="color:red">%s</a>', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including <code>Default</code>) has a separate switch that controls whether this rule uses the pre-proxy or not."))
add_xray_depends(o, { xray_protocol = "_shunt", preproxy_enabled = true }) o = s:option(Value, option_name("main_node"), string.format('<a style="color:red">%s</a>', translate("Preproxy Node")), translate("Set the node to be used as a pre-proxy. Each rule (including <code>Default</code>) has a separate switch that controls whether this rule uses the pre-proxy or not."))
add_v2ray_depends(o, { xray_protocol = "_shunt", preproxy_enabled = true }) o:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true })
add_v2ray_depends(o, { [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true })
for k, v in pairs(balancers_table) do for k, v in pairs(balancers_table) do
o:value(v.id, v.remarks) o:value(v.id, v.remarks)
end end
@ -190,13 +181,13 @@ if #nodes_table > 0 then
end end
uci:foreach(appname, "shunt_rules", function(e) uci:foreach(appname, "shunt_rules", function(e)
if e[".name"] and e.remarks then if e[".name"] and e.remarks then
o = s:option(Value, e[".name"], string.format('* <a href="%s" target="_blank">%s</a>', api.url("shunt_rules", e[".name"]), e.remarks)) o = s:option(Value, option_name(e[".name"]), string.format('* <a href="%s" target="_blank">%s</a>', api.url("shunt_rules", e[".name"]), e.remarks))
o:value("nil", translate("Close")) o:value("nil", translate("Close"))
o:value("_default", translate("Default")) o:value("_default", translate("Default"))
o:value("_direct", translate("Direct Connection")) o:value("_direct", translate("Direct Connection"))
o:value("_blackhole", translate("Blackhole")) o:value("_blackhole", translate("Blackhole"))
add_xray_depends(o, { xray_protocol = "_shunt" }) o:depends({ [option_name("protocol")] = "_shunt" })
add_v2ray_depends(o, { xray_protocol = "_shunt" }) add_v2ray_depends(o, { [option_name("protocol")] = "_shunt" })
if #nodes_table > 0 then if #nodes_table > 0 then
for k, v in pairs(balancers_table) do for k, v in pairs(balancers_table) do
@ -205,28 +196,29 @@ uci:foreach(appname, "shunt_rules", function(e)
for k, v in pairs(iface_table) do for k, v in pairs(iface_table) do
o:value(v.id, v.remarks) o:value(v.id, v.remarks)
end end
local pt = s:option(ListValue, e[".name"] .. "_proxy_tag", string.format('* <a style="color:red">%s</a>', e.remarks .. " " .. translate("Preproxy"))) local pt = s:option(ListValue, option_name(e[".name"] .. "_proxy_tag"), string.format('* <a style="color:red">%s</a>', e.remarks .. " " .. translate("Preproxy")))
pt:value("nil", translate("Close")) pt:value("nil", translate("Close"))
pt:value("main", translate("Preproxy Node")) pt:value("main", translate("Preproxy Node"))
pt.default = "nil" pt.default = "nil"
for k, v in pairs(nodes_table) do for k, v in pairs(nodes_table) do
o:value(v.id, v.remarks) o:value(v.id, v.remarks)
add_xray_depends(pt, { xray_protocol = "_shunt", preproxy_enabled = "1", [e[".name"]] = v.id }) pt:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true, [option_name(e[".name"])] = v.id })
add_v2ray_depends(pt, { xray_protocol = "_shunt", preproxy_enabled = "1", [e[".name"]] = v.id }) add_v2ray_depends(o, { [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true, [option_name(e[".name"])] = v.id })
end end
end end
end end
end) end)
o = s:option(DummyValue, "shunt_tips", " ") o = s:option(DummyValue, option_name("shunt_tips"), " ")
o.not_rewrite = true
o.rawhtml = true o.rawhtml = true
o.cfgvalue = function(t, n) o.cfgvalue = function(t, n)
return string.format('<a style="color: red" href="../rule">%s</a>', translate("No shunt rules? Click me to go to add.")) return string.format('<a style="color: red" href="../rule">%s</a>', translate("No shunt rules? Click me to go to add."))
end end
add_xray_depends(o, { xray_protocol = "_shunt" }) o:depends({ [option_name("protocol")] = "_shunt" })
local o = s:option(Value, "default_node", string.format('* <a style="color:red">%s</a>', translate("Default"))) local o = s:option(Value, option_name("default_node"), string.format('* <a style="color:red">%s</a>', translate("Default")))
add_xray_depends(o, { xray_protocol = "_shunt" }) o:depends({ [option_name("protocol")] = "_shunt" })
o:value("_direct", translate("Direct Connection")) o:value("_direct", translate("Direct Connection"))
o:value("_blackhole", translate("Blackhole")) o:value("_blackhole", translate("Blackhole"))
@ -237,17 +229,17 @@ if #nodes_table > 0 then
for k, v in pairs(iface_table) do for k, v in pairs(iface_table) do
o:value(v.id, v.remarks) o:value(v.id, v.remarks)
end end
local dpt = s:option(ListValue, "default_proxy_tag", string.format('* <a style="color:red">%s</a>', translate("Default Preproxy")), translate("When using, localhost will connect this node first and then use this node to connect the default node.")) local dpt = s:option(ListValue, option_name("default_proxy_tag"), string.format('* <a style="color:red">%s</a>', 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("nil", translate("Close"))
dpt:value("main", translate("Preproxy Node")) dpt:value("main", translate("Preproxy Node"))
dpt.default = "nil" dpt.default = "nil"
for k, v in pairs(nodes_table) do for k, v in pairs(nodes_table) do
o:value(v.id, v.remarks) o:value(v.id, v.remarks)
add_xray_depends(dpt, { xray_protocol = "_shunt", preproxy_enabled = "1", default_node = v.id }) dpt:depends({ [option_name("protocol")] = "_shunt", [option_name("preproxy_enabled")] = true, [option_name("default_node")] = v.id })
end end
end end
o = s:option(ListValue, "domainStrategy", translate("Domain Strategy")) o = s:option(ListValue, option_name("domainStrategy"), translate("Domain Strategy"))
o:value("AsIs") o:value("AsIs")
o:value("IPIfNonMatch") o:value("IPIfNonMatch")
o:value("IPOnDemand") o:value("IPOnDemand")
@ -256,182 +248,170 @@ o.description = "<br /><ul><li>" .. translate("'AsIs': Only use domain for routi
.. "</li><li>" .. translate("'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.") .. "</li><li>" .. translate("'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.")
.. "</li><li>" .. translate("'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.") .. "</li><li>" .. translate("'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.")
.. "</li></ul>" .. "</li></ul>"
add_xray_depends(o, { xray_protocol = "_shunt" }) o:depends({ [option_name("protocol")] = "_shunt" })
o = s:option(ListValue, "domainMatcher", translate("Domain matcher")) o = s:option(ListValue, option_name("domainMatcher"), translate("Domain matcher"))
o:value("hybrid") o:value("hybrid")
o:value("linear") o:value("linear")
add_xray_depends(o, { xray_protocol = "_shunt" }) o:depends({ [option_name("protocol")] = "_shunt" })
-- [[ 分流模块 End ]] -- [[ 分流模块 End ]]
o = s:option(Value, "xray_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "http" }) add_xray_depends(o, { [option_name("protocol")] = "http" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "http" }) add_v2ray_depends(o, { [option_name("protocol")] = "http" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "http" }) add_xray_depends(o, { [option_name("protocol")] = "http" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "http" }) add_v2ray_depends(o, { [option_name("protocol")] = "http" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_username", translate("Username")) o = s:option(Value, option_name("username"), translate("Username"))
add_xray_depends(o, { xray_protocol = "http" }) add_xray_depends(o, { [option_name("protocol")] = "http" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "http" }) add_v2ray_depends(o, { [option_name("protocol")] = "http" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
add_xray_depends(o, { xray_protocol = "http" }) add_xray_depends(o, { [option_name("protocol")] = "http" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
add_v2ray_depends(o, { xray_protocol = "http" }) add_v2ray_depends(o, { [option_name("protocol")] = "http" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(ListValue, "security", translate("Encrypt Method")) o = s:option(ListValue, option_name("security"), translate("Encrypt Method"))
for a, t in ipairs(security_list) do o:value(t) end for a, t in ipairs(security_list) do o:value(t) end
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
o = s:option(Value, "encryption", translate("Encrypt Method")) o = s:option(Value, option_name("encryption"), translate("Encrypt Method"))
o.default = "none" o.default = "none"
o:value("none") o:value("none")
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
o = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method")) o = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method"))
o.not_rewrite = true
for a, t in ipairs(v_ss_encrypt_method_list) do o:value(t) end for a, t in ipairs(v_ss_encrypt_method_list) do o:value(t) end
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
function o.cfgvalue(self, section) function o.cfgvalue(self, section)
return m:get(section, "method") return m:get(section, "method")
end end
function o.write(self, section, value) function o.write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" or s.fields["type"]:formvalue(arg[1]) == "V2ray" then
m:set(section, "method", value) m:set(section, "method", value)
end end
end
o = s:option(ListValue, "x_ss_encrypt_method", translate("Encrypt Method")) o = s:option(ListValue, option_name("x_ss_encrypt_method"), translate("Encrypt Method"))
o.not_rewrite = true
for a, t in ipairs(x_ss_encrypt_method_list) do o:value(t) end for a, t in ipairs(x_ss_encrypt_method_list) do o:value(t) end
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
function o.cfgvalue(self, section) function o.cfgvalue(self, section)
return m:get(section, "method") return m:get(section, "method")
end end
function o.write(self, section, value) function o.write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" or s.fields["type"]:formvalue(arg[1]) == "V2ray" then
m:set(section, "method", value) m:set(section, "method", value)
end end
end
o = s:option(Flag, "iv_check", translate("IV Check")) o = s:option(Flag, option_name("iv_check"), translate("IV Check"))
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "shadowsocks", x_ss_encrypt_method = "aes-128-gcm" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks", [option_name("x_ss_encrypt_method")] = "aes-128-gcm" })
add_xray_depends(o, { xray_protocol = "shadowsocks", x_ss_encrypt_method = "aes-256-gcm" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks", [option_name("x_ss_encrypt_method")] = "aes-256-gcm" })
add_xray_depends(o, { xray_protocol = "shadowsocks", x_ss_encrypt_method = "chacha20-poly1305" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks", [option_name("x_ss_encrypt_method")] = "chacha20-poly1305" })
add_xray_depends(o, { xray_protocol = "shadowsocks", x_ss_encrypt_method = "xchacha20-poly1305" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks", [option_name("x_ss_encrypt_method")] = "xchacha20-poly1305" })
o = s:option(Flag, "uot", translate("UDP over TCP"), translate("Need Xray-core or sing-box as server side.")) o = s:option(Flag, option_name("uot"), translate("UDP over TCP"), translate("Need Xray-core or sing-box as server side."))
add_xray_depends(o, { xray_protocol = "shadowsocks", x_ss_encrypt_method = "2022-blake3-aes-128-gcm" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks", [option_name("x_ss_encrypt_method")] = "2022-blake3-aes-128-gcm" })
add_xray_depends(o, { xray_protocol = "shadowsocks", x_ss_encrypt_method = "2022-blake3-aes-256-gcm" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks", [option_name("x_ss_encrypt_method")] = "2022-blake3-aes-256-gcm" })
add_xray_depends(o, { xray_protocol = "shadowsocks", x_ss_encrypt_method = "2022-blake3-chacha20-poly1305" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks", [option_name("x_ss_encrypt_method")] = "2022-blake3-chacha20-poly1305" })
o = s:option(Value, "xray_uuid", translate("ID")) o = s:option(Value, option_name("uuid"), translate("ID"))
o.password = true o.password = true
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Flag, "xray_tls", translate("TLS")) o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0 o.default = 0
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_tlsflow", translate("flow")) o = s:option(Value, option_name("tlsflow"), translate("flow"))
o.default = "" o.default = ""
o:value("", translate("Disable")) o:value("", translate("Disable"))
o:value("xtls-rprx-vision") o:value("xtls-rprx-vision")
o:value("xtls-rprx-vision-udp443") o:value("xtls-rprx-vision-udp443")
add_xray_depends(o, { xray_protocol = "vless", xray_tls = true, transport = "tcp" }) add_xray_depends(o, { [option_name("protocol")] = "vless", [option_name("tls")] = true, [option_name("transport")] = "tcp" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Flag, "reality", translate("REALITY"), translate("Only recommend to use with VLESS-TCP-XTLS-Vision.")) o = s:option(Flag, option_name("reality"), translate("REALITY"), translate("Only recommend to use with VLESS-TCP-XTLS-Vision."))
o.default = 0 o.default = 0
add_xray_depends(o, { xray_tls = true, transport = "tcp" }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("transport")] = "tcp" })
add_xray_depends(o, { xray_tls = true, transport = "h2" }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("transport")] = "h2" })
add_xray_depends(o, { xray_tls = true, transport = "grpc" }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("transport")] = "grpc" })
o = s:option(ListValue, "alpn", translate("alpn")) o = s:option(ListValue, option_name("alpn"), translate("alpn"))
o.default = "default" o.default = "default"
o:value("default", translate("Default")) o:value("default", translate("Default"))
o:value("h2,http/1.1") o:value("h2,http/1.1")
o:value("h2") o:value("h2")
o:value("http/1.1") o:value("http/1.1")
add_xray_depends(o, { xray_tls = true, reality = false }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("reality")] = false })
add_v2ray_depends(o, { xray_tls = true }) add_v2ray_depends(o, { [option_name("tls")] = true })
-- o = s:option(Value, "minversion", translate("minversion")) -- o = s:option(Value, option_name("minversion"), translate("minversion"))
-- o.default = "1.3" -- o.default = "1.3"
-- o:value("1.3") -- o:value("1.3")
-- add_xray_depends(o, { xray_tls = true }) -- add_xray_depends(o, { [option_name("tls")] = true })
-- add_v2ray_depends(o, { xray_tls = true }) -- add_v2ray_depends(o, { [option_name("tls")] = true })
o = s:option(Value, "xray_tls_serverName", translate("Domain")) o = s:option(Value, option_name("tls_serverName"), translate("Domain"))
add_xray_depends(o, { xray_tls = true }) add_xray_depends(o, { [option_name("tls")] = true })
add_v2ray_depends(o, { xray_tls = true }) add_v2ray_depends(o, { [option_name("tls")] = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Flag, "xray_tls_allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.")) o = s:option(Flag, option_name("tls_allowInsecure"), translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, Certificate validation will be skipped."))
o.default = "0" o.default = "0"
add_xray_depends(o, { xray_tls = true, reality = false }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("reality")] = false })
add_v2ray_depends(o, { xray_tls = true }) add_v2ray_depends(o, { [option_name("tls")] = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_fingerprint", translate("Finger Print"), translate("Avoid using randomized, unless you have to.")) o = s:option(Value, option_name("fingerprint"), translate("Finger Print"), translate("Avoid using randomized, unless you have to."))
o:value("", translate("Disable")) o:value("", translate("Disable"))
o:value("chrome") o:value("chrome")
o:value("firefox") o:value("firefox")
@ -444,23 +424,21 @@ o:value("qq")
o:value("random") o:value("random")
o:value("randomized") o:value("randomized")
o.default = "" o.default = ""
add_xray_depends(o, { xray_tls = true, reality = false }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("reality")] = false })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o.remove = rm_prefix_remove
-- [[ REALITY部分 ]] -- -- [[ REALITY部分 ]] --
o = s:option(Value, "reality_publicKey", translate("Public Key")) o = s:option(Value, option_name("reality_publicKey"), translate("Public Key"))
add_xray_depends(o, { xray_tls = true, reality = true }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("reality")] = true })
o = s:option(Value, "reality_shortId", translate("Short Id")) o = s:option(Value, option_name("reality_shortId"), translate("Short Id"))
add_xray_depends(o, { xray_tls = true, reality = true }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("reality")] = true })
o = s:option(Value, "reality_spiderX", translate("Spider X")) o = s:option(Value, option_name("reality_spiderX"), translate("Spider X"))
o.placeholder = "/" o.placeholder = "/"
add_xray_depends(o, { xray_tls = true, reality = true }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("reality")] = true })
o = s:option(Value, "reality_fingerprint", translate("Finger Print"), translate("Avoid using randomized, unless you have to.")) o = s:option(Value, option_name("reality_fingerprint"), translate("Finger Print"), translate("Avoid using randomized, unless you have to."))
o.not_rewrite = true
o:value("chrome") o:value("chrome")
o:value("firefox") o:value("firefox")
o:value("safari") o:value("safari")
@ -472,15 +450,17 @@ o:value("qq")
o:value("random") o:value("random")
o:value("randomized") o:value("randomized")
o.default = "chrome" o.default = "chrome"
add_xray_depends(o, { xray_tls = true, reality = true }) add_xray_depends(o, { [option_name("tls")] = true, [option_name("reality")] = true })
function o.cfgvalue(self, section) function o.cfgvalue(self, section)
return m:get(section, "fingerprint") return m:get(section, "fingerprint")
end end
function o.write(self, section, value) function o.write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" or s.fields["type"]:formvalue(arg[1]) == "V2ray" then
m:set(section, "fingerprint", value) m:set(section, "fingerprint", value)
end end
end
o = s:option(ListValue, "transport", translate("Transport")) o = s:option(ListValue, option_name("transport"), translate("Transport"))
o:value("tcp", "TCP") o:value("tcp", "TCP")
o:value("mkcp", "mKCP") o:value("mkcp", "mKCP")
o:value("ws", "WebSocket") o:value("ws", "WebSocket")
@ -488,254 +468,252 @@ o:value("h2", "HTTP/2")
o:value("ds", "DomainSocket") o:value("ds", "DomainSocket")
o:value("quic", "QUIC") o:value("quic", "QUIC")
o:value("grpc", "gRPC") o:value("grpc", "gRPC")
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
--[[ --[[
o = s:option(ListValue, "ss_transport", translate("Transport")) o = s:option(ListValue, option_name("ss_transport"), translate("Transport"))
o:value("ws", "WebSocket") o:value("ws", "WebSocket")
o:value("h2", "HTTP/2") o:value("h2", "HTTP/2")
o:value("h2+ws", "HTTP/2 & WebSocket") o:value("h2+ws", "HTTP/2 & WebSocket")
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
]]-- ]]--
o = s:option(Value, "wireguard_public_key", translate("Public Key")) o = s:option(Value, option_name("wireguard_public_key"), translate("Public Key"))
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
o = s:option(Value, "wireguard_secret_key", translate("Private Key")) o = s:option(Value, option_name("wireguard_secret_key"), translate("Private Key"))
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
o = s:option(Value, "wireguard_preSharedKey", translate("Pre shared key")) o = s:option(Value, option_name("wireguard_preSharedKey"), translate("Pre shared key"))
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
o = s:option(DynamicList, "wireguard_local_address", translate("Local Address")) o = s:option(DynamicList, option_name("wireguard_local_address"), translate("Local Address"))
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
o = s:option(Value, "wireguard_mtu", translate("MTU")) o = s:option(Value, option_name("wireguard_mtu"), translate("MTU"))
o.default = "1420" o.default = "1420"
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
if api.compare_versions(api.get_app_version("xray"), ">=", "1.8.0") then if api.compare_versions(api.get_app_version("xray"), ">=", "1.8.0") then
o = s:option(Value, "wireguard_reserved", translate("Reserved"), translate("Decimal numbers separated by \",\" or Base64-encoded strings.")) o = s:option(Value, option_name("wireguard_reserved"), translate("Reserved"), translate("Decimal numbers separated by \",\" or Base64-encoded strings."))
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
end end
o = s:option(Value, "wireguard_keepAlive", translate("Keep Alive")) o = s:option(Value, option_name("wireguard_keepAlive"), translate("Keep Alive"))
o.default = "0" o.default = "0"
add_xray_depends(o, { xray_protocol = "wireguard" }) add_xray_depends(o, { [option_name("protocol")] = "wireguard" })
-- [[ TCP部分 ]]-- -- [[ TCP部分 ]]--
-- TCP伪装 -- TCP伪装
o = s:option(ListValue, "tcp_guise", translate("Camouflage Type")) o = s:option(ListValue, option_name("tcp_guise"), translate("Camouflage Type"))
o:value("none", "none") o:value("none", "none")
o:value("http", "http") o:value("http", "http")
add_xray_depends(o, { transport = "tcp" }) add_xray_depends(o, { [option_name("transport")] = "tcp" })
add_v2ray_depends(o, { transport = "tcp" }) add_v2ray_depends(o, { [option_name("transport")] = "tcp" })
-- HTTP域名 -- HTTP域名
o = s:option(DynamicList, "tcp_guise_http_host", translate("HTTP Host")) o = s:option(DynamicList, option_name("tcp_guise_http_host"), translate("HTTP Host"))
add_xray_depends(o, { tcp_guise = "http" }) add_xray_depends(o, { [option_name("tcp_guise")] = "http" })
add_v2ray_depends(o, { tcp_guise = "http" }) add_v2ray_depends(o, { [option_name("tcp_guise")] = "http" })
-- HTTP路径 -- HTTP路径
o = s:option(DynamicList, "tcp_guise_http_path", translate("HTTP Path")) o = s:option(DynamicList, option_name("tcp_guise_http_path"), translate("HTTP Path"))
o.placeholder = "/" o.placeholder = "/"
add_xray_depends(o, { tcp_guise = "http" }) add_xray_depends(o, { [option_name("tcp_guise")] = "http" })
add_v2ray_depends(o, { tcp_guise = "http" }) add_v2ray_depends(o, { [option_name("tcp_guise")] = "http" })
-- [[ mKCP部分 ]]-- -- [[ mKCP部分 ]]--
o = s:option(ListValue, "mkcp_guise", translate("Camouflage Type"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)')) o = s:option(ListValue, option_name("mkcp_guise"), translate("Camouflage Type"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)'))
for a, t in ipairs(header_type_list) do o:value(t) end for a, t in ipairs(header_type_list) do o:value(t) end
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_mtu", translate("KCP MTU")) o = s:option(Value, option_name("mkcp_mtu"), translate("KCP MTU"))
o.default = "1350" o.default = "1350"
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_tti", translate("KCP TTI")) o = s:option(Value, option_name("mkcp_tti"), translate("KCP TTI"))
o.default = "20" o.default = "20"
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_uplinkCapacity", translate("KCP uplinkCapacity")) o = s:option(Value, option_name("mkcp_uplinkCapacity"), translate("KCP uplinkCapacity"))
o.default = "5" o.default = "5"
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_downlinkCapacity", translate("KCP downlinkCapacity")) o = s:option(Value, option_name("mkcp_downlinkCapacity"), translate("KCP downlinkCapacity"))
o.default = "20" o.default = "20"
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Flag, "mkcp_congestion", translate("KCP Congestion")) o = s:option(Flag, option_name("mkcp_congestion"), translate("KCP Congestion"))
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_readBufferSize", translate("KCP readBufferSize")) o = s:option(Value, option_name("mkcp_readBufferSize"), translate("KCP readBufferSize"))
o.default = "1" o.default = "1"
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_writeBufferSize", translate("KCP writeBufferSize")) o = s:option(Value, option_name("mkcp_writeBufferSize"), translate("KCP writeBufferSize"))
o.default = "1" o.default = "1"
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_seed", translate("KCP Seed")) o = s:option(Value, option_name("mkcp_seed"), translate("KCP Seed"))
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
-- [[ WebSocket部分 ]]-- -- [[ WebSocket部分 ]]--
o = s:option(Value, "xray_ws_host", translate("WebSocket Host")) o = s:option(Value, option_name("ws_host"), translate("WebSocket Host"))
add_xray_depends(o, { transport = "ws" }) add_xray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { ss_transport = "ws" }) add_xray_depends(o, { [option_name("ss_transport")] = "ws" })
add_v2ray_depends(o, { transport = "ws" }) add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_v2ray_depends(o, { ss_transport = "ws" }) add_v2ray_depends(o, { [option_name("ss_transport")] = "ws" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_ws_path", translate("WebSocket Path")) o = s:option(Value, option_name("ws_path"), translate("WebSocket Path"))
o.placeholder = "/" o.placeholder = "/"
add_xray_depends(o, { transport = "ws" }) add_xray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { ss_transport = "ws" }) add_xray_depends(o, { [option_name("ss_transport")] = "ws" })
add_v2ray_depends(o, { transport = "ws" }) add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_v2ray_depends(o, { ss_transport = "ws" }) add_v2ray_depends(o, { [option_name("ss_transport")] = "ws" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Flag, "ws_enableEarlyData", translate("Enable early data")) o = s:option(Flag, "v2ray_ws_enableEarlyData", translate("Enable early data"))
add_v2ray_depends(o, { transport = "ws" }) add_v2ray_depends(o, { [option_name("transport")] = "ws" })
o = s:option(Value, "ws_maxEarlyData", translate("Early data length")) o = s:option(Value, "v2ray_ws_maxEarlyData", translate("Early data length"))
o.default = "1024" o.default = "1024"
add_v2ray_depends(o, { ws_enableEarlyData = true }) add_v2ray_depends(o, { v2ray_ws_enableEarlyData = true })
o = s:option(Value, "ws_earlyDataHeaderName", translate("Early data header name"), translate("Recommended value: Sec-WebSocket-Protocol")) o = s:option(Value, "v2ray_ws_earlyDataHeaderName", translate("Early data header name"), translate("Recommended value: Sec-WebSocket-Protocol"))
add_v2ray_depends(o, { ws_enableEarlyData = true }) add_v2ray_depends(o, { v2ray_ws_enableEarlyData = true })
-- [[ HTTP/2部分 ]]-- -- [[ HTTP/2部分 ]]--
o = s:option(Value, "xray_h2_host", translate("HTTP/2 Host")) o = s:option(Value, option_name("h2_host"), translate("HTTP/2 Host"))
add_xray_depends(o, { transport = "h2" }) add_xray_depends(o, { [option_name("transport")] = "h2" })
add_xray_depends(o, { ss_transport = "h2" }) add_xray_depends(o, { [option_name("ss_transport")] = "h2" })
add_v2ray_depends(o, { transport = "h2" }) add_v2ray_depends(o, { [option_name("transport")] = "h2" })
add_v2ray_depends(o, { ss_transport = "h2" }) add_v2ray_depends(o, { [option_name("ss_transport")] = "h2" })
o = s:option(Value, "xray_h2_path", translate("HTTP/2 Path")) o = s:option(Value, option_name("h2_path"), translate("HTTP/2 Path"))
o.placeholder = "/" o.placeholder = "/"
add_xray_depends(o, { transport = "h2" }) add_xray_depends(o, { [option_name("transport")] = "h2" })
add_xray_depends(o, { ss_transport = "h2" }) add_xray_depends(o, { [option_name("ss_transport")] = "h2" })
add_v2ray_depends(o, { transport = "h2" }) add_v2ray_depends(o, { [option_name("transport")] = "h2" })
add_v2ray_depends(o, { ss_transport = "h2" }) add_v2ray_depends(o, { [option_name("ss_transport")] = "h2" })
o = s:option(Flag, "h2_health_check", translate("Health check")) o = s:option(Flag, option_name("h2_health_check"), translate("Health check"))
add_xray_depends(o, { transport = "h2" }) add_xray_depends(o, { [option_name("transport")] = "h2" })
o = s:option(Value, "h2_read_idle_timeout", translate("Idle timeout")) o = s:option(Value, option_name("h2_read_idle_timeout"), translate("Idle timeout"))
o.default = "10" o.default = "10"
add_xray_depends(o, { h2_health_check = true }) add_xray_depends(o, { [option_name("h2_health_check")] = true })
o = s:option(Value, "h2_health_check_timeout", translate("Health check timeout")) o = s:option(Value, option_name("h2_health_check_timeout"), translate("Health check timeout"))
o.default = "15" o.default = "15"
add_xray_depends(o, { h2_health_check = true }) add_xray_depends(o, { [option_name("h2_health_check")] = true })
-- [[ DomainSocket部分 ]]-- -- [[ DomainSocket部分 ]]--
o = s:option(Value, "ds_path", "Path", translate("A legal file path. This file must not exist before running.")) o = s:option(Value, option_name("ds_path"), "Path", translate("A legal file path. This file must not exist before running."))
add_xray_depends(o, { transport = "ds" }) add_xray_depends(o, { [option_name("transport")] = "ds" })
add_v2ray_depends(o, { transport = "ds" }) add_v2ray_depends(o, { [option_name("transport")] = "ds" })
-- [[ QUIC部分 ]]-- -- [[ QUIC部分 ]]--
o = s:option(ListValue, "quic_security", translate("Encrypt Method")) o = s:option(ListValue, option_name("quic_security"), translate("Encrypt Method"))
o:value("none") o:value("none")
o:value("aes-128-gcm") o:value("aes-128-gcm")
o:value("chacha20-poly1305") o:value("chacha20-poly1305")
add_xray_depends(o, { transport = "quic" }) add_xray_depends(o, { [option_name("transport")] = "quic" })
add_v2ray_depends(o, { transport = "quic" }) add_v2ray_depends(o, { [option_name("transport")] = "quic" })
o = s:option(Value, "quic_key", translate("Encrypt Method") .. translate("Key")) o = s:option(Value, option_name("quic_key"), translate("Encrypt Method") .. translate("Key"))
add_xray_depends(o, { transport = "quic" }) add_xray_depends(o, { [option_name("transport")] = "quic" })
add_v2ray_depends(o, { transport = "quic" }) add_v2ray_depends(o, { [option_name("transport")] = "quic" })
o = s:option(ListValue, "quic_guise", translate("Camouflage Type")) o = s:option(ListValue, option_name("quic_guise"), translate("Camouflage Type"))
for a, t in ipairs(header_type_list) do o:value(t) end for a, t in ipairs(header_type_list) do o:value(t) end
add_xray_depends(o, { transport = "quic" }) add_xray_depends(o, { [option_name("transport")] = "quic" })
add_v2ray_depends(o, { transport = "quic" }) add_v2ray_depends(o, { [option_name("transport")] = "quic" })
-- [[ gRPC部分 ]]-- -- [[ gRPC部分 ]]--
o = s:option(Value, "grpc_serviceName", "ServiceName") o = s:option(Value, option_name("grpc_serviceName"), "ServiceName")
add_xray_depends(o, { transport = "grpc" }) add_xray_depends(o, { [option_name("transport")] = "grpc" })
add_v2ray_depends(o, { transport = "grpc" }) add_v2ray_depends(o, { [option_name("transport")] = "grpc" })
o = s:option(ListValue, "grpc_mode", "gRPC " .. translate("Transfer mode")) o = s:option(ListValue, option_name("grpc_mode"), "gRPC " .. translate("Transfer mode"))
o:value("gun") o:value("gun")
o:value("multi") o:value("multi")
add_xray_depends(o, { transport = "grpc" }) add_xray_depends(o, { [option_name("transport")] = "grpc" })
o = s:option(Flag, "grpc_health_check", translate("Health check")) o = s:option(Flag, option_name("grpc_health_check"), translate("Health check"))
add_xray_depends(o, { transport = "grpc" }) add_xray_depends(o, { [option_name("transport")] = "grpc" })
o = s:option(Value, "grpc_idle_timeout", translate("Idle timeout")) o = s:option(Value, option_name("grpc_idle_timeout"), translate("Idle timeout"))
o.default = "10" o.default = "10"
add_xray_depends(o, { grpc_health_check = true }) add_xray_depends(o, { [option_name("grpc_health_check")] = true })
o = s:option(Value, "grpc_health_check_timeout", translate("Health check timeout")) o = s:option(Value, option_name("grpc_health_check_timeout"), translate("Health check timeout"))
o.default = "20" o.default = "20"
add_xray_depends(o, { grpc_health_check = true }) add_xray_depends(o, { [option_name("grpc_health_check")] = true })
o = s:option(Flag, "grpc_permit_without_stream", translate("Permit without stream")) o = s:option(Flag, option_name("grpc_permit_without_stream"), translate("Permit without stream"))
o.default = "0" o.default = "0"
add_xray_depends(o, { grpc_health_check = true }) add_xray_depends(o, { [option_name("grpc_health_check")] = true })
o = s:option(Value, "grpc_initial_windows_size", translate("Initial Windows Size")) o = s:option(Value, option_name("grpc_initial_windows_size"), translate("Initial Windows Size"))
o.default = "0" o.default = "0"
add_xray_depends(o, { transport = "grpc" }) add_xray_depends(o, { [option_name("transport")] = "grpc" })
-- [[ Mux ]]-- -- [[ Mux ]]--
o = s:option(Flag, "mux", translate("Mux")) o = s:option(Flag, option_name("mux"), translate("Mux"))
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "http" }) add_v2ray_depends(o, { [option_name("protocol")] = "http" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless", xray_tlsflow = "" }) add_xray_depends(o, { [option_name("protocol")] = "vless", [option_name("tlsflow")] = "" })
add_xray_depends(o, { xray_protocol = "http" }) add_xray_depends(o, { [option_name("protocol")] = "http" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
o = s:option(Value, "mux_concurrency", translate("Mux concurrency")) o = s:option(Value, option_name("mux_concurrency"), translate("Mux concurrency"))
o.default = 8 o.default = 8
add_xray_depends(o, { mux = true }) add_xray_depends(o, { [option_name("mux")] = true })
add_v2ray_depends(o, { mux = true }) add_v2ray_depends(o, { [option_name("mux")] = true })
-- [[ XUDP Mux ]]-- -- [[ XUDP Mux ]]--
o = s:option(Flag, "xmux", translate("xMux")) o = s:option(Flag, option_name("xmux"), translate("xMux"))
o.default = 1 o.default = 1
add_xray_depends(o, { xray_protocol = "vless", xray_tlsflow = "xtls-rprx-vision" }) add_xray_depends(o, { [option_name("protocol")] = "vless", [option_name("tlsflow")] = "xtls-rprx-vision" })
add_xray_depends(o, { xray_protocol = "vless", xray_tlsflow = "xtls-rprx-vision-udp443" }) add_xray_depends(o, { [option_name("protocol")] = "vless", [option_name("tlsflow")] = "xtls-rprx-vision-udp443" })
o = s:option(Value, "xudp_concurrency", translate("XUDP Mux concurrency")) o = s:option(Value, option_name("xudp_concurrency"), translate("XUDP Mux concurrency"))
o.default = 8 o.default = 8
add_xray_depends(o, { xmux = true }) add_xray_depends(o, { [option_name("xmux")] = true })
s.fields["xray_protocol"].validate = function(self, value) for key, value in pairs(s.fields) do
if value == "_shunt" or value == "_balancing" then if key:find(option_prefix) == 1 then
s.fields["xray_address"].rmempty = true if not s.fields[key].not_rewrite then
s.fields["xray_port"].rmempty = true s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end
end end
return value
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("sslocal") then
return return
end end
local type_name = "SS-Rust"
local option_prefix = "ssrust_" local option_prefix = "ssrust_"
local function option_name(name) local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
local ssrust_encrypt_method_list = { local ssrust_encrypt_method_list = {
"plain", "none", "plain", "none",
@ -31,52 +42,53 @@ local ssrust_encrypt_method_list = {
-- [[ Shadowsocks Rust ]] -- [[ Shadowsocks Rust ]]
s.fields["type"]:value("SS-Rust", translate("Shadowsocks Rust")) s.fields["type"]:value(type_name, translate("Shadowsocks Rust"))
o = s:option(Value, "ssrust_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
o = s:option(Value, "ssrust_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "ssrust_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
o = s:option(Value, "ssrust_method", translate("Encrypt Method")) o = s:option(Value, option_name("method"), translate("Encrypt Method"))
for a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end for a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end
o = s:option(Value, "ssrust_timeout", translate("Connection Timeout")) o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 300 o.default = 300
o = s:option(ListValue, "ssrust_tcp_fast_open", "TCP " .. translate("Fast Open"), translate("Need node support required")) o = s:option(ListValue, option_name("tcp_fast_open"), "TCP " .. translate("Fast Open"), translate("Need node support required"))
o:value("false") o:value("false")
o:value("true") o:value("true")
o = s:option(ListValue, "ssrust_plugin", translate("plugin")) o = s:option(ListValue, option_name("plugin"), translate("plugin"))
o:value("none", translate("none")) o:value("none", translate("none"))
if api.is_finded("xray-plugin") then o:value("xray-plugin") end if api.is_finded("xray-plugin") then o:value("xray-plugin") end
if api.is_finded("v2ray-plugin") then o:value("v2ray-plugin") end if api.is_finded("v2ray-plugin") then o:value("v2ray-plugin") end
if api.is_finded("obfs-local") then o:value("obfs-local") end if api.is_finded("obfs-local") then o:value("obfs-local") end
o = s:option(Value, "ssrust_plugin_opts", translate("opts")) o = s:option(Value, option_name("plugin_opts"), translate("opts"))
o:depends({ ssrust_plugin = "xray-plugin"}) o:depends({ [option_name("plugin")] = "xray-plugin"})
o:depends({ ssrust_plugin = "v2ray-plugin"}) o:depends({ [option_name("plugin")] = "v2ray-plugin"})
o:depends({ ssrust_plugin = "obfs-local"}) o:depends({ [option_name("plugin")] = "obfs-local"})
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "SS-Rust" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "SS-Rust" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -2,10 +2,12 @@ local m, s = ...
local api = require "luci.passwall2.api" local api = require "luci.passwall2.api"
if not api.is_finded("ss-redir") then if not api.is_finded("ss-local") then
return return
end end
local type_name = "SS"
local option_prefix = "ss_" local option_prefix = "ss_"
local function option_name(name) local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
local ss_encrypt_method_list = { local ss_encrypt_method_list = {
"rc4-md5", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr", "rc4-md5", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr",
@ -32,52 +43,53 @@ local ss_encrypt_method_list = {
-- [[ Shadowsocks Libev ]] -- [[ Shadowsocks Libev ]]
s.fields["type"]:value("SS", translate("Shadowsocks Libev")) s.fields["type"]:value(type_name, translate("Shadowsocks Libev"))
o = s:option(Value, "ss_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
o = s:option(Value, "ss_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "ss_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
o = s:option(Value, "ss_method", translate("Encrypt Method")) o = s:option(Value, option_name("method"), translate("Encrypt Method"))
for a, t in ipairs(ss_encrypt_method_list) do o:value(t) end for a, t in ipairs(ss_encrypt_method_list) do o:value(t) end
o = s:option(Value, "ss_timeout", translate("Connection Timeout")) o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 300 o.default = 300
o = s:option(ListValue, "ss_tcp_fast_open", "TCP " .. translate("Fast Open"), translate("Need node support required")) o = s:option(ListValue, option_name("tcp_fast_open"), "TCP " .. translate("Fast Open"), translate("Need node support required"))
o:value("false") o:value("false")
o:value("true") o:value("true")
o = s:option(ListValue, "ss_plugin", translate("plugin")) o = s:option(ListValue, option_name("plugin"), translate("plugin"))
o:value("none", translate("none")) o:value("none", translate("none"))
if api.is_finded("xray-plugin") then o:value("xray-plugin") end if api.is_finded("xray-plugin") then o:value("xray-plugin") end
if api.is_finded("v2ray-plugin") then o:value("v2ray-plugin") end if api.is_finded("v2ray-plugin") then o:value("v2ray-plugin") end
if api.is_finded("obfs-local") then o:value("obfs-local") end if api.is_finded("obfs-local") then o:value("obfs-local") end
o = s:option(Value, "ss_plugin_opts", translate("opts")) o = s:option(Value, option_name("plugin_opts"), translate("opts"))
o:depends({ ss_plugin = "xray-plugin"}) o:depends({ [option_name("plugin")] = "xray-plugin"})
o:depends({ ss_plugin = "v2ray-plugin"}) o:depends({ [option_name("plugin")] = "v2ray-plugin"})
o:depends({ ss_plugin = "obfs-local"}) o:depends({ [option_name("plugin")] = "obfs-local"})
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "SS" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "SS" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -2,10 +2,12 @@ local m, s = ...
local api = require "luci.passwall2.api" local api = require "luci.passwall2.api"
if not api.is_finded("ssr-redir") then if not api.is_finded("ssr-local") then
return return
end end
local type_name = "SSR"
local option_prefix = "ssr_" local option_prefix = "ssr_"
local function option_name(name) local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
local ssr_encrypt_method_list = { local ssr_encrypt_method_list = {
"none", "table", "rc2-cfb", "rc4", "rc4-md5", "rc4-md5-6", "aes-128-cfb", "none", "table", "rc2-cfb", "rc4", "rc4-md5", "rc4-md5-6", "aes-128-cfb",
@ -44,34 +55,34 @@ local ssr_obfs_list = {
-- [[ ShadowsocksR Libev ]] -- [[ ShadowsocksR Libev ]]
s.fields["type"]:value("SSR", translate("ShadowsocksR Libev")) s.fields["type"]:value(type_name, translate("ShadowsocksR Libev"))
o = s:option(Value, "ssr_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
o = s:option(Value, "ssr_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "ssr_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
o = s:option(ListValue, "ssr_method", translate("Encrypt Method")) o = s:option(ListValue, option_name("method"), translate("Encrypt Method"))
for a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end for a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end
o = s:option(ListValue, "ssr_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
for a, t in ipairs(ssr_protocol_list) do o:value(t) end for a, t in ipairs(ssr_protocol_list) do o:value(t) end
o = s:option(Value, "ssr_protocol_param", translate("Protocol_param")) o = s:option(Value, option_name("protocol_param"), translate("Protocol_param"))
o = s:option(ListValue, "ssr_obfs", translate("Obfs")) o = s:option(ListValue, option_name("obfs"), translate("Obfs"))
for a, t in ipairs(ssr_obfs_list) do o:value(t) end for a, t in ipairs(ssr_obfs_list) do o:value(t) end
o = s:option(Value, "ssr_obfs_param", translate("Obfs_param")) o = s:option(Value, option_name("obfs_param"), translate("Obfs_param"))
o = s:option(Value, "ssr_timeout", translate("Connection Timeout")) o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 300 o.default = 300
o = s:option(ListValue, "ssr_tcp_fast_open", "TCP " .. translate("Fast Open"), translate("Need node support required")) o = s:option(ListValue, option_name("tcp_fast_open"), "TCP " .. translate("Fast Open"), translate("Need node support required"))
o:value("false") o:value("false")
o:value("true") o:value("true")
@ -80,15 +91,16 @@ for key, value in pairs(s.fields) do
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "SSR" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "SSR" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("tuic-client") then
return return
end end
local type_name = "TUIC"
local option_prefix = "tuic_" local option_prefix = "tuic_"
local function option_name(name) local function option_name(name)
@ -18,25 +20,34 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
-- [[ TUIC ]] -- [[ TUIC ]]
s.fields["type"]:value("TUIC", translate("TUIC")) s.fields["type"]:value(type_name, translate("TUIC"))
o = s:option(Value, "tuic_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("address"), translate("Address (Support Domain Name)"))
o = s:option(Value, "tuic_port", translate("Port")) o = s:option(Value, option_name("port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "tuic_uuid", translate("ID")) o = s:option(Value, option_name("uuid"), translate("ID"))
o.password = true o.password = true
-- Tuic Password for remote server connect -- Tuic Password for remote server connect
o = s:option(Value, "tuic_password", translate("TUIC User Password For Connect Remote Server")) o = s:option(Value, option_name("password"), translate("TUIC User Password For Connect Remote Server"))
o.password = true o.password = true
o.rmempty = true o.rmempty = true
o.default = "" o.default = ""
@ -44,32 +55,32 @@ o.not_rewrite = true
--[[ --[[
-- Tuic username for local socks connect -- Tuic username for local socks connect
o = s:option(Value, "tuic_socks_username", translate("TUIC UserName For Local Socks")) o = s:option(Value, option_name("socks_username"), translate("TUIC UserName For Local Socks"))
o.rmempty = true o.rmempty = true
o.default = "" o.default = ""
o.not_rewrite = true o.not_rewrite = true
-- Tuic Password for local socks connect -- Tuic Password for local socks connect
o = s:option(Value, "tuic_socks_password", translate("TUIC Password For Local Socks")) o = s:option(Value, option_name("socks_password"), translate("TUIC Password For Local Socks"))
o.password = true o.password = true
o.rmempty = true o.rmempty = true
o.default = "" o.default = ""
o.not_rewrite = true o.not_rewrite = true
--]] --]]
o = s:option(Value, "tuic_ip", translate("Set the TUIC proxy server ip address")) o = s:option(Value, option_name("ip"), translate("Set the TUIC proxy server ip address"))
o.datatype = "ipaddr" o.datatype = "ipaddr"
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(ListValue, "tuic_udp_relay_mode", translate("UDP relay mode")) o = s:option(ListValue, option_name("udp_relay_mode"), translate("UDP relay mode"))
o:value("native", translate("native")) o:value("native", translate("native"))
o:value("quic", translate("QUIC")) o:value("quic", translate("QUIC"))
o.default = "native" o.default = "native"
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(ListValue, "tuic_congestion_control", translate("Congestion control algorithm")) o = s:option(ListValue, option_name("congestion_control"), translate("Congestion control algorithm"))
o:value("bbr", translate("BBR")) o:value("bbr", translate("BBR"))
o:value("cubic", translate("CUBIC")) o:value("cubic", translate("CUBIC"))
o:value("new_reno", translate("New Reno")) o:value("new_reno", translate("New Reno"))
@ -77,65 +88,65 @@ o.default = "cubic"
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "tuic_heartbeat", translate("Heartbeat interval(second)")) o = s:option(Value, option_name("heartbeat"), translate("Heartbeat interval(second)"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = "3" o.default = "3"
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "tuic_timeout", translate("Timeout for establishing a connection to server(second)")) o = s:option(Value, option_name("timeout"), translate("Timeout for establishing a connection to server(second)"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = "8" o.default = "8"
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "tuic_gc_interval", translate("Garbage collection interval(second)")) o = s:option(Value, option_name("gc_interval"), translate("Garbage collection interval(second)"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = "3" o.default = "3"
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "tuic_gc_lifetime", translate("Garbage collection lifetime(second)")) o = s:option(Value, option_name("gc_lifetime"), translate("Garbage collection lifetime(second)"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = "15" o.default = "15"
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "tuic_send_window", translate("TUIC send window")) o = s:option(Value, option_name("send_window"), translate("TUIC send window"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 20971520 o.default = 20971520
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "tuic_receive_window", translate("TUIC receive window")) o = s:option(Value, option_name("receive_window"), translate("TUIC receive window"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 10485760 o.default = 10485760
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "tuic_max_package_size", translate("TUIC Maximum packet size the socks5 server can receive from external, in bytes")) o = s:option(Value, option_name("max_package_size"), translate("TUIC Maximum packet size the socks5 server can receive from external, in bytes"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 1500 o.default = 1500
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
--Tuic settings for the local inbound socks5 server --Tuic settings for the local inbound socks5 server
o = s:option(Flag, "tuic_dual_stack", translate("Set if the listening socket should be dual-stack")) o = s:option(Flag, option_name("dual_stack"), translate("Set if the listening socket should be dual-stack"))
o.default = 0 o.default = 0
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "tuic_disable_sni", translate("Disable SNI")) o = s:option(Flag, option_name("disable_sni"), translate("Disable SNI"))
o.default = 0 o.default = 0
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "tuic_zero_rtt_handshake", translate("Enable 0-RTT QUIC handshake")) o = s:option(Flag, option_name("zero_rtt_handshake"), translate("Enable 0-RTT QUIC handshake"))
o.default = 0 o.default = 0
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
o = s:option(DynamicList, "tuic_tls_alpn", translate("TLS ALPN")) o = s:option(DynamicList, option_name("tls_alpn"), translate("TLS ALPN"))
o.rmempty = true o.rmempty = true
o.not_rewrite = true o.not_rewrite = true
@ -144,15 +155,16 @@ for key, value in pairs(s.fields) do
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "TUIC" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "TUIC" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("brook") then
return return
end end
local type_name = "Brook"
local option_prefix = "brook_" local option_prefix = "brook_"
local function option_name(name) local function option_name(name)
@ -18,48 +20,59 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
-- [[ Brook ]] -- [[ Brook ]]
s.fields["type"]:value("Brook", translate("Brook")) s.fields["type"]:value(type_name, translate("Brook"))
o = s:option(Value, "brook_port", translate("Listen Port")) o = s:option(Value, option_name("port"), translate("Listen Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(ListValue, "brook_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("server", "Brook") o:value("server", "Brook")
o:value("wsserver", "WebSocket") o:value("wsserver", "WebSocket")
--o = s:option(Flag, "brook_tls", translate("Use TLS")) --o = s:option(Flag, option_name("tls"), translate("Use TLS"))
--o:depends({ brook_protocol = "wsserver" }) --o:depends({ [option_name("protocol")] = "wsserver" })
o = s:option(Value, "brook_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
o = s:option(Value, "brook_ws_path", translate("WebSocket Path")) o = s:option(Value, option_name("ws_path"), translate("WebSocket Path"))
o:depends({ brook_protocol = "wsserver" }) o:depends({ [option_name("protocol")] = "wsserver" })
o = s:option(Flag, "brook_log", translate("Log")) o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1" o.default = "1"
o.rmempty = false
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "Brook" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "Brook" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("hysteria") then
return return
end end
local type_name = "Hysteria"
local option_prefix = "hysteria_" local option_prefix = "hysteria_"
local function option_name(name) local function option_name(name)
@ -18,67 +20,76 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
-- [[ Hysteria ]] -- [[ Hysteria ]]
s.fields["type"]:value("Hysteria", translate("Hysteria")) s.fields["type"]:value(type_name, translate("Hysteria"))
o = s:option(Value, "hysteria_port", translate("Listen Port")) o = s:option(Value, option_name("port"), translate("Listen Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(ListValue, "hysteria_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("udp", "UDP") o:value("udp", "UDP")
o:value("faketcp", "faketcp") o:value("faketcp", "faketcp")
o:value("wechat-video", "wechat-video") o:value("wechat-video", "wechat-video")
o = s:option(Value, "hysteria_obfs", translate("Obfs Password")) o = s:option(Value, option_name("obfs"), translate("Obfs Password"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(ListValue, "hysteria_auth_type", translate("Auth Type")) o = s:option(ListValue, option_name("auth_type"), translate("Auth Type"))
o:value("disable", translate("Disable")) o:value("disable", translate("Disable"))
o:value("string", translate("STRING")) o:value("string", translate("STRING"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_auth_password", translate("Auth Password")) o = s:option(Value, option_name("auth_password"), translate("Auth Password"))
o.password = true o.password = true
o:depends({ hysteria_auth_type = "string" }) o:depends({ [option_name("auth_type")] = "string" })
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_alpn", translate("QUIC TLS ALPN")) o = s:option(Value, option_name("alpn"), translate("QUIC TLS ALPN"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "hysteria_udp", translate("UDP")) o = s:option(Flag, option_name("udp"), translate("UDP"))
o.default = "1" o.default = "1"
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_up_mbps", translate("Max upload Mbps")) o = s:option(Value, option_name("up_mbps"), translate("Max upload Mbps"))
o.default = "10" o.default = "10"
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_down_mbps", translate("Max download Mbps")) o = s:option(Value, option_name("down_mbps"), translate("Max download Mbps"))
o.default = "50" o.default = "50"
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_recv_window_conn", translate("QUIC stream receive window")) o = s:option(Value, option_name("recv_window_conn"), translate("QUIC stream receive window"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Value, "hysteria_recv_window", translate("QUIC connection receive window")) o = s:option(Value, option_name("recv_window"), translate("QUIC connection receive window"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "hysteria_disable_mtu_discovery", translate("Disable MTU detection")) o = s:option(Flag, option_name("disable_mtu_discovery"), translate("Disable MTU detection"))
o.not_rewrite = true o.not_rewrite = true
o = s:option(Flag, "hysteria_tls", translate("TLS")) o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0 o.default = 0
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value then if value then
if value == "1" then if value == "1" then
local ca = s.fields["hysteria_tls_certificateFile"]:formvalue(t) or "" local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or ""
local key = s.fields["hysteria_tls_keyFile"]:formvalue(t) or "" local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or ""
if ca == "" or key == "" then if ca == "" or key == "" then
return nil, translate("Public key and Private key path can not be empty!") return nil, translate("Public key and Private key path can not be empty!")
end end
@ -87,9 +98,9 @@ o.validate = function(self, value, t)
end end
end end
o = s:option(FileUpload, "hysteria_tls_certificateFile", translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem") o = s:option(FileUpload, option_name("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem")
o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem" o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem"
o:depends({ hysteria_tls = true }) o:depends({ [option_name("tls")] = true })
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value and value ~= "" then if value and value ~= "" then
if not nixio.fs.access(value) then if not nixio.fs.access(value) then
@ -101,9 +112,9 @@ o.validate = function(self, value, t)
return nil return nil
end end
o = s:option(FileUpload, "hysteria_tls_keyFile", translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key") o = s:option(FileUpload, option_name("tls_keyFile"), translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key")
o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key" o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key"
o:depends({ hysteria_tls = true }) o:depends({ [option_name("tls")] = true })
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value and value ~= "" then if value and value ~= "" then
if not nixio.fs.access(value) then if not nixio.fs.access(value) then
@ -115,23 +126,25 @@ o.validate = function(self, value, t)
return nil return nil
end end
o = s:option(Flag, "hysteria_log", translate("Log")) o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1" o.default = "1"
o.rmempty = false
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "Hysteria" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "Hysteria" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -18,10 +18,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" or s.fields["type"]:formvalue(arg[1]) == "V2ray" then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" or s.fields["type"]:formvalue(arg[1]) == "V2ray" then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
local function add_xray_depends(o, field, value) local function add_xray_depends(o, field, value)
local deps = { type = "Xray" } local deps = { type = "Xray" }
@ -51,11 +60,11 @@ local function add_v2ray_depends(o, field, value)
o:depends(deps) o:depends(deps)
end end
local v_ss_encrypt_method_list = { local v_ss_method_list = {
"aes-128-gcm", "aes-256-gcm", "chacha20-poly1305" "aes-128-gcm", "aes-256-gcm", "chacha20-poly1305"
} }
local x_ss_encrypt_method_list = { local x_ss_method_list = {
"aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "xchacha20-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305" "aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "xchacha20-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
} }
@ -72,7 +81,7 @@ if api.is_finded("xray") then
s.fields["type"]:value("Xray", translate("Xray")) s.fields["type"]:value("Xray", translate("Xray"))
end end
o = s:option(ListValue, "xray_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("vmess", "Vmess") o:value("vmess", "Vmess")
o:value("vless", "VLESS") o:value("vless", "VLESS")
o:value("http", "HTTP") o:value("http", "HTTP")
@ -82,128 +91,122 @@ o:value("trojan", "Trojan")
o:value("dokodemo-door", "dokodemo-door") o:value("dokodemo-door", "dokodemo-door")
add_xray_depends(o) add_xray_depends(o)
add_v2ray_depends(o) add_v2ray_depends(o)
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_port", translate("Listen Port")) o = s:option(Value, option_name("port"), translate("Listen Port"))
o.datatype = "port" o.datatype = "port"
add_xray_depends(o) add_xray_depends(o)
add_v2ray_depends(o) add_v2ray_depends(o)
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Flag, "xray_auth", translate("Auth")) o = s:option(Flag, option_name("auth"), translate("Auth"))
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value and value == "1" then if value and value == "1" then
local user_v = s.fields["xray_username"]:formvalue(t) or "" local user_v = s.fields[option_name("username")]:formvalue(t) or ""
local pass_v = s.fields["xray_password"]:formvalue(t) or "" local pass_v = s.fields[option_name("password")]:formvalue(t) or ""
if user_v == "" or pass_v == "" then if user_v == "" or pass_v == "" then
return nil, translate("Username and Password must be used together!") return nil, translate("Username and Password must be used together!")
end end
end end
return value return value
end end
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "http" }) add_xray_depends(o, { [option_name("protocol")] = "http" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "http" }) add_v2ray_depends(o, { [option_name("protocol")] = "http" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_username", translate("Username")) o = s:option(Value, option_name("username"), translate("Username"))
add_xray_depends(o, { xray_auth = true }) add_xray_depends(o, { [option_name("auth")] = true })
add_v2ray_depends(o, { xray_auth = true }) add_v2ray_depends(o, { [option_name("auth")] = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
add_xray_depends(o, { xray_auth = true }) add_xray_depends(o, { [option_name("auth")] = true })
add_v2ray_depends(o, { xray_auth = true }) add_v2ray_depends(o, { [option_name("auth")] = true })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(ListValue, "d_protocol", translate("Destination protocol")) o = s:option(ListValue, option_name("d_protocol"), translate("Destination protocol"))
o:value("tcp", "TCP") o:value("tcp", "TCP")
o:value("udp", "UDP") o:value("udp", "UDP")
o:value("tcp,udp", "TCP,UDP") o:value("tcp,udp", "TCP,UDP")
add_v2ray_depends(o, { xray_protocol = "dokodemo-door" }) add_v2ray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
add_xray_depends(o, { xray_protocol = "dokodemo-door" }) add_xray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
o = s:option(Value, "d_address", translate("Destination address")) o = s:option(Value, option_name("d_address"), translate("Destination address"))
add_v2ray_depends(o, { xray_protocol = "dokodemo-door" }) add_v2ray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
add_xray_depends(o, { xray_protocol = "dokodemo-door" }) add_xray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
o = s:option(Value, "d_port", translate("Destination port")) o = s:option(Value, option_name("d_port"), translate("Destination port"))
o.datatype = "port" o.datatype = "port"
add_v2ray_depends(o, { xray_protocol = "dokodemo-door" }) add_v2ray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
add_xray_depends(o, { xray_protocol = "dokodemo-door" }) add_xray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
o = s:option(Value, "decryption", translate("Encrypt Method")) o = s:option(Value, option_name("decryption"), translate("Encrypt Method"))
o.default = "none" o.default = "none"
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
o = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method")) o = s:option(ListValue, option_name("v_ss_method"), translate("Encrypt Method"))
for a, t in ipairs(v_ss_encrypt_method_list) do o:value(t) end o.not_rewrite = true
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) for a, t in ipairs(v_ss_method_list) do o:value(t) end
add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
function o.cfgvalue(self, section) function o.cfgvalue(self, section)
return m:get(section, "method") return m:get(section, "method")
end end
function o.write(self, section, value) function o.write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "V2ray" then
m:set(section, "method", value) m:set(section, "method", value)
end end
end
o = s:option(ListValue, "x_ss_encrypt_method", translate("Encrypt Method")) o = s:option(ListValue, option_name("x_ss_method"), translate("Encrypt Method"))
for a, t in ipairs(x_ss_encrypt_method_list) do o:value(t) end o.not_rewrite = true
add_xray_depends(o, { xray_protocol = "shadowsocks" }) for a, t in ipairs(x_ss_method_list) do o:value(t) end
add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
function o.cfgvalue(self, section) function o.cfgvalue(self, section)
return m:get(section, "method") return m:get(section, "method")
end end
function o.write(self, section, value) function o.write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" then
m:set(section, "method", value) m:set(section, "method", value)
end end
end
o = s:option(Flag, "iv_check", translate("IV Check")) o = s:option(Flag, option_name("iv_check"), translate("IV Check"))
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
o = s:option(ListValue, "ss_network", translate("Transport")) o = s:option(ListValue, option_name("ss_network"), translate("Transport"))
o.default = "tcp,udp" o.default = "tcp,udp"
o:value("tcp", "TCP") o:value("tcp", "TCP")
o:value("udp", "UDP") o:value("udp", "UDP")
o:value("tcp,udp", "TCP,UDP") o:value("tcp,udp", "TCP,UDP")
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
o = s:option(Flag, "udp_forward", translate("UDP Forward")) o = s:option(Flag, option_name("udp_forward"), translate("UDP Forward"))
o.default = "1" o.default = "1"
o.rmempty = false o.rmempty = false
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
o = s:option(DynamicList, "xray_uuid", translate("ID") .. "/" .. translate("Password")) o = s:option(DynamicList, option_name("uuid"), translate("ID") .. "/" .. translate("Password"))
for i = 1, 3 do for i = 1, 3 do
o:value(api.gen_uuid(1)) o:value(api.gen_uuid(1))
end end
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Flag, "xray_tls", translate("TLS")) o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0 o.default = 0
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value then if value then
if value == "1" then if value == "1" then
local ca = s.fields["xray_tls_certificateFile"]:formvalue(t) or "" local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or ""
local key = s.fields["xray_tls_keyFile"]:formvalue(t) or "" local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or ""
if ca == "" or key == "" then if ca == "" or key == "" then
return nil, translate("Public key and Private key path can not be empty!") return nil, translate("Public key and Private key path can not be empty!")
end end
@ -211,48 +214,44 @@ o.validate = function(self, value, t)
return value return value
end end
end end
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "tlsflow", translate("flow")) o = s:option(Value, option_name("tlsflow"), translate("flow"))
o.default = "" o.default = ""
o:value("", translate("Disable")) o:value("", translate("Disable"))
o:value("xtls-rprx-vision") o:value("xtls-rprx-vision")
o:value("xtls-rprx-vision-udp443") o:value("xtls-rprx-vision-udp443")
add_xray_depends(o, { xray_protocol = "vless", xray_tls = true }) add_xray_depends(o, { [option_name("protocol")] = "vless", [option_name("tls")] = true })
o = s:option(ListValue, "alpn", translate("alpn")) o = s:option(ListValue, option_name("alpn"), translate("alpn"))
o.default = "h2,http/1.1" o.default = "h2,http/1.1"
o:value("h2,http/1.1") o:value("h2,http/1.1")
o:value("h2") o:value("h2")
o:value("http/1.1") o:value("http/1.1")
add_v2ray_depends(o, { xray_tls = true }) add_v2ray_depends(o, { [option_name("tls")] = true })
add_xray_depends(o, { xray_tls = true }) add_xray_depends(o, { [option_name("tls")] = true })
-- o = s:option(Value, "minversion", translate("minversion")) -- o = s:option(Value, option_name("minversion"), translate("minversion"))
-- o.default = "1.3" -- o.default = "1.3"
-- o:value("1.3") -- o:value("1.3")
--add_v2ray_depends(o, { xray_tls = true }) --add_v2ray_depends(o, { [option_name("tls")] = true })
--add_xray_depends(o, { xray_tls = true }) --add_xray_depends(o, { [option_name("tls")] = true })
-- [[ TLS部分 ]] -- -- [[ TLS部分 ]] --
o = s:option(FileUpload, "xray_tls_certificateFile", translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem") o = s:option(FileUpload, option_name("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem")
o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem" o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem"
add_v2ray_depends(o, { xray_tls = true }) add_v2ray_depends(o, { [option_name("tls")] = true })
add_xray_depends(o, { xray_tls = true }) add_xray_depends(o, { [option_name("tls")] = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value and value ~= "" then if value and value ~= "" then
if not nixio.fs.access(value) then if not nixio.fs.access(value) then
@ -264,12 +263,10 @@ o.validate = function(self, value, t)
return nil return nil
end end
o = s:option(FileUpload, "xray_tls_keyFile", translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key") o = s:option(FileUpload, option_name("tls_keyFile"), translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key")
o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key" o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key"
add_v2ray_depends(o, { xray_tls = true }) add_v2ray_depends(o, { [option_name("tls")] = true })
add_xray_depends(o, { xray_tls = true }) add_xray_depends(o, { [option_name("tls")] = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value and value ~= "" then if value and value ~= "" then
if not nixio.fs.access(value) then if not nixio.fs.access(value) then
@ -281,7 +278,7 @@ o.validate = function(self, value, t)
return nil return nil
end end
o = s:option(ListValue, "transport", translate("Transport")) o = s:option(ListValue, option_name("transport"), translate("Transport"))
o:value("tcp", "TCP") o:value("tcp", "TCP")
o:value("mkcp", "mKCP") o:value("mkcp", "mKCP")
o:value("ws", "WebSocket") o:value("ws", "WebSocket")
@ -289,179 +286,171 @@ o:value("h2", "HTTP/2")
o:value("ds", "DomainSocket") o:value("ds", "DomainSocket")
o:value("quic", "QUIC") o:value("quic", "QUIC")
o:value("grpc", "gRPC") o:value("grpc", "gRPC")
add_v2ray_depends(o, { xray_protocol = "vmess" }) add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { xray_protocol = "socks" }) add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" }) add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { xray_protocol = "vmess" }) add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" }) add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { xray_protocol = "socks" }) add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" }) add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" }) add_xray_depends(o, { [option_name("protocol")] = "trojan" })
-- [[ WebSocket部分 ]]-- -- [[ WebSocket部分 ]]--
o = s:option(Value, "xray_ws_host", translate("WebSocket Host")) o = s:option(Value, option_name("ws_host"), translate("WebSocket Host"))
add_v2ray_depends(o, { transport = "ws" }) add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { transport = "ws" }) add_xray_depends(o, { [option_name("transport")] = "ws" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_ws_path", translate("WebSocket Path")) o = s:option(Value, option_name("ws_path"), translate("WebSocket Path"))
add_v2ray_depends(o, { transport = "ws" }) add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { transport = "ws" }) add_xray_depends(o, { [option_name("transport")] = "ws" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
-- [[ HTTP/2部分 ]]-- -- [[ HTTP/2部分 ]]--
o = s:option(Value, "xray_h2_host", translate("HTTP/2 Host")) o = s:option(Value, option_name("h2_host"), translate("HTTP/2 Host"))
add_v2ray_depends(o, { transport = "h2" }) add_v2ray_depends(o, { [option_name("transport")] = "h2" })
add_xray_depends(o, { transport = "h2" }) add_xray_depends(o, { [option_name("transport")] = "h2" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, "xray_h2_path", translate("HTTP/2 Path")) o = s:option(Value, option_name("h2_path"), translate("HTTP/2 Path"))
add_v2ray_depends(o, { transport = "h2" }) add_v2ray_depends(o, { [option_name("transport")] = "h2" })
add_xray_depends(o, { transport = "h2" }) add_xray_depends(o, { [option_name("transport")] = "h2" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
-- [[ TCP部分 ]]-- -- [[ TCP部分 ]]--
-- TCP伪装 -- TCP伪装
o = s:option(ListValue, "tcp_guise", translate("Camouflage Type")) o = s:option(ListValue, option_name("tcp_guise"), translate("Camouflage Type"))
o:value("none", "none") o:value("none", "none")
o:value("http", "http") o:value("http", "http")
add_v2ray_depends(o, { transport = "tcp" }) add_v2ray_depends(o, { [option_name("transport")] = "tcp" })
add_xray_depends(o, { transport = "tcp" }) add_xray_depends(o, { [option_name("transport")] = "tcp" })
-- HTTP域名 -- HTTP域名
o = s:option(DynamicList, "tcp_guise_http_host", translate("HTTP Host")) o = s:option(DynamicList, option_name("tcp_guise_http_host"), translate("HTTP Host"))
add_v2ray_depends(o, { tcp_guise = "http" }) add_v2ray_depends(o, { [option_name("tcp_guise")] = "http" })
add_xray_depends(o, { tcp_guise = "http" }) add_xray_depends(o, { [option_name("tcp_guise")] = "http" })
-- HTTP路径 -- HTTP路径
o = s:option(DynamicList, "tcp_guise_http_path", translate("HTTP Path")) o = s:option(DynamicList, option_name("tcp_guise_http_path"), translate("HTTP Path"))
add_v2ray_depends(o, { tcp_guise = "http" }) add_v2ray_depends(o, { [option_name("tcp_guise")] = "http" })
add_xray_depends(o, { tcp_guise = "http" }) add_xray_depends(o, { [option_name("tcp_guise")] = "http" })
-- [[ mKCP部分 ]]-- -- [[ mKCP部分 ]]--
o = s:option(ListValue, "mkcp_guise", translate("Camouflage Type"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)')) o = s:option(ListValue, option_name("mkcp_guise"), translate("Camouflage Type"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)'))
for a, t in ipairs(header_type_list) do o:value(t) end for a, t in ipairs(header_type_list) do o:value(t) end
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_mtu", translate("KCP MTU")) o = s:option(Value, option_name("mkcp_mtu"), translate("KCP MTU"))
o.default = "1350" o.default = "1350"
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_tti", translate("KCP TTI")) o = s:option(Value, option_name("mkcp_tti"), translate("KCP TTI"))
o.default = "20" o.default = "20"
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_uplinkCapacity", translate("KCP uplinkCapacity")) o = s:option(Value, option_name("mkcp_uplinkCapacity"), translate("KCP uplinkCapacity"))
o.default = "5" o.default = "5"
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_downlinkCapacity", translate("KCP downlinkCapacity")) o = s:option(Value, option_name("mkcp_downlinkCapacity"), translate("KCP downlinkCapacity"))
o.default = "20" o.default = "20"
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Flag, "mkcp_congestion", translate("KCP Congestion")) o = s:option(Flag, option_name("mkcp_congestion"), translate("KCP Congestion"))
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_readBufferSize", translate("KCP readBufferSize")) o = s:option(Value, option_name("mkcp_readBufferSize"), translate("KCP readBufferSize"))
o.default = "1" o.default = "1"
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_writeBufferSize", translate("KCP writeBufferSize")) o = s:option(Value, option_name("mkcp_writeBufferSize"), translate("KCP writeBufferSize"))
o.default = "1" o.default = "1"
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_seed", translate("KCP Seed")) o = s:option(Value, option_name("mkcp_seed"), translate("KCP Seed"))
add_v2ray_depends(o, { transport = "mkcp" }) add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { transport = "mkcp" }) add_xray_depends(o, { [option_name("transport")] = "mkcp" })
-- [[ DomainSocket部分 ]]-- -- [[ DomainSocket部分 ]]--
o = s:option(Value, "ds_path", "Path", translate("A legal file path. This file must not exist before running.")) o = s:option(Value, option_name("ds_path"), "Path", translate("A legal file path. This file must not exist before running."))
add_v2ray_depends(o, { transport = "ds" }) add_v2ray_depends(o, { [option_name("transport")] = "ds" })
add_xray_depends(o, { transport = "ds" }) add_xray_depends(o, { [option_name("transport")] = "ds" })
-- [[ QUIC部分 ]]-- -- [[ QUIC部分 ]]--
o = s:option(ListValue, "quic_security", translate("Encrypt Method")) o = s:option(ListValue, option_name("quic_security"), translate("Encrypt Method"))
o:value("none") o:value("none")
o:value("aes-128-gcm") o:value("aes-128-gcm")
o:value("chacha20-poly1305") o:value("chacha20-poly1305")
add_v2ray_depends(o, { transport = "quic" }) add_v2ray_depends(o, { [option_name("transport")] = "quic" })
add_xray_depends(o, { transport = "quic" }) add_xray_depends(o, { [option_name("transport")] = "quic" })
o = s:option(Value, "quic_key", translate("Encrypt Method") .. translate("Key")) o = s:option(Value, option_name("quic_key"), translate("Encrypt Method") .. translate("Key"))
add_v2ray_depends(o, { transport = "quic" }) add_v2ray_depends(o, { [option_name("transport")] = "quic" })
add_xray_depends(o, { transport = "quic" }) add_xray_depends(o, { [option_name("transport")] = "quic" })
o = s:option(ListValue, "quic_guise", translate("Camouflage Type")) o = s:option(ListValue, option_name("quic_guise"), translate("Camouflage Type"))
for a, t in ipairs(header_type_list) do o:value(t) end for a, t in ipairs(header_type_list) do o:value(t) end
add_v2ray_depends(o, { transport = "quic" }) add_v2ray_depends(o, { [option_name("transport")] = "quic" })
add_xray_depends(o, { transport = "quic" }) add_xray_depends(o, { [option_name("transport")] = "quic" })
-- [[ gRPC部分 ]]-- -- [[ gRPC部分 ]]--
o = s:option(Value, "grpc_serviceName", "ServiceName") o = s:option(Value, option_name("grpc_serviceName"), "ServiceName")
add_v2ray_depends(o, { transport = "grpc" }) add_v2ray_depends(o, { [option_name("transport")] = "grpc" })
add_xray_depends(o, { transport = "grpc" }) add_xray_depends(o, { [option_name("transport")] = "grpc" })
o = s:option(Flag, "acceptProxyProtocol", translate("acceptProxyProtocol"), translate("Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.")) o = s:option(Flag, option_name("acceptProxyProtocol"), translate("acceptProxyProtocol"), translate("Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used."))
add_v2ray_depends(o, { transport = "tcp" }) add_v2ray_depends(o, { [option_name("transport")] = "tcp" })
add_v2ray_depends(o, { transport = "ws" }) add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { transport = "tcp" }) add_xray_depends(o, { [option_name("transport")] = "tcp" })
add_xray_depends(o, { transport = "ws" }) add_xray_depends(o, { [option_name("transport")] = "ws" })
-- [[ Fallback部分 ]]-- -- [[ Fallback部分 ]]--
o = s:option(Flag, "fallback", translate("Fallback")) o = s:option(Flag, option_name("fallback"), translate("Fallback"))
add_v2ray_depends(o, { xray_protocol = "vless", transport = "tcp" }) add_v2ray_depends(o, { [option_name("protocol")] = "vless", [option_name("transport")] = "tcp" })
add_v2ray_depends(o, { xray_protocol = "trojan", transport = "tcp" }) add_v2ray_depends(o, { [option_name("protocol")] = "trojan", [option_name("transport")] = "tcp" })
add_xray_depends(o, { xray_protocol = "vless", transport = "tcp" }) add_xray_depends(o, { [option_name("protocol")] = "vless", [option_name("transport")] = "tcp" })
add_xray_depends(o, { xray_protocol = "trojan", transport = "tcp" }) add_xray_depends(o, { [option_name("protocol")] = "trojan", [option_name("transport")] = "tcp" })
--[[ --[[
o = s:option(Value, "fallback_alpn", "Fallback alpn") o = s:option(Value, option_name("fallback_alpn"), "Fallback alpn")
add_v2ray_depends(o, { fallback = true }) add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { fallback = true }) add_xray_depends(o, { [option_name("fallback")] = true })
o = s:option(Value, "fallback_path", "Fallback path") o = s:option(Value, option_name("fallback_path"), "Fallback path")
add_v2ray_depends(o, { fallback = true }) add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { fallback = true }) add_xray_depends(o, { [option_name("fallback")] = true })
o = s:option(Value, "fallback_dest", "Fallback dest") o = s:option(Value, option_name("fallback_dest"), "Fallback dest")
add_v2ray_depends(o, { fallback = true }) add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { fallback = true }) add_xray_depends(o, { [option_name("fallback")] = true })
o = s:option(Value, "fallback_xver", "Fallback xver") o = s:option(Value, option_name("fallback_xver"), "Fallback xver")
o.default = 0 o.default = 0
add_v2ray_depends(o, { fallback = true }) add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { fallback = true }) add_xray_depends(o, { [option_name("fallback")] = true })
]]-- ]]--
o = s:option(DynamicList, "fallback_list", "Fallback", translate("dest,path")) o = s:option(DynamicList, option_name("fallback_list"), "Fallback", translate("dest,path"))
add_v2ray_depends(o, { fallback = true }) add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { fallback = true }) add_xray_depends(o, { [option_name("fallback")] = true })
o = s:option(Flag, "bind_local", translate("Bind Local"), translate("When selected, it can only be accessed locally, It is recommended to turn on when using reverse proxies or be fallback.")) o = s:option(Flag, option_name("bind_local"), translate("Bind Local"), translate("When selected, it can only be accessed locally, It is recommended to turn on when using reverse proxies or be fallback."))
o.default = "0" o.default = "0"
add_v2ray_depends(o) add_v2ray_depends(o)
add_xray_depends(o) add_xray_depends(o)
o = s:option(Flag, "accept_lan", translate("Accept LAN Access"), translate("When selected, it can accessed lan , this will not be safe!")) o = s:option(Flag, option_name("accept_lan"), translate("Accept LAN Access"), translate("When selected, it can accessed lan , this will not be safe!"))
o.default = "0" o.default = "0"
add_v2ray_depends(o) add_v2ray_depends(o)
add_xray_depends(o) add_xray_depends(o)
@ -476,7 +465,7 @@ for k, e in ipairs(api.get_valid_nodes()) do
end end
end end
o = s:option(ListValue, "outbound_node", translate("outbound node")) o = s:option(ListValue, option_name("outbound_node"), translate("outbound node"))
o:value("nil", translate("Close")) o:value("nil", translate("Close"))
o:value("_socks", translate("Custom Socks")) o:value("_socks", translate("Custom Socks"))
o:value("_http", translate("Custom HTTP")) o:value("_http", translate("Custom HTTP"))
@ -486,51 +475,58 @@ o.default = "nil"
add_v2ray_depends(o) add_v2ray_depends(o)
add_xray_depends(o) add_xray_depends(o)
o = s:option(Value, "outbound_node_address", translate("Address (Support Domain Name)")) o = s:option(Value, option_name("outbound_node_address"), translate("Address (Support Domain Name)"))
add_v2ray_depends(o, { outbound_node = "_socks"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { outbound_node = "_socks"}) add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_xray_depends(o, { outbound_node = "_http"}) add_xray_depends(o, { [option_name("outbound_node")] = "_http"})
o = s:option(Value, "outbound_node_port", translate("Port")) o = s:option(Value, option_name("outbound_node_port"), translate("Port"))
o.datatype = "port" o.datatype = "port"
add_v2ray_depends(o, { outbound_node = "_socks"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { outbound_node = "_socks"}) add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_xray_depends(o, { outbound_node = "_http"}) add_xray_depends(o, { [option_name("outbound_node")] = "_http"})
o = s:option(Value, "outbound_node_username", translate("Username")) o = s:option(Value, option_name("outbound_node_username"), translate("Username"))
add_v2ray_depends(o, { outbound_node = "_socks"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { outbound_node = "_socks"}) add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_xray_depends(o, { outbound_node = "_http"}) add_xray_depends(o, { [option_name("outbound_node")] = "_http"})
o = s:option(Value, "outbound_node_password", translate("Password")) o = s:option(Value, option_name("outbound_node_password"), translate("Password"))
o.password = true o.password = true
add_v2ray_depends(o, { outbound_node = "_socks"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { outbound_node = "_socks"}) add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_xray_depends(o, { outbound_node = "_http"}) add_xray_depends(o, { [option_name("outbound_node")] = "_http"})
o = s:option(Value, "outbound_node_iface", translate("Interface")) o = s:option(Value, option_name("outbound_node_iface"), translate("Interface"))
o.default = "eth1" o.default = "eth1"
add_v2ray_depends(o, { outbound_node = "_iface"}) add_v2ray_depends(o, { [option_name("outbound_node")] = "_iface"})
add_xray_depends(o, { outbound_node = "_iface"}) add_xray_depends(o, { [option_name("outbound_node")] = "_iface"})
o = s:option(Flag, "xray_log", translate("Log")) o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1" o.default = "1"
o.rmempty = false
add_v2ray_depends(o) add_v2ray_depends(o)
add_xray_depends(o) add_xray_depends(o)
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(ListValue, "xray_loglevel", translate("Log Level")) o = s:option(ListValue, option_name("loglevel"), translate("Log Level"))
o.default = "warning" o.default = "warning"
o:value("debug") o:value("debug")
o:value("info") o:value("info")
o:value("warning") o:value("warning")
o:value("error") o:value("error")
add_v2ray_depends(o, { xray_log = true }) add_v2ray_depends(o, { [option_name("log")] = true })
add_xray_depends(o, { xray_log = true }) add_xray_depends(o, { [option_name("log")] = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end
end
end

View File

@ -6,6 +6,8 @@ if not api.is_finded("ssserver") then
return return
end end
local type_name = "SS-Rust"
local option_prefix = "ssrust_" local option_prefix = "ssrust_"
local function option_name(name) local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
local ssrust_encrypt_method_list = { local ssrust_encrypt_method_list = {
"plain", "none", "plain", "none",
@ -31,41 +42,43 @@ local ssrust_encrypt_method_list = {
-- [[ Shadowsocks Rust ]] -- [[ Shadowsocks Rust ]]
s.fields["type"]:value("SS-Rust", translate("Shadowsocks Rust")) s.fields["type"]:value(type_name, translate("Shadowsocks Rust"))
o = s:option(Value, "ssrust_port", translate("Listen Port")) o = s:option(Value, option_name("port"), translate("Listen Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "ssrust_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
o = s:option(ListValue, "ssrust_method", translate("Encrypt Method")) o = s:option(ListValue, option_name("method"), translate("Encrypt Method"))
for a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end for a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end
o = s:option(Value, "ssrust_timeout", translate("Connection Timeout")) o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 300 o.default = 300
o = s:option(Flag, "ssrust_tcp_fast_open", "TCP " .. translate("Fast Open")) o = s:option(Flag, option_name("tcp_fast_open"), "TCP " .. translate("Fast Open"))
o.default = "0" o.default = "0"
o = s:option(Flag, "ssrust_log", translate("Log")) o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1" o.default = "1"
o.rmempty = false
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "SS-Rust" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "SS-Rust" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("ss-server") then
return return
end end
local type_name = "SS"
local option_prefix = "ss_" local option_prefix = "ss_"
local function option_name(name) local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
local ss_encrypt_method_list = { local ss_encrypt_method_list = {
"rc4-md5", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr", "rc4-md5", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr",
@ -34,41 +45,43 @@ local ss_encrypt_method_list = {
-- [[ Shadowsocks ]] -- [[ Shadowsocks ]]
s.fields["type"]:value("SS", translate("Shadowsocks")) s.fields["type"]:value(type_name, translate("Shadowsocks"))
o = s:option(Value, "ss_port", translate("Listen Port")) o = s:option(Value, option_name("port"), translate("Listen Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "ss_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
o = s:option(ListValue, "ss_method", translate("Encrypt Method")) o = s:option(ListValue, option_name("method"), translate("Encrypt Method"))
for a, t in ipairs(ss_encrypt_method_list) do o:value(t) end for a, t in ipairs(ss_encrypt_method_list) do o:value(t) end
o = s:option(Value, "ss_timeout", translate("Connection Timeout")) o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 300 o.default = 300
o = s:option(Flag, "ss_tcp_fast_open", "TCP " .. translate("Fast Open")) o = s:option(Flag, option_name("tcp_fast_open"), "TCP " .. translate("Fast Open"))
o.default = "0" o.default = "0"
o = s:option(Flag, "ss_log", translate("Log")) o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1" o.default = "1"
o.rmempty = false
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "SS" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "SS" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -6,6 +6,8 @@ if not api.is_finded("ssr-server") then
return return
end end
local type_name = "SSR"
local option_prefix = "ssr_" local option_prefix = "ssr_"
local function option_name(name) local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end end
end end
local function rm_prefix_write(self, section, value) local function rm_prefix_write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then if self.option:find(option_prefix) == 1 then
m:set(section, self.option:sub(1 + #option_prefix), value) m:set(section, self.option:sub(1 + #option_prefix), value)
end end
end end
end
local function rm_prefix_remove(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == type_name then
if self.option:find(option_prefix) == 1 then
m:del(section, self.option:sub(1 + #option_prefix))
end
end
end
local ssr_encrypt_method_list = { local ssr_encrypt_method_list = {
"none", "table", "rc2-cfb", "rc4", "rc4-md5", "rc4-md5-6", "aes-128-cfb", "none", "table", "rc2-cfb", "rc4", "rc4-md5", "rc4-md5-6", "aes-128-cfb",
@ -44,55 +55,57 @@ local ssr_obfs_list = {
-- [[ ShadowsocksR ]] -- [[ ShadowsocksR ]]
s.fields["type"]:value("SSR", translate("ShadowsocksR")) s.fields["type"]:value(type_name, translate("ShadowsocksR"))
o = s:option(Value, "ssr_port", translate("Listen Port")) o = s:option(Value, option_name("port"), translate("Listen Port"))
o.datatype = "port" o.datatype = "port"
o = s:option(Value, "ssr_password", translate("Password")) o = s:option(Value, option_name("password"), translate("Password"))
o.password = true o.password = true
o = s:option(ListValue, "ssr_method", translate("Encrypt Method")) o = s:option(ListValue, option_name("method"), translate("Encrypt Method"))
for a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end for a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end
o = s:option(ListValue, "ssr_protocol", translate("Protocol")) o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
for a, t in ipairs(ssr_protocol_list) do o:value(t) end for a, t in ipairs(ssr_protocol_list) do o:value(t) end
o = s:option(Value, "ssr_protocol_param", translate("Protocol_param")) o = s:option(Value, option_name("protocol_param"), translate("Protocol_param"))
o = s:option(ListValue, "ssr_obfs", translate("Obfs")) o = s:option(ListValue, option_name("obfs"), translate("Obfs"))
for a, t in ipairs(ssr_obfs_list) do o:value(t) end for a, t in ipairs(ssr_obfs_list) do o:value(t) end
o = s:option(Value, "ssr_obfs_param", translate("Obfs_param")) o = s:option(Value, option_name("obfs_param"), translate("Obfs_param"))
o = s:option(Value, "ssr_timeout", translate("Connection Timeout")) o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o.default = 300 o.default = 300
o = s:option(Flag, "ssr_tcp_fast_open", "TCP " .. translate("Fast Open")) o = s:option(Flag, option_name("tcp_fast_open"), "TCP " .. translate("Fast Open"))
o.default = "0" o.default = "0"
o = s:option(Flag, "ssr_udp_forward", translate("UDP Forward")) o = s:option(Flag, option_name("udp_forward"), translate("UDP Forward"))
o.default = "1" o.default = "1"
o.rmempty = false o.rmempty = false
o = s:option(Flag, "ssr_log", translate("Log")) o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1" o.default = "1"
o.rmempty = false
for key, value in pairs(s.fields) do for key, value in pairs(s.fields) do
if key:find(option_prefix) == 1 then if key:find(option_prefix) == 1 then
if not s.fields[key].not_rewrite then if not s.fields[key].not_rewrite then
s.fields[key].cfgvalue = rm_prefix_cfgvalue s.fields[key].cfgvalue = rm_prefix_cfgvalue
s.fields[key].write = rm_prefix_write s.fields[key].write = rm_prefix_write
s.fields[key].remove = rm_prefix_remove
end end
local deps = s.fields[key].deps local deps = s.fields[key].deps
if #deps > 0 then if #deps > 0 then
for index, value in ipairs(deps) do for index, value in ipairs(deps) do
deps[index]["type"] = "SSR" deps[index]["type"] = type_name
end end
else else
s.fields[key]:depends({ type = "SSR" }) s.fields[key]:depends({ type = type_name })
end end
end end
end end

View File

@ -562,17 +562,14 @@ msgstr "劫持ICMP (PING)"
msgid "Hijacking ICMPv6 (IPv6 PING)" msgid "Hijacking ICMPv6 (IPv6 PING)"
msgstr "劫持ICMPv6 (IPv6 PING)" msgstr "劫持ICMPv6 (IPv6 PING)"
msgid "Sniffing (V2Ray/Xray)" msgid "Sniffing"
msgstr "流量嗅探 (V2ray/Xray)" msgstr "流量嗅探"
msgid "When using the V2ray/Xray shunt, must be enabled, otherwise the shunt will invalid." msgid "When using the shunt, must be enabled, otherwise the shunt will invalid."
msgstr "使用 V2Ray/Xray 分流时,必须启用,否则分流将无效。" msgstr "使用分流时,必须启用,否则分流将无效。"
msgid "Sniffing Route Only (Xray)" msgid "Sniffing Route Only"
msgstr "流量嗅探只供路由使用 (Xray)" msgstr "流量嗅探只供路由使用"
msgid "When enabled, the server not will resolve the domain name again."
msgstr "启用后,服务器不会再次解析域名。"
msgid "TCP Proxy Way" msgid "TCP Proxy Way"
msgstr "TCP代理方式" msgstr "TCP代理方式"
@ -1330,11 +1327,11 @@ msgstr "初始窗口大小"
msgid "No Sniffing Lists" msgid "No Sniffing Lists"
msgstr "不进行流量嗅探的域名列表" msgstr "不进行流量嗅探的域名列表"
msgid "Hosts added into No Sniffing Lists will not resolve again on server (Xray only)." msgid "Hosts added into No Sniffing Lists will not resolve again on server."
msgstr "加入的域名不会再次在服务器解析仅适用于Xray。" msgstr "加入的域名不会再次在服务器解析。"
msgid "Buffer Size (Xray)" msgid "Buffer Size"
msgstr "缓冲区大小Xray" msgstr "缓冲区大小"
msgid "Buffer size for every connection (kB)" msgid "Buffer size for every connection (kB)"
msgstr "每一个连接的缓冲区大小kB" msgstr "每一个连接的缓冲区大小kB"

View File

@ -43,6 +43,19 @@ use_nft=$(uci -q get passwall2.@global_forwarding[0].use_nft || echo "0")
fi fi
} }
global_xray=$(uci -q get passwall2.@global_xray[0])
[ -z "${global_xray}" ] && {
cfgid=$(uci add passwall2 global_xray)
uci -q set passwall2.${cfgid}.sniffing=$(uci -q get passwall2.@global_forwarding[0].sniffing || echo "1")
uci -q set passwall2.${cfgid}.route_only=$(uci -q get passwall2.@global_forwarding[0].route_only || echo "0")
uci -q set passwall2.${cfgid}.buffer_size=$(uci -q get passwall2.@global_forwarding[0].buffer_size || echo "")
uci -q delete passwall2.@global_forwarding[0].sniffing
uci -q delete passwall2.@global_forwarding[0].route_only
uci -q delete passwall2.@global_forwarding[0].buffer_size
uci -q commit passwall2
}
rm -f /tmp/luci-indexcache rm -f /tmp/luci-indexcache
rm -rf /tmp/luci-modulecache/ rm -rf /tmp/luci-modulecache/
killall -HUP rpcd 2>/dev/null killall -HUP rpcd 2>/dev/null

View File

@ -1065,9 +1065,6 @@ add_ip2route)
get_new_port) get_new_port)
get_new_port $@ get_new_port $@
;; ;;
run_v2ray)
run_v2ray $@
;;
run_socks) run_socks)
run_socks $@ run_socks $@
;; ;;

View File

@ -299,8 +299,10 @@ do
end end
end end
else else
if v.currentNode == nil and v.delete then if v.currentNode == nil then
if v.delete then
v.delete() v.delete()
end
CONFIG[k] = nil CONFIG[k] = nil
end end
end end
@ -793,7 +795,7 @@ local function truncate_nodes(add_from)
end end
config.set(config) config.set(config)
else else
if config.currentNode.add_mode == "2" then if config.currentNode and config.currentNode.add_mode == "2" then
if add_from then if add_from then
if config.currentNode.add_from and config.currentNode.add_from == add_from then if config.currentNode.add_from and config.currentNode.add_from == add_from then
config.set(config, "nil") config.set(config, "nil")
@ -933,7 +935,7 @@ local function select_node(nodes, config)
config.set(config, server) config.set(config, server)
end end
else else
config.set(config, nil) config.set(config, "nil")
end end
end end