diff --git a/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/luci-app-passwall/luasrc/passwall/util_sing-box.lua index 9453b0aed..a411e0a8d 100644 --- a/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -9,6 +9,7 @@ local split = api.split local local_version = api.get_app_version("sing-box") local version_ge_1_11_0 = api.compare_versions(local_version:match("[^v]+"), ">=", "1.11.0") +local version_ge_1_12_0 = api.compare_versions(local_version:match("[^v]+"), ">=", "1.12.0") local geosite_all_tag = {} local geoip_all_tag = {} @@ -126,6 +127,18 @@ function gen_outbound(flag, node, tag, proxy_table) detour = node.detour, } + if version_ge_1_12_0 then + --https://sing-box.sagernet.org/migration/#migrate-outbound-domain-strategy-option-to-domain-resolver + result.domain_strategy = nil + if node.domain_strategy then + local domain_resolver = { + server = "direct", + strategy = node.domain_strategy + } + result.domain_resolver = domain_resolver + end + end + local tls = nil if node.tls == "1" then local alpn = nil @@ -841,6 +854,7 @@ function gen_config(var) local direct_dns_tcp_server = var["-direct_dns_tcp_server"] local direct_dns_dot_server = var["-direct_dns_dot_server"] local direct_dns_query_strategy = var["-direct_dns_query_strategy"] + local remote_dns_server = var["-remote_dns_server"] local remote_dns_port = var["-remote_dns_port"] local remote_dns_udp_server = var["-remote_dns_udp_server"] local remote_dns_tcp_server = var["-remote_dns_tcp_server"] @@ -1420,10 +1434,12 @@ function gen_config(var) fakeip = nil, } - table.insert(dns.servers, { - tag = "block", - address = "rcode://success", - }) + if not version_ge_1_12_0 then --Migrate to new DNS server formats + table.insert(dns.servers, { + tag = "block", + address = "rcode://success", + }) + end if dns_socks_address and dns_socks_port then default_outTag = "dns_socks_out" @@ -1444,57 +1460,118 @@ function gen_config(var) remote_strategy = "ipv6_only" end - local remote_server = { - tag = "remote", - address_strategy = "prefer_ipv4", - strategy = remote_strategy, - address_resolver = "direct", - detour = default_outTag, - client_subnet = (remote_dns_client_ip and remote_dns_client_ip ~= "") and remote_dns_client_ip or nil, - } - - if remote_dns_udp_server then - local server_port = tonumber(remote_dns_port) or 53 - remote_server.address = "udp://" .. remote_dns_udp_server .. ":" .. server_port - end - - if remote_dns_tcp_server then - remote_server.address = remote_dns_tcp_server - end - - if remote_dns_doh_url and remote_dns_doh_host then - remote_server.address = remote_dns_doh_url - end - - if remote_server.address then - table.insert(dns.servers, remote_server) - end - + local remote_server = {} local fakedns_tag = "remote_fakeip" - if remote_dns_fake then - dns.fakeip = { - enabled = true, - inet4_range = "198.18.0.0/15", - inet6_range = "fc00::/18", - } - - table.insert(dns.servers, { - tag = fakedns_tag, - address = "fakeip", - strategy = remote_strategy, - }) - if not experimental then - experimental = {} - end - experimental.cache_file = { - enabled = true, - store_fakeip = true, - path = api.CACHE_PATH .. "/singbox_" .. flag .. ".db" + if not version_ge_1_12_0 then --Migrate to new DNS server formats + remote_server = { + tag = "remote", + address_strategy = "prefer_ipv4", + strategy = remote_strategy, + address_resolver = "direct", + detour = default_outTag, + client_subnet = (remote_dns_client_ip and remote_dns_client_ip ~= "") and remote_dns_client_ip or nil, } + + if remote_dns_udp_server then + local server_port = tonumber(remote_dns_port) or 53 + remote_server.address = "udp://" .. remote_dns_udp_server .. ":" .. server_port + end + + if remote_dns_tcp_server then + remote_server.address = remote_dns_tcp_server + end + + if remote_dns_doh_url and remote_dns_doh_host then + remote_server.address = remote_dns_doh_url + end + + if remote_server.address then + table.insert(dns.servers, remote_server) + end + + if remote_dns_fake then + dns.fakeip = { + enabled = true, + inet4_range = "198.18.0.0/15", + inet6_range = "fc00::/18", + } + + table.insert(dns.servers, { + tag = fakedns_tag, + address = "fakeip", + strategy = remote_strategy, + }) + + if not experimental then + experimental = {} + end + experimental.cache_file = { + enabled = true, + store_fakeip = true, + path = api.CACHE_PATH .. "/singbox_" .. flag .. ".db" + } + end + else -- Migrate to 1.12 DNS + remote_server = { + tag = "remote", + domain_strategy = remote_strategy, + domain_resolver = "direct", + detour = default_outTag, + } + + if remote_dns_udp_server then + local server_port = tonumber(remote_dns_port) or 53 + remote_server.type = "udp" + remote_server.server = remote_dns_udp_server + remote_server.server_port = server_port + end + + if remote_dns_tcp_server then + local server_port = tonumber(remote_dns_port) or 53 + remote_server.type = "tcp" + remote_server.server = remote_dns_server + remote_server.server_port = server_port + end + + if remote_dns_doh_url and remote_dns_doh_host then + local server_port = tonumber(remote_dns_port) or 443 + remote_server.type = "https" + remote_server.server = remote_dns_doh_host + remote_server.server_port = server_port + end + + if remote_server.server then + table.insert(dns.servers, remote_server) + end + + if remote_dns_fake then + table.insert(dns.servers, { + tag = fakedns_tag, + type = "fakeip", + inet4_range = "198.18.0.0/15", + inet6_range = "fc00::/18", + }) + + if not experimental then + experimental = {} + end + experimental.cache_file = { + enabled = true, + store_fakeip = true, + path = api.CACHE_PATH .. "/singbox_" .. flag .. ".db" + } + end end - + + local direct_strategy = "prefer_ipv6" if direct_dns_udp_server or direct_dns_tcp_server or direct_dns_dot_server then + if direct_dns_query_strategy == "UseIPv4" then + direct_strategy = "ipv4_only" + elseif direct_dns_query_strategy == "UseIPv6" then + direct_strategy = "ipv6_only" + end + local domain = {} local nodes_domain_text = sys.exec('uci show passwall | grep ".address=" | cut -d "\'" -f 2 | grep "[a-zA-Z]$" | sort -u') string.gsub(nodes_domain_text, '[^' .. "\r\n" .. ']+', function(w) @@ -1503,40 +1580,61 @@ function gen_config(var) if #domain > 0 then table.insert(dns_domain_rules, 1, { outboundTag = "direct", - domain = domain + domain = domain, + strategy = version_ge_1_12_0 and direct_strategy or nil }) end - - local direct_strategy = "prefer_ipv6" - if direct_dns_query_strategy == "UseIPv4" then - direct_strategy = "ipv4_only" - elseif direct_dns_query_strategy == "UseIPv6" then - direct_strategy = "ipv6_only" + + if not version_ge_1_12_0 then --Migrate to new DNS server formats + local direct_dns_server, port + if direct_dns_udp_server then + port = tonumber(direct_dns_port) or 53 + direct_dns_server = "udp://" .. direct_dns_udp_server .. ":" .. port + elseif direct_dns_tcp_server then + port = tonumber(direct_dns_port) or 53 + direct_dns_server = "tcp://" .. direct_dns_tcp_server .. ":" .. port + elseif direct_dns_dot_server then + port = tonumber(direct_dns_port) or 853 + if direct_dns_dot_server:find(":") == nil then + direct_dns_server = "tls://" .. direct_dns_dot_server .. ":" .. port + else + direct_dns_server = "tls://[" .. direct_dns_dot_server .. "]:" .. port + end + end + + table.insert(dns.servers, { + tag = "direct", + address = direct_dns_server, + address_strategy = "prefer_ipv6", + strategy = direct_strategy, + detour = "direct", + }) + else -- Migrate to 1.12 DNS + local direct_dns_server, port, type + if direct_dns_udp_server then + port = tonumber(direct_dns_port) or 53 + direct_dns_server = direct_dns_udp_server + type = "udp" + elseif direct_dns_tcp_server then + port = tonumber(direct_dns_port) or 53 + direct_dns_server = direct_dns_tcp_server + type = "tcp" + elseif direct_dns_dot_server then + port = tonumber(direct_dns_port) or 853 + direct_dns_server = direct_dns_dot_server + type = "tls" + end + + table.insert(dns.servers, { + tag = "direct", + type = type, + server = direct_dns_server, + server_port = port, + domain_strategy = direct_strategy, + detour = "direct", + }) end - local direct_dns_server, port - if direct_dns_udp_server then - port = tonumber(direct_dns_port) or 53 - direct_dns_server = "udp://" .. direct_dns_udp_server .. ":" .. port - elseif direct_dns_tcp_server then - port = tonumber(direct_dns_port) or 53 - direct_dns_server = "tcp://" .. direct_dns_tcp_server .. ":" .. port - elseif direct_dns_dot_server then - port = tonumber(direct_dns_port) or 853 - if direct_dns_dot_server:find(":") == nil then - direct_dns_server = "tls://" .. direct_dns_dot_server .. ":" .. port - else - direct_dns_server = "tls://[" .. direct_dns_dot_server .. "]:" .. port - end - end - - table.insert(dns.servers, { - tag = "direct", - address = direct_dns_server, - address_strategy = "prefer_ipv6", - strategy = direct_strategy, - detour = "direct", - }) end local default_dns_flag = "remote" @@ -1561,6 +1659,9 @@ function gen_config(var) end end dns.final = default_dns_flag + if version_ge_1_12_0 then -- Migrate to 1.12 DNS + dns.strategy = (default_dns_flag == "direct") and direct_strategy or remote_strategy + end --按分流顺序DNS if dns_domain_rules and #dns_domain_rules > 0 then @@ -1574,15 +1675,24 @@ function gen_config(var) domain_regex = (value.domain_regex and #value.domain_regex > 0) and value.domain_regex or nil, rule_set = (value.rule_set and #value.rule_set > 0) and value.rule_set or nil, --适配srs disable_cache = false, + strategy = (version_ge_1_12_0 and value.outboundTag == "direct") and direct_strategy or nil --Migrate to 1.12 DNS } + if version_ge_1_12_0 and value.outboundTag == "block" then --Migrate to 1.12 DNS + dns_rule.action = "predefined" + dns_rule.rcode = "NOERROR" + dns_rule.server = nil + dns_rule.disable_cache = nil + end if value.outboundTag ~= "block" and value.outboundTag ~= "direct" then dns_rule.server = "remote" - if value.outboundTag ~= COMMON.default_outbound_tag and remote_server.address then - local remote_dns_server = api.clone(remote_server) - remote_dns_server.tag = value.outboundTag - remote_dns_server.detour = value.outboundTag - table.insert(dns.servers, remote_dns_server) - dns_rule.server = remote_dns_server.tag + dns_rule.strategy = version_ge_1_12_0 and remote_strategy or nil --Migrate to 1.12 DNS + dns_rule.client_subnet = (version_ge_1_12_0 and remote_dns_client_ip and remote_dns_client_ip ~= "") and remote_dns_client_ip or nil --Migrate to 1.12 DNS + if value.outboundTag ~= COMMON.default_outbound_tag and (remote_server.address or remote_server.server) then + local remote_shunt_server = api.clone(remote_server) + remote_shunt_server.tag = value.outboundTag + remote_shunt_server.detour = value.outboundTag + table.insert(dns.servers, remote_shunt_server) + dns_rule.server = remote_shunt_server.tag end if remote_dns_fake then local fakedns_dns_rule = api.clone(dns_rule) @@ -1638,12 +1748,23 @@ function gen_config(var) --实验性 experimental = experimental, } - table.insert(outbounds, { + + local direct_outbound = { type = "direct", tag = "direct", routing_mark = 255, - domain_strategy = "prefer_ipv6", - }) + } + if not version_ge_1_12_0 then --Migrate to 1.12 DNS + direct_outbound.domain_strategy = "prefer_ipv6" + else + local domain_resolver = { + server = "direct", + strategy = "prefer_ipv6" + } + direct_outbound.domain_resolver = domain_resolver + end + table.insert(outbounds,direct_outbound) + table.insert(outbounds, { type = "block", tag = "block" diff --git a/luci-app-systools/Makefile b/luci-app-systools/Makefile index 3492e2ea8..400d50ad6 100644 --- a/luci-app-systools/Makefile +++ b/luci-app-systools/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk -PKG_VERSION:=1.0.10-20250404 +PKG_VERSION:=1.0.12-20250428 PKG_RELEASE:= LUCI_TITLE:=LuCI support for SysTools diff --git a/luci-app-systools/root/usr/share/systools/reset_rom_pkgs.run b/luci-app-systools/root/usr/share/systools/reset_rom_pkgs.run index 7321230db..ade90fee0 100755 --- a/luci-app-systools/root/usr/share/systools/reset_rom_pkgs.run +++ b/luci-app-systools/root/usr/share/systools/reset_rom_pkgs.run @@ -21,22 +21,24 @@ reset_pkg() { ^libgcc1$ ^libatomic1$ ^busybox$' && return - if [ -f /rom/usr/lib/opkg/info/${pkgname}.control -a -e /overlay/upper/usr/lib/opkg/info/${pkgname}.control ]; then + if [ -f /rom/usr/lib/opkg/info/${pkgname}.control -a \ + \( -e /overlay/upper/usr/lib/opkg/info/${pkgname}.control -o \ + -e /ext_overlay/upper/usr/lib/opkg/info/${pkgname}.control \) ]; then echo "reset ${pkgname}" if [ -f /rom/usr/lib/opkg/info/${pkgname}.list ]; then nonconf_files_of_pkg "${pkgname}" | while read; do line="$REPLY" - rm -f "/overlay/upper/${line}" + rm -f "/overlay/upper/${line}" "/ext_overlay/upper/${line}" done - rm -f /overlay/upper/usr/lib/opkg/info/${pkgname}.list + rm -f /overlay/upper/usr/lib/opkg/info/${pkgname}.list /ext_overlay/upper/usr/lib/opkg/info/${pkgname}.list fi - deps=`grep '^Depends: ' /rom/usr/lib/opkg/info/${pkgname}.control | dd bs=1 skip=8 2>/dev/null | sed 's/,/ /g'` + deps=`grep '^Depends: ' /rom/usr/lib/opkg/info/${pkgname}.control | dd bs=1 skip=8 2>/dev/null | sed -e 's/ ([^)]*)//g' -e 's/,/ /g'` # avoid loop deps - rm -f /overlay/upper/usr/lib/opkg/info/${pkgname}.control + rm -f /overlay/upper/usr/lib/opkg/info/${pkgname}.control /ext_overlay/upper/usr/lib/opkg/info/${pkgname}.control for dep in $deps ; do reset_pkg "$dep" done - rm -f /overlay/upper/usr/lib/opkg/info/${pkgname}.* + rm -f /overlay/upper/usr/lib/opkg/info/${pkgname}.* /ext_overlay/upper/usr/lib/opkg/info/${pkgname}.* fi } diff --git a/v2ray-geodata/Makefile b/v2ray-geodata/Makefile index 35c542678..7ab4c5715 100644 --- a/v2ray-geodata/Makefile +++ b/v2ray-geodata/Makefile @@ -21,13 +21,13 @@ define Download/geoip HASH:=735786c00694313090c5d525516463836167422b132ce293873443613b496e92 endef -GEOSITE_VER:=20250422055726 +GEOSITE_VER:=20250428010409 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=7a4530370eff2db6265613d9066c2b5eee841e3e7f02288750b03128af6daf7b + HASH:=bb0542801286c3efca59305b8fb1b01e808535be3ce1331a9f8709704417ea7d endef GEOSITE_IRAN_VER:=202504280040