update 2026-08-10 04:25:08
No files matched your search
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 319 KiB |
|
After Width: | Height: | Size: 389 KiB |
|
Before Width: | Height: | Size: 640 KiB |
|
Before Width: | Height: | Size: 550 KiB |
|
Before Width: | Height: | Size: 547 KiB |
|
Before Width: | Height: | Size: 659 KiB |
|
Before Width: | Height: | Size: 650 KiB |
@@ -103,30 +103,7 @@ config nodes 'myshunt'
|
|||||||
config shunt_rules 'DirectGame'
|
config shunt_rules 'DirectGame'
|
||||||
option remarks 'DirectGame'
|
option remarks 'DirectGame'
|
||||||
option network 'tcp,udp'
|
option network 'tcp,udp'
|
||||||
option domain_list '# steam直连域名获取国内CDN走国内线路下载
|
option domain_list '# 国内游戏geosite域名
|
||||||
cm.steampowered.com
|
|
||||||
steamserver.net
|
|
||||||
|
|
||||||
# steam国内CDN华为云
|
|
||||||
steampipe.steamcontent.tnkjmec.com
|
|
||||||
# steam国内CDN白山云
|
|
||||||
st.dl.eccdnx.com
|
|
||||||
st.dl.bscstorage.net
|
|
||||||
st.dl.pinyuncloud.com
|
|
||||||
# steam国内CDN新流云(原金山云)(支持ipv6)
|
|
||||||
dl.steam.clngaa.com
|
|
||||||
# steam国内CDN网宿
|
|
||||||
cdn.mileweb.cs.steampowered.com.8686c.com
|
|
||||||
cdn-ws.content.steamchina.com
|
|
||||||
# steam国内CDN腾讯云 (蒸汽中国独占)
|
|
||||||
cdn-qc.content.steamchina.com
|
|
||||||
# steam国内CDN阿里云(支持ipv6)
|
|
||||||
cdn-ali.content.steamchina.com
|
|
||||||
xz.pphimalayanrt.com
|
|
||||||
lv.queniujq.cn
|
|
||||||
alibaba.cdn.steampipe.steamcontent.com
|
|
||||||
|
|
||||||
# 国内游戏geosite域名
|
|
||||||
geosite:category-games@cn'
|
geosite:category-games@cn'
|
||||||
option ip_list '# steam直连IP
|
option ip_list '# steam直连IP
|
||||||
45.121.184.0/24
|
45.121.184.0/24
|
||||||
@@ -196,6 +173,9 @@ steamcloud-sydney.storage.googleapis.com
|
|||||||
steamcloud-taiwan.storage.googleapis.com
|
steamcloud-taiwan.storage.googleapis.com
|
||||||
steamcloud-eu.storage.googleapis.com
|
steamcloud-eu.storage.googleapis.com
|
||||||
domain:blizzard.com
|
domain:blizzard.com
|
||||||
|
#Steam支付
|
||||||
|
domain:checkout.steampowered.com
|
||||||
|
domain:globalapi.smart2pay.com
|
||||||
geosite:category-games'
|
geosite:category-games'
|
||||||
|
|
||||||
config shunt_rules 'AIGC'
|
config shunt_rules 'AIGC'
|
||||||
|
|||||||
@@ -23,17 +23,6 @@ for k, e in ipairs(api.get_valid_nodes()) do
|
|||||||
nodes_table[#nodes_table + 1] = e
|
nodes_table[#nodes_table + 1] = e
|
||||||
end
|
end
|
||||||
|
|
||||||
local dynamicList_write = function(self, section, value)
|
|
||||||
local new_t = {}
|
|
||||||
if type(value) == "table" then
|
|
||||||
new_t = api.table_remove_duplicates(value)
|
|
||||||
else
|
|
||||||
new_t = { value }
|
|
||||||
end
|
|
||||||
local new_val = table.concat(new_t, " ")
|
|
||||||
return DynamicList.write(self, section, new_val)
|
|
||||||
end
|
|
||||||
|
|
||||||
local doh_validate = function(self, value, t)
|
local doh_validate = function(self, value, t)
|
||||||
if value ~= "" then
|
if value ~= "" then
|
||||||
local flag = 0
|
local flag = 0
|
||||||
@@ -168,7 +157,6 @@ sources.validate = function(self, value, t)
|
|||||||
|
|
||||||
return value
|
return value
|
||||||
end
|
end
|
||||||
sources.write = dynamicList_write
|
|
||||||
|
|
||||||
o = s:option(ListValue, "mode", translate("Mode"))
|
o = s:option(ListValue, "mode", translate("Mode"))
|
||||||
o:value("0", translate("No Proxy"))
|
o:value("0", translate("No Proxy"))
|
||||||
|
|||||||
@@ -167,19 +167,6 @@ source.validate = function(self, value, t)
|
|||||||
return value
|
return value
|
||||||
end
|
end
|
||||||
|
|
||||||
local dynamicList_write = function(self, section, value)
|
|
||||||
local new_t = {}
|
|
||||||
if type(value) == "table" then
|
|
||||||
new_t = api.table_remove_duplicates(value)
|
|
||||||
else
|
|
||||||
new_t = { value }
|
|
||||||
end
|
|
||||||
local new_val = table.concat(new_t, " ")
|
|
||||||
return DynamicList.write(self, section, new_val)
|
|
||||||
end
|
|
||||||
|
|
||||||
source.write = dynamicList_write
|
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
-- Too low usage rate, hidden
|
-- Too low usage rate, hidden
|
||||||
sourcePort = s:option(Value, "sourcePort", translate("Source port"))
|
sourcePort = s:option(Value, "sourcePort", translate("Source port"))
|
||||||
|
|||||||
@@ -116,12 +116,12 @@ if load_balancing_options then -- [[ Load balancing Start ]]
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Reading the old DynamicList
|
-- Reading the old DynamicList
|
||||||
function o.cfgvalue(self, section)
|
function o.custom_cfgvalue(self, section)
|
||||||
return m.uci:get_list(appname, section, "balancing_node") or {}
|
return table.concat(m:get(section, "balancing_node") or {}, " ")
|
||||||
end
|
end
|
||||||
-- Write-and-hold DynamicList
|
-- Write-and-hold DynamicList
|
||||||
function o.custom_write(self, section, value)
|
function o.custom_write(self, section, value)
|
||||||
local old = m.uci:get_list(appname, section, "balancing_node") or {}
|
local old = m:get(section, "balancing_node") or {}
|
||||||
local new, set = {}, {}
|
local new, set = {}, {}
|
||||||
for v in value:gmatch("%S+") do
|
for v in value:gmatch("%S+") do
|
||||||
new[#new + 1] = v
|
new[#new + 1] = v
|
||||||
@@ -129,13 +129,13 @@ if load_balancing_options then -- [[ Load balancing Start ]]
|
|||||||
end
|
end
|
||||||
for _, v in ipairs(old) do
|
for _, v in ipairs(old) do
|
||||||
if not set[v] then
|
if not set[v] then
|
||||||
m.uci:set_list(appname, section, "balancing_node", new)
|
m:set(section, "balancing_node", new)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
set[v] = nil
|
set[v] = nil
|
||||||
end
|
end
|
||||||
for _ in pairs(set) do
|
for _ in pairs(set) do
|
||||||
m.uci:set_list(appname, section, "balancing_node", new)
|
m:set(section, "balancing_node", new)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -533,15 +533,6 @@ o:value("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
|
|||||||
o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
|
o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
|
||||||
o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
|
o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
|
||||||
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
|
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
|
||||||
function o.custom_write(self, section, value)
|
|
||||||
local new_t
|
|
||||||
if type(value) == "table" then
|
|
||||||
new_t = api.table_remove_duplicates(value)
|
|
||||||
else
|
|
||||||
new_t = { value }
|
|
||||||
end
|
|
||||||
m:set(section, self.option:sub(1 + #option_prefix), new_t)
|
|
||||||
end
|
|
||||||
|
|
||||||
o = s:option(TextValue, _n("reality_mldsa65Verify"), "ML-DSA-65 " .. translate("Public key"))
|
o = s:option(TextValue, _n("reality_mldsa65Verify"), "ML-DSA-65 " .. translate("Public key"))
|
||||||
o.default = ""
|
o.default = ""
|
||||||
|
|||||||
@@ -118,12 +118,12 @@ if load_urltest_options then -- [[ URLTest Start ]]
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Reading the old DynamicList
|
-- Reading the old DynamicList
|
||||||
function o.cfgvalue(self, section)
|
function o.custom_cfgvalue(self, section)
|
||||||
return m.uci:get_list(appname, section, "urltest_node") or {}
|
return table.concat(m:get(section, "urltest_node") or {}, " ")
|
||||||
end
|
end
|
||||||
-- Write-and-hold DynamicList
|
-- Write-and-hold DynamicList
|
||||||
function o.custom_write(self, section, value)
|
function o.custom_write(self, section, value)
|
||||||
local old = m.uci:get_list(appname, section, "urltest_node") or {}
|
local old = m:get(section, "urltest_node") or {}
|
||||||
local new, set = {}, {}
|
local new, set = {}, {}
|
||||||
for v in value:gmatch("%S+") do
|
for v in value:gmatch("%S+") do
|
||||||
new[#new + 1] = v
|
new[#new + 1] = v
|
||||||
@@ -131,13 +131,13 @@ if load_urltest_options then -- [[ URLTest Start ]]
|
|||||||
end
|
end
|
||||||
for _, v in ipairs(old) do
|
for _, v in ipairs(old) do
|
||||||
if not set[v] then
|
if not set[v] then
|
||||||
m.uci:set_list(appname, section, "urltest_node", new)
|
m:set(section, "urltest_node", new)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
set[v] = nil
|
set[v] = nil
|
||||||
end
|
end
|
||||||
for _ in pairs(set) do
|
for _ in pairs(set) do
|
||||||
m.uci:set_list(appname, section, "urltest_node", new)
|
m:set(section, "urltest_node", new)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -589,15 +589,6 @@ o:value("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
|
|||||||
o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
|
o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
|
||||||
o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
|
o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
|
||||||
o:depends({ [_n("tls")] = true })
|
o:depends({ [_n("tls")] = true })
|
||||||
function o.custom_write(self, section, value)
|
|
||||||
local new_t
|
|
||||||
if type(value) == "table" then
|
|
||||||
new_t = api.table_remove_duplicates(value)
|
|
||||||
else
|
|
||||||
new_t = { value }
|
|
||||||
end
|
|
||||||
m:set(section, self.option:sub(1 + #option_prefix), new_t)
|
|
||||||
end
|
|
||||||
|
|
||||||
o = s:option(Flag, _n("ech"), translate("ECH"))
|
o = s:option(Flag, _n("ech"), translate("ECH"))
|
||||||
o.default = "0"
|
o.default = "0"
|
||||||
|
|||||||
@@ -218,15 +218,6 @@ o:depends({ [_n("reality")] = true })
|
|||||||
|
|
||||||
o = s:option(DynamicList, _n("reality_serverNames"), translate("serverNames"))
|
o = s:option(DynamicList, _n("reality_serverNames"), translate("serverNames"))
|
||||||
o:depends({ [_n("reality")] = true })
|
o:depends({ [_n("reality")] = true })
|
||||||
function o.custom_write(self, section, value)
|
|
||||||
local new_t = {}
|
|
||||||
if type(value) == "table" then
|
|
||||||
new_t = api.table_remove_duplicates(value)
|
|
||||||
else
|
|
||||||
new_t = { value }
|
|
||||||
end
|
|
||||||
m:set(section, self.option:sub(1 + #option_prefix), new_t)
|
|
||||||
end
|
|
||||||
|
|
||||||
o = s:option(ListValue, _n("alpn"), translate("alpn"))
|
o = s:option(ListValue, _n("alpn"), translate("alpn"))
|
||||||
o.default = "default"
|
o.default = "default"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ nixio = require "nixio"
|
|||||||
fs = require "nixio.fs"
|
fs = require "nixio.fs"
|
||||||
sys = require "luci.sys"
|
sys = require "luci.sys"
|
||||||
uci = require"luci.model.uci".cursor()
|
uci = require"luci.model.uci".cursor()
|
||||||
|
cbi = require "luci.cbi"
|
||||||
util = require "luci.util"
|
util = require "luci.util"
|
||||||
datatypes = require "luci.cbi.datatypes"
|
datatypes = require "luci.cbi.datatypes"
|
||||||
jsonc = require "luci.jsonc"
|
jsonc = require "luci.jsonc"
|
||||||
@@ -1386,7 +1387,6 @@ function set_apply_on_parse(map)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function set_default_cbi()
|
function set_default_cbi()
|
||||||
local cbi = require "luci.cbi"
|
|
||||||
if true then
|
if true then
|
||||||
--TextValue
|
--TextValue
|
||||||
local TextValue = cbi.TextValue
|
local TextValue = cbi.TextValue
|
||||||
@@ -1396,10 +1396,28 @@ function set_default_cbi()
|
|||||||
self.template = appname .. "/cbi/tvalue"
|
self.template = appname .. "/cbi/tvalue"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if true then
|
||||||
|
--DynamicList
|
||||||
|
local DynamicList = cbi.DynamicList
|
||||||
|
function DynamicList.write(self, section, value)
|
||||||
|
local new_t = {}
|
||||||
|
if type(value) == "table" then
|
||||||
|
new_t = table_remove_duplicates(value)
|
||||||
|
else
|
||||||
|
new_t = { value }
|
||||||
|
end
|
||||||
|
local new_val
|
||||||
|
if self.cast == "string" then
|
||||||
|
new_val = table.concat(new_t, " ")
|
||||||
|
else
|
||||||
|
new_val = new_t
|
||||||
|
end
|
||||||
|
return cbi.AbstractValue.write(self, section, new_val)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function return_map(map)
|
function return_map(map)
|
||||||
local cbi = require "luci.cbi"
|
|
||||||
local api = require "luci.passwall2.api"
|
local api = require "luci.passwall2.api"
|
||||||
if true then
|
if true then
|
||||||
-- header
|
-- header
|
||||||
@@ -1457,11 +1475,25 @@ function luci_types(id, m, s, type_name, option_prefix)
|
|||||||
if self.custom_write then
|
if self.custom_write then
|
||||||
self:custom_write(section, value)
|
self:custom_write(section, value)
|
||||||
else
|
else
|
||||||
|
local new_val = value
|
||||||
|
if util.instanceof(self, cbi.DynamicList) then
|
||||||
|
local new_t = {}
|
||||||
|
if type(value) == "table" then
|
||||||
|
new_t = table_remove_duplicates(value)
|
||||||
|
else
|
||||||
|
new_t = { value }
|
||||||
|
end
|
||||||
|
if self.cast == "string" then
|
||||||
|
new_val = table.concat(new_t, " ")
|
||||||
|
else
|
||||||
|
new_val = new_t
|
||||||
|
end
|
||||||
|
end
|
||||||
if self.rewrite_option then
|
if self.rewrite_option then
|
||||||
m:set(section, self.rewrite_option, value)
|
m:set(section, self.rewrite_option, new_val)
|
||||||
else
|
else
|
||||||
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), new_val)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||