update 2023-09-06 23:36:46

This commit is contained in:
github-actions[bot] 2023-09-06 23:36:47 +08:00
parent 9498b73098
commit ac8e3b8858
27 changed files with 454 additions and 389 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -376,7 +376,7 @@ if (!isEmpty(main_node)) {
invert: (cfg.invert === '1'),
outbound: get_outbound(cfg.outbound),
server: get_resolver(cfg.server),
disable_cache: (cfg.disable_cache === '1')
disable_cache: (cfg.dns_disable_cache === '1')
});
});

View File

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

View File

@ -2,8 +2,8 @@ local api = require "luci.passwall2.api"
local appname = api.appname
local uci = api.uci
local datatypes = api.datatypes
local has_singbox = api.is_finded("sing-box")
local has_xray = api.is_finded("xray")
local has_singbox = api.finded_com("singbox")
local has_xray = api.finded_com("xray")
m = Map(appname)

View File

@ -2,8 +2,8 @@ local api = require "luci.passwall2.api"
local appname = api.appname
local has_ss = api.is_finded("ss-redir")
local has_ss_rust = api.is_finded("sslocal")
local has_singbox = api.is_finded("sing-box")
local has_xray = api.is_finded("xray")
local has_singbox = api.finded_com("singbox")
local has_xray = api.finded_com("xray")
local ss_aead_type = {}
if has_ss then
ss_aead_type[#ss_aead_type + 1] = "shadowsocks-libev"

View File

@ -3,8 +3,8 @@ local appname = api.appname
local sys = api.sys
local has_ss = api.is_finded("ss-redir")
local has_ss_rust = api.is_finded("sslocal")
local has_singbox = api.is_finded("sing-box")
local has_xray = api.is_finded("xray")
local has_singbox = api.finded_com("singbox")
local has_xray = api.finded_com("xray")
local ss_aead_type = {}
if has_ss then
ss_aead_type[#ss_aead_type + 1] = "shadowsocks-libev"

View File

@ -2,8 +2,8 @@ local api = require "luci.passwall2.api"
local appname = api.appname
local fs = api.fs
local uci = api.uci
local has_singbox = api.is_finded("sing-box")
local has_xray = api.is_finded("xray")
local has_singbox = api.finded_com("singbox")
local has_xray = api.finded_com("xray")
local has_fw3 = api.is_finded("fw3")
local has_fw4 = api.is_finded("fw4")

View File

@ -1,8 +1,8 @@
local api = require "luci.passwall2.api"
local appname = api.appname
local uci = api.uci
local has_singbox = api.is_finded("sing-box")
local has_xray = api.is_finded("xray")
local has_singbox = api.finded_com("singbox")
local has_xray = api.finded_com("xray")
m = Map(appname)

View File

@ -2,7 +2,7 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("brook") then
if not api.finded_com("brook") then
return
end

View File

@ -2,7 +2,7 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("hysteria") then
if not api.finded_com("hysteria") then
return
end

View File

@ -2,7 +2,7 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("xray") then
if not api.finded_com("xray") then
return
end

View File

@ -2,11 +2,13 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("sing-box") then
local singbox_bin = api.finded_com("singbox")
if not singbox_bin then
return
end
local singbox_tags = luci.sys.exec(api.finded("sing-box") .. " version | grep 'Tags:' | awk '{print $2}'")
local singbox_tags = luci.sys.exec(singbox_bin .. " version | grep 'Tags:' | awk '{print $2}'")
local appname = api.appname
local uci = api.uci

View File

@ -2,7 +2,7 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("brook") then
if not api.finded_com("brook") then
return
end

View File

@ -2,7 +2,7 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("hysteria") then
if not api.finded_com("hysteria") then
return
end

View File

@ -2,7 +2,7 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("xray") then
if not api.finded_com("xray") then
return
end

View File

@ -2,11 +2,13 @@ local m, s = ...
local api = require "luci.passwall2.api"
if not api.is_finded("sing-box")then
local singbox_bin = api.finded_com("singbox")
if not singbox_bin then
return
end
local singbox_tags = luci.sys.exec(api.finded("sing-box") .. " version | grep 'Tags:' | awk '{print $2}'")
local singbox_tags = luci.sys.exec(singbox_bin .. " version | grep 'Tags:' | awk '{print $2}'")
local type_name = "sing-box"

View File

@ -381,8 +381,14 @@ function get_customed_path(e)
return uci_get_type("global_app", e .. "_file")
end
function finded_com(e)
local bin = get_app_path(e)
if not bin then return end
return luci.sys.exec('echo -n $(type -t -p "%s" | head -n1)' % { bin })
end
function finded(e)
return luci.sys.exec('echo -n $(type -t -p "/bin/%s" -p "/usr/bin/%s" -p "%s" "%s" | head -n1)' % {e, e, get_customed_path(e), e})
return luci.sys.exec('echo -n $(type -t -p "/bin/%s" -p "/usr/bin/%s" "%s" | head -n1)' % {e, e, e})
end
function is_finded(e)
@ -425,10 +431,12 @@ local function get_bin_version_cache(file, cmd)
end
function get_app_path(app_name)
local def_path = com[app_name].default_path
local path = uci_get_type("global_app", app_name:gsub("%-","_") .. "_file")
path = path and (#path>0 and path or def_path) or def_path
return path
if com[app_name] then
local def_path = com[app_name].default_path
local path = uci_get_type("global_app", app_name:gsub("%-","_") .. "_file")
path = path and (#path>0 and path or def_path) or def_path
return path
end
end
function get_app_version(app_name, file)
@ -790,12 +798,23 @@ function to_extract(app_name, file, subfix)
return {code = 1, error = i18n.translate("File path required.")}
end
if sys.exec("echo -n $(opkg list-installed | grep -c unzip)") ~= "1" then
exec("/bin/rm", {"-f", file})
return {
code = 1,
error = i18n.translate("Not installed unzip, Can't unzip!")
}
local tools_name
if com[app_name].zipped then
if not com[app_name].zipped_suffix or com[app_name].zipped_suffix == "zip" then
tools_name = "unzip"
end
if com[app_name].zipped_suffix and com[app_name].zipped_suffix == "tar.gz" then
tools_name = "tar"
end
if tools_name then
if sys.exec("echo -n $(command -v %s)" % { tools_name }) == "" then
exec("/bin/rm", {"-f", file})
return {
code = 1,
error = i18n.translate("Not installed %s, Can't unzip!" % { tools_name })
}
end
end
end
sys.call("/bin/rm -rf /tmp/".. app_name .."_extract.*")
@ -809,8 +828,19 @@ function to_extract(app_name, file, subfix)
local tmp_dir = util.trim(util.exec("mktemp -d -t ".. app_name .."_extract.XXXXXX"))
local output = {}
exec("/usr/bin/unzip", {"-o", file, app_name, "-d", tmp_dir},
function(chunk) output[#output + 1] = chunk end)
if tools_name then
if tools_name == "unzip" then
local bin = sys.exec("echo -n $(command -v unzip)")
exec(bin, {"-o", file, app_name, "-d", tmp_dir}, function(chunk) output[#output + 1] = chunk end)
elseif tools_name == "tar" then
local bin = sys.exec("echo -n $(command -v tar)")
if com[app_name].zipped_suffix == "tar.gz" then
exec(bin, {"-zxf", file, "-C", tmp_dir}, function(chunk) output[#output + 1] = chunk end)
sys.call("/bin/mv -f " .. tmp_dir .. "/*/" .. com[app_name].name:lower() .. " " .. tmp_dir)
end
end
end
local files = util.split(table.concat(output))
@ -829,7 +859,7 @@ function to_move(app_name,file)
local bin_path = file
local cmd_rm_tmp = "/bin/rm -rf /tmp/" .. app_name .. "_download.*"
if fs.stat(file, "type") == "dir" then
bin_path = file .. "/" .. app_name
bin_path = file .. "/" .. com[app_name].name:lower()
cmd_rm_tmp = "/bin/rm -rf /tmp/" .. app_name .. "_extract.*"
end

View File

@ -39,6 +39,7 @@ _M.singbox = {
get_url = gh_pre_release_url,
cmd_version = "version | awk '{print $3}' | sed -n 1P",
zipped = true,
zipped_suffix = "tar.gz",
default_path = "/usr/bin/sing-box",
match_fmt_str = "linux%%-%s",
file_tree = {

View File

@ -662,12 +662,12 @@ function gen_config(var)
local route = {
rules = {},
geoip = {
path = singbox_settings.geoip_path or "/tmp/singbox/geoip.db",
path = singbox_settings.geoip_path or "/usr/share/singbox/geoip.db",
download_url = singbox_settings.geoip_url or nil,
download_detour = nil,
},
geosite = {
path = singbox_settings.geosite_path or "/tmp/singbox/geosite.db",
path = singbox_settings.geosite_path or "/usr/share/singbox/geosite.db",
download_url = singbox_settings.geosite_url or nil,
download_detour = nil,
},
@ -1134,7 +1134,7 @@ function gen_config(var)
end
experimental.clash_api = {
store_fakeip = true,
cache_file = "/tmp/singbox/passwall2_" .. flag .. ".db"
cache_file = "/tmp/singbox_passwall2_" .. flag .. ".db"
}
end
end

View File

@ -1,7 +1,8 @@
<%+cbi/valueheader%>
<%
local api = require "luci.passwall2.api"
local has_xray = api.is_finded("xray")
local has_singbox = api.finded_com("singbox")
local has_xray = api.finded_com("xray")
-%>
<script type="text/javascript">//<![CDATA[
function padright(str, cnt, pad) {
@ -142,6 +143,8 @@ local has_xray = api.is_finded("xray")
protocol = "hysteria"
} else if (v_type === "Xray") {
dom_prefix = "xray_"
} else if (v_type === "sing-box") {
dom_prefix = "singbox_"
}
var _address = ""
if (dom_prefix && dom_prefix != null) {
@ -229,7 +232,7 @@ local has_xray = api.is_finded("xray")
"&protoparam=" + b64encsafe(v_protocol_param.value) +
"&remarks=" + b64encutf8safe(v_alias.value);
url = b64encsafe(ssr_str);
} else if (v_type === "Xray" && opt.get(dom_prefix + "protocol").value === "vmess") {
} else if ((v_type === "sing-box" || v_type === "Xray") && opt.get(dom_prefix + "protocol").value === "vmess") {
protocol = "vmess";
var info = {};
info.v = "2";
@ -274,7 +277,7 @@ local has_xray = api.is_finded("xray")
info.sni = opt.get(dom_prefix + "tls_serverName").value;
}
url = b64EncodeUnicode(JSON.stringify(info));
} else if (v_type === "Xray" && opt.get(dom_prefix + "protocol").value === "vless") {
} else if ((v_type === "sing-box" || v_type === "Xray") && opt.get(dom_prefix + "protocol").value === "vless") {
protocol = "vless";
var v_password = opt.get(dom_prefix + "uuid");
var v_port = opt.get(dom_prefix + "port");
@ -340,7 +343,7 @@ local has_xray = api.is_finded("xray")
params = params.substring(1);
}
url += params;
} else if ((v_type === "Xray" && opt.get(dom_prefix + "protocol").value === "trojan")) {
} else if ((v_type === "sing-box" || v_type === "Xray") && opt.get(dom_prefix + "protocol").value === "trojan") {
protocol = "trojan";
var v_password = opt.get(dom_prefix + "password");
var v_port = opt.get(dom_prefix + "port");
@ -630,7 +633,6 @@ local has_xray = api.is_finded("xray")
}
}
if (ssu[0] === "trojan") {
dom_prefix = "xray_"
var m = parseNodeUrl(ssrurl);
var password = m.passwd;
if (password === "") {
@ -648,8 +650,12 @@ local has_xray = api.is_finded("xray")
queryParam[decodeURIComponent(params[0]).toLowerCase()] = decodeURIComponent(params[1] || '');
}
}
<% if has_xray then %>
<% if has_singbox then %>
opt.set('type', "sing-box");
dom_prefix = "singbox_"
<% elseif has_xray then %>
opt.set('type', "Xray");
dom_prefix = "xray_"
<% end %>
opt.set(dom_prefix + 'protocol', "trojan");
opt.set(dom_prefix + 'address', m.hostname);
@ -664,11 +670,14 @@ local has_xray = api.is_finded("xray")
}
}
if (ssu[0] === "vmess") {
dom_prefix = "xray_"
var sstr = b64DecodeUnicode(ssu[1]);
var ploc = sstr.indexOf("/?");
<% if has_xray then %>
<% if has_singbox then %>
opt.set('type', "sing-box");
dom_prefix = "singbox_"
<% elseif has_xray then %>
opt.set('type', "Xray");
dom_prefix = "xray_"
<% end %>
opt.set(dom_prefix + 'protocol', "vmess");
var url0, param = "";
@ -715,9 +724,12 @@ local has_xray = api.is_finded("xray")
}
}
if (ssu[0] === "vless") {
dom_prefix = "xray_"
<% if has_xray then %>
<% if has_singbox then %>
opt.set('type', "sing-box");
dom_prefix = "singbox_"
<% elseif has_xray then %>
opt.set('type', "Xray");
dom_prefix = "xray_"
<% end %>
opt.set(dom_prefix + 'protocol', "vless");
var m = parseNodeUrl(ssrurl);

View File

@ -1258,8 +1258,8 @@ msgstr "无"
msgid "You did not fill in the %s path. Please save and apply then update manually."
msgstr "您没有填写 %s 路径。请保存应用后再手动更新。"
msgid "Not installed unzip, Can't unzip!"
msgstr "未安装unzip,无法解压。"
msgid "Not installed %s, Can't unzip!"
msgstr "未安装 %s,无法解压。"
msgid "Can't determine ARCH, or ARCH not supported."
msgstr "无法确认ARCH架构或是不支持。"

View File

@ -62,9 +62,9 @@ config global_subscribe
config global_singbox
option sniff_override_destination '1'
option geoip_path '/tmp/singbox/geoip.db'
option geoip_path '/usr/share/singbox/geoip.db'
option geoip_url 'https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db'
option geosite_path '/tmp/singbox/geosite.db'
option geosite_path '/usr/share/singbox/geosite.db'
option geosite_url 'https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db'
config nodes 'myshunt'

View File

@ -808,8 +808,16 @@ run_global() {
node_http_port=$(config_t_get global node_http_port 0)
[ "$node_http_port" != "0" ] && V2RAY_ARGS="${V2RAY_ARGS} http_port=${node_http_port}"
[ "${TYPE}" = "xray" ] && run_xray $V2RAY_ARGS
[ "${TYPE}" = "sing-box" ] && run_singbox $V2RAY_ARGS
local run_func
[ -n "${XRAY_BIN}" ] && run_func="run_xray"
[ -n "${SINGBOX_BIN}" ] && run_func="run_singbox"
if [ "${TYPE}" = "xray" ] && [ -n "${XRAY_BIN}" ]; then
run_func="run_xray"
elif [ "${TYPE}" = "sing-box" ] && [ -n "${SINGBOX_BIN}" ]; then
run_func="run_singbox"
fi
${run_func} $V2RAY_ARGS
}
start_socks() {
@ -1061,8 +1069,13 @@ acl_app() {
dns_port=$(get_new_port $(expr $dns_port + 1))
local acl_socks_port=$(get_new_port $(expr $redir_port + $index))
local run_func
[ "${TYPE}" = "xray" ] && run_func="run_xray"
[ "${TYPE}" = "sing-box" ] && run_func="run_singbox"
[ -n "${XRAY_BIN}" ] && run_func="run_xray"
[ -n "${SINGBOX_BIN}" ] && run_func="run_singbox"
if [ "${type}" = "xray" ] && [ -n "${XRAY_BIN}" ]; then
run_func="run_xray"
elif [ "${type}" = "sing-box" ] && [ -n "${SINGBOX_BIN}" ]; then
run_func="run_singbox"
fi
${run_func} flag=acl_$sid node=$node redir_port=$redir_port socks_address=127.0.0.1 socks_port=$acl_socks_port dns_listen_port=${dns_port} direct_dns_protocol=${direct_dns_protocol} direct_dns_udp_server=${direct_dns} direct_dns_tcp_server=${direct_dns} direct_dns_doh="${direct_dns}" direct_dns_client_ip=${direct_dns_client_ip} direct_dns_query_strategy=${direct_dns_query_strategy} remote_dns_protocol=${remote_dns_protocol} remote_dns_tcp_server=${remote_dns} remote_dns_udp_server=${remote_dns} remote_dns_doh="${remote_dns}" remote_dns_client_ip=${remote_dns_client_ip} remote_fakedns=${remote_fakedns} remote_dns_query_strategy=${remote_dns_query_strategy} config_file=${config_file}
fi
dnsmasq_port=$(get_new_port $(expr $dnsmasq_port + 1))
@ -1218,6 +1231,9 @@ AUTO_DNS=${DEFAULT_DNS:-119.29.29.29}
PROXY_IPV6=$(config_t_get global_forwarding ipv6_tproxy 0)
XRAY_BIN=$(first_type $(config_t_get global_app xray_file) xray)
SINGBOX_BIN=$(first_type $(config_t_get global_app singbox_file) sing-box)
export V2RAY_LOCATION_ASSET=$(config_t_get global_rules v2ray_location_asset "/usr/share/v2ray/")
export XRAY_LOCATION_ASSET=$V2RAY_LOCATION_ASSET
mkdir -p /tmp/etc $TMP_PATH $TMP_BIN_PATH $TMP_SCRIPT_FUNC_PATH $TMP_ID_PATH $TMP_PORT_PATH $TMP_ROUTE_PATH $TMP_ACL_PATH $TMP_IFACE_PATH $TMP_PATH2

View File

@ -859,6 +859,7 @@ flush_ipset() {
for _name in $(ipset list | grep "Name: " | grep "passwall2_" | awk '{print $2}'); do
destroy_ipset ${_name}
done
rm -rf /tmp/singbox_passwall2_*
/etc/init.d/passwall2 reload
}

View File

@ -876,11 +876,10 @@ del_firewall_rule() {
flush_nftset() {
del_firewall_rule
destroy_nftset $NFTSET_VPSLIST $NFTSET_LANLIST
destroy_nftset $NFTSET_VPSLIST6 $NFTSET_LANLIST6
for _name in $(nft -a list sets | grep -E "passwall2" | awk -F 'set ' '{print $2}' | awk '{print $1}'); do
destroy_nftset ${_name}
done
rm -rf /tmp/singbox_passwall2_*
/etc/init.d/passwall2 reload
}

View File

@ -23,8 +23,8 @@ uci:revert(appname)
local has_ss = api.is_finded("ss-redir")
local has_ss_rust = api.is_finded("sslocal")
local has_singbox = api.is_finded("sing-box")
local has_xray = api.is_finded("xray")
local has_singbox = api.finded_com("singbox")
local has_xray = api.finded_com("xray")
local allowInsecure_default = true
local ss_aead_type_default = uci:get(appname, "@global_subscribe[0]", "ss_aead_type") or "shadowsocks-libev"
-- 判断是否过滤节点关键字