luci-app-passwall: sync with upstream source

This commit is contained in:
CN_SZTL 2020-03-15 21:11:47 +08:00
parent cc38e6495c
commit 91dd669cab
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
7 changed files with 274 additions and 34 deletions

View File

@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=3.6
PKG_RELEASE:=22
PKG_DATE:=20200314
PKG_RELEASE:=25
PKG_DATE:=20200315
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

View File

@ -10,12 +10,11 @@ local outbounds = {}
local network = proto
local routing = nil
local function gen_outbound(node, tag)
local function gen_outbound(node)
local result = nil
if node then
result = {
tag = tag or node[".name"],
cbi_id = node[".name"],
tag = node[".name"],
protocol = node.v2ray_protocol or "vmess",
mux = {
enabled = (node.v2ray_mux == "1") and true or false,

View File

@ -0,0 +1,203 @@
local ucursor = require"luci.model.uci".cursor()
local sys = require "luci.sys"
local json = require "luci.jsonc"
local node_section = arg[1]
local proto = arg[2]
local redir_port = arg[3]
local socks5_proxy_port = arg[4]
local node = ucursor:get_all("passwall", node_section)
local inbounds = {}
local outbounds = {}
local network = proto
local routing = nil
local function gen_outbound(node)
local result = nil
if node then
local node_id = node[".name"]
if node.type ~= "V2ray" then
if node.type == "Socks5" then
node.v2ray_protocol = "socks"
node.v2ray_transport = "tcp"
else
local node_type = (proto and proto ~= "nil") and proto or
"socks"
local new_port = sys.exec(
"echo -n $(/usr/share/passwall/app.sh get_new_port auto tcp)")
node.port = new_port
sys.call(string.format(
"/usr/share/passwall/app.sh gen_start_config %s %s %s %s %s %s",
node_id, new_port, "SOCKS5",
"/var/etc/passwall/v2_balancing_" .. node_type .. "_" ..
node_id .. ".json", "4", "127.0.0.1"))
node.v2ray_protocol = "socks"
node.v2ray_transport = "tcp"
node.address = "127.0.0.1"
end
end
result = {
tag = node_id,
protocol = node.v2ray_protocol or "vmess",
mux = {
enabled = (node.v2ray_mux == "1") and true or false,
concurrency = (node.v2ray_mux_concurrency) and
tonumber(node.v2ray_mux_concurrency) or 8
},
-- 底层传输配置
streamSettings = {
network = node.v2ray_transport,
security = node.v2ray_stream_security,
tlsSettings = (node.v2ray_stream_security == "tls") and {
serverName = node.tls_serverName,
allowInsecure = (node.tls_allowInsecure == "1") and true or
false
} or nil,
tcpSettings = (node.v2ray_transport == "tcp" and
node.v2ray_protocol ~= "socks") and {
header = {
type = node.v2ray_tcp_guise,
request = {
path = node.v2ray_tcp_guise_http_path or {"/"},
headers = {
Host = node.v2ray_tcp_guise_http_host or {}
}
} or {}
}
} or nil,
kcpSettings = (node.v2ray_transport == "mkcp") and {
mtu = tonumber(node.v2ray_mkcp_mtu),
tti = tonumber(node.v2ray_mkcp_tti),
uplinkCapacity = tonumber(node.v2ray_mkcp_uplinkCapacity),
downlinkCapacity = tonumber(node.v2ray_mkcp_downlinkCapacity),
congestion = (node.v2ray_mkcp_congestion == "1") and true or
false,
readBufferSize = tonumber(node.v2ray_mkcp_readBufferSize),
writeBufferSize = tonumber(node.v2ray_mkcp_writeBufferSize),
header = {type = node.v2ray_mkcp_guise}
} or nil,
wsSettings = (node.v2ray_transport == "ws") and {
path = node.v2ray_ws_path or "",
headers = (node.v2ray_ws_host ~= nil) and
{Host = node.v2ray_ws_host} or nil
} or nil,
httpSettings = (node.v2ray_transport == "h2") and
{path = node.v2ray_h2_path, host = node.v2ray_h2_host} or
nil,
dsSettings = (node.v2ray_transport == "ds") and
{path = node.v2ray_ds_path} or nil,
quicSettings = (node.v2ray_transport == "quic") and {
security = node.v2ray_quic_security,
key = node.v2ray_quic_key,
header = {type = node.v2ray_quic_guise}
} or nil
},
settings = {
vnext = (node.v2ray_protocol == "vmess") and {
{
address = node.address,
port = tonumber(node.port),
users = {
{
id = node.v2ray_VMess_id,
alterId = tonumber(node.v2ray_VMess_alterId),
level = tonumber(node.v2ray_VMess_level),
security = node.v2ray_security
}
}
}
} or nil,
servers = (node.v2ray_protocol == "socks") and {
{
address = node.address,
port = tonumber(node.port),
users = (node.username and node.password) and
{{user = node.username, pass = node.password}} or
nil
}
} or (node.v2ray_protocol == "ss") and {
{
email = nil,
address = node.address,
method = nil,
ota = nil,
password = node.password or nil,
port = tonumber(node.port),
level = 1
}
} or nil
}
}
end
return result
end
if socks5_proxy_port ~= "nil" then
table.insert(inbounds, {
listen = "0.0.0.0",
port = socks5_proxy_port,
protocol = "socks",
settings = {auth = "noauth", udp = true, ip = "127.0.0.1"}
})
network = "tcp,udp"
end
if redir_port ~= "nil" then
table.insert(inbounds, {
port = redir_port,
protocol = "dokodemo-door",
settings = {network = proto, followRedirect = true},
sniffing = {enabled = true, destOverride = {"http", "tls"}}
})
if proto == "tcp" and node.v2ray_tcp_socks == "1" then
table.insert(inbounds, {
listen = "0.0.0.0",
port = tonumber(node.v2ray_tcp_socks_port),
protocol = "socks",
settings = {
auth = node.v2ray_tcp_socks_auth,
accounts = (node.v2ray_tcp_socks_auth == "password") and {
{
user = node.v2ray_tcp_socks_auth_username,
pass = node.v2ray_tcp_socks_auth_password
}
} or nil,
udp = true
}
})
end
end
if node.v2ray_balancing_node then
local nodes = node.v2ray_balancing_node
local length = #nodes
for i = 1, length do
local node = ucursor:get_all("passwall", nodes[i])
local outbound = gen_outbound(node)
if outbound then table.insert(outbounds, outbound) end
end
routing = {
domainStrategy = "IPOnDemand",
balancers = {{tag = "balancer", selector = nodes}},
rules = {
{type = "field", network = "tcp,udp", balancerTag = "balancer"}
}
}
end
-- 额外传出连接
table.insert(outbounds,
{protocol = "freedom", tag = "direct", settings = {keep = ""}})
local v2ray = {
log = {
-- error = "/var/log/v2ray.log",
loglevel = "warning"
},
-- 传入连接
inbounds = inbounds,
-- 传出连接
outbounds = outbounds,
-- 路由
routing = routing
}
print(json.stringify(v2ray, 1))

View File

@ -14,7 +14,7 @@ local routing = nil
local function gen_outbound(node, tag)
local result = nil
if node then
local cbi_id = node[".name"]
local node_id = node[".name"]
if node.type ~= "V2ray" then
if node.type == "Socks5" then
node.v2ray_protocol = "socks"
@ -27,9 +27,9 @@ local function gen_outbound(node, tag)
node.port = new_port
sys.call(string.format(
"/usr/share/passwall/app.sh gen_start_config %s %s %s %s %s %s",
cbi_id, new_port, "SOCKS5",
node_id, new_port, "SOCKS5",
"/var/etc/passwall/v2_shunt_" .. node_type .. "_" ..
cbi_id .. ".json", "4", "127.0.0.1"))
node_id .. ".json", "4", "127.0.0.1"))
node.v2ray_protocol = "socks"
node.v2ray_transport = "tcp"
node.address = "127.0.0.1"
@ -37,7 +37,6 @@ local function gen_outbound(node, tag)
end
result = {
tag = tag,
cbi_id = cbi_id,
protocol = node.v2ray_protocol or "vmess",
mux = {
enabled = (node.v2ray_mux == "1") and true or false,

View File

@ -20,7 +20,7 @@ uci:foreach(appname, "nodes", function(e)
if type == nil then type = "" end
local address = e.address
if address == nil then address = "" end
if (type == "V2ray_balancing" or type == "V2ray_shunt") or (address:match("[\u4e00-\u9fa5]") and address:find("%.") and address:sub(#address) ~= ".") then
--if (type == "V2ray_balancing" or type == "V2ray_shunt") or (address:match("[\u4e00-\u9fa5]") and address:find("%.") and address:sub(#address) ~= ".") then
if type and address and e.remarks then
if e.use_kcp and e.use_kcp == "1" then
n[e[".name"]] = "%s+%s[%s] %s" %
@ -32,7 +32,7 @@ uci:foreach(appname, "nodes", function(e)
{translate(type), e.remarks, address}
end
end
end
--end
end)
local key_table = {}

View File

@ -20,6 +20,7 @@ DNS_PORT=7913
LUA_API_PATH=/usr/lib/lua/luci/model/cbi/$CONFIG/api
API_GEN_TROJAN=$LUA_API_PATH/gen_trojan.lua
API_GEN_V2RAY=$LUA_API_PATH/gen_v2ray.lua
API_GEN_V2RAY_BALANCING=$LUA_API_PATH/gen_v2ray_balancing.lua
API_GEN_V2RAY_SHUNT=$LUA_API_PATH/gen_v2ray_shunt.lua
echolog() {
@ -288,9 +289,12 @@ gen_start_config() {
eval SOCKS5_NODE${5}_PORT=$port
if [ "$type" == "socks5" ]; then
echolog "Socks5节点不能使用Socks5代理节点"
elif [ "$type" == "v2ray" -o "$type" == "v2ray_balancing" ]; then
elif [ "$type" == "v2ray" ]; then
lua $API_GEN_V2RAY $node nil nil $local_port >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_socks_$5 "-config=$config_file"
elif [ "$type" == "v2ray_balancing" ]; then
lua $API_GEN_V2RAY_BALANCING $node nil nil $local_port >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_socks_$5 "-config=$config_file"
elif [ "$type" == "v2ray_shunt" ]; then
lua $API_GEN_V2RAY_SHUNT $node nil nil $local_port >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_socks_$5 "-config=$config_file"
@ -331,9 +335,12 @@ gen_start_config() {
local server_password=$(config_n_get $node password)
eval port=\$UDP_REDIR_PORT$5
ln_start_bin $(find_bin ipt2socks) ipt2socks_udp_$5 "-U -l $port -b 0.0.0.0 -s $node_address -p $node_port -R"
elif [ "$type" == "v2ray" -o "$type" == "v2ray_balancing" ]; then
elif [ "$type" == "v2ray" ]; then
lua $API_GEN_V2RAY $node udp $local_port nil >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_udp_$5 "-config=$config_file"
elif [ "$type" == "v2ray_balancing" ]; then
lua $API_GEN_V2RAY_BALANCING $node udp $local_port nil >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_udp_$5 "-config=$config_file"
elif [ "$type" == "v2ray_shunt" ]; then
lua $API_GEN_V2RAY_SHUNT $node udp $local_port nil >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_udp_$5 "-config=$config_file"
@ -384,9 +391,12 @@ gen_start_config() {
local server_password=$(config_n_get $node password)
eval port=\$TCP_REDIR_PORT$5
ln_start_bin $(find_bin ipt2socks) ipt2socks_tcp_$5 "-T -l $port -b 0.0.0.0 -s $node_address -p $node_port -R"
elif [ "$type" == "v2ray" -o "$type" == "v2ray_balancing" ]; then
elif [ "$type" == "v2ray" ]; then
lua $API_GEN_V2RAY $node tcp $local_port nil >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_tcp_$5 "-config=$config_file"
elif [ "$type" == "v2ray_balancing" ]; then
lua $API_GEN_V2RAY_BALANCING $node tcp $local_port nil >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_tcp_$5 "-config=$config_file"
elif [ "$type" == "v2ray_shunt" ]; then
lua $API_GEN_V2RAY_SHUNT $node tcp $local_port nil >$config_file
ln_start_bin $(config_t_get global_app v2ray_file $(find_bin v2ray))/v2ray v2ray_tcp_$5 "-config=$config_file"

View File

@ -302,8 +302,7 @@ local function processData(szType, content, add_mode)
result.group = content.airport
result.remarks = content.remarks
else
log('暂时不支持' .. szType ..
"类型的节点订阅,跳过此节点。")
log('暂时不支持' .. szType .. "类型的节点订阅,跳过此节点。")
return nil
end
if not result.remarks then
@ -313,7 +312,8 @@ local function processData(szType, content, add_mode)
end
-- wget
local function wget(url)
local stdout = luci.sys.exec('/usr/bin/wget --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" --no-check-certificate -t 3 -T 10 -O- "' .. url .. '"')
local ua = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
local stdout = luci.sys.exec('/usr/bin/wget --user-agent="' .. ua .. '" --no-check-certificate -t 3 -T 10 -O- "' .. url .. '"')
return trim(stdout)
end
@ -351,31 +351,59 @@ end
local function select_node(nodes, config)
local server
-- 特别优先级 V2ray分流 + 备注
if config.currentNode.type == 'V2ray_shunt' then
for id, node in pairs(nodes) do
if node.remarks == config.currentNode.remarks then
log('选择【' .. config.remarks .. '】V2ray分流匹配节点' .. node.remarks)
server = id
break
end
end
end
-- 特别优先级 V2ray负载均衡 + 备注
if config.currentNode.type == 'V2ray_balancing' then
for id, node in pairs(nodes) do
if node.remarks == config.currentNode.remarks then
log('选择【' .. config.remarks .. '】V2ray负载均衡匹配节点' .. node.remarks)
server = id
break
end
end
end
-- 第一优先级 IP + 端口
for id, node in pairs(nodes) do
if node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port then
log('选择【' .. config.remarks .. '】第一匹配节点:' .. node.remarks)
server = id
break
if not server then
for id, node in pairs(nodes) do
if node.address and node.port then
if node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port then
log('选择【' .. config.remarks .. '】第一匹配节点:' .. node.remarks)
server = id
break
end
end
end
end
-- 第二优先级 IP
if not server then
for id, node in pairs(nodes) do
if node.address == config.currentNode.address then
log('选择【' .. config.remarks .. '】第二匹配节点:' .. node.remarks)
server = id
break
if node.address then
if node.address == config.currentNode.address then
log('选择【' .. config.remarks .. '】第二匹配节点:' .. node.remarks)
server = id
break
end
end
end
end
-- 第三优先级备注
if not server then
for id, node in pairs(nodes) do
if node.remarks == config.currentNode.remarks then
log('选择【' .. config.remarks .. '】第三匹配节点:' .. node.remarks)
server = id
break
if node.remarks then
if node.remarks == config.currentNode.remarks then
log('选择【' .. config.remarks .. '】第三匹配节点:' .. node.remarks)
server = id
break
end
end
end
end
@ -427,14 +455,14 @@ local function update_node(manual)
local nodes = {}
local ucic3 = uci.cursor()
ucic3:foreach(application, uciType, function(node)
if node.port and node.address and node.remarks then
if (node.port and node.address and node.remarks) or node.type == 'V2ray_shunt' or node.type == 'V2ray_balancing' then
nodes[node['.name']] = node
end
end)
for _, config in pairs(CONFIG) do
select_node(nodes, config)
end
ucic3:commit(application)
ucic2:commit(application)
luci.sys.call("/etc/init.d/" .. application .. " restart > /dev/null 2>&1 &") -- 不加&的话日志会出现的更早
end
end
@ -498,7 +526,8 @@ local function parse_link(raw, remark, manual)
if result.remarks:find("过期时间") or
result.remarks:find("剩余流量") or
result.remarks:find("QQ群") or
result.remarks:find("官网") or not result.address or
result.remarks:find("官网") or
not result.address or
result.address:match("[^0-9a-zA-Z%-%_%.%s]") or -- 中文做地址的 也没有人拿中文域名搞就算中文域也有Puny Code SB 机场
not result.address:find("%.") or -- 虽然没有.也算域,不过应该没有人会这样干吧
result.address:sub(#result.address) == "." -- 结尾是.
@ -548,7 +577,7 @@ if arg[1] then
end)
log('订阅完毕...')
else
log('未设置或启用订阅, 请检查设置...')
log('未设置订阅启用订阅, 请检查设置...')
end
elseif arg[1] == "add" then
local f = assert(io.open("/tmp/links.conf", 'r'))