update 2023-09-01 09:14:49

This commit is contained in:
github-actions[bot] 2023-09-01 09:14:49 +08:00
parent bc8e7d497d
commit 9c8669400f
9 changed files with 414 additions and 340 deletions

View File

@ -127,30 +127,33 @@ o:depends("ipv6_tproxy", true)
o.default = 0
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.rmempty = false
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."))
route_only.default = 0
route_only:depends("sniffing", true)
o = s:option(Flag, "route_only", translate("Sniffing Route Only"))
o.default = 0
o:depends("sniffing", true)
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.wrap = "off"
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.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, "")
end
end
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.rmempty = true
o = s:option(Value, "buffer_size", translate("Buffer Size"), translate("Buffer size for every connection (kB)"))
o.datatype = "uinteger"
end
end

View File

@ -6,6 +6,8 @@ if not api.is_finded("brook") then
return
end
local type_name = "Brook"
local option_prefix = "brook_"
local function option_name(name)
@ -18,48 +20,59 @@ local function rm_prefix_cfgvalue(self, section)
end
end
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
m:set(section, self.option:sub(1 + #option_prefix), value)
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 ]]
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 = s:option(ListValue, "brook_protocol", translate("Protocol"))
o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("server", "Brook")
o:value("wsserver", "WebSocket")
--o = s:option(Flag, "brook_tls", translate("Use TLS"))
--o:depends({ brook_protocol = "wsserver" })
--o = s:option(Flag, option_name("tls"), translate("Use TLS"))
--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 = s:option(Value, "brook_ws_path", translate("WebSocket Path"))
o:depends({ brook_protocol = "wsserver" })
o = s:option(Value, option_name("ws_path"), translate("WebSocket Path"))
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.rmempty = false
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
local deps = s.fields[key].deps
if #deps > 0 then
for index, value in ipairs(deps) do
deps[index]["type"] = "Brook"
deps[index]["type"] = type_name
end
else
s.fields[key]:depends({ type = "Brook" })
s.fields[key]:depends({ type = type_name })
end
end
end

View File

@ -6,6 +6,8 @@ if not api.is_finded("hysteria") then
return
end
local type_name = "Hysteria"
local option_prefix = "hysteria_"
local function option_name(name)
@ -18,67 +20,76 @@ local function rm_prefix_cfgvalue(self, section)
end
end
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
m:set(section, self.option:sub(1 + #option_prefix), value)
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 ]]
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 = s:option(ListValue, "hysteria_protocol", translate("Protocol"))
o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("udp", "UDP")
o:value("faketcp", "faketcp")
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 = 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("string", translate("STRING"))
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:depends({ hysteria_auth_type = "string" })
o:depends({ [option_name("auth_type")] = "string" })
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 = s:option(Flag, "hysteria_udp", translate("UDP"))
o = s:option(Flag, option_name("udp"), translate("UDP"))
o.default = "1"
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.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.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 = 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 = 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 = s:option(Flag, "hysteria_tls", translate("TLS"))
o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0
o.validate = function(self, value, t)
if value then
if value == "1" then
local ca = s.fields["hysteria_tls_certificateFile"]:formvalue(t) or ""
local key = s.fields["hysteria_tls_keyFile"]:formvalue(t) or ""
local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or ""
local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or ""
if ca == "" or key == "" then
return nil, translate("Public key and Private key path can not be empty!")
end
@ -87,9 +98,9 @@ o.validate = function(self, value, t)
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:depends({ hysteria_tls = true })
o:depends({ [option_name("tls")] = true })
o.validate = function(self, value, t)
if value and value ~= "" then
if not nixio.fs.access(value) then
@ -101,9 +112,9 @@ o.validate = function(self, value, t)
return nil
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:depends({ hysteria_tls = true })
o:depends({ [option_name("tls")] = true })
o.validate = function(self, value, t)
if value and value ~= "" then
if not nixio.fs.access(value) then
@ -115,23 +126,25 @@ o.validate = function(self, value, t)
return nil
end
o = s:option(Flag, "hysteria_log", translate("Log"))
o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1"
o.rmempty = false
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
local deps = s.fields[key].deps
if #deps > 0 then
for index, value in ipairs(deps) do
deps[index]["type"] = "Hysteria"
deps[index]["type"] = type_name
end
else
s.fields[key]:depends({ type = "Hysteria" })
s.fields[key]:depends({ type = type_name })
end
end
end

View File

@ -18,10 +18,19 @@ local function rm_prefix_cfgvalue(self, section)
end
end
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
m:set(section, self.option:sub(1 + #option_prefix), value)
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 deps = { type = "Xray" }
@ -51,11 +60,11 @@ local function add_v2ray_depends(o, field, value)
o:depends(deps)
end
local v_ss_encrypt_method_list = {
local v_ss_method_list = {
"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"
}
@ -72,7 +81,7 @@ if api.is_finded("xray") then
s.fields["type"]:value("Xray", translate("Xray"))
end
o = s:option(ListValue, "xray_protocol", translate("Protocol"))
o = s:option(ListValue, option_name("protocol"), translate("Protocol"))
o:value("vmess", "Vmess")
o:value("vless", "VLESS")
o:value("http", "HTTP")
@ -82,17 +91,13 @@ o:value("trojan", "Trojan")
o:value("dokodemo-door", "dokodemo-door")
add_xray_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"
add_xray_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)
if value and value == "1" then
local user_v = s.fields["xray_username"]:formvalue(t) or ""
@ -103,107 +108,105 @@ o.validate = function(self, value, t)
end
return value
end
add_xray_depends(o, { xray_protocol = "socks" })
add_xray_depends(o, { xray_protocol = "http" })
add_v2ray_depends(o, { xray_protocol = "socks" })
add_v2ray_depends(o, { xray_protocol = "http" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { [option_name("protocol")] = "http" })
add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { [option_name("protocol")] = "http" })
o = s:option(Value, "xray_username", translate("Username"))
add_xray_depends(o, { xray_auth = true })
add_v2ray_depends(o, { xray_auth = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, option_name("username"), translate("Username"))
add_xray_depends(o, { [option_name("auth")] = true })
add_v2ray_depends(o, { [option_name("auth")] = true })
o = s:option(Value, "xray_password", translate("Password"))
o = s:option(Value, option_name("password"), translate("Password"))
o.password = true
add_xray_depends(o, { xray_auth = true })
add_v2ray_depends(o, { xray_auth = true })
add_xray_depends(o, { xray_protocol = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
add_xray_depends(o, { [option_name("auth")] = true })
add_v2ray_depends(o, { [option_name("auth")] = true })
add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
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("udp", "UDP")
o:value("tcp,udp", "TCP,UDP")
add_v2ray_depends(o, { xray_protocol = "dokodemo-door" })
add_xray_depends(o, { xray_protocol = "dokodemo-door" })
add_v2ray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
add_xray_depends(o, { [option_name("protocol")] = "dokodemo-door" })
o = s:option(Value, "d_address", translate("Destination address"))
add_v2ray_depends(o, { xray_protocol = "dokodemo-door" })
add_xray_depends(o, { xray_protocol = "dokodemo-door" })
o = s:option(Value, option_name("d_address"), translate("Destination address"))
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { xray_protocol = "dokodemo-door" })
add_xray_depends(o, { xray_protocol = "dokodemo-door" })
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { xray_protocol = "vless" })
add_xray_depends(o, { xray_protocol = "vless" })
add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { [option_name("protocol")] = "vless" })
o = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method"))
for a, t in ipairs(v_ss_encrypt_method_list) do o:value(t) end
add_v2ray_depends(o, { xray_protocol = "shadowsocks" })
o = s:option(ListValue, option_name("v_ss_method"), translate("Encrypt Method"))
o.not_rewrite = true
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)
return m:get(section, "method")
end
function o.write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "V2ray" then
m:set(section, "method", value)
end
end
o = s:option(ListValue, "x_ss_encrypt_method", translate("Encrypt Method"))
for a, t in ipairs(x_ss_encrypt_method_list) do o:value(t) end
add_xray_depends(o, { xray_protocol = "shadowsocks" })
o = s:option(ListValue, option_name("x_ss_method"), translate("Encrypt Method"))
o.not_rewrite = true
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)
return m:get(section, "method")
end
function o.write(self, section, value)
if s.fields["type"]:formvalue(arg[1]) == "Xray" then
m:set(section, "method", value)
end
end
o = s:option(Flag, "iv_check", translate("IV Check"))
add_v2ray_depends(o, { xray_protocol = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" })
o = s:option(Flag, option_name("iv_check"), translate("IV Check"))
add_v2ray_depends(o, { [option_name("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:value("tcp", "TCP")
o:value("udp", "UDP")
o:value("tcp,udp", "TCP,UDP")
add_v2ray_depends(o, { xray_protocol = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" })
add_v2ray_depends(o, { [option_name("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.rmempty = false
add_v2ray_depends(o, { xray_protocol = "socks" })
add_xray_depends(o, { xray_protocol = "socks" })
add_v2ray_depends(o, { [option_name("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
o:value(api.gen_uuid(1))
end
add_v2ray_depends(o, { xray_protocol = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" })
add_v2ray_depends(o, { xray_protocol = "trojan" })
add_xray_depends(o, { xray_protocol = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" })
add_xray_depends(o, { xray_protocol = "trojan" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { [option_name("protocol")] = "trojan" })
o = s:option(Flag, "xray_tls", translate("TLS"))
o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0
o.validate = function(self, value, t)
if value then
if value == "1" then
local ca = s.fields["xray_tls_certificateFile"]:formvalue(t) or ""
local key = s.fields["xray_tls_keyFile"]:formvalue(t) or ""
local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or ""
local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or ""
if ca == "" or key == "" then
return nil, translate("Public key and Private key path can not be empty!")
end
@ -211,48 +214,44 @@ o.validate = function(self, value, t)
return value
end
end
add_v2ray_depends(o, { xray_protocol = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" })
add_v2ray_depends(o, { xray_protocol = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" })
add_xray_depends(o, { xray_protocol = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" })
add_xray_depends(o, { xray_protocol = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { [option_name("protocol")] = "trojan" })
o = s:option(Value, "tlsflow", translate("flow"))
o = s:option(Value, option_name("tlsflow"), translate("flow"))
o.default = ""
o:value("", translate("Disable"))
o:value("xtls-rprx-vision")
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:value("h2,http/1.1")
o:value("h2")
o:value("http/1.1")
add_v2ray_depends(o, { xray_tls = true })
add_xray_depends(o, { xray_tls = true })
add_v2ray_depends(o, { [option_name("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:value("1.3")
--add_v2ray_depends(o, { xray_tls = true })
--add_xray_depends(o, { xray_tls = true })
--add_v2ray_depends(o, { [option_name("tls")] = true })
--add_xray_depends(o, { [option_name("tls")] = true })
-- [[ 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"
add_v2ray_depends(o, { xray_tls = true })
add_xray_depends(o, { xray_tls = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
add_v2ray_depends(o, { [option_name("tls")] = true })
add_xray_depends(o, { [option_name("tls")] = true })
o.validate = function(self, value, t)
if value and value ~= "" then
if not nixio.fs.access(value) then
@ -264,12 +263,10 @@ o.validate = function(self, value, t)
return nil
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"
add_v2ray_depends(o, { xray_tls = true })
add_xray_depends(o, { xray_tls = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
add_v2ray_depends(o, { [option_name("tls")] = true })
add_xray_depends(o, { [option_name("tls")] = true })
o.validate = function(self, value, t)
if value and value ~= "" then
if not nixio.fs.access(value) then
@ -281,7 +278,7 @@ o.validate = function(self, value, t)
return nil
end
o = s:option(ListValue, "transport", translate("Transport"))
o = s:option(ListValue, option_name("transport"), translate("Transport"))
o:value("tcp", "TCP")
o:value("mkcp", "mKCP")
o:value("ws", "WebSocket")
@ -289,179 +286,171 @@ o:value("h2", "HTTP/2")
o:value("ds", "DomainSocket")
o:value("quic", "QUIC")
o:value("grpc", "gRPC")
add_v2ray_depends(o, { xray_protocol = "vmess" })
add_v2ray_depends(o, { xray_protocol = "vless" })
add_v2ray_depends(o, { xray_protocol = "socks" })
add_v2ray_depends(o, { xray_protocol = "shadowsocks" })
add_v2ray_depends(o, { xray_protocol = "trojan" })
add_xray_depends(o, { xray_protocol = "vmess" })
add_xray_depends(o, { xray_protocol = "vless" })
add_xray_depends(o, { xray_protocol = "socks" })
add_xray_depends(o, { xray_protocol = "shadowsocks" })
add_xray_depends(o, { xray_protocol = "trojan" })
add_v2ray_depends(o, { [option_name("protocol")] = "vmess" })
add_v2ray_depends(o, { [option_name("protocol")] = "vless" })
add_v2ray_depends(o, { [option_name("protocol")] = "socks" })
add_v2ray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_v2ray_depends(o, { [option_name("protocol")] = "trojan" })
add_xray_depends(o, { [option_name("protocol")] = "vmess" })
add_xray_depends(o, { [option_name("protocol")] = "vless" })
add_xray_depends(o, { [option_name("protocol")] = "socks" })
add_xray_depends(o, { [option_name("protocol")] = "shadowsocks" })
add_xray_depends(o, { [option_name("protocol")] = "trojan" })
-- [[ WebSocket部分 ]]--
o = s:option(Value, "xray_ws_host", translate("WebSocket Host"))
add_v2ray_depends(o, { transport = "ws" })
add_xray_depends(o, { transport = "ws" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, option_name("ws_host"), translate("WebSocket Host"))
add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { [option_name("transport")] = "ws" })
o = s:option(Value, "xray_ws_path", translate("WebSocket Path"))
add_v2ray_depends(o, { transport = "ws" })
add_xray_depends(o, { transport = "ws" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, option_name("ws_path"), translate("WebSocket Path"))
add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { [option_name("transport")] = "ws" })
-- [[ HTTP/2部分 ]]--
o = s:option(Value, "xray_h2_host", translate("HTTP/2 Host"))
add_v2ray_depends(o, { transport = "h2" })
add_xray_depends(o, { transport = "h2" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, option_name("h2_host"), translate("HTTP/2 Host"))
add_v2ray_depends(o, { [option_name("transport")] = "h2" })
add_xray_depends(o, { [option_name("transport")] = "h2" })
o = s:option(Value, "xray_h2_path", translate("HTTP/2 Path"))
add_v2ray_depends(o, { transport = "h2" })
add_xray_depends(o, { transport = "h2" })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
o = s:option(Value, option_name("h2_path"), translate("HTTP/2 Path"))
add_v2ray_depends(o, { [option_name("transport")] = "h2" })
add_xray_depends(o, { [option_name("transport")] = "h2" })
-- [[ 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("http", "http")
add_v2ray_depends(o, { transport = "tcp" })
add_xray_depends(o, { transport = "tcp" })
add_v2ray_depends(o, { [option_name("transport")] = "tcp" })
add_xray_depends(o, { [option_name("transport")] = "tcp" })
-- HTTP域名
o = s:option(DynamicList, "tcp_guise_http_host", translate("HTTP Host"))
add_v2ray_depends(o, { tcp_guise = "http" })
add_xray_depends(o, { tcp_guise = "http" })
o = s:option(DynamicList, option_name("tcp_guise_http_host"), translate("HTTP Host"))
add_v2ray_depends(o, { [option_name("tcp_guise")] = "http" })
add_xray_depends(o, { [option_name("tcp_guise")] = "http" })
-- HTTP路径
o = s:option(DynamicList, "tcp_guise_http_path", translate("HTTP Path"))
add_v2ray_depends(o, { tcp_guise = "http" })
add_xray_depends(o, { tcp_guise = "http" })
o = s:option(DynamicList, option_name("tcp_guise_http_path"), translate("HTTP Path"))
add_v2ray_depends(o, { [option_name("tcp_guise")] = "http" })
add_xray_depends(o, { [option_name("tcp_guise")] = "http" })
-- [[ 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
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Flag, "mkcp_congestion", translate("KCP Congestion"))
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
o = s:option(Flag, option_name("mkcp_congestion"), translate("KCP Congestion"))
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
add_v2ray_depends(o, { [option_name("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"
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { [option_name("transport")] = "mkcp" })
o = s:option(Value, "mkcp_seed", translate("KCP Seed"))
add_v2ray_depends(o, { transport = "mkcp" })
add_xray_depends(o, { transport = "mkcp" })
o = s:option(Value, option_name("mkcp_seed"), translate("KCP Seed"))
add_v2ray_depends(o, { [option_name("transport")] = "mkcp" })
add_xray_depends(o, { [option_name("transport")] = "mkcp" })
-- [[ DomainSocket部分 ]]--
o = s:option(Value, "ds_path", "Path", translate("A legal file path. This file must not exist before running."))
add_v2ray_depends(o, { transport = "ds" })
add_xray_depends(o, { transport = "ds" })
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, { [option_name("transport")] = "ds" })
add_xray_depends(o, { [option_name("transport")] = "ds" })
-- [[ 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("aes-128-gcm")
o:value("chacha20-poly1305")
add_v2ray_depends(o, { transport = "quic" })
add_xray_depends(o, { transport = "quic" })
add_v2ray_depends(o, { [option_name("transport")] = "quic" })
add_xray_depends(o, { [option_name("transport")] = "quic" })
o = s:option(Value, "quic_key", translate("Encrypt Method") .. translate("Key"))
add_v2ray_depends(o, { transport = "quic" })
add_xray_depends(o, { transport = "quic" })
o = s:option(Value, option_name("quic_key"), translate("Encrypt Method") .. translate("Key"))
add_v2ray_depends(o, { [option_name("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
add_v2ray_depends(o, { transport = "quic" })
add_xray_depends(o, { transport = "quic" })
add_v2ray_depends(o, { [option_name("transport")] = "quic" })
add_xray_depends(o, { [option_name("transport")] = "quic" })
-- [[ gRPC部分 ]]--
o = s:option(Value, "grpc_serviceName", "ServiceName")
add_v2ray_depends(o, { transport = "grpc" })
add_xray_depends(o, { transport = "grpc" })
o = s:option(Value, option_name("grpc_serviceName"), "ServiceName")
add_v2ray_depends(o, { [option_name("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."))
add_v2ray_depends(o, { transport = "tcp" })
add_v2ray_depends(o, { transport = "ws" })
add_xray_depends(o, { transport = "tcp" })
add_xray_depends(o, { transport = "ws" })
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, { [option_name("transport")] = "tcp" })
add_v2ray_depends(o, { [option_name("transport")] = "ws" })
add_xray_depends(o, { [option_name("transport")] = "tcp" })
add_xray_depends(o, { [option_name("transport")] = "ws" })
-- [[ Fallback部分 ]]--
o = s:option(Flag, "fallback", translate("Fallback"))
add_v2ray_depends(o, { xray_protocol = "vless", transport = "tcp" })
add_v2ray_depends(o, { xray_protocol = "trojan", transport = "tcp" })
add_xray_depends(o, { xray_protocol = "vless", transport = "tcp" })
add_xray_depends(o, { xray_protocol = "trojan", transport = "tcp" })
o = s:option(Flag, option_name("fallback"), translate("Fallback"))
add_v2ray_depends(o, { [option_name("protocol")] = "vless", [option_name("transport")] = "tcp" })
add_v2ray_depends(o, { [option_name("protocol")] = "trojan", [option_name("transport")] = "tcp" })
add_xray_depends(o, { [option_name("protocol")] = "vless", [option_name("transport")] = "tcp" })
add_xray_depends(o, { [option_name("protocol")] = "trojan", [option_name("transport")] = "tcp" })
--[[
o = s:option(Value, "fallback_alpn", "Fallback alpn")
add_v2ray_depends(o, { fallback = true })
add_xray_depends(o, { fallback = true })
o = s:option(Value, option_name("fallback_alpn"), "Fallback alpn")
add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { [option_name("fallback")] = true })
o = s:option(Value, "fallback_path", "Fallback path")
add_v2ray_depends(o, { fallback = true })
add_xray_depends(o, { fallback = true })
o = s:option(Value, option_name("fallback_path"), "Fallback path")
add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { [option_name("fallback")] = true })
o = s:option(Value, "fallback_dest", "Fallback dest")
add_v2ray_depends(o, { fallback = true })
add_xray_depends(o, { fallback = true })
o = s:option(Value, option_name("fallback_dest"), "Fallback dest")
add_v2ray_depends(o, { [option_name("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
add_v2ray_depends(o, { fallback = true })
add_xray_depends(o, { fallback = true })
add_v2ray_depends(o, { [option_name("fallback")] = true })
add_xray_depends(o, { [option_name("fallback")] = true })
]]--
o = s:option(DynamicList, "fallback_list", "Fallback", translate("dest,path"))
add_v2ray_depends(o, { fallback = true })
add_xray_depends(o, { fallback = true })
o = s:option(DynamicList, option_name("fallback_list"), "Fallback", translate("dest,path"))
add_v2ray_depends(o, { [option_name("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"
add_v2ray_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"
add_v2ray_depends(o)
add_xray_depends(o)
@ -476,7 +465,7 @@ for k, e in ipairs(api.get_valid_nodes()) do
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("_socks", translate("Custom Socks"))
o:value("_http", translate("Custom HTTP"))
@ -486,51 +475,58 @@ o.default = "nil"
add_v2ray_depends(o)
add_xray_depends(o)
o = s:option(Value, "outbound_node_address", translate("Address (Support Domain Name)"))
add_v2ray_depends(o, { outbound_node = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"})
add_xray_depends(o, { outbound_node = "_socks"})
add_xray_depends(o, { outbound_node = "_http"})
o = s:option(Value, option_name("outbound_node_address"), translate("Address (Support Domain Name)"))
add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
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"
add_v2ray_depends(o, { outbound_node = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"})
add_xray_depends(o, { outbound_node = "_socks"})
add_xray_depends(o, { outbound_node = "_http"})
add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_xray_depends(o, { [option_name("outbound_node")] = "_http"})
o = s:option(Value, "outbound_node_username", translate("Username"))
add_v2ray_depends(o, { outbound_node = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"})
add_xray_depends(o, { outbound_node = "_socks"})
add_xray_depends(o, { outbound_node = "_http"})
o = s:option(Value, option_name("outbound_node_username"), translate("Username"))
add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
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
add_v2ray_depends(o, { outbound_node = "_socks"})
add_v2ray_depends(o, { outbound_node = "_http"})
add_xray_depends(o, { outbound_node = "_socks"})
add_xray_depends(o, { outbound_node = "_http"})
add_v2ray_depends(o, { [option_name("outbound_node")] = "_socks"})
add_v2ray_depends(o, { [option_name("outbound_node")] = "_http"})
add_xray_depends(o, { [option_name("outbound_node")] = "_socks"})
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"
add_v2ray_depends(o, { outbound_node = "_iface"})
add_xray_depends(o, { outbound_node = "_iface"})
add_v2ray_depends(o, { [option_name("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.rmempty = false
add_v2ray_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:value("debug")
o:value("info")
o:value("warning")
o:value("error")
add_v2ray_depends(o, { xray_log = true })
add_xray_depends(o, { xray_log = true })
o.cfgvalue = rm_prefix_cfgvalue
o.write = rm_prefix_write
add_v2ray_depends(o, { [option_name("log")] = true })
add_xray_depends(o, { [option_name("log")] = true })
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
end
local type_name = "SS-Rust"
local option_prefix = "ssrust_"
local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end
end
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
m:set(section, self.option:sub(1 + #option_prefix), value)
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 = {
"plain", "none",
@ -31,41 +42,43 @@ local ssrust_encrypt_method_list = {
-- [[ 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 = s:option(Value, "ssrust_password", translate("Password"))
o = s:option(Value, option_name("password"), translate("Password"))
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
o = s:option(Value, "ssrust_timeout", translate("Connection Timeout"))
o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger"
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 = s:option(Flag, "ssrust_log", translate("Log"))
o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1"
o.rmempty = false
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
local deps = s.fields[key].deps
if #deps > 0 then
for index, value in ipairs(deps) do
deps[index]["type"] = "SS-Rust"
deps[index]["type"] = type_name
end
else
s.fields[key]:depends({ type = "SS-Rust" })
s.fields[key]:depends({ type = type_name })
end
end
end

View File

@ -6,6 +6,8 @@ if not api.is_finded("ss-server") then
return
end
local type_name = "SS"
local option_prefix = "ss_"
local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end
end
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
m:set(section, self.option:sub(1 + #option_prefix), value)
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 = {
"rc4-md5", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr",
@ -34,41 +45,43 @@ local ss_encrypt_method_list = {
-- [[ 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 = s:option(Value, "ss_password", translate("Password"))
o = s:option(Value, option_name("password"), translate("Password"))
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
o = s:option(Value, "ss_timeout", translate("Connection Timeout"))
o = s:option(Value, option_name("timeout"), translate("Connection Timeout"))
o.datatype = "uinteger"
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 = s:option(Flag, "ss_log", translate("Log"))
o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1"
o.rmempty = false
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
local deps = s.fields[key].deps
if #deps > 0 then
for index, value in ipairs(deps) do
deps[index]["type"] = "SS"
deps[index]["type"] = type_name
end
else
s.fields[key]:depends({ type = "SS" })
s.fields[key]:depends({ type = type_name })
end
end
end

View File

@ -6,6 +6,8 @@ if not api.is_finded("ssr-server") then
return
end
local type_name = "SSR"
local option_prefix = "ssr_"
local function option_name(name)
@ -18,10 +20,19 @@ local function rm_prefix_cfgvalue(self, section)
end
end
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
m:set(section, self.option:sub(1 + #option_prefix), value)
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 = {
"none", "table", "rc2-cfb", "rc4", "rc4-md5", "rc4-md5-6", "aes-128-cfb",
@ -44,55 +55,57 @@ local ssr_obfs_list = {
-- [[ 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 = s:option(Value, "ssr_password", translate("Password"))
o = s:option(Value, option_name("password"), translate("Password"))
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
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
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
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.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 = s:option(Flag, "ssr_udp_forward", translate("UDP Forward"))
o = s:option(Flag, option_name("udp_forward"), translate("UDP Forward"))
o.default = "1"
o.rmempty = false
o = s:option(Flag, "ssr_log", translate("Log"))
o = s:option(Flag, option_name("log"), translate("Log"))
o.default = "1"
o.rmempty = false
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
local deps = s.fields[key].deps
if #deps > 0 then
for index, value in ipairs(deps) do
deps[index]["type"] = "SSR"
deps[index]["type"] = type_name
end
else
s.fields[key]:depends({ type = "SSR" })
s.fields[key]:depends({ type = type_name })
end
end
end

View File

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

View File

@ -43,6 +43,19 @@ use_nft=$(uci -q get passwall2.@global_forwarding[0].use_nft || echo "0")
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 -rf /tmp/luci-modulecache/
killall -HUP rpcd 2>/dev/null