From 0c46bce85abbb62603a4782e88604f503523eae9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 23:46:59 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=93=20Sync=202026-07-18=2023:46:58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- luci-app-passwall/Makefile | 2 +- .../root/usr/share/passwall/nftables.sh | 409 ++++---- .../root/usr/share/passwall/rule_update.lua | 7 +- luci-app-ssr-plus/Makefile | 2 +- .../luasrc/controller/shadowsocksr.lua | 87 +- .../luasrc/view/shadowsocksr/component.htm | 106 +- .../view/shadowsocksr/server_header.htm | 5 +- luci-app-ssr-plus/po/templates/ssr-plus.pot | 701 +++++++------ luci-app-ssr-plus/po/zh_Hans/ssr-plus.po | 714 ++++++------- .../share/shadowsocksr/update_components.sh | 938 +++++++++++++----- 10 files changed, 1848 insertions(+), 1123 deletions(-) diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index 8d9c5a83..0a2308b2 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=26.7.16 -PKG_RELEASE:=184 +PKG_RELEASE:=185 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/root/usr/share/passwall/nftables.sh b/luci-app-passwall/root/usr/share/passwall/nftables.sh index 7abf8c37..9c0dbfac 100755 --- a/luci-app-passwall/root/usr/share/passwall/nftables.sh +++ b/luci-app-passwall/root/usr/share/passwall/nftables.sh @@ -26,6 +26,22 @@ NFTSET_BLACK6="psw_black6" NFTSET_WHITE6="psw_white6" NFTSET_BLOCK6="psw_block6" +# IPv4 static sets +#Keep the variable names consistent with those in `nft_rule_dual`\rule_update.lua +NFTSET_CHN_STATIC="${NFTSET_CHN}_static" +NFTSET_BLACK_STATIC="${NFTSET_BLACK}_static" +NFTSET_WHITE_STATIC="${NFTSET_WHITE}_static" +NFTSET_BLOCK_STATIC="${NFTSET_BLOCK}_static" +NFTSET_SHUNT_STATIC="${NFTSET_SHUNT}_static" + +# IPv6 static sets +#Keep the variable names consistent with those in `nft_rule_dual`\rule_update.lua +NFTSET_CHN6_STATIC="${NFTSET_CHN6}_static" +NFTSET_BLACK6_STATIC="${NFTSET_BLACK6}_static" +NFTSET_WHITE6_STATIC="${NFTSET_WHITE6}_static" +NFTSET_BLOCK6_STATIC="${NFTSET_BLOCK6}_static" +NFTSET_SHUNT6_STATIC="${NFTSET_SHUNT6}_static" + USE_SHUNT_TCP=0 USE_SHUNT_UDP=0 @@ -162,18 +178,21 @@ gen_nft_tables() { fi } +nft_rule_dual() { + local chain_name="${1}" + local match_condition="${2}" + local target_set="${3}" + local final_action="${4}" + + nft "add rule $NFTABLE_NAME $chain_name $match_condition @${target_set} ${final_action}" + nft "add rule $NFTABLE_NAME $chain_name $match_condition @${target_set}_static ${final_action}" +} + insert_nftset() { local nftset_name="${1}"; shift - local timeout_argument="${1}"; shift - local default_timeout="365d" local suffix="" if [ -n "$nftset_name" ] && { [ $# -gt 0 ] || [ ! -t 0 ]; }; then - case "$timeout_argument" in - "-1") suffix="" ;; - "0") suffix=" timeout $default_timeout" ;; - *) suffix=" timeout $timeout_argument" ;; - esac { if [ $# -gt 0 ] && [ $# -le 1000 ]; then printf "%s\n" "$@" @@ -208,19 +227,16 @@ gen_nftset() { local ip_type="${1}"; shift # 0 - don't set defalut timeout local timeout_argument_set="${1}"; shift - # 0 - don't let element timeout(365 days) when set's timeout parameters be seted - # -1 - follow the set's timeout parameters - local timeout_argument_element="${1}"; shift local gc_interval_time="1h" if ! nft list set $NFTABLE_NAME $nftset_name >/dev/null 2>&1; then if [ "$timeout_argument_set" = "0" ]; then - nft "add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval, timeout; auto-merge; }" + nft "add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval; auto-merge; }" else nft "add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval, timeout; timeout $timeout_argument_set; gc-interval $gc_interval_time; auto-merge; }" fi fi - [ $# -gt 0 ] || [ ! -t 0 ] && insert_nftset "$nftset_name" "$timeout_argument_element" "$@" + [ $# -gt 0 ] || [ ! -t 0 ] && insert_nftset "$nftset_name" "$@" } get_jump_nft() { @@ -313,11 +329,15 @@ load_acl() { use_shunt_udp=${USE_SHUNT_UDP} dns_redirect_port=${DNS_REDIRECT_PORT} black_set_name=${NFTSET_BLACK} + black_set_name_static=${NFTSET_BLACK_STATIC} black6_set_name=${NFTSET_BLACK6} + black6_set_name_static=${NFTSET_BLACK6_STATIC} gfw_set_name=${NFTSET_GFW} gfw6_set_name=${NFTSET_GFW6} shunt_set_name=${NFTSET_SHUNT} + shunt_set_name_static=${NFTSET_SHUNT_STATIC} shunt6_set_name=${NFTSET_SHUNT6} + shunt6_set_name_static=${NFTSET_SHUNT6_STATIC} use_fakedns=${USE_FAKEDNS} } @@ -399,25 +419,33 @@ load_acl() { [ "${use_proxy_list}" = "1" ] && { [ "${use_global_config}" = "0" ] && { black_set_name="psw_${sid}_black" + black_set_name_static="psw_${sid}_black_static" black6_set_name="psw_${sid}_black6" - gen_nftset $black_set_name ipv4_addr "2d" 0 - gen_nftset $black6_set_name ipv6_addr "2d" 0 + black6_set_name_static="psw_${sid}_black6_static" + gen_nftset $black_set_name ipv4_addr "2d" + gen_nftset $black_set_name_static ipv4_addr 0 + gen_nftset $black6_set_name ipv6_addr "2d" + gen_nftset $black6_set_name_static ipv6_addr 0 } } [ "${use_gfw_list}" = "1" ] && { [ "${use_global_config}" = "0" ] && { gfw_set_name="psw_${sid}_gfw" gfw6_set_name="psw_${sid}_gfw6" - gen_nftset $gfw_set_name ipv4_addr "2d" 0 - gen_nftset $gfw6_set_name ipv6_addr "2d" 0 + gen_nftset $gfw_set_name ipv4_addr "2d" + gen_nftset $gfw6_set_name ipv6_addr "2d" } } [ "${use_shunt_tcp}" = "1" ] || [ "${use_shunt_udp}" = "1" ] && { [ "${use_global_config}" = "0" ] && { shunt_set_name="psw_${sid}_shunt" + shunt_set_name_static="psw_${sid}_shunt_static" shunt6_set_name="psw_${sid}_shunt6" - gen_nftset $shunt_set_name ipv4_addr "2d" 0 - gen_nftset $shunt6_set_name ipv6_addr "2d" 0 + shunt6_set_name_static="psw_${sid}_shunt6_static" + gen_nftset $shunt_set_name ipv4_addr "2d" + gen_nftset $shunt_set_name_static ipv4_addr 0 + gen_nftset $shunt6_set_name ipv6_addr "2d" + gen_nftset $shunt6_set_name_static ipv6_addr 0 } } [ -n "${dns_redirect_port}" ] && dns_redirect=${dns_redirect_port} @@ -437,29 +465,29 @@ load_acl() { fi [ -n "$tcp_port" ] || [ -n "$udp_port" ] && { - [ "${use_block_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ${_ipt_source} ip daddr @$NFTSET_BLOCK counter reject comment \"$remarks\"" - [ "${use_block_list}" = "1" ] && [ -z "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME PSW_NAT ${_ipt_source} ip daddr @$NFTSET_BLOCK counter reject comment \"$remarks\"" - [ "${use_direct_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ${_ipt_source} ip daddr @$NFTSET_WHITE counter return comment \"$remarks\"" - [ "${use_direct_list}" = "1" ] && [ -z "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME PSW_NAT ${_ipt_source} ip daddr @$NFTSET_WHITE counter return comment \"$remarks\"" + [ "${use_block_list}" = "1" ] && nft_rule_dual "PSW_MANGLE" "${_ipt_source} ip daddr" "$NFTSET_BLOCK" "counter reject comment \"$remarks\"" + [ "${use_block_list}" = "1" ] && [ -z "${is_tproxy}" ] && nft_rule_dual "PSW_NAT" "${_ipt_source} ip daddr" "$NFTSET_BLOCK" "counter reject comment \"$remarks\"" + [ "${use_direct_list}" = "1" ] && nft_rule_dual "PSW_MANGLE" "${_ipt_source} ip daddr" "$NFTSET_WHITE" "counter return comment \"$remarks\"" + [ "${use_direct_list}" = "1" ] && [ -z "${is_tproxy}" ] && nft_rule_dual "PSW_NAT" "${_ipt_source} ip daddr" "$NFTSET_WHITE" "counter return comment \"$remarks\"" [ "$PROXY_IPV6" = "1" ] && [ "$_ipv4" != "1" ] && { - [ "${use_block_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 ${_ipt_source} ip6 daddr @$NFTSET_BLOCK6 counter reject comment \"$remarks\"" - [ "${use_direct_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 ${_ipt_source} ip6 daddr @$NFTSET_WHITE6 counter return comment \"$remarks\"" + [ "${use_block_list}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "${_ipt_source} ip6 daddr" "$NFTSET_BLOCK6" "counter reject comment \"$remarks\"" + [ "${use_direct_list}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "${_ipt_source} ip6 daddr" "$NFTSET_WHITE6" "counter return comment \"$remarks\"" } [ "$tcp_proxy_drop_ports" != "disable" ] && { [ "$PROXY_IPV6" = "1" ] && [ "$_ipv4" != "1" ] && { [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr $FAKE_IP_6 counter reject comment \"$remarks\"" 2>/dev/null - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr @$black6_set_name counter reject comment \"$remarks\"" 2>/dev/null + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr" "$black6_set_name" "counter reject comment \"$remarks\"" 2>/dev/null [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr @$gfw6_set_name counter reject comment \"$remarks\"" 2>/dev/null - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" 2>/dev/null - [ "${use_shunt_tcp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr @$shunt6_set_name counter reject comment \"$remarks\"" 2>/dev/null + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" 2>/dev/null + [ "${use_shunt_tcp}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip6 daddr" "$shunt6_set_name" "counter reject comment \"$remarks\"" 2>/dev/null [ "${tcp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") counter reject comment \"$remarks\"" 2>/dev/null } [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr $FAKE_IP counter reject comment \"$remarks\"" - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr @$black_set_name counter reject comment \"$remarks\"" + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "$nft_prerouting_chain" "ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr" "$black_set_name" "counter reject comment \"$remarks\"" [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr @$gfw_set_name counter reject comment \"$remarks\"" - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" - [ "${use_shunt_tcp}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr @$shunt_set_name counter reject comment \"$remarks\"" + [ "${chn_list}" != "0" ] && nft_rule_dual "$nft_prerouting_chain" "ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" + [ "${use_shunt_tcp}" = "1" ] && nft_rule_dual "$nft_prerouting_chain" "ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") ip daddr" "$shunt_set_name" "counter reject comment \"$remarks\"" [ "${tcp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports "tcp dport") counter reject comment \"$remarks\"" echolog " - ${msg}屏蔽代理 TCP 端口[${tcp_proxy_drop_ports}]" } @@ -467,17 +495,17 @@ load_acl() { [ "$udp_proxy_drop_ports" != "disable" ] && { [ "$PROXY_IPV6" = "1" ] && [ "$_ipv4" != "1" ] && { [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr $FAKE_IP_6 counter reject comment \"$remarks\"" 2>/dev/null - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr @$black6_set_name counter reject comment \"$remarks\"" 2>/dev/null + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr" "$black6_set_name" "counter reject comment \"$remarks\"" 2>/dev/null [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr @$gfw6_set_name counter reject comment \"$remarks\"" 2>/dev/null - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" 2>/dev/null - [ "${use_shunt_udp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr @$shunt6_set_name counter reject comment \"$remarks\"" 2>/dev/null + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" 2>/dev/null + [ "${use_shunt_udp}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip6 daddr" "$shunt6_set_name" "counter reject comment \"$remarks\"" 2>/dev/null [ "${udp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") counter reject comment \"$remarks\"" 2>/dev/null } [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr $FAKE_IP counter reject comment \"$remarks\"" 2>/dev/null - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr @$black_set_name counter reject comment \"$remarks\"" 2>/dev/null + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr" "$black_set_name" "counter reject comment \"$remarks\"" 2>/dev/null [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr @$gfw_set_name counter reject comment \"$remarks\"" 2>/dev/null - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" 2>/dev/null - [ "${use_shunt_udp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr @$shunt_set_name counter reject comment \"$remarks\"" 2>/dev/null + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${chn_list} "counter reject") comment \"$remarks\"" 2>/dev/null + [ "${use_shunt_udp}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") ip daddr" "$shunt_set_name" "counter reject comment \"$remarks\"" 2>/dev/null [ "${udp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports "udp dport") counter reject comment \"$remarks\"" 2>/dev/null echolog " - ${msg}屏蔽代理 UDP 端口[${udp_proxy_drop_ports}]" } @@ -497,41 +525,41 @@ load_acl() { fi [ "$accept_icmp" = "1" ] && { - [ "${use_direct_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$NFTSET_WHITE counter return comment \"$remarks\"" + [ "${use_direct_list}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip protocol icmp ${_ipt_source} ip daddr" "$NFTSET_WHITE" "counter return comment \"$remarks\"" [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr $FAKE_IP $(REDIRECT) comment \"$remarks\"" - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$black_set_name $(REDIRECT) comment \"$remarks\"" + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip protocol icmp ${_ipt_source} ip daddr" "$black_set_name" "$(REDIRECT) comment \"$remarks\"" [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$gfw_set_name $(REDIRECT) comment \"$remarks\"" - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list}) comment \"$remarks\"" - [ "${use_shunt_tcp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$shunt_set_name $(REDIRECT) comment \"$remarks\"" + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip protocol icmp ${_ipt_source} ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${chn_list}) comment \"$remarks\"" + [ "${use_shunt_tcp}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip protocol icmp ${_ipt_source} ip daddr" "$shunt_set_name" "$(REDIRECT) comment \"$remarks\"" [ "${tcp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} $(REDIRECT) comment \"$remarks\"" nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} return comment \"$remarks\"" } [ "$accept_icmpv6" = "1" ] && [ "$PROXY_IPV6" = "1" ] && [ "$_ipv4" != "1" ] && { - [ "${use_direct_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$NFTSET_WHITE6 counter return comment \"$remarks\"" 2>/dev/null + [ "${use_direct_list}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "meta l4proto icmpv6 ${_ipt_source} ip6 daddr" "$NFTSET_WHITE6" "counter return comment \"$remarks\"" 2>/dev/null [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \"$remarks\"" 2>/dev/null - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$black6_set_name $(REDIRECT) comment \"$remarks\"" 2>/dev/null + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "meta l4proto icmpv6 ${_ipt_source} ip6 daddr" "$black6_set_name" "$(REDIRECT) comment \"$remarks\"" 2>/dev/null [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$gfw6_set_name $(REDIRECT) comment \"$remarks\"" 2>/dev/null - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list}) comment \"$remarks\"" 2>/dev/null - [ "${use_shunt_tcp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$shunt6_set_name $(REDIRECT) comment \"$remarks\"" 2>/dev/null + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "meta l4proto icmpv6 ${_ipt_source} ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${chn_list}) comment \"$remarks\"" 2>/dev/null + [ "${use_shunt_tcp}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "meta l4proto icmpv6 ${_ipt_source} ip6 daddr" "$shunt6_set_name" "$(REDIRECT) comment \"$remarks\"" 2>/dev/null [ "${tcp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} $(REDIRECT) comment \"$remarks\"" 2>/dev/null nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} return comment \"$remarks\"" 2>/dev/null } [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} ip daddr $FAKE_IP ${nft_j} comment \"$remarks\"" - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr @$black_set_name ${nft_j} comment \"$remarks\" " - [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr @$gfw_set_name ${nft_j} comment \"$remarks\" " - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} "${nft_j}") comment \"$remarks\" " - [ "${use_shunt_tcp}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr @$shunt_set_name ${nft_j} comment \"$remarks\"" + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "$nft_chain" "ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr" "$black_set_name" "${nft_j} comment \"$remarks\"" + [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr @$gfw_set_name ${nft_j} comment \"$remarks\"" + [ "${chn_list}" != "0" ] && nft_rule_dual "$nft_chain" "ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${chn_list} "${nft_j}") comment \"$remarks\"" + [ "${use_shunt_tcp}" = "1" ] && nft_rule_dual "$nft_chain" "ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip daddr" "$shunt_set_name" "${nft_j} comment \"$remarks\"" [ "${tcp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ${nft_j} comment \"$remarks\"" [ -n "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(REDIRECT $tcp_port TPROXY4) comment \"$remarks\"" [ "$PROXY_IPV6" = "1" ] && [ "$_ipv4" != "1" ] && { [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \"$remarks\"" - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr @$black6_set_name counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr" "$black6_set_name" "counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr @$gfw6_set_name counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} "counter jump PSW_RULE") comment \"$remarks\" " - [ "${use_shunt_tcp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr @$shunt6_set_name counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${chn_list} "counter jump PSW_RULE") comment \"$remarks\"" 2>/dev/null + [ "${use_shunt_tcp}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr" "$shunt6_set_name" "counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null [ "${tcp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(REDIRECT $tcp_port TPROXY) comment \"$remarks\"" 2>/dev/null } @@ -550,19 +578,19 @@ load_acl() { msg2="${msg2}(TPROXY:${udp_port})" [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} ip daddr $FAKE_IP counter jump PSW_RULE comment \"$remarks\"" - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip daddr @$black_set_name counter jump PSW_RULE comment \"$remarks\"" + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip daddr" "$black_set_name" "counter jump PSW_RULE comment \"$remarks\"" [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip daddr @$gfw_set_name counter jump PSW_RULE comment \"$remarks\"" - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} "counter jump PSW_RULE") comment \"$remarks\"" - [ "${use_shunt_udp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip daddr @$shunt_set_name counter jump PSW_RULE comment \"$remarks\"" + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${chn_list} "counter jump PSW_RULE") comment \"$remarks\"" + [ "${use_shunt_udp}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip daddr" "$shunt_set_name" "counter jump PSW_RULE comment \"$remarks\"" [ "${udp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") counter jump PSW_RULE comment \"$remarks\"" nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(REDIRECT $udp_port TPROXY4) comment \"$remarks\"" [ "$PROXY_IPV6" = "1" ] && [ "$_ipv4" != "1" ] && { [ "${use_fakedns}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \"$remarks\"" - [ "${use_proxy_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr @$black6_set_name counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null + [ "${use_proxy_list}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr" "$black6_set_name" "counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null [ "${use_gfw_list}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr @$gfw6_set_name counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null - [ "${chn_list}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} "counter jump PSW_RULE") comment \"$remarks\"" 2>/dev/null - [ "${use_shunt_udp}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr @$shunt6_set_name counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null + [ "${chn_list}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${chn_list} "counter jump PSW_RULE") comment \"$remarks\"" 2>/dev/null + [ "${use_shunt_udp}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr" "$shunt6_set_name" "counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null [ "${udp_proxy_mode}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") counter jump PSW_RULE comment \"$remarks\"" 2>/dev/null nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(REDIRECT $udp_port TPROXY) comment \"$remarks\"" 2>/dev/null } @@ -624,48 +652,48 @@ load_acl() { fi [ -n "${TCP_PROXY_MODE}" ] || [ -n "${UDP_PROXY_MODE}" ] && { - [ "${USE_BLOCK_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip daddr @$NFTSET_BLOCK counter reject comment \"默认\"" - [ "${USE_BLOCK_LIST}" = "1" ] && [ -z "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME PSW_NAT ip daddr @$NFTSET_BLOCK counter reject comment \"默认\"" - [ "${USE_DIRECT_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip daddr @$NFTSET_WHITE counter return comment \"默认\"" - [ "${USE_DIRECT_LIST}" = "1" ] && [ -z "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME PSW_NAT ip daddr @$NFTSET_WHITE counter return comment \"默认\"" + [ "${USE_BLOCK_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip daddr" "$NFTSET_BLOCK" "counter reject comment \"默认\"" + [ "${USE_BLOCK_LIST}" = "1" ] && [ -z "${is_tproxy}" ] && nft_rule_dual "PSW_NAT" "ip daddr" "$NFTSET_BLOCK" "counter reject comment \"默认\"" + [ "${USE_DIRECT_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip daddr" "$NFTSET_WHITE" "counter return comment \"默认\"" + [ "${USE_DIRECT_LIST}" = "1" ] && [ -z "${is_tproxy}" ] && nft_rule_dual "PSW_NAT" "ip daddr" "$NFTSET_WHITE" "counter return comment \"默认\"" [ "$PROXY_IPV6" = "1" ] && { - [ "${USE_BLOCK_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 ip6 daddr @$NFTSET_BLOCK6 counter reject comment \"默认\"" - [ "${USE_DIRECT_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 ip6 daddr @$NFTSET_WHITE6 counter return comment \"默认\"" + [ "${USE_BLOCK_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "ip6 daddr" "$NFTSET_BLOCK6" "counter reject comment \"默认\"" + [ "${USE_DIRECT_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "ip6 daddr" "$NFTSET_WHITE6" "counter return comment \"默认\"" } - + [ "$TCP_PROXY_DROP_PORTS" != "disable" ] && { [ "$PROXY_IPV6" = "1" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr $FAKE_IP_6 counter reject comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr @$NFTSET_BLACK6 counter reject comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr" "$NFTSET_BLACK6" "counter reject comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr @$NFTSET_GFW6 counter reject comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr @$NFTSET_SHUNT6 counter reject comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip6 daddr" "$NFTSET_SHUNT6" "counter reject comment \"默认\"" [ "${TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject comment \"默认\"" } [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr $FAKE_IP counter reject comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr @$NFTSET_BLACK counter reject comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "$nft_prerouting_chain" "ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr" "$NFTSET_BLACK" "counter reject comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr @$NFTSET_GFW counter reject comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr @$NFTSET_SHUNT counter reject comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "$nft_prerouting_chain" "ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "$nft_prerouting_chain" "ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") ip daddr" "$NFTSET_SHUNT" "counter reject comment \"默认\"" [ "${TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject comment \"默认\"" echolog " - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]" } - + [ "$UDP_PROXY_DROP_PORTS" != "disable" ] && { [ "$PROXY_IPV6" = "1" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr $FAKE_IP_6 counter reject comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr @$NFTSET_BLACK6 counter reject comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr" "$NFTSET_BLACK6" "counter reject comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr @$NFTSET_GFW6 counter reject comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" - [ "${USE_SHUNT_UDP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr @$NFTSET_SHUNT6 counter reject comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" + [ "${USE_SHUNT_UDP}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip6 daddr" "$NFTSET_SHUNT6" "counter reject comment \"默认\"" [ "${UDP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject comment \"默认\"" } [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr $FAKE_IP counter reject comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr @$NFTSET_BLACK counter reject comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr" "$NFTSET_BLACK" "counter reject comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr @$NFTSET_GFW counter reject comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" - [ "${USE_SHUNT_UDP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr @$NFTSET_SHUNT counter reject comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${CHN_LIST} "counter reject") comment \"默认\"" + [ "${USE_SHUNT_UDP}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") ip daddr" "$NFTSET_SHUNT" "counter reject comment \"默认\"" [ "${UDP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject comment \"默认\"" echolog " - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]" } @@ -690,42 +718,42 @@ load_acl() { fi [ "$accept_icmp" = "1" ] && { - [ "${USE_DIRECT_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip daddr @$NFTSET_WHITE counter return comment \"默认\"" + [ "${USE_DIRECT_LIST}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip daddr" "$NFTSET_WHITE" "counter return comment \"默认\"" [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr $FAKE_IP $(REDIRECT) comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_BLACK $(REDIRECT) comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip protocol icmp ip daddr" "$NFTSET_BLACK" "$(REDIRECT) comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_GFW $(REDIRECT) comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST}) comment \"默认\"" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_SHUNT $(REDIRECT) comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip protocol icmp ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${CHN_LIST}) comment \"默认\"" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip protocol icmp ip daddr" "$NFTSET_SHUNT" "$(REDIRECT) comment \"默认\"" [ "${TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp $(REDIRECT) comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp return comment \"默认\"" } [ "$accept_icmpv6" = "1" ] && [ "$PROXY_IPV6" = "1" ] && { - [ "${USE_DIRECT_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip6 daddr @$NFTSET_WHITE6 counter return comment \"默认\"" + [ "${USE_DIRECT_LIST}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "ip6 daddr" "$NFTSET_WHITE6" "counter return comment \"默认\"" [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_BLACK6 $(REDIRECT) comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "meta l4proto icmpv6 ip6 daddr" "$NFTSET_BLACK6" "$(REDIRECT) comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_GFW6 $(REDIRECT) comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST}) comment \"默认\"" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_SHUNT6 $(REDIRECT) comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "meta l4proto icmpv6 ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${CHN_LIST}) comment \"默认\"" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "meta l4proto icmpv6 ip6 daddr" "$NFTSET_SHUNT6" "$(REDIRECT) comment \"默认\"" [ "${TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 $(REDIRECT) comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 return comment \"默认\"" } [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr $FAKE_IP ${nft_j} comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip daddr @$NFTSET_BLACK ${nft_j} comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "$nft_chain" "ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip daddr" "$NFTSET_BLACK" "${nft_j} comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip daddr @$NFTSET_GFW ${nft_j} comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} "${nft_j}") comment \"默认\"" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip daddr @$NFTSET_SHUNT ${nft_j} comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "$nft_chain" "ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${CHN_LIST} "${nft_j}") comment \"默认\"" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "$nft_chain" "ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip daddr" "$NFTSET_SHUNT" "${nft_j} comment \"默认\"" [ "${TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ${nft_j} comment \"默认\"" [ -n "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(REDIRECT $TCP_REDIR_PORT TPROXY4) comment \"默认\"" nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp counter return comment \"默认\"" [ "$PROXY_IPV6" = "1" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip6 daddr @$NFTSET_BLACK6 counter jump PSW_RULE comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip6 daddr" "$NFTSET_BLACK6" "counter jump PSW_RULE comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip6 daddr @$NFTSET_GFW6 counter jump PSW_RULE comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE") comment \"默认\"" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip6 daddr @$NFTSET_SHUNT6 counter jump PSW_RULE comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE") comment \"默认\"" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") ip6 daddr" "$NFTSET_SHUNT6" "counter jump PSW_RULE comment \"默认\"" [ "${TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") counter jump PSW_RULE comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(REDIRECT $TCP_REDIR_PORT TPROXY) comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp counter return comment \"默认\"" @@ -745,20 +773,20 @@ load_acl() { fi [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ip daddr $FAKE_IP counter jump PSW_RULE comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") ip daddr @$NFTSET_BLACK counter jump PSW_RULE comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") ip daddr" "$NFTSET_BLACK" "counter jump PSW_RULE comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") ip daddr @$NFTSET_GFW counter jump PSW_RULE comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE") comment \"默认\"" - [ "${USE_SHUNT_UDP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") ip daddr @$NFTSET_SHUNT counter jump PSW_RULE comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE") comment \"默认\"" + [ "${USE_SHUNT_UDP}" = "1" ] && nft_rule_dual "PSW_MANGLE" "ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") ip daddr" "$NFTSET_SHUNT" "counter jump PSW_RULE comment \"默认\"" [ "${UDP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(REDIRECT $UDP_REDIR_PORT TPROXY4) comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp counter return comment \"默认\"" [ "$PROXY_IPV6" = "1" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \"默认\"" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") ip6 daddr @$NFTSET_BLACK6 counter jump PSW_RULE comment \"默认\"" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") ip6 daddr" "$NFTSET_BLACK6" "counter jump PSW_RULE comment \"默认\"" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") ip6 daddr @$NFTSET_GFW6 counter jump PSW_RULE comment \"默认\"" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE") comment \"默认\"" - [ "${USE_SHUNT_UDP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") ip6 daddr @$NFTSET_SHUNT6 counter jump PSW_RULE comment \"默认\"" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE") comment \"默认\"" + [ "${USE_SHUNT_UDP}" = "1" ] && nft_rule_dual "PSW_MANGLE_V6" "meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") ip6 daddr" "$NFTSET_SHUNT6" "counter jump PSW_RULE comment \"默认\"" [ "${UDP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(REDIRECT $UDP_REDIR_PORT TPROXY) comment \"默认\"" nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp counter return comment \"默认\"" @@ -773,29 +801,29 @@ load_acl() { filter_haproxy() { for item in ${haproxy_items}; do get_host_ip ipv4 $(echo $item | awk -F ":" '{print $1}') 1 - done | insert_nftset $NFTSET_VPS "-1" + done | insert_nftset $NFTSET_VPS echolog " - [$?]加入负载均衡的节点到nftset[$NFTSET_VPS]直连完成" } filter_vps_addr() { for server_host in "$@"; do get_host_ip "ipv4" ${server_host} - done | insert_nftset $NFTSET_VPS "-1" + done | insert_nftset $NFTSET_VPS for server_host in "$@"; do get_host_ip "ipv6" ${server_host} - done | insert_nftset $NFTSET_VPS6 "-1" + done | insert_nftset $NFTSET_VPS6 } filter_vpsip() { local EXCLUDE_VPSIP="^(0\.0\.0\.0|127\.0\.0\.1|1\.1\.1\.1|1\.1\.1\.2|8\.8\.8\.8|8\.8\.4\.4|9\.9\.9\.9)$" - uci show $CONFIG | grep -E "(\.address=|\.download_address=)" | cut -d "'" -f 2 | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | grep -Ev "$EXCLUDE_VPSIP" | insert_nftset $NFTSET_VPS "-1" + uci show $CONFIG | grep -E "(\.address=|\.download_address=)" | cut -d "'" -f 2 | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | grep -Ev "$EXCLUDE_VPSIP" | insert_nftset $NFTSET_VPS echolog " - [$?]加入所有IPv4节点到nftset[$NFTSET_VPS]直连完成" - uci show $CONFIG | grep -E "(\.address=|\.download_address=)" | cut -d "'" -f 2 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_VPS6 "-1" + uci show $CONFIG | grep -E "(\.address=|\.download_address=)" | cut -d "'" -f 2 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_VPS6 echolog " - [$?]加入所有IPv6节点到nftset[$NFTSET_VPS6]直连完成" #订阅方式为直连时 - get_subscribe_host | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | grep -Ev "$EXCLUDE_VPSIP" | insert_nftset $NFTSET_VPS "-1" - get_subscribe_host | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_VPS6 "-1" + get_subscribe_host | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | grep -Ev "$EXCLUDE_VPSIP" | insert_nftset $NFTSET_VPS + get_subscribe_host | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_VPS6 } filter_server_port() { @@ -872,7 +900,7 @@ update_wan_sets() { local WAN_IP=$(get_wan_ips ip4) [ -n "$WAN_IP" ] && { nft flush set $NFTABLE_NAME $NFTSET_WAN - echo "$WAN_IP" | insert_nftset $NFTSET_WAN "-1" + echo "$WAN_IP" | insert_nftset $NFTSET_WAN [ "$log" = "log" ] && { local wan_ip for wan_ip in $WAN_IP; do @@ -884,7 +912,7 @@ update_wan_sets() { local WAN6_IP=$(get_wan_ips ip6) [ -n "${WAN6_IP}" ] && { nft flush set $NFTABLE_NAME $NFTSET_WAN6 - echo "$WAN6_IP" | insert_nftset $NFTSET_WAN6 "-1" + echo "$WAN6_IP" | insert_nftset $NFTSET_WAN6 [ "$log" = "log" ] && { local wan6_ip for wan6_ip in $WAN6_IP; do @@ -910,37 +938,46 @@ add_firewall_rule() { add_script_mwan3 mwan3_start set_tproxy_sysctl - gen_nftset $NFTSET_WAN ipv4_addr 0 "-1" - gen_nftset $NFTSET_VPS ipv4_addr 0 "-1" - gen_nftset $NFTSET_GFW ipv4_addr "2d" 0 - gen_nftset $NFTSET_LOCAL ipv4_addr 0 "-1" - gen_nftset $NFTSET_LAN ipv4_addr 0 "-1" $(gen_lanlist) + gen_nftset $NFTSET_WAN ipv4_addr 0 + gen_nftset $NFTSET_VPS ipv4_addr 0 + gen_nftset $NFTSET_GFW ipv4_addr "2d" + gen_nftset $NFTSET_LOCAL ipv4_addr 0 + gen_nftset $NFTSET_LAN ipv4_addr 0 $(gen_lanlist) + gen_nftset $NFTSET_CHN ipv4_addr "2d" if [ -f $RULES_PATH/chnroute.nft ] && [ -s $RULES_PATH/chnroute.nft ] && [ $(awk 'END{print NR}' $RULES_PATH/chnroute.nft) -ge 8 ]; then - #echolog "使用缓存加载chnroute..." nft -f $RULES_PATH/chnroute.nft else - cat $RULES_PATH/chnroute | tr -s '\n' | sed 's/#.*//' | gen_nftset $NFTSET_CHN ipv4_addr "2d" 0 + cat $RULES_PATH/chnroute | tr -s '\n' | sed 's/#.*//' | gen_nftset $NFTSET_CHN_STATIC ipv4_addr 0 fi - gen_nftset $NFTSET_BLACK ipv4_addr "2d" 0 - gen_nftset $NFTSET_WHITE ipv4_addr "2d" 0 - gen_nftset $NFTSET_BLOCK ipv4_addr "2d" 0 - gen_nftset $NFTSET_SHUNT ipv4_addr "2d" 0 + gen_nftset $NFTSET_BLACK ipv4_addr "2d" + gen_nftset $NFTSET_BLACK_STATIC ipv4_addr 0 + gen_nftset $NFTSET_WHITE ipv4_addr "2d" + gen_nftset $NFTSET_WHITE_STATIC ipv4_addr 0 + gen_nftset $NFTSET_BLOCK ipv4_addr "2d" + gen_nftset $NFTSET_BLOCK_STATIC ipv4_addr 0 + gen_nftset $NFTSET_SHUNT ipv4_addr "2d" + gen_nftset $NFTSET_SHUNT_STATIC ipv4_addr 0 - gen_nftset $NFTSET_WAN6 ipv6_addr 0 "-1" - gen_nftset $NFTSET_VPS6 ipv6_addr 0 "-1" - gen_nftset $NFTSET_GFW6 ipv6_addr "2d" 0 - gen_nftset $NFTSET_LOCAL6 ipv6_addr 0 "-1" - gen_nftset $NFTSET_LAN6 ipv6_addr 0 "-1" $(gen_lanlist_6) + gen_nftset $NFTSET_WAN6 ipv6_addr 0 + gen_nftset $NFTSET_VPS6 ipv6_addr 0 + gen_nftset $NFTSET_GFW6 ipv6_addr "2d" + gen_nftset $NFTSET_LOCAL6 ipv6_addr 0 + gen_nftset $NFTSET_LAN6 ipv6_addr 0 $(gen_lanlist_6) + gen_nftset $NFTSET_CHN6 ipv6_addr "2d" if [ -f $RULES_PATH/chnroute6.nft ] && [ -s $RULES_PATH/chnroute6.nft ] && [ $(awk 'END{print NR}' $RULES_PATH/chnroute6.nft) -ge 8 ]; then #echolog "使用缓存加载chnroute6..." nft -f $RULES_PATH/chnroute6.nft else - cat $RULES_PATH/chnroute6 | tr -s '\n' | sed 's/#.*//' | gen_nftset $NFTSET_CHN6 ipv6_addr "2d" 0 + cat $RULES_PATH/chnroute6 | tr -s '\n' | sed 's/#.*//' | gen_nftset $NFTSET_CHN6_STATIC ipv6_addr 0 fi - gen_nftset $NFTSET_BLACK6 ipv6_addr "2d" 0 - gen_nftset $NFTSET_WHITE6 ipv6_addr "2d" 0 - gen_nftset $NFTSET_BLOCK6 ipv6_addr "2d" 0 - gen_nftset $NFTSET_SHUNT6 ipv6_addr "2d" 0 + gen_nftset $NFTSET_BLACK6 ipv6_addr "2d" + gen_nftset $NFTSET_BLACK6_STATIC ipv6_addr 0 + gen_nftset $NFTSET_WHITE6 ipv6_addr "2d" + gen_nftset $NFTSET_WHITE6_STATIC ipv6_addr 0 + gen_nftset $NFTSET_BLOCK6 ipv6_addr "2d" + gen_nftset $NFTSET_BLOCK6_STATIC ipv6_addr 0 + gen_nftset $NFTSET_SHUNT6 ipv6_addr "2d" + gen_nftset $NFTSET_SHUNT6_STATIC ipv6_addr 0 #导入规则列表、分流规则中的IP列表 local USE_SHUNT_NODE=0 @@ -971,13 +1008,13 @@ add_firewall_rule() { #直连列表 [ "$USE_DIRECT_LIST_ALL" = "1" ] && { - cat $RULES_PATH/direct_ip | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_WHITE "0" - cat $RULES_PATH/direct_ip | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_WHITE6 "0" + cat $RULES_PATH/direct_ip | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_WHITE_STATIC + cat $RULES_PATH/direct_ip | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_WHITE6_STATIC [ "$USE_GEOVIEW" = "1" ] && { local GEOIP_CODE=$(cat $RULES_PATH/direct_ip | tr -s "\r\n" "\n" | sed -e "/^$/d" | grep -E "^geoip:" | grep -v "^geoip:private" | sed -E 's/^geoip:(.*)/\1/' | sed ':a;N;$!ba;s/\n/,/g') if [ -n "$GEOIP_CODE" ]; then - get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_WHITE "0" - get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_WHITE6 "0" + get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_WHITE_STATIC + get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_WHITE6_STATIC echolog " - [$?]解析并加入[直连列表] GeoIP 到 NFTSET 完成" fi } @@ -985,13 +1022,13 @@ add_firewall_rule() { #代理列表 [ "$USE_PROXY_LIST_ALL" = "1" ] && { - cat $RULES_PATH/proxy_ip | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLACK "0" - cat $RULES_PATH/proxy_ip | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLACK6 "0" + cat $RULES_PATH/proxy_ip | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLACK_STATIC + cat $RULES_PATH/proxy_ip | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLACK6_STATIC [ "$USE_GEOVIEW" = "1" ] && { local GEOIP_CODE=$(cat $RULES_PATH/proxy_ip | tr -s "\r\n" "\n" | sed -e "/^$/d" | grep -E "^geoip:" | grep -v "^geoip:private" | sed -E 's/^geoip:(.*)/\1/' | sed ':a;N;$!ba;s/\n/,/g') if [ -n "$GEOIP_CODE" ]; then - get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLACK "0" - get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLACK6 "0" + get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLACK_STATIC + get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLACK6_STATIC echolog " - [$?]解析并加入[代理列表] GeoIP 到 NFTSET 完成" fi } @@ -999,13 +1036,13 @@ add_firewall_rule() { #屏蔽列表 [ "$USE_BLOCK_LIST_ALL" = "1" ] && { - cat $RULES_PATH/block_ip | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLOCK "0" - cat $RULES_PATH/block_ip | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLOCK6 "0" + cat $RULES_PATH/block_ip | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLOCK_STATIC + cat $RULES_PATH/block_ip | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLOCK6_STATIC [ "$USE_GEOVIEW" = "1" ] && { local GEOIP_CODE=$(cat $RULES_PATH/block_ip | tr -s "\r\n" "\n" | sed -e "/^$/d" | grep -E "^geoip:" | grep -v "^geoip:private" | sed -E 's/^geoip:(.*)/\1/' | sed ':a;N;$!ba;s/\n/,/g') if [ -n "$GEOIP_CODE" ]; then - get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLOCK "0" - get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLOCK6 "0" + get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_BLOCK_STATIC + get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_BLOCK6_STATIC echolog " - [$?]解析并加入[屏蔽列表] GeoIP 到 NFTSET 完成" fi } @@ -1016,22 +1053,22 @@ add_firewall_rule() { local GEOIP_CODE="" local shunt_ids=$(uci show $CONFIG | grep "=shunt_rules" | awk -F '.' '{print $2}' | awk -F '=' '{print $1}') for shunt_id in $shunt_ids; do - config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_SHUNT "0" - config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_SHUNT6 "0" + config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_SHUNT_STATIC + config_n_get $shunt_id ip_list | sed 's/#.*//' | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_SHUNT6_STATIC [ "$USE_GEOVIEW" = "1" ] && { local geoip_code=$(config_n_get $shunt_id ip_list | tr -s "\r\n" "\n" | sed -e "/^$/d" | grep -E "^geoip:" | grep -v "^geoip:private" | sed -E 's/^geoip:(.*)/\1/' | sed ':a;N;$!ba;s/\n/,/g') [ -n "$geoip_code" ] && GEOIP_CODE="${GEOIP_CODE:+$GEOIP_CODE,}$geoip_code" } done if [ -n "$GEOIP_CODE" ]; then - get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_SHUNT "0" - get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_SHUNT6 "0" + get_geoip $GEOIP_CODE ipv4 | grep -E "(\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}" | insert_nftset $NFTSET_SHUNT_STATIC + get_geoip $GEOIP_CODE ipv6 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | insert_nftset $NFTSET_SHUNT6_STATIC echolog " - [$?]解析并加入[分流节点] GeoIP 到 NFTSET 完成" fi } - get_local_ips ip4 | insert_nftset $NFTSET_LOCAL "-1" - get_local_ips ip6 | insert_nftset $NFTSET_LOCAL6 "-1" + get_local_ips ip4 | insert_nftset $NFTSET_LOCAL + get_local_ips ip6 | insert_nftset $NFTSET_LOCAL6 # 忽略特殊IP段 local lan_ifname lan_ip @@ -1042,15 +1079,15 @@ add_firewall_rule() { #echolog "本机IPv4网段互访直连:${lan_ip}" #echolog "本机IPv6网段互访直连:${lan_ip6}" - [ -n "$lan_ip" ] && echo $lan_ip | insert_nftset $NFTSET_LAN "-1" - [ -n "$lan_ip6" ] && echo $lan_ip6 | insert_nftset $NFTSET_LAN6 "-1" + [ -n "$lan_ip" ] && echo $lan_ip | insert_nftset $NFTSET_LAN + [ -n "$lan_ip6" ] && echo $lan_ip6 | insert_nftset $NFTSET_LAN6 } update_wan_sets "log" [ -n "$ISP_DNS" ] && { #echolog "处理 ISP DNS 例外..." - echo "$ISP_DNS" | insert_nftset $NFTSET_WHITE 0 + echo "$ISP_DNS" | insert_nftset $NFTSET_WHITE for ispip in $ISP_DNS; do echolog " - [$?]追加ISP IPv4 DNS到白名单:${ispip}" done @@ -1058,7 +1095,7 @@ add_firewall_rule() { [ -n "$ISP_DNS6" ] && { #echolog "处理 ISP IPv6 DNS 例外..." - echo $ISP_DNS6 | insert_nftset $NFTSET_WHITE6 0 + echo $ISP_DNS6 | insert_nftset $NFTSET_WHITE6 for ispip6 in $ISP_DNS6; do echolog " - [$?]追加ISP IPv6 DNS到白名单:${ispip6}" done @@ -1120,8 +1157,8 @@ add_firewall_rule() { nft "flush chain $NFTABLE_NAME PSW_OUTPUT_MANGLE" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_LAN counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_VPS counter return" - [ "${USE_BLOCK_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_BLOCK counter reject" - [ "${USE_DIRECT_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_WHITE counter return" + [ "${USE_BLOCK_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip daddr" "$NFTSET_BLOCK" "counter reject" + [ "${USE_DIRECT_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip daddr" "$NFTSET_WHITE" "counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ct direction reply counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE meta mark 255 counter return" @@ -1142,8 +1179,8 @@ add_firewall_rule() { nft "flush chain $NFTABLE_NAME PSW_OUTPUT_NAT" nft "add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_LAN counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_VPS counter return" - [ "${USE_BLOCK_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_BLOCK counter reject" - [ "${USE_DIRECT_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_WHITE counter return" + [ "${USE_BLOCK_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_NAT" "ip daddr" "$NFTSET_BLOCK" "counter reject" + [ "${USE_DIRECT_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_NAT" "ip daddr" "$NFTSET_WHITE" "counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_NAT meta mark 255 counter return" } @@ -1181,8 +1218,8 @@ add_firewall_rule() { nft "flush chain $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_LAN6 counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_VPS6 counter return" - [ "${USE_BLOCK_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_BLOCK6 counter reject" - [ "${USE_DIRECT_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_WHITE6 counter return" + [ "${USE_BLOCK_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "ip6 daddr" "$NFTSET_BLOCK6" "counter reject" + [ "${USE_DIRECT_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "ip6 daddr" "$NFTSET_WHITE6" "counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ct direction reply counter return" nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta mark 255 counter return" @@ -1253,20 +1290,20 @@ add_firewall_rule() { [ -n "${LOCALHOST_TCP_PROXY_MODE}" ] || [ -n "${LOCALHOST_UDP_PROXY_MODE}" ] && { [ "$TCP_PROXY_DROP_PORTS" != "disable" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr $FAKE_IP $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject - [ "${USE_PROXY_LIST}" = "1" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_BLACK $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "$nft_output_chain" "ip protocol tcp ip daddr" "$NFTSET_BLACK" "$(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject" [ "${USE_GFW_LIST}" = "1" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_GFW $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject - [ "${CHN_LIST}" != "0" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_CHN $(factor $TCP_PROXY_DROP_PORTS "tcp dport") $(get_jump_nft ${CHN_LIST} "counter reject") - [ "${USE_SHUNT_TCP}" = "1" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_SHUNT $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "$nft_output_chain" "ip protocol tcp ip daddr" "$NFTSET_CHN" "$(factor $TCP_PROXY_DROP_PORTS "tcp dport") $(get_jump_nft ${CHN_LIST} "counter reject")" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "$nft_output_chain" "ip protocol tcp ip daddr" "$NFTSET_SHUNT" "$(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject" [ "${LOCALHOST_TCP_PROXY_MODE}" != "disable" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS "tcp dport") counter reject echolog " - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]" } [ "$UDP_PROXY_DROP_PORTS" != "disable" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr $FAKE_IP $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject - [ "${USE_PROXY_LIST}" = "1" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_BLACK $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip protocol udp ip daddr" "$NFTSET_BLACK" "$(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject" [ "${USE_GFW_LIST}" = "1" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_GFW $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject - [ "${CHN_LIST}" != "0" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_CHN $(factor $UDP_PROXY_DROP_PORTS "udp dport") $(get_jump_nft ${CHN_LIST} "counter reject") - [ "${USE_SHUNT_UDP}" = "1" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_SHUNT $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip protocol udp ip daddr" "$NFTSET_CHN" "$(factor $UDP_PROXY_DROP_PORTS "udp dport") $(get_jump_nft ${CHN_LIST} "counter reject")" + [ "${USE_SHUNT_UDP}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip protocol udp ip daddr" "$NFTSET_SHUNT" "$(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject" [ "${LOCALHOST_UDP_PROXY_MODE}" != "disable" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS "udp dport") counter reject echolog " - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]" } @@ -1304,20 +1341,20 @@ add_firewall_rule() { [ "$accept_icmp" = "1" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr $FAKE_IP counter redirect" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_BLACK counter redirect" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "oif lo ip protocol icmp ip daddr" "$NFTSET_BLACK" "counter redirect" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_GFW counter redirect" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST})" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_SHUNT counter redirect" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "oif lo ip protocol icmp ip daddr" "$NFTSET_CHN" "$(get_jump_nft ${CHN_LIST})" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "oif lo ip protocol icmp ip daddr" "$NFTSET_SHUNT" "counter redirect" [ -n "${LOCALHOST_TCP_PROXY_MODE}" ] && [ "${LOCALHOST_TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp counter redirect" nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp counter return" } [ "$accept_icmpv6" = "1" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 counter redirect" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_BLACK6 counter redirect" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "oif lo meta l4proto icmpv6 ip6 daddr" "$NFTSET_BLACK6" "counter redirect" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_GFW6 counter redirect" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST})" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_SHUNT6 counter redirect" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "oif lo meta l4proto icmpv6 ip6 daddr" "$NFTSET_CHN6" "$(get_jump_nft ${CHN_LIST})" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "PSW_ICMP_REDIRECT" "oif lo meta l4proto icmpv6 ip6 daddr" "$NFTSET_SHUNT6" "counter redirect" [ -n "${LOCALHOST_TCP_PROXY_MODE}" ] && [ "${LOCALHOST_TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 counter redirect" nft "add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 counter return" } @@ -1332,10 +1369,10 @@ add_firewall_rule() { [ -n "${LOCALHOST_TCP_PROXY_MODE}" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr $FAKE_IP ${nft_j}" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_BLACK $(factor $TCP_REDIR_PORTS "tcp dport") ${nft_j}" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "$nft_chain" "ip protocol tcp ip daddr" "$NFTSET_BLACK" "$(factor $TCP_REDIR_PORTS "tcp dport") ${nft_j}" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_GFW $(factor $TCP_REDIR_PORTS "tcp dport") ${nft_j}" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_CHN $(factor $TCP_REDIR_PORTS "tcp dport") $(get_jump_nft ${CHN_LIST} "${nft_j}")" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_SHUNT $(factor $TCP_REDIR_PORTS "tcp dport") ${nft_j}" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "$nft_chain" "ip protocol tcp ip daddr" "$NFTSET_CHN" "$(factor $TCP_REDIR_PORTS "tcp dport") $(get_jump_nft ${CHN_LIST} "${nft_j}")" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "$nft_chain" "ip protocol tcp ip daddr" "$NFTSET_SHUNT" "$(factor $TCP_REDIR_PORTS "tcp dport") ${nft_j}" [ "${LOCALHOST_TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS "tcp dport") ${nft_j}" [ -n "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp iif lo $(REDIRECT $TCP_REDIR_PORT TPROXY4) comment \"本机\"" } @@ -1346,10 +1383,10 @@ add_firewall_rule() { [ "$PROXY_IPV6" = "1" ] && { [ -n "${LOCALHOST_TCP_PROXY_MODE}" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_BLACK6 $(factor $TCP_REDIR_PORTS "tcp dport") counter jump PSW_RULE" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "meta l4proto tcp ip6 daddr" "$NFTSET_BLACK6" "$(factor $TCP_REDIR_PORTS "tcp dport") counter jump PSW_RULE" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_GFW6 $(factor $TCP_REDIR_PORTS "tcp dport") counter jump PSW_RULE" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_CHN6 $(factor $TCP_REDIR_PORTS "tcp dport") $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE")" - [ "${USE_SHUNT_TCP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_SHUNT6 $(factor $TCP_REDIR_PORTS "tcp dport") counter jump PSW_RULE" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "meta l4proto tcp ip6 daddr" "$NFTSET_CHN6" "$(factor $TCP_REDIR_PORTS "tcp dport") $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE")" + [ "${USE_SHUNT_TCP}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "meta l4proto tcp ip6 daddr" "$NFTSET_SHUNT6" "$(factor $TCP_REDIR_PORTS "tcp dport") counter jump PSW_RULE" [ "${LOCALHOST_TCP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS "tcp dport") counter jump PSW_RULE" nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp iif lo $(REDIRECT $TCP_REDIR_PORT TPROXY) comment \"本机\"" } @@ -1384,10 +1421,10 @@ add_firewall_rule() { [ -n "${UDP_PROXY_DNS}" ] && hosts_foreach REMOTE_DNS _proxy_udp_access 53 [ -n "${LOCALHOST_UDP_PROXY_MODE}" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr $FAKE_IP counter jump PSW_RULE" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_BLACK $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip protocol udp ip daddr" "$NFTSET_BLACK" "$(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_GFW $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_CHN $(factor $UDP_REDIR_PORTS "udp dport") $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE")" - [ "${USE_SHUNT_UDP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_SHUNT $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip protocol udp ip daddr" "$NFTSET_CHN" "$(factor $UDP_REDIR_PORTS "udp dport") $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE")" + [ "${USE_SHUNT_UDP}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE" "ip protocol udp ip daddr" "$NFTSET_SHUNT" "$(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" [ "${LOCALHOST_UDP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" nft "add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp iif lo $(REDIRECT $UDP_REDIR_PORT TPROXY4) comment \"本机\"" } @@ -1397,10 +1434,10 @@ add_firewall_rule() { [ "$PROXY_IPV6" = "1" ] && { [ -n "${LOCALHOST_UDP_PROXY_MODE}" ] && { [ "${USE_FAKEDNS}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE" - [ "${USE_PROXY_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_BLACK6 $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" + [ "${USE_PROXY_LIST}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "meta l4proto udp ip6 daddr" "$NFTSET_BLACK6" "$(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" [ "${USE_GFW_LIST}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_GFW6 $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" - [ "${CHN_LIST}" != "0" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_CHN6 $(factor $UDP_REDIR_PORTS "udp dport") $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE")" - [ "${USE_SHUNT_UDP}" = "1" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_SHUNT6 $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" + [ "${CHN_LIST}" != "0" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "meta l4proto udp ip6 daddr" "$NFTSET_CHN6" "$(factor $UDP_REDIR_PORTS "udp dport") $(get_jump_nft ${CHN_LIST} "counter jump PSW_RULE")" + [ "${USE_SHUNT_UDP}" = "1" ] && nft_rule_dual "PSW_OUTPUT_MANGLE_V6" "meta l4proto udp ip6 daddr" "$NFTSET_SHUNT6" "$(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" [ "${LOCALHOST_UDP_PROXY_MODE}" != "disable" ] && nft "add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS "udp dport") counter jump PSW_RULE" nft "add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp iif lo $(REDIRECT $UDP_REDIR_PORT TPROXY) comment \"本机\"" } @@ -1453,22 +1490,28 @@ del_firewall_rule() { destroy_nftset $NFTSET_LAN destroy_nftset $NFTSET_VPS #destroy_nftset $NFTSET_SHUNT + destroy_nftset $NFTSET_SHUNT_STATIC #destroy_nftset $NFTSET_GFW #destroy_nftset $NFTSET_CHN + destroy_nftset $NFTSET_CHN_STATIC #destroy_nftset $NFTSET_BLACK - destroy_nftset $NFTSET_BLOCK - destroy_nftset $NFTSET_WHITE + destroy_nftset $NFTSET_BLACK_STATIC + destroy_nftset $NFTSET_BLOCK $NFTSET_BLOCK_STATIC + destroy_nftset $NFTSET_WHITE $NFTSET_WHITE_STATIC destroy_nftset $NFTSET_LOCAL6 destroy_nftset $NFTSET_WAN6 destroy_nftset $NFTSET_LAN6 destroy_nftset $NFTSET_VPS6 #destroy_nftset $NFTSET_SHUNT6 + destroy_nftset $NFTSET_SHUNT6_STATIC #destroy_nftset $NFTSET_GFW6 #destroy_nftset $NFTSET_CHN6 + destroy_nftset $NFTSET_CHN6_STATIC #destroy_nftset $NFTSET_BLACK6 - destroy_nftset $NFTSET_BLOCK6 - destroy_nftset $NFTSET_WHITE6 + destroy_nftset $NFTSET_BLACK6_STATIC + destroy_nftset $NFTSET_BLOCK6 $NFTSET_BLOCK6_STATIC + destroy_nftset $NFTSET_WHITE6 $NFTSET_WHITE6_STATIC del_script_mwan3 diff --git a/luci-app-passwall/root/usr/share/passwall/rule_update.lua b/luci-app-passwall/root/usr/share/passwall/rule_update.lua index d022b9ec..53db2e1d 100755 --- a/luci-app-passwall/root/usr/share/passwall/rule_update.lua +++ b/luci-app-passwall/root/usr/share/passwall/rule_update.lua @@ -56,6 +56,7 @@ end --gen cache for nftset from file local function gen_cache(set_name, ip_type, input_file, output_file) local tmp_set_name = set_name .. "_tmp_" .. os.time() + local final_set_name = set_name .. "_static" local f_in = io.open(input_file, "r") if not f_in then return false end local nft_pipe = io.popen("nft -f -", "w") @@ -65,14 +66,14 @@ local function gen_cache(set_name, ip_type, input_file, output_file) end nft_pipe:write('#!/usr/sbin/nft -f\n') nft_pipe:write(string.format('add table %s\n', nftable_name)) - nft_pipe:write(string.format('add set %s %s { type %s; flags interval, timeout; timeout 2d; gc-interval 1h; auto-merge; }\n', nftable_name, tmp_set_name, ip_type)) + nft_pipe:write(string.format('add set %s %s { type %s; flags interval; auto-merge; }\n', nftable_name, tmp_set_name, ip_type)) nft_pipe:write(string.format('add element %s %s { ', nftable_name, tmp_set_name)) local count = 0 local batch_size = 500 for line in f_in:lines() do local ip = line:match("^%s*(.-)%s*$") if ip and ip ~= "" then - nft_pipe:write(ip, "timeout 365d, ") + nft_pipe:write(ip, ", ") count = count + 1 if count % batch_size == 0 then nft_pipe:write("}\n") @@ -88,7 +89,7 @@ local function gen_cache(set_name, ip_type, input_file, output_file) os.execute(string.format('nft delete set %s %s 2>/dev/null', nftable_name, tmp_set_name)) return false end - os.execute(string.format('nft list set %s %s | sed "s/%s/%s/g" > %s', nftable_name, tmp_set_name, tmp_set_name, set_name, output_file)) + os.execute(string.format('nft list set %s %s | sed "s/%s/%s/g" > %s', nftable_name, tmp_set_name, tmp_set_name, final_set_name, output_file)) os.execute(string.format('nft delete set %s %s 2>/dev/null', nftable_name, tmp_set_name)) end diff --git a/luci-app-ssr-plus/Makefile b/luci-app-ssr-plus/Makefile index daa090c0..a424055f 100644 --- a/luci-app-ssr-plus/Makefile +++ b/luci-app-ssr-plus/Makefile @@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus LUCI_PKGARCH:=all PKG_NAME:=luci-app-ssr-plus PKG_VERSION:=196 -PKG_RELEASE:=49 +PKG_RELEASE:=50 PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \ diff --git a/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua b/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua index 78826aec..6b4801d5 100644 --- a/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua +++ b/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua @@ -24,9 +24,10 @@ local SUPPORTED_COMPONENTS = { naiveproxy = true } local SUPPORTED_GEO_COMPONENTS = { - country_mmdb = true, - geosite = true, - v2ray_geo = true + { name = "country_mmdb", require = nil }, + { name = "geosite", require = "/etc/openclash" }, + { name = "v2ray_geoip", require = nil }, + { name = "v2ray_geosite", require = nil } } local function trim(value) @@ -576,7 +577,15 @@ local function read_component_state(component, action) end local function read_geo_state(component, action) - if not SUPPORTED_GEO_COMPONENTS[component] then + local is_supported = false + for _, item in ipairs(SUPPORTED_GEO_COMPONENTS) do + if item.name == component then + is_supported = true + break + end + end + + if not is_supported then return nil, 400, "unsupported_component" end @@ -649,6 +658,7 @@ function index() entry({"admin", "services", "shadowsocksr", "component_set_mirror"}, call("component_set_mirror")).leaf = true entry({"admin", "services", "shadowsocksr", "component_status"}, call("component_status")).leaf = true entry({"admin", "services", "shadowsocksr", "component_upgrade"}, call("component_upgrade")).leaf = true + entry({"admin", "services", "shadowsocksr", "geo_component"}, call("geo_component")).leaf = true entry({"admin", "services", "shadowsocksr", "geo_local_status"}, call("geo_local_status")).leaf = true entry({"admin", "services", "shadowsocksr", "geo_status"}, call("geo_status")).leaf = true entry({"admin", "services", "shadowsocksr", "geo_upgrade"}, call("geo_upgrade")).leaf = true @@ -1072,6 +1082,20 @@ function geo_status() write_geo_json(data) end +function geo_component() + local component = {} + for _, item in ipairs(SUPPORTED_GEO_COMPONENTS) do + local available = true + if item.require then + available = nixio.fs.access(item.require) + end + if available then + table.insert(component, item.name) + end + end + write_geo_json({ component = component }) +end + function geo_local_status() local component = luci.http.formvalue("component") local data, status, err = read_geo_state(component, "local_info") @@ -1091,6 +1115,19 @@ function geo_upgrade() write_geo_json({component = component, error = err or "bad_request", success = "0"}) return end + + local info = read_geo_state(component, "info") + if info then + for key, value in pairs(info) do + if data[key] == nil or data[key] == "" then + data[key] = value + end + end + if data.success == "1" then + data.can_upgrade = info.can_upgrade + end + end + write_geo_json(data) end @@ -1343,22 +1380,30 @@ function clash_client_rule_clear() end function fetch_certsha256() - local function fetch_cert_sha256(host, port, sni, timeout) + local function fetch_cert_sha256(host, port, sni, timeout, http3) if not host then return "" end port = tonumber(port) or 443 sni = sni or host timeout = tonumber(timeout) or 5 - - local cmd = string.format( - "timeout %d openssl s_client -connect %s:%d -servername %s -showcerts /dev/null " .. - "| awk 'BEGIN{c=0}/BEGIN CERT/{c++} c==1{print} /END CERT/{if(c==1)exit}' " .. - "| openssl x509 -outform der 2>/dev/null " .. - "| sha256sum 2>/dev/null", - timeout, host, port, sni - ) - + local cmd + if http3 then + cmd = string.format( + "timeout %d curl --http3 -k -w '%%{certs}' -o /dev/null https://%s:%d 2>/dev/null " .. + "| awk 'BEGIN{c=0}/BEGIN CERT/{c++} c==1{print} /END CERT/{if(c==1)exit}' " .. + "| openssl x509 -outform der 2>/dev/null " .. + "| sha256sum 2>/dev/null", + timeout, host, port + ) + else + cmd = string.format( + "timeout %d openssl s_client -connect %s:%d -servername %s -showcerts /dev/null " .. + "| awk 'BEGIN{c=0}/BEGIN CERT/{c++} c==1{print} /END CERT/{if(c==1)exit}' " .. + "| openssl x509 -outform der 2>/dev/null " .. + "| sha256sum 2>/dev/null", + timeout, host, port, sni + ) + end local out = trim(luci.sys.exec(cmd)) - local fp = out:match("^([0-9a-fA-F]+)") if not fp or fp:lower():match("^e3b0c44298fc1c149afbf4c8996fb924") then return "" @@ -1372,12 +1417,22 @@ function fetch_certsha256() local port = tonumber(port_raw) or 0 local sni = (id ~= "") and uci:get("shadowsocksr", sid, "tls_host") or "" sni = (sni and sni ~= "") and sni or address + local protocol = uci:get("shadowsocksr", id, "v2ray_protocol") or "" + local h3, timeout = false, 10 + if protocol == "hysteria2" then + h3 = true + timeout = 60 + if port == 0 then + local hop = uci:get("shadowsocksr", id, "port_range") or "0" + port = tonumber(hop:match("^%s*(%d+)")) + end + end if address == "" or port == 0 then luci.http.prepare_content("application/json") luci.http.write_json({ code = 0, msg = "Address or Port is invalid" }) return end - local data = fetch_cert_sha256(address, port, sni, 5) + local data = fetch_cert_sha256(address, port, sni, timeout, h3) luci.http.prepare_content("application/json") luci.http.write_json(data ~= "" and { code = 1, data = data } or { code = 0 }) end diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm index e0ea3ae7..cbe293d3 100644 --- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm @@ -22,15 +22,20 @@ var geoMeta = { country_mmdb: { label: '<%:Country MMDB%>', - help: '<%:Update the Country.mmdb database used by Mihomo/Clash runtime when available.%>' + help: '<%:Update the Country.mmdb database used by Xray/V2Ray runtime when available.%>' }, geosite: { - label: '<%:GeoSite Database%>', - help: '<%:Update the GeoSite.dat database used by Mihomo/Clash runtime when available.%>' + label: '<%:OpenClash GeoSite Database%>', + help: '<%:Update the GeoSite.dat database used by Mihomo/Clash runtime when available.%>', + require: '/etc/openclash' }, - v2ray_geo: { - label: '<%:V2Ray GEO Databases%>', - help: '<%:Update geoip.dat and geosite.dat used by Xray/V2Ray runtime when available.%>' + v2ray_geoip: { + label: '<%:V2Ray GeoIP Databases%>', + help: '<%:Update the geoip.dat used by Xray/V2Ray runtime when available.%>' + }, + v2ray_geosite: { + label: '<%:V2Ray GeoSite Databases%>', + help: '<%:Update the geosite.dat used by Xray/V2Ray runtime when available.%>' } }; @@ -91,6 +96,7 @@ } function renderComponentInfo(data, checkedRemote) { + // console.log('Geo data:', data); var panel = document.getElementById('component-status'); var upgradeButton = document.getElementById('component-upgrade'); var action = document.getElementById('component-action'); @@ -192,6 +198,7 @@ mirror: mirror }, function() { queryLocalComponentInfo(); + queryLocalGeoInfo(); }); } @@ -204,7 +211,41 @@ return geoMeta[component] ? geoMeta[component].help : ''; } - function renderGeoInfo(data) { + function loadGeoComponent() { + var url = '<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "geo_component")%>'; + var selector = document.getElementById('geo-selector'); + if (!selector) + return; + + XHR.get(url, {}, function(x, rv) { + if (!rv || !Array.isArray(rv.component)) + return; + + var fragment = document.createDocumentFragment(); + for (var i = 0; i < rv.component.length; i++) { + var comp = rv.component[i]; + var meta = geoMeta[comp]; + if (!meta) + continue; + + var option = document.createElement('option'); + option.value = comp; + option.textContent = meta.label; + fragment.appendChild(option); + } + + selector.innerHTML = ''; + selector.appendChild(fragment); + + if (selector.options.length > 0) { + selector.selectedIndex = 0; + onGeoChange(); + } + }); + } + + function renderGeoInfo(data, checkedRemote) { + // console.log('Geo data:', data); var panel = document.getElementById('geo-status'); var upgradeButton = document.getElementById('geo-upgrade'); var action = document.getElementById('geo-action'); @@ -227,11 +268,23 @@ } html.push('
<%:Current Version%>: ' + (data.current_version || '<%:File Not Exist%>') + '
'); - if (data.component !== 'v2ray_geo' && data.current_version_extra) { + html.push('
<%:Latest Version%>: ' + (data.latest_version || '<%:Unknown%>') + '
'); + var installed = data.installed !== undefined ? data.installed : (data.current_version ? true : false); + html.push('
<%:Installed%>: ' + (installed ? '<%:Yes%>' : '<%:No%>') + '
'); + if (data.component !== 'v2ray_geoip' && data.current_version_extra) { + html.push('
<%:Additional Version%>: ' + data.current_version_extra + '
'); + } + if (data.component !== 'v2ray_geosite' && data.current_version_extra) { html.push('
<%:Additional Version%>: ' + data.current_version_extra + '
'); } if (data.error) { html.push('
<%:Status%>: ' + displayError(data.error) + '
'); + } else if (!checkedRemote) { + html.push('
<%:Status%>: <%:No Check%>
'); + } else if (data.can_upgrade) { + html.push('
<%:Status%>: <%:Upgrade available%>
'); + } else if (data.latest_version) { + html.push('
<%:Status%>: <%:Already up to date%>
'); } else if (data.message) { html.push('
<%:Status%>: ' + (data.success ? displayMessage(data.message) : (data.message || '<%:Unknown%>')) + '
'); } else { @@ -240,7 +293,7 @@ panel.innerHTML = html.join(''); if (upgradeButton) { - upgradeButton.disabled = false; + upgradeButton.disabled = !!data.error || !checkedRemote || !data.latest_version || !data.can_upgrade; } if (action) { action.innerHTML = data.message @@ -249,26 +302,28 @@ } } - function queryGeoInfo(button) { + function queryGeoInfo(button, doUpgrade) { var component = selectedGeoComponent(); var mirror = selectedMirror(); var action = document.getElementById('geo-action'); - var url = '<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "geo_upgrade")%>'; + var url = doUpgrade + ? '<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "geo_upgrade")%>' + : '<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "geo_status")%>'; if (button) { button.disabled = true; - button.value = '<%:Checking...%>'; + button.value = doUpgrade ? '<%:Upgrading...%>' : '<%:Checking...%>'; } if (action) { - action.innerHTML = '<%:Processing...%>'; + action.innerHTML = doUpgrade ? '<%:Processing...%>' : ''; } XHR.get(url, { component: component, mirror: mirror }, function(x, rv) { - renderGeoInfo(rv); + renderGeoInfo(rv, true); if (button) { button.disabled = false; - button.value = '<%:CHECK AND UPDATE%>'; + button.value = doUpgrade ? '<%:Upgrade%>' : '<%:Check Update%>'; } }); } @@ -282,7 +337,7 @@ component: selectedGeoComponent(), mirror: selectedMirror() }, function(x, rv) { - renderGeoInfo(rv); + renderGeoInfo(rv, false); }); } @@ -290,9 +345,18 @@ queryLocalGeoInfo(); } + function selectedGeoComponent() { + var selector = document.getElementById('geo-selector'); + return selector ? selector.value : 'country_mmdb'; + } + + function geoHelp(component) { + return geoMeta[component] ? geoMeta[component].help : ''; + } + window.setTimeout(function() { onComponentChange(); - onGeoChange(); + loadGeoComponent() }, 0); //]]> @@ -437,8 +501,9 @@ @@ -447,7 +512,8 @@
<%:Collecting data...%>
- + +
diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm index 3a2ef042..228a54bd 100644 --- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm @@ -18,7 +18,10 @@ return; } if (!res || res.code !== 1 || !res.data) { - alert(res && res.msg ? res.msg : "<%:Fetch Failed%> !"); + alert(res && res.msg ? res.msg : "<%:Fetch Failed%> !\n" + + "<%:Requires OpenSSL to retrieve the TLS certificate chain fingerprint.%>\n" + + "<%:QUIC protocols such as HY2 also require curl with http3 support.%>" + ); return; } const inputs = document.querySelectorAll('input[id$=".tls_CertSha"]'); diff --git a/luci-app-ssr-plus/po/templates/ssr-plus.pot b/luci-app-ssr-plus/po/templates/ssr-plus.pot index 705628b6..830e57e6 100644 --- a/luci-app-ssr-plus/po/templates/ssr-plus.pot +++ b/luci-app-ssr-plus/po/templates/ssr-plus.pot @@ -20,7 +20,7 @@ msgstr "" msgid "128 Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1662 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1663 msgid "16" msgstr "" @@ -56,7 +56,7 @@ msgstr "" msgid "64 Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1649 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1650 msgid "8" msgstr "" @@ -69,8 +69,8 @@ msgid "" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1149 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1504 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1505 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1532 msgid "" msgstr "" @@ -83,9 +83,9 @@ msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:269 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:284 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1321 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1642 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1655 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1668 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1656 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1669 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:186 msgid "
  • " msgstr "" @@ -98,40 +98,41 @@ msgstr "" msgid "Accept LAN Access" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:640 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:649 msgid "Access Control" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1035 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:272 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1118 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:302 msgid "Actions" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1015 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:290 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:298 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:226 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:321 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1098 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:349 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:357 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:256 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:351 msgid "Add" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:252 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:282 msgid "Add failed:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:219 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:249 msgid "Adding..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:231 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:275 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:278 msgid "Additional Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:388 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:452 msgid "Address" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:641 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:650 msgid "Advanced Settings" msgstr "" @@ -143,9 +144,9 @@ msgstr "" msgid "AliYun Public DNS (223.5.5.5)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:596 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:708 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:157 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:597 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:709 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:187 msgid "Alias" msgstr "" @@ -161,15 +162,15 @@ msgstr "" msgid "All Ports" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:965 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046 msgid "All client proxy rules cleared and applied." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:965 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046 msgid "All client proxy rules cleared." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:101 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:131 msgid "All settings saved successfully." msgstr "" @@ -185,8 +186,9 @@ msgstr "" msgid "Allow subscribe Insecure nodes By default" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:38 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:130 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:43 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:136 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:287 msgid "Already up to date" msgstr "" @@ -224,8 +226,8 @@ msgstr "" msgid "Apple domains optimization" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:768 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:774 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:769 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:775 msgid "Apply" msgstr "" @@ -233,7 +235,7 @@ msgstr "" msgid "Appointment Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:112 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:142 msgid "Are you sure you want to delete subscribe link: %s ?" msgstr "" @@ -241,7 +243,7 @@ msgstr "" msgid "Are you sure you want to restore the client to default settings?" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:785 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:786 msgid "Auto Switch" msgstr "" @@ -258,13 +260,13 @@ msgid "Auto Update Server subscription, GFW list and CHN route" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:907 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1708 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1724 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1709 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1725 msgid "BBR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1709 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1725 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1710 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1726 msgid "BRUTAL" msgstr "" @@ -309,11 +311,6 @@ msgstr "" msgid "Bypass Domain List" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:271 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:450 -msgid "CHECK AND UPDATE" -msgstr "" - #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:31 msgid "CLOSE WIN" msgstr "" @@ -323,8 +320,8 @@ msgid "CNNIC SDNS (1.2.4.8)" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:908 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1710 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1728 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1711 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1729 msgid "CUBIC" msgstr "" @@ -341,16 +338,16 @@ msgstr "" msgid "Certificate File Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1618 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1619 msgid "Certificate fingerprint" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:36 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:39 msgid "" "Certificate fingerprint retrieved successfully, but no input field found!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:73 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:76 msgid "Certificate name retrieved successfully, but no input field found!" msgstr "" @@ -372,8 +369,10 @@ msgstr "" msgid "Check Try Count" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:167 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:416 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:480 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:515 msgid "Check Update" msgstr "" @@ -392,8 +391,8 @@ msgstr "" msgid "Check..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:156 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:260 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:162 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:315 msgid "Checking..." msgstr "" @@ -417,13 +416,13 @@ msgstr "" msgid "Clang.CN.CIDR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:379 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:380 msgid "Clash" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:88 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:817 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1013 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:893 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1096 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:3 msgid "Clash Panel" msgstr "" @@ -444,11 +443,11 @@ msgstr "" msgid "Clash/Mihomo" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1018 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1101 msgid "Clear All Rules" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:954 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1035 msgid "Clear all custom client proxy rules and restore empty state?" msgstr "" @@ -458,28 +457,28 @@ msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:309 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1151 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1506 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1533 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1507 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1534 msgid "Click to the page" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1032 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1115 msgid "Client" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:920 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1001 msgid "Client rules exported to CSV file." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:944 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1025 msgid "Client rules imported from CSV file. Click Save to apply." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1027 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110 msgid "Client supports manual IP or IP/CIDR input." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1024 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1107 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:251 msgid "Close" msgstr "" @@ -493,17 +492,17 @@ msgstr "" msgid "Cloudflare DNS (1.1.1.1)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:413 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:447 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:477 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:512 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:21 msgid "Collecting data..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:400 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:464 msgid "Component" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:643 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:652 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:5 msgid "Component Update" msgstr "" @@ -528,16 +527,16 @@ msgstr "" msgid "Connection Timeout" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1517 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1518 msgid "" "Controls the policy used when performing DNS queries for ECH configuration." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:560 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:561 msgid "Convert Address" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:555 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:556 msgid "" "Convert subscriptions to Clash/Mihomo YAML with a subscription template URL." msgstr "" @@ -546,12 +545,12 @@ msgstr "" msgid "Copy SSR to clipboard successfully." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:379 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:443 msgid "Core Components" msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:24 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:439 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:503 msgid "Country MMDB" msgstr "" @@ -559,19 +558,19 @@ msgstr "" msgid "Create Backup File" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1756 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1757 msgid "Create upload file error." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:120 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 msgid "Current ARCH" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1776 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1777 msgid "Current Certificate Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:229 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:270 msgid "Current Version" msgstr "" @@ -579,8 +578,8 @@ msgstr "" msgid "Custom" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:991 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:992 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1073 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1074 msgid "Custom Client Proxies Rules" msgstr "" @@ -611,11 +610,11 @@ msgstr "" msgid "Custom YAML imported successfully: %s" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:708 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784 msgid "Custom client proxy rules saved and applied." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:708 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784 msgid "Custom client proxy rules saved." msgstr "" @@ -646,7 +645,7 @@ msgstr "" msgid "DTLS 1.2" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:435 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:499 msgid "Database" msgstr "" @@ -659,9 +658,9 @@ msgid "Decryption" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1364 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1554 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1566 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1580 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1555 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1567 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1581 msgid "Default" msgstr "" @@ -669,7 +668,7 @@ msgstr "" msgid "Default Node Local Port" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1669 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1670 msgid "Default reject rejects traffic." msgstr "" @@ -677,30 +676,30 @@ msgstr "" msgid "Default value 0 indicatesno heartbeat." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644 msgid "" "Default: disable. When entering a negative number, such as -1, The Mux " "module will not be used to carry TCP traffic." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1656 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1657 msgid "" "Default:16. When entering a negative number, such as -1, The Mux module will " "not be used to carry UDP traffic, Use original UDP transmission method of " "proxy protocol." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:297 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41 msgid "Defaults Cleared!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:297 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41 msgid "Defaults Restored!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1027 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110 msgid "" "Define per-client Mihomo proxy targets. Rules are injected as SRC-IP-CIDR " "entries before the original Clash rules." @@ -710,10 +709,10 @@ msgstr "" msgid "Delay (ms)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:589 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:248 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:166 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:298 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:665 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:319 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:196 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:328 msgid "Delete" msgstr "" @@ -721,7 +720,7 @@ msgstr "" msgid "Delete All Subscribe Servers" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:130 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:160 msgid "Delete failed:" msgstr "" @@ -756,7 +755,7 @@ msgstr "" msgid "Disable TCP No_delay" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:552 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:553 msgid "Disabled means use Xray or ShadowSocks-Rust core." msgstr "" @@ -788,11 +787,11 @@ msgstr "" msgid "Downlink Capacity(Default:Mbps)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:387 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:451 msgid "Download Source" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:47 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:52 msgid "Download failed" msgstr "" @@ -800,11 +799,11 @@ msgstr "" msgid "Dual-stack Listening Socket" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1502 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1503 msgid "ECH Config" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1516 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1517 msgid "ECH Query Policy" msgstr "" @@ -812,8 +811,8 @@ msgstr "" msgid "Early Data Header Name" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:240 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:246 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:311 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:317 msgid "Edit" msgstr "" @@ -827,9 +826,9 @@ msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:323 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:588 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1031 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:154 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:589 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1114 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:184 msgid "Enable" msgstr "" @@ -842,11 +841,11 @@ msgid "Enable Authentication" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1793 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1794 msgid "Enable Auto Switch" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1486 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1487 msgid "Enable ECH(optional)" msgstr "" @@ -854,21 +853,21 @@ msgstr "" msgid "Enable Lazy Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1524 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1525 msgid "Enable ML-DSA-65(optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:549 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:550 msgid "Enable Mihomo core" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1687 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1688 msgid "" "Enable Multipath TCP, need to be enabled in both server and client " "configuration." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1623 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1624 msgid "Enable Mux.Cool" msgstr "" @@ -921,7 +920,7 @@ msgid "Enabled Mixed" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:825 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1782 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1783 msgid "Enabling TCP Fast Open Requires Server Support." msgstr "" @@ -942,7 +941,7 @@ msgid "Enter Custom Ports" msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:17 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:54 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:57 msgid "Error" msgstr "" @@ -986,23 +985,23 @@ msgstr "" msgid "Expecting: %s" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1019 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1102 msgid "Export Client Rules" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:48 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:53 msgid "Extract failed" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1726 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1727 msgid "FORCE BRUTAL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:967 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1048 msgid "Failed to clear all client proxy rules." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:46 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:51 msgid "Failed to create temp directory" msgstr "" @@ -1010,34 +1009,34 @@ msgstr "" msgid "Failed to create temporary YAML upload file." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:41 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:84 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:46 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:89 msgid "Failed to fetch release metadata" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:106 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:112 msgid "Failed to query component information." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:220 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:261 msgid "Failed to query geo database information." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:710 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:786 msgid "Failed to save custom client proxy rules." msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:21 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:58 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:61 msgid "Fetch Failed" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1607 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1614 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1608 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1615 msgid "Fetch Manually" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:229 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:270 msgid "File Not Exist" msgstr "" @@ -1130,21 +1129,16 @@ msgstr "" msgid "Gecko Packet Size (min)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:427 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:491 msgid "Geo Database Update" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:436 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:500 msgid "Geo Resource" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:28 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:440 -msgid "GeoSite Database" -msgstr "" - #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:14 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:391 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:455 msgid "GitHub Direct" msgstr "" @@ -1277,7 +1271,7 @@ msgstr "" msgid "Httpupgrade Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:419 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:420 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:456 msgid "Hysteria2" msgstr "" @@ -1294,7 +1288,7 @@ msgstr "" msgid "IP Route Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1578 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1579 msgid "IP Stack Preference" msgstr "" @@ -1302,7 +1296,7 @@ msgstr "" msgid "If empty, Not change Apple domains parsing DNS (Default is empty)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1504 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1505 msgid "" "If it is not empty, it indicates that the Client has enabled Encrypted " "Client, see:" @@ -1312,13 +1306,13 @@ msgstr "" msgid "If this option is not set, the socket behavior is platform dependent." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1591 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1592 msgid "" "If true, allowss insecure connection at TLS client, e.g., TLS server uses " "unverifiable certificates." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1740 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1741 msgid "If you have a self-signed certificate,please check the box" msgstr "" @@ -1326,7 +1320,7 @@ msgstr "" msgid "Import" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1020 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1103 msgid "Import Client Rules" msgstr "" @@ -1347,19 +1341,23 @@ msgstr "" msgid "Initial Windows Size" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:52 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:57 msgid "Install failed" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:115 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273 +msgid "Installed" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 msgid "Installed Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:53 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:58 msgid "Installed binary failed to run" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:55 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:60 msgid "Installed package check failed" msgstr "" @@ -1371,7 +1369,7 @@ msgstr "" msgid "Interface control" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:293 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:352 msgid "Invalid" msgstr "" @@ -1419,19 +1417,19 @@ msgstr "" msgid "KcpTun" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1798 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1799 msgid "KcpTun Enable" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1818 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1819 msgid "KcpTun Param" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1812 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1813 msgid "KcpTun Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1805 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1806 msgid "KcpTun Port" msgstr "" @@ -1459,7 +1457,8 @@ msgstr "" msgid "LAN IP AC" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:116 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:122 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:271 msgid "Latest Version" msgstr "" @@ -1518,8 +1517,8 @@ msgstr "" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:718 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:771 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:794 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:847 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:84 msgid "Loading..." msgstr "" @@ -1537,7 +1536,7 @@ msgstr "" msgid "Local addresses" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:656 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:666 msgid "Log" msgstr "" @@ -1553,11 +1552,11 @@ msgstr "" msgid "Loyalsoldier/v2ray-rules-dat" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1529 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1530 msgid "ML-DSA-65 Public key" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1687 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1688 msgid "MPTCP" msgstr "" @@ -1569,14 +1568,14 @@ msgstr "" msgid "Main Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:586 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:587 msgid "" "Manage multiple subscribe URLs, including Clash subscriptions. Only enabled " "entries are included when updating all subscriptions." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:42 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:85 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:47 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:90 msgid "Matching release asset not found" msgstr "" @@ -1592,18 +1591,18 @@ msgstr "" msgid "Maximum packet size the socks5 server can receive from external" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:375 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:378 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:381 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:387 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:403 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:376 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:379 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:382 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:388 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:404 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:13 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:406 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:470 msgid "Mihomo" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1005 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1006 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1087 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1088 msgid "Mihomo Pannel" msgstr "" @@ -1611,13 +1610,13 @@ msgstr "" msgid "Min" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1657 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1658 msgid "" "Min value is 1, Max value is 1024. When omitted or set to 0, Will same path " "as TCP traffic." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1645 msgid "" "Min value is 1, Max value is 128. When omitted or set to 0, it equals 8." msgstr "" @@ -1626,15 +1625,15 @@ msgstr "" msgid "Mirror URL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:44 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:49 msgid "Missing gzip support" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:43 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:48 msgid "Missing unzip support" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:45 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:50 msgid "Missing xz support" msgstr "" @@ -1667,7 +1666,7 @@ msgstr "" msgid "Must be JSON text!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1623 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1624 msgid "Mux" msgstr "" @@ -1679,10 +1678,10 @@ msgstr "" msgid "NOT RUNNING" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:413 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:414 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:387 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:17 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:407 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:471 msgid "NaiveProxy" msgstr "" @@ -1702,10 +1701,15 @@ msgstr "" msgid "Next" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273 +msgid "No" +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:252 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:256 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:285 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:132 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:283 msgid "No Check" msgstr "" @@ -1729,7 +1733,7 @@ msgstr "" msgid "No custom YAML file was selected." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:474 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:550 msgid "No custom client proxy rules yet." msgstr "" @@ -1737,20 +1741,20 @@ msgstr "" msgid "No new data!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1772 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1773 msgid "No specify upload file." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:94 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:124 msgid "No subscription items found" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:615 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:691 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:32 msgid "No switchable proxy groups found." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:610 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:611 msgid "" "Node order can be dragged with the mouse and takes effect immediately. The " "automatic switch order of server nodes is consistent with the node order in " @@ -1766,8 +1770,8 @@ msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1258 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1270 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1280 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:705 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:710 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:706 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:711 msgid "None" msgstr "" @@ -1785,7 +1789,7 @@ msgstr "" msgid "Not exist" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:115 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 msgid "Not installed" msgstr "" @@ -1807,7 +1811,7 @@ msgid "" "saperate with ','." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1698 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1699 msgid "Number of early established connections to reduce latency." msgstr "" @@ -1835,7 +1839,7 @@ msgstr "" msgid "Obfuscation Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1606 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1607 msgid "Once set, connects only when the server’s chain fingerprint matches." msgstr "" @@ -1859,6 +1863,11 @@ msgstr "" msgid "Only when Socks5 Auth Mode is password valid, Not mandatory." msgstr "" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:28 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:504 +msgid "OpenClash GeoSite Database" +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:154 msgid "OpenDNS" msgstr "" @@ -1873,11 +1882,11 @@ msgstr "" msgid "OpenDNS (208.67.222.222)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:118 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:124 msgid "Package Manager" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:401 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:465 msgid "Package Name" msgstr "" @@ -1920,11 +1929,11 @@ msgstr "" msgid "Permit Without Stream" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:753 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:754 msgid "Ping Latency" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1779 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1780 msgid "Please confirm the current certificate path" msgstr "" @@ -1940,7 +1949,7 @@ msgstr "" msgid "Plugin Opts" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1033 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1116 msgid "Policy" msgstr "" @@ -1952,7 +1961,7 @@ msgstr "" msgid "Port hopping range" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1698 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1699 msgid "Pre-connections" msgstr "" @@ -1976,8 +1985,8 @@ msgstr "" msgid "Private key" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:160 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:264 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:166 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:319 msgid "Processing..." msgstr "" @@ -2033,6 +2042,10 @@ msgstr "" msgid "QUIC maxStreamReceiveWindow" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:23 +msgid "QUIC protocols such as HY2 also require curl with http3 support." +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1439 msgid "REALITY" msgstr "" @@ -2041,24 +2054,24 @@ msgstr "" msgid "RST Backup" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:441 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:442 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:7 msgid "RUNNING" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:434 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:435 msgid "RUNNING in %s (%s) Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:438 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:439 msgid "RUNNING in %s Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:604 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:752 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:802 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:680 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:828 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:878 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:93 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:238 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:291 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:253 msgid "Ready." msgstr "" @@ -2075,8 +2088,8 @@ msgstr "" msgid "Realm URL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:772 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:272 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:773 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17 msgid "Reapply" msgstr "" @@ -2117,7 +2130,7 @@ msgstr "" msgid "Regular update (Min)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:127 msgid "Release Asset" msgstr "" @@ -2126,19 +2139,19 @@ msgstr "" msgid "Reload YAML" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:265 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:341 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:10 msgid "Reloading YAML..." msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:135 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:136 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1034 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1117 msgid "Remarks" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1711 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1727 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1712 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1728 msgid "Reno" msgstr "" @@ -2146,18 +2159,22 @@ msgstr "" msgid "Required for VMess/VLESS. Generate with: uuidgen" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:22 +msgid "Requires OpenSSL to retrieve the TLS certificate chain fingerprint." +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1335 msgid "Reserved bytes(optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:998 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:999 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1080 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1081 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:62 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:63 msgid "Reset Default Proxies Rules" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:300 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:376 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:44 msgid "Reset Defaults Failed!" msgstr "" @@ -2167,7 +2184,7 @@ msgstr "" msgid "Reset complete" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:286 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:362 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:30 msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?" msgstr "" @@ -2176,7 +2193,7 @@ msgstr "" msgid "Reset to defaults" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:290 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:366 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:34 msgid "Resetting Defaults..." msgstr "" @@ -2216,7 +2233,7 @@ msgstr "" msgid "Running Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:415 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:416 msgid "SOCKS5" msgstr "" @@ -2224,24 +2241,24 @@ msgstr "" msgid "SS URL base64 sstr format not recognized." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:638 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:647 msgid "SSR Client" msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:5 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:404 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:468 msgid "SSR Plus+ Main Program" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:642 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:651 msgid "SSR Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1023 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:165 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:297 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:322 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:323 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1106 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:195 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:327 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:352 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:353 msgid "Save" msgstr "" @@ -2257,21 +2274,21 @@ msgstr "" msgid "Save current subscribe settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:82 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:105 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:112 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:135 msgid "Save failed:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:687 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:51 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:763 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:81 msgid "Saving..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:77 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:105 msgid "Second" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1732 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1733 msgid "Self-signed Certificate" msgstr "" @@ -2310,7 +2327,7 @@ msgstr "" msgid "Server failsafe auto swith and custom update settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:639 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:648 msgid "Servers Nodes" msgstr "" @@ -2331,15 +2348,15 @@ msgstr "" msgid "Shadow-TLS ChainPoxy type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:376 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:377 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:381 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:451 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:61 msgid "ShadowSocks" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:388 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:390 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:389 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:391 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:384 msgid "ShadowSocks-Rust" msgstr "" @@ -2348,7 +2365,7 @@ msgstr "" msgid "ShadowSocks-rust Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:635 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:644 msgid "ShadowSocksR Plus+" msgstr "" @@ -2356,7 +2373,7 @@ msgstr "" msgid "ShadowSocksR Plus+ Settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:417 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:418 msgid "ShadowTLS" msgstr "" @@ -2365,7 +2382,7 @@ msgstr "" msgid "Shadowsocks Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:384 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:385 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:378 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:64 msgid "ShadowsocksR" @@ -2399,7 +2416,7 @@ msgstr "" msgid "Snell Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:713 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:714 msgid "Socket Connected" msgstr "" @@ -2432,7 +2449,7 @@ msgstr "" msgid "Socks5 User" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:73 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:129 msgid "Start Detection" msgstr "" @@ -2440,18 +2457,21 @@ msgstr "" msgid "Starting subscription update..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:644 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:124 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:128 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:653 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:130 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:234 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:236 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:238 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:132 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:134 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:136 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:281 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:283 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:285 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:287 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:289 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:291 msgid "Status" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:74 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:130 msgid "Stop Detection" msgstr "" @@ -2459,7 +2479,7 @@ msgstr "" msgid "Subscribe Advanced Settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:554 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:555 msgid "Subscribe Convert Online" msgstr "" @@ -2479,13 +2499,13 @@ msgstr "" msgid "Subscribe Save Words" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:568 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:569 msgid "Subscribe Template URL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:579 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:603 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:159 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:580 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:604 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:189 msgid "Subscribe URL" msgstr "" @@ -2501,11 +2521,11 @@ msgstr "" msgid "Subscribe nodes allows insecure connection as TLS client (insecure)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:33 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:36 msgid "Successfully retrieved certificate fingerprint:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:70 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:73 msgid "Successfully retrieved certificate name:" msgstr "" @@ -2527,17 +2547,17 @@ msgstr "" msgid "Switch check cycly(second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:654 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:730 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:71 msgid "Switch failed." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:651 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:727 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:68 msgid "Switched successfully." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:644 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:720 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:61 msgid "Switching..." msgstr "" @@ -2547,7 +2567,7 @@ msgid "TCP Camouflage Type" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:825 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1782 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1783 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:128 msgid "TCP Fast Open" msgstr "" @@ -2571,32 +2591,32 @@ msgstr "" msgid "TLS 1.3 Strict mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1552 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1553 msgid "TLS ALPN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1610 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1611 msgid "TLS Certificate Name (CertName)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1603 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1604 msgid "TLS Chain Fingerprint (SHA256)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1544 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1545 msgid "TLS Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1613 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1614 msgid "TLS is used to verify the leaf certificate name." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:382 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:383 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:393 msgid "TUIC" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1564 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1565 msgid "TUIC ALPN" msgstr "" @@ -2620,7 +2640,7 @@ msgstr "" msgid "TUIC send window" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1532 msgid "" "The client has not configured mldsa65Verify, but it will not perform the " "\"additional verification\" step and can still connect normally, see:" @@ -2661,8 +2681,8 @@ msgid "" "release assets." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:740 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:795 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:816 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:871 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:89 msgid "This Clash total node is not active. Apply this node first." msgstr "" @@ -2672,9 +2692,9 @@ msgid "" "This panel is available only when the current Clash total node is active." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:272 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:126 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:314 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:331 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:156 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:344 msgid "This section contains no values yet" msgstr "" @@ -2686,7 +2706,7 @@ msgstr "" msgid "Through proxy update list, Not Recommended" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:78 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:106 msgid "Timeout" msgstr "" @@ -2712,7 +2732,7 @@ msgstr "" msgid "Transport Protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:411 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:412 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450 msgid "Trojan" msgstr "" @@ -2721,12 +2741,12 @@ msgstr "" msgid "Trojan Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:79 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:107 msgid "Try Count" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:327 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:702 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:703 msgid "Type" msgstr "" @@ -2774,37 +2794,38 @@ msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:32 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:42 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:116 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:120 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:236 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:122 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:127 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:271 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:289 msgid "Unknown" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:87 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:82 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:130 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:252 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:92 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:112 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:160 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:282 msgid "Unknown error" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:40 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:82 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:45 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:87 msgid "Unsupported ARCH" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:86 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:91 msgid "Unsupported component" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:54 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:83 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:59 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:88 msgid "Unsupported package manager" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:167 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:302 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:303 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:197 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:332 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:333 msgid "Update" msgstr "" @@ -2824,14 +2845,9 @@ msgstr "" msgid "Update cycle (Day/Week)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:33 -msgid "" -"Update geoip.dat and geosite.dat used by Xray/V2Ray runtime when available." -msgstr "" - #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:25 msgid "" -"Update the Country.mmdb database used by Mihomo/Clash runtime when available." +"Update the Country.mmdb database used by Xray/V2Ray runtime when available." msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:29 @@ -2839,24 +2855,36 @@ msgid "" "Update the GeoSite.dat database used by Mihomo/Clash runtime when available." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:31 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:34 +msgid "Update the geoip.dat used by Xray/V2Ray runtime when available." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:38 +msgid "Update the geosite.dat used by Xray/V2Ray runtime when available." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:61 msgid "Updating..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:167 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:417 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:481 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:516 msgid "Upgrade" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:128 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:134 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:285 msgid "Upgrade available" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:39 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:44 msgid "Upgrade completed" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:156 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:162 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:315 msgid "Upgrading..." msgstr "" @@ -2864,17 +2892,17 @@ msgstr "" msgid "Uplink Capacity(Default:Mbps)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1742 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1743 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm:3 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_yaml_upload.htm:3 msgid "Upload" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:545 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:546 msgid "Upload Custom YAML File" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:547 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:548 msgid "" "Upload a custom Clash/Mihomo YAML file. The file will be preprocessed and " "saved as a local Clash node." @@ -2924,7 +2952,7 @@ msgid "User cancelled." msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1362 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:535 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:536 msgid "User-Agent" msgstr "" @@ -2947,9 +2975,14 @@ msgstr "" msgid "Using incorrect encryption mothod may causes service fail to start" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:32 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:441 -msgid "V2Ray GEO Databases" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:33 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:505 +msgid "V2Ray GeoIP Databases" +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:37 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:506 +msgid "V2Ray GeoSite Databases" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:375 @@ -3060,7 +3093,7 @@ msgstr "" msgid "XTLS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:405 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:406 msgid "Xray" msgstr "" @@ -3073,20 +3106,24 @@ msgid "Xray Noise Packets" msgstr "" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:9 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:405 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:469 msgid "Xray-core" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:275 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:351 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:20 msgid "YAML Reload Failed!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:272 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17 msgid "YAML Reloaded!" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273 +msgid "Yes" +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 msgid "adblock_url" msgstr "" @@ -3095,15 +3132,15 @@ msgstr "" msgid "aes-128-gcm" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1676 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1677 msgid "allow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1670 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1671 msgid "allow: Allows use Mux connection." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1586 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1587 msgid "allowInsecure" msgstr "" @@ -3132,12 +3169,12 @@ msgstr "" msgid "chrome" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1707 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1723 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1708 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1724 msgid "comment_tcpcongestion_disable" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1640 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1641 msgid "concurrency" msgstr "" @@ -3145,14 +3182,14 @@ msgstr "" msgid "curl" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1704 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1720 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1705 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1721 msgid "custom_tcpcongestion" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1482 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1648 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1661 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1483 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1649 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1662 msgid "disable" msgstr "" @@ -3222,11 +3259,11 @@ msgstr "" msgid "mKCP Camouflage Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:50 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:55 msgid "mihomo binary not found in archive" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:51 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:56 msgid "naive binary not found in archive" msgstr "" @@ -3255,7 +3292,7 @@ msgstr "" msgid "randomized" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1675 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1676 msgid "reject" msgstr "" @@ -3276,11 +3313,11 @@ msgstr "" msgid "shadowTLS protocol Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1677 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1678 msgid "skip" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1671 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1672 msgid "" "skip: Not use Mux module to carry UDP 443 traffic, Use original UDP " "transmission method of proxy protocol." @@ -3290,6 +3327,10 @@ msgstr "" msgid "spiderX" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1482 +msgid "unsafe" +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 msgid "v2fly/domain-list-community" msgstr "" @@ -3306,7 +3347,7 @@ msgstr "" msgid "warning! Please do not reuse the port!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:49 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:54 msgid "xray binary not found in archive" msgstr "" @@ -3314,10 +3355,10 @@ msgstr "" msgid "xray-plugin" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1653 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1654 msgid "xudpConcurrency" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1666 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1667 msgid "xudpProxyUDP443" msgstr "" diff --git a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po index 63d2575a..5382a3f3 100644 --- a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po +++ b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po @@ -22,7 +22,7 @@ msgstr "单线程" msgid "128 Threads" msgstr "128 线程" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1662 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1663 msgid "16" msgstr "" @@ -58,7 +58,7 @@ msgstr "4 线程" msgid "64 Threads" msgstr "64 线程" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1649 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1650 msgid "8" msgstr "" @@ -71,8 +71,8 @@ msgid "" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1149 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1504 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1505 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1532 msgid "" msgstr "" @@ -87,9 +87,9 @@ msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:269 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:284 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1321 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1642 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1655 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1668 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1656 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1669 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:186 msgid "
    • " msgstr "" @@ -102,40 +102,41 @@ msgstr "一个合法的文件路径。在运行之前,此文件必须不存在 msgid "Accept LAN Access" msgstr "接受局域网访问" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:640 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:649 msgid "Access Control" msgstr "访问控制" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1035 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:272 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1118 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:302 msgid "Actions" msgstr "操作" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1015 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:290 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:298 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:226 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:321 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1098 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:349 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:357 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:256 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:351 msgid "Add" msgstr "添加" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:252 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:282 msgid "Add failed:" msgstr "添加失败:" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:219 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:249 msgid "Adding..." msgstr "添加中..." -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:231 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:275 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:278 msgid "Additional Version" msgstr "附加版本" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:388 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:452 msgid "Address" msgstr "地址" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:641 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:650 msgid "Advanced Settings" msgstr "高级设置" @@ -147,9 +148,9 @@ msgstr "【广告屏蔽】数据库" msgid "AliYun Public DNS (223.5.5.5)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:596 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:708 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:157 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:597 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:709 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:187 msgid "Alias" msgstr "别名" @@ -165,15 +166,15 @@ msgstr "全部" msgid "All Ports" msgstr "所有端口(默认)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:965 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046 msgid "All client proxy rules cleared and applied." msgstr "所有客户端代理规则已清空并生效。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:965 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1046 msgid "All client proxy rules cleared." msgstr "所有客户端代理规则已清空。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:101 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:131 msgid "All settings saved successfully." msgstr "所有设置保存成功。" @@ -189,8 +190,9 @@ msgstr "仅允许列表内主机" msgid "Allow subscribe Insecure nodes By default" msgstr "订阅节点允许不验证 TLS 证书" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:38 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:130 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:43 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:136 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:287 msgid "Already up to date" msgstr "已是最新版本" @@ -228,8 +230,8 @@ msgstr "Apple 域名更新 URL" msgid "Apple domains optimization" msgstr "Apple 域名解析优化" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:768 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:774 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:769 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:775 msgid "Apply" msgstr "应用" @@ -237,7 +239,7 @@ msgstr "应用" msgid "Appointment Mode" msgstr "定时模式" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:112 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:142 msgid "Are you sure you want to delete subscribe link: %s ?" msgstr "确定要删除此订阅链接:%s 吗?" @@ -245,7 +247,7 @@ msgstr "确定要删除此订阅链接:%s 吗?" msgid "Are you sure you want to restore the client to default settings?" msgstr "是否真的要恢复客户端默认配置?" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:785 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:786 msgid "Auto Switch" msgstr "自动切换" @@ -262,13 +264,13 @@ msgid "Auto Update Server subscription, GFW list and CHN route" msgstr "自动更新服务器订阅、GFW 列表和中国大陆 IP 段" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:907 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1708 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1724 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1709 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1725 msgid "BBR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1709 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1725 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1710 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1726 msgid "BRUTAL" msgstr "" @@ -313,11 +315,6 @@ msgstr "布隆过滤器" msgid "Bypass Domain List" msgstr "不走代理的域名" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:271 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:450 -msgid "CHECK AND UPDATE" -msgstr "检查并更新" - #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:31 msgid "CLOSE WIN" msgstr "关闭窗口" @@ -327,8 +324,8 @@ msgid "CNNIC SDNS (1.2.4.8)" msgstr "" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:908 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1710 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1728 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1711 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1729 msgid "CUBIC" msgstr "" @@ -345,16 +342,16 @@ msgstr "伪装类型" msgid "Certificate File Path" msgstr "证书文件路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1618 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1619 msgid "Certificate fingerprint" msgstr "证书指纹" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:36 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:39 msgid "" "Certificate fingerprint retrieved successfully, but no input field found!" msgstr "已成功获取证书指纹,但未找到对应的输入框!" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:73 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:76 msgid "Certificate name retrieved successfully, but no input field found!" msgstr "已成功获取证书名称,但未找到对应的输入框!" @@ -376,8 +373,10 @@ msgstr "【服务器端口】检查" msgid "Check Try Count" msgstr "切换检查重试次数" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:167 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:416 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:480 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:515 msgid "Check Update" msgstr "检查更新" @@ -396,8 +395,8 @@ msgstr "切换检查超时时间(秒)" msgid "Check..." msgstr "正在检查..." -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:156 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:260 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:162 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:315 msgid "Checking..." msgstr "检查中..." @@ -421,13 +420,13 @@ msgstr "" msgid "Clang.CN.CIDR" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:379 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:380 msgid "Clash" msgstr "Clash" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:88 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:817 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1013 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:893 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1096 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:3 msgid "Clash Panel" msgstr "Clash 面板" @@ -448,11 +447,11 @@ msgstr "Clash YAML 路径" msgid "Clash/Mihomo" msgstr "Clash/Mihomo" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1018 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1101 msgid "Clear All Rules" msgstr "清空所有规则" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:954 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1035 msgid "Clear all custom client proxy rules and restore empty state?" msgstr "清空所有自定义客户端代理规则,并恢复为空白状态吗?" @@ -462,28 +461,28 @@ msgstr "清空日志" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:309 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1151 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1506 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1533 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1507 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1534 msgid "Click to the page" msgstr "点击前往" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1032 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1115 msgid "Client" msgstr "客户端" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:920 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1001 msgid "Client rules exported to CSV file." msgstr "客户端规则已导出为 CSV 文件。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:944 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1025 msgid "Client rules imported from CSV file. Click Save to apply." msgstr "客户端规则已从 CSV 文件导入,请点击保存生效。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1027 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110 msgid "Client supports manual IP or IP/CIDR input." msgstr "客户端支持手动输入 IP 或 IP/CIDR。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1024 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1107 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:251 msgid "Close" msgstr "关闭" @@ -497,17 +496,17 @@ msgstr "" msgid "Cloudflare DNS (1.1.1.1)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:413 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:447 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:477 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:512 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:21 msgid "Collecting data..." msgstr "正在收集数据中..." -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:400 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:464 msgid "Component" msgstr "组件" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:643 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:652 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:5 msgid "Component Update" msgstr "组件升级" @@ -532,16 +531,16 @@ msgstr "连接正常" msgid "Connection Timeout" msgstr "连接超时" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1517 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1518 msgid "" "Controls the policy used when performing DNS queries for ECH configuration." msgstr "控制使用 DNS 查询 ECH 配置时的策略。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:560 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:561 msgid "Convert Address" msgstr "转换订阅模板API服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:555 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:556 msgid "" "Convert subscriptions to Clash/Mihomo YAML with a subscription template URL." msgstr "使用订阅转换模板 URL 将订阅转换为 Clash/Mihomo YAML。" @@ -550,12 +549,12 @@ msgstr "使用订阅转换模板 URL 将订阅转换为 Clash/Mihomo YAML。" msgid "Copy SSR to clipboard successfully." msgstr "成功复制 SSR 网址到剪贴板。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:379 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:443 msgid "Core Components" msgstr "核心组件" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:24 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:439 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:503 msgid "Country MMDB" msgstr "Country MMDB" @@ -563,19 +562,19 @@ msgstr "Country MMDB" msgid "Create Backup File" msgstr "创建备份文件" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1756 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1757 msgid "Create upload file error." msgstr "创建上传文件错误。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:120 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 msgid "Current ARCH" msgstr "当前架构" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1776 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1777 msgid "Current Certificate Path" msgstr "当前证书路径" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:229 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:270 msgid "Current Version" msgstr "当前版本" @@ -583,8 +582,8 @@ msgstr "当前版本" msgid "Custom" msgstr "自定义" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:991 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:992 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1073 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1074 msgid "Custom Client Proxies Rules" msgstr "自定义客户端代理规则" @@ -616,11 +615,11 @@ msgstr "自定义端口" msgid "Custom YAML imported successfully: %s" msgstr "自定义 YAML 导入成功:%s" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:708 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784 msgid "Custom client proxy rules saved and applied." msgstr "自定义客户端代理规则已保存并生效。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:708 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:784 msgid "Custom client proxy rules saved." msgstr "自定义客户端代理规则已保存。" @@ -651,7 +650,7 @@ msgstr "" msgid "DTLS 1.2" msgstr "DTLS 1.2 数据包" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:435 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:499 msgid "Database" msgstr "数据库" @@ -664,9 +663,9 @@ msgid "Decryption" msgstr "解密" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1364 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1554 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1566 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1580 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1555 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1567 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1581 msgid "Default" msgstr "默认" @@ -674,7 +673,7 @@ msgstr "默认" msgid "Default Node Local Port" msgstr "节点默认本地端口" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1669 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1670 msgid "Default reject rejects traffic." msgstr "默认 reject 拒绝流量。" @@ -682,13 +681,13 @@ msgstr "默认 reject 拒绝流量。" msgid "Default value 0 indicatesno heartbeat." msgstr "默认为 0 表示无心跳。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644 msgid "" "Default: disable. When entering a negative number, such as -1, The Mux " "module will not be used to carry TCP traffic." msgstr "默认:禁用。填负数时,如 -1,不使用 Mux 模块承载 TCP 流量。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1656 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1657 msgid "" "Default:16. When entering a negative number, such as -1, The Mux module will " "not be used to carry UDP traffic, Use original UDP transmission method of " @@ -697,17 +696,17 @@ msgstr "" "默认值:16。填负数时,如 -1,不使用 Mux 模块承载 UDP 流量。将使用代理协议原本" "的 UDP 传输方式。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:297 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41 msgid "Defaults Cleared!" msgstr "已清空默认状态!" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:297 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:373 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:41 msgid "Defaults Restored!" msgstr "默认值已恢复!" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1027 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1110 msgid "" "Define per-client Mihomo proxy targets. Rules are injected as SRC-IP-CIDR " "entries before the original Clash rules." @@ -719,10 +718,10 @@ msgstr "" msgid "Delay (ms)" msgstr "延迟(ms)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:589 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:248 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:166 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:298 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:665 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:319 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:196 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:328 msgid "Delete" msgstr "删除" @@ -730,7 +729,7 @@ msgstr "删除" msgid "Delete All Subscribe Servers" msgstr "删除所有订阅节点" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:130 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:160 msgid "Delete failed:" msgstr "删除失败:" @@ -765,7 +764,7 @@ msgstr "关闭 SNI 服务器名称指示" msgid "Disable TCP No_delay" msgstr "禁用 TCP 无延迟" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:552 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:553 msgid "Disabled means use Xray or ShadowSocks-Rust core." msgstr "禁用则使用 Xray 或 ShadowSocks-Rust 核心。" @@ -797,11 +796,11 @@ msgstr "国内 DNS 服务器" msgid "Downlink Capacity(Default:Mbps)" msgstr "下行链路容量(默认:Mbps)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:387 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:451 msgid "Download Source" msgstr "下载源" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:47 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:52 msgid "Download failed" msgstr "下载失败" @@ -809,11 +808,11 @@ msgstr "下载失败" msgid "Dual-stack Listening Socket" msgstr "双栈 Socket 监听" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1502 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1503 msgid "ECH Config" msgstr "ECH 配置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1516 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1517 msgid "ECH Query Policy" msgstr "ECH 查询策略" @@ -821,8 +820,8 @@ msgstr "ECH 查询策略" msgid "Early Data Header Name" msgstr "前置数据标头" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:240 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:246 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:311 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:317 msgid "Edit" msgstr "编辑" @@ -836,9 +835,9 @@ msgstr "编辑服务器配置" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:323 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:588 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1031 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:154 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:589 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1114 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:184 msgid "Enable" msgstr "启用" @@ -851,11 +850,11 @@ msgid "Enable Authentication" msgstr "启用用户名/密码认证" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1793 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1794 msgid "Enable Auto Switch" msgstr "启用自动切换" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1486 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1487 msgid "Enable ECH(optional)" msgstr "启用 ECH (可选)" @@ -863,21 +862,21 @@ msgstr "启用 ECH (可选)" msgid "Enable Lazy Mode" msgstr "启用懒狗模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1524 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1525 msgid "Enable ML-DSA-65(optional)" msgstr "启用 ML-DSA-65 (可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:549 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:550 msgid "Enable Mihomo core" msgstr "启用 Mihomo 核心" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1687 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1688 msgid "" "Enable Multipath TCP, need to be enabled in both server and client " "configuration." msgstr "启用 Multipath TCP,需在服务端和客户端配置中同时启用。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1623 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1624 msgid "Enable Mux.Cool" msgstr "启用 Mux.Cool" @@ -930,7 +929,7 @@ msgid "Enabled Mixed" msgstr "启用 Mixed" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:825 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1782 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1783 msgid "Enabling TCP Fast Open Requires Server Support." msgstr "启用 TCP 快速打开需要服务端支持。" @@ -951,7 +950,7 @@ msgid "Enter Custom Ports" msgstr "输入自定义端口" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:17 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:54 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:57 msgid "Error" msgstr "错误" @@ -995,23 +994,23 @@ msgstr "示例:" msgid "Expecting: %s" msgstr "应为:%s" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1019 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1102 msgid "Export Client Rules" msgstr "批量导出客户端规则" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:48 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:53 msgid "Extract failed" msgstr "解压失败" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1726 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1727 msgid "FORCE BRUTAL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:967 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1048 msgid "Failed to clear all client proxy rules." msgstr "清空所有客户端代理规则失败。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:46 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:51 msgid "Failed to create temp directory" msgstr "创建临时目录失败" @@ -1019,34 +1018,34 @@ msgstr "创建临时目录失败" msgid "Failed to create temporary YAML upload file." msgstr "创建临时 YAML 上传文件失败。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:41 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:84 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:46 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:89 msgid "Failed to fetch release metadata" msgstr "获取发布信息失败" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:106 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:112 msgid "Failed to query component information." msgstr "获取组件信息失败。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:220 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:261 msgid "Failed to query geo database information." msgstr "获取 Geo 数据库信息失败。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:710 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:786 msgid "Failed to save custom client proxy rules." msgstr "保存自定义客户端代理规则失败。" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:21 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:58 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:61 msgid "Fetch Failed" msgstr "获取失败" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1607 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1614 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1608 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1615 msgid "Fetch Manually" msgstr "手动获取" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:229 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:270 msgid "File Not Exist" msgstr "文件不存在" @@ -1139,21 +1138,16 @@ msgstr "Gecko 包大小(最大)" msgid "Gecko Packet Size (min)" msgstr "Gecko 包大小(最小)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:427 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:491 msgid "Geo Database Update" msgstr "Geo 数据库更新" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:436 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:500 msgid "Geo Resource" msgstr "Geo 资源" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:28 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:440 -msgid "GeoSite Database" -msgstr "GeoSite 数据库" - #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/component.lua:14 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:391 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:455 msgid "GitHub Direct" msgstr "GitHub 直连" @@ -1286,7 +1280,7 @@ msgstr "HTTPUpgrade 主机名" msgid "Httpupgrade Path" msgstr "HTTPUpgrade 路径" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:419 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:420 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:456 msgid "Hysteria2" msgstr "" @@ -1303,7 +1297,7 @@ msgstr "QUIC 参数" msgid "IP Route Mode" msgstr "绕过中国大陆 IP 模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1578 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1579 msgid "IP Stack Preference" msgstr "IP 栈优先级" @@ -1311,7 +1305,7 @@ msgstr "IP 栈优先级" msgid "If empty, Not change Apple domains parsing DNS (Default is empty)" msgstr "如果为空,则不更改 Apple 域名解析 DNS(默认为空)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1504 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1505 msgid "" "If it is not empty, it indicates that the Client has enabled Encrypted " "Client, see:" @@ -1321,14 +1315,14 @@ msgstr "如果不为空,表示客户端已启用加密客户端,具体请参 msgid "If this option is not set, the socket behavior is platform dependent." msgstr "如果未设置此选项,则 Socket 行为依赖于平台。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1591 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1592 msgid "" "If true, allowss insecure connection at TLS client, e.g., TLS server uses " "unverifiable certificates." msgstr "" "是否允许不安全连接。当选择时,将不会检查远端主机所提供的 TLS 证书的有效性。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1740 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1741 msgid "If you have a self-signed certificate,please check the box" msgstr "如果你使用自签证书,请选择" @@ -1336,7 +1330,7 @@ msgstr "如果你使用自签证书,请选择" msgid "Import" msgstr "导入配置信息" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1020 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1103 msgid "Import Client Rules" msgstr "批量导入客户端规则" @@ -1357,19 +1351,23 @@ msgstr "导入配置信息成功。" msgid "Initial Windows Size" msgstr "初始窗口大小" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:52 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:57 msgid "Install failed" msgstr "安装失败" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:115 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273 +msgid "Installed" +msgstr "已安装" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 msgid "Installed Version" msgstr "已安装版本" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:53 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:58 msgid "Installed binary failed to run" msgstr "新安装的二进制无法运行" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:55 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:60 msgid "Installed package check failed" msgstr "安装后软件包检查失败" @@ -1381,7 +1379,7 @@ msgstr "接口" msgid "Interface control" msgstr "接口控制" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:293 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:352 msgid "Invalid" msgstr "无效的" @@ -1429,19 +1427,19 @@ msgstr "KCP 写缓冲区大小" msgid "KcpTun" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1798 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1799 msgid "KcpTun Enable" msgstr "KcpTun 启用" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1818 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1819 msgid "KcpTun Param" msgstr "KcpTun 参数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1812 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1813 msgid "KcpTun Password" msgstr "KcpTun 密码" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1805 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1806 msgid "KcpTun Port" msgstr "KcpTun 端口" @@ -1469,7 +1467,8 @@ msgstr "内网主机列表" msgid "LAN IP AC" msgstr "LAN IP 访问控制" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:116 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:122 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:271 msgid "Latest Version" msgstr "最新版本" @@ -1528,8 +1527,8 @@ msgstr "Linux 内核 TUN 虚拟网卡需要系统支持和 root 权限。" msgid "Listen only on the given interface or, if unspecified, on all" msgstr "仅监听指定的接口,未指定则监听全部。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:718 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:771 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:794 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:847 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:84 msgid "Loading..." msgstr "加载中..." @@ -1547,7 +1546,7 @@ msgstr "本机服务端" msgid "Local addresses" msgstr "本地地址" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:656 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:666 msgid "Log" msgstr "日志" @@ -1563,11 +1562,11 @@ msgstr "" msgid "Loyalsoldier/v2ray-rules-dat" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1529 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1530 msgid "ML-DSA-65 Public key" msgstr "ML-DSA-65 公钥" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1687 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1688 msgid "MPTCP" msgstr "" @@ -1579,7 +1578,7 @@ msgstr "最大传输单元" msgid "Main Server" msgstr "主服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:586 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:587 msgid "" "Manage multiple subscribe URLs, including Clash subscriptions. Only enabled " "entries are included when updating all subscriptions." @@ -1587,8 +1586,8 @@ msgstr "" "管理多条订阅 URL,包括 Clash 订阅。只有启用的订阅项才会参与“更新所有订阅节" "点”。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:42 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:85 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:47 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:90 msgid "Matching release asset not found" msgstr "未找到匹配的发布资产" @@ -1604,18 +1603,18 @@ msgstr "最大分片数" msgid "Maximum packet size the socks5 server can receive from external" msgstr "socks5 服务器可以从外部接收的最大数据包大小(单位:字节)" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:375 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:378 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:381 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:387 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:403 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:376 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:379 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:382 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:388 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:404 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:13 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:406 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:470 msgid "Mihomo" msgstr "Mihomo" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1005 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1006 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1087 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1088 msgid "Mihomo Pannel" msgstr "Mihomo 面板" @@ -1623,7 +1622,7 @@ msgstr "Mihomo 面板" msgid "Min" msgstr "分" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1657 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1658 msgid "" "Min value is 1, Max value is 1024. When omitted or set to 0, Will same path " "as TCP traffic." @@ -1631,7 +1630,7 @@ msgstr "" "最小值 1,最大值 1024。 省略或者填 0 时,将与 TCP 流量走同一条路,也就是传统" "的行为。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1645 msgid "" "Min value is 1, Max value is 128. When omitted or set to 0, it equals 8." msgstr "最小值 1,最大值 128。省略或者填 0 时都等于 8。" @@ -1640,15 +1639,15 @@ msgstr "最小值 1,最大值 128。省略或者填 0 时都等于 8。" msgid "Mirror URL" msgstr "镜像地址" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:44 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:49 msgid "Missing gzip support" msgstr "缺少 gzip 支持" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:43 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:48 msgid "Missing unzip support" msgstr "缺少 unzip 支持" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:45 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:50 msgid "Missing xz support" msgstr "缺少 xz 支持" @@ -1681,7 +1680,7 @@ msgstr "多线程并发转发" msgid "Must be JSON text!" msgstr "必须是 JSON 文本内容!" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1623 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1624 msgid "Mux" msgstr "" @@ -1693,10 +1692,10 @@ msgstr "" msgid "NOT RUNNING" msgstr "未运行" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:413 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:414 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:387 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:17 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:407 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:471 msgid "NaiveProxy" msgstr "" @@ -1716,10 +1715,15 @@ msgstr "" msgid "Next" msgstr "下一页" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273 +msgid "No" +msgstr "否" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:252 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:256 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:285 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:132 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:283 msgid "No Check" msgstr "未检查" @@ -1743,7 +1747,7 @@ msgstr "没有可用的核心(Shadowsocks, Mihomo 或 Xray)可以导入此 msgid "No custom YAML file was selected." msgstr "没有选择自定义 YAML 文件。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:474 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:550 msgid "No custom client proxy rules yet." msgstr "暂无自定义客户端代理规则。" @@ -1751,20 +1755,20 @@ msgstr "暂无自定义客户端代理规则。" msgid "No new data!" msgstr "你已经是最新数据,无需更新!" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1772 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1773 msgid "No specify upload file." msgstr "没有上传证书。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:94 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:124 msgid "No subscription items found" msgstr "没有找到任何订阅项" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:615 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:691 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:32 msgid "No switchable proxy groups found." msgstr "未找到可切换的代理组。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:610 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:611 msgid "" "Node order can be dragged with the mouse and takes effect immediately. The " "automatic switch order of server nodes is consistent with the node order in " @@ -1781,8 +1785,8 @@ msgstr "噪声" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1258 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1270 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1280 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:705 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:710 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:706 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:711 msgid "None" msgstr "" @@ -1800,7 +1804,7 @@ msgstr "未运行" msgid "Not exist" msgstr "未安装可执行文件" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:115 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 msgid "Not installed" msgstr "未安装" @@ -1822,7 +1826,7 @@ msgid "" "saperate with ','." msgstr "注意:当版本高于 26.6.1 时,可以输入多个分片长度,并用英文 ',' 分隔。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1698 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1699 msgid "Number of early established connections to reduce latency." msgstr "预连接的数量,用于降低延迟。" @@ -1850,7 +1854,7 @@ msgstr "混淆密码" msgid "Obfuscation Type" msgstr "混淆类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1606 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1607 msgid "Once set, connects only when the server’s chain fingerprint matches." msgstr "设置后,仅在服务器证书链指纹匹配时连接。" @@ -1874,6 +1878,11 @@ msgstr "仅当 Socks5 认证方式为 Password 时有效,必填。" msgid "Only when Socks5 Auth Mode is password valid, Not mandatory." msgstr "仅当 Socks5 认证方式为 Password 时有效,非必填。" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:28 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:504 +msgid "OpenClash GeoSite Database" +msgstr "OpenClash GeoSite 数据库" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:154 msgid "OpenDNS" msgstr "" @@ -1888,11 +1897,11 @@ msgstr "" msgid "OpenDNS (208.67.222.222)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:118 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:124 msgid "Package Manager" msgstr "包管理器" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:401 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:465 msgid "Package Name" msgstr "组件包名称" @@ -1935,11 +1944,11 @@ msgstr "执行重置" msgid "Permit Without Stream" msgstr "允许无数据流" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:753 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:754 msgid "Ping Latency" msgstr "Ping 延迟" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1779 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1780 msgid "Please confirm the current certificate path" msgstr "请选择确认所传证书,证书不正确将无法运行" @@ -1955,7 +1964,7 @@ msgstr "请填写 Clash 订阅 URL 或本地 YAML 路径中的至少一项。" msgid "Plugin Opts" msgstr "插件参数" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1033 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1116 msgid "Policy" msgstr "策略" @@ -1967,7 +1976,7 @@ msgstr "端口跳跃间隔(单位:秒)" msgid "Port hopping range" msgstr "端口跳跃范围" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1698 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1699 msgid "Pre-connections" msgstr "预连接" @@ -1991,8 +2000,8 @@ msgstr "私钥文件路径" msgid "Private key" msgstr "私钥" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:160 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:264 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:166 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:319 msgid "Processing..." msgstr "处理中..." @@ -2048,6 +2057,10 @@ msgstr "QUIC 最长空闲超时时间(单位:秒)" msgid "QUIC maxStreamReceiveWindow" msgstr "QUIC 最大的流接收窗口大小" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:23 +msgid "QUIC protocols such as HY2 also require curl with http3 support." +msgstr "HY2 等 QUIC 协议还需要 curl 支持 http3。" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1439 msgid "REALITY" msgstr "" @@ -2056,24 +2069,24 @@ msgstr "" msgid "RST Backup" msgstr "恢复备份" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:441 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:442 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:7 msgid "RUNNING" msgstr "运行中" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:434 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:435 msgid "RUNNING in %s (%s) Mode" msgstr "运行中,当前为 %s(%s)模式" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:438 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:439 msgid "RUNNING in %s Mode" msgstr "运行中,当前为 %s 模式" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:604 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:752 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:802 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:680 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:828 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:878 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:93 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:238 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:291 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:253 msgid "Ready." msgstr "就绪。" @@ -2090,8 +2103,8 @@ msgstr "" msgid "Realm URL" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:772 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:272 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:773 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17 msgid "Reapply" msgstr "重新应用" @@ -2132,7 +2145,7 @@ msgstr "定时更新(小时)" msgid "Regular update (Min)" msgstr "定时更新(分钟)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:127 msgid "Release Asset" msgstr "发布包名" @@ -2141,19 +2154,19 @@ msgstr "发布包名" msgid "Reload YAML" msgstr "重载 YAML" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:265 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:341 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:10 msgid "Reloading YAML..." msgstr "正在重载 YAML..." #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:135 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:136 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1034 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1117 msgid "Remarks" msgstr "备注" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1711 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1727 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1712 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1728 msgid "Reno" msgstr "Reno" @@ -2161,18 +2174,22 @@ msgstr "Reno" msgid "Required for VMess/VLESS. Generate with: uuidgen" msgstr "VMess/VLESS 协议必需,可使用:uuidgen 命令生成。" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:22 +msgid "Requires OpenSSL to retrieve the TLS certificate chain fingerprint." +msgstr "获取 TLS 证书链指纹需要 OpenSSL 支持。" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1335 msgid "Reserved bytes(optional)" msgstr "保留字节(可选)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:998 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:999 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1080 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1081 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:62 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:63 msgid "Reset Default Proxies Rules" msgstr "重置代理分组规则" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:300 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:376 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:44 msgid "Reset Defaults Failed!" msgstr "重置默认值失败!" @@ -2182,7 +2199,7 @@ msgstr "重置默认值失败!" msgid "Reset complete" msgstr "重置完成" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:286 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:362 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:30 msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?" msgstr "要清空已保存的 Mihomo 分组选择,并恢复为 YAML 默认值吗?" @@ -2191,7 +2208,7 @@ msgstr "要清空已保存的 Mihomo 分组选择,并恢复为 YAML 默认值 msgid "Reset to defaults" msgstr "恢复出厂设置" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:290 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:366 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:34 msgid "Resetting Defaults..." msgstr "正在重置默认值..." @@ -2231,7 +2248,7 @@ msgstr "运行中" msgid "Running Mode" msgstr "运行模式" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:415 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:416 msgid "SOCKS5" msgstr "SOCKS5" @@ -2239,24 +2256,24 @@ msgstr "SOCKS5" msgid "SS URL base64 sstr format not recognized." msgstr "无法识别 SS URL 的 Base64 格式。" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:638 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:647 msgid "SSR Client" msgstr "客户端" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:5 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:404 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:468 msgid "SSR Plus+ Main Program" msgstr "SSR Plus+ 主程序" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:642 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:651 msgid "SSR Server" msgstr "服务端" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1023 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:165 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:297 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:322 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:323 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:1106 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:195 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:327 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:352 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:353 msgid "Save" msgstr "保存" @@ -2273,21 +2290,21 @@ msgstr "" msgid "Save current subscribe settings" msgstr "保存当前订阅设置" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:82 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:105 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:112 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:135 msgid "Save failed:" msgstr "保存失败:" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:687 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:51 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:763 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:81 msgid "Saving..." msgstr "保存中..." -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:77 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:105 msgid "Second" msgstr "周期" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1732 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1733 msgid "Self-signed Certificate" msgstr "自签证书" @@ -2326,7 +2343,7 @@ msgstr "服务端类型" msgid "Server failsafe auto swith and custom update settings" msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:639 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:648 msgid "Servers Nodes" msgstr "服务器节点" @@ -2347,15 +2364,15 @@ msgstr "" msgid "Shadow-TLS ChainPoxy type" msgstr "代理链类型" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:376 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:377 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:381 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:451 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:61 msgid "ShadowSocks" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:388 -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:390 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:389 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:391 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:384 msgid "ShadowSocks-Rust" msgstr "" @@ -2364,7 +2381,7 @@ msgstr "" msgid "ShadowSocks-rust Version" msgstr "ShadowSocks-rust 版本" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:635 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:644 msgid "ShadowSocksR Plus+" msgstr "" @@ -2372,7 +2389,7 @@ msgstr "" msgid "ShadowSocksR Plus+ Settings" msgstr "ShadowSocksR Plus+ 设置" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:417 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:418 msgid "ShadowTLS" msgstr "ShadowTLS" @@ -2381,7 +2398,7 @@ msgstr "ShadowTLS" msgid "Shadowsocks Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:384 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:385 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:378 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:64 msgid "ShadowsocksR" @@ -2415,7 +2432,7 @@ msgstr "" msgid "Snell Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:713 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:714 msgid "Socket Connected" msgstr "连接测试" @@ -2448,7 +2465,7 @@ msgstr "Socks5 密码" msgid "Socks5 User" msgstr "Socks5 用户名" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:73 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:129 msgid "Start Detection" msgstr "开始探测" @@ -2456,18 +2473,21 @@ msgstr "开始探测" msgid "Starting subscription update..." msgstr "正在开始更新订阅..." -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:644 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:124 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:128 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:653 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:130 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:234 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:236 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:238 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:132 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:134 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:136 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:281 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:283 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:285 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:287 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:289 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:291 msgid "Status" msgstr "状态" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:74 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:130 msgid "Stop Detection" msgstr "停止探测" @@ -2475,7 +2495,7 @@ msgstr "停止探测" msgid "Subscribe Advanced Settings" msgstr "订阅高级设置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:554 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:555 msgid "Subscribe Convert Online" msgstr "在线订阅转换" @@ -2495,13 +2515,13 @@ msgstr "订阅日志" msgid "Subscribe Save Words" msgstr "订阅节点关键字保留检查" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:568 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:569 msgid "Subscribe Template URL" msgstr "订阅转换模板 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:579 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:603 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:159 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:580 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:604 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:189 msgid "Subscribe URL" msgstr "订阅 URL (支持SS/SSR/V2/TROJAN/HY2/TUIC/CLASH等)" @@ -2517,11 +2537,11 @@ msgstr "订阅加入的新节点默认开启自动切换" msgid "Subscribe nodes allows insecure connection as TLS client (insecure)" msgstr "订阅节点强制开启 不验证TLS客户端证书 (insecure)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:33 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:36 msgid "Successfully retrieved certificate fingerprint:" msgstr "已成功获取证书指纹:" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:70 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_header.htm:73 msgid "Successfully retrieved certificate name:" msgstr "已成功获取证书名称:" @@ -2545,17 +2565,17 @@ msgstr "" msgid "Switch check cycly(second)" msgstr "自动切换检查周期(秒)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:654 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:730 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:71 msgid "Switch failed." msgstr "切换失败。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:651 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:727 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:68 msgid "Switched successfully." msgstr "切换成功。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:644 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:720 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:61 msgid "Switching..." msgstr "正在切换..." @@ -2565,7 +2585,7 @@ msgid "TCP Camouflage Type" msgstr "TCP 伪装类型" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:825 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1782 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1783 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:128 msgid "TCP Fast Open" msgstr "TCP 快速打开" @@ -2589,32 +2609,32 @@ msgstr "" msgid "TLS 1.3 Strict mode" msgstr "TLS 1.3 限定模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1552 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1553 msgid "TLS ALPN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1610 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1611 msgid "TLS Certificate Name (CertName)" msgstr "TLS 证书名称(CertName)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1603 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1604 msgid "TLS Chain Fingerprint (SHA256)" msgstr "TLS 证书链指纹(SHA256)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1544 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1545 msgid "TLS Host" msgstr "TLS 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1613 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1614 msgid "TLS is used to verify the leaf certificate name." msgstr "TLS 用于验证 leaf 证书的 name。" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:382 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:383 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:393 msgid "TUIC" msgstr "TUIC" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1564 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1565 msgid "TUIC ALPN" msgstr "" @@ -2638,7 +2658,7 @@ msgstr "接收窗口(无需确认即可接收的最大字节数:默认8Mb) msgid "TUIC send window" msgstr "发送窗口(无需确认即可发送的最大字节数:默认8Mb*2)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1532 msgid "" "The client has not configured mldsa65Verify, but it will not perform the " "\"additional verification\" step and can still connect normally, see:" @@ -2689,8 +2709,8 @@ msgstr "" "在线升级会跟踪最新 NaiveProxy 发布版,并优先选择与当前架构匹配的 OpenWrt " "static 压缩包,找不到时再回退到其他发布资产。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:740 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:795 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:816 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:871 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel.htm:89 msgid "This Clash total node is not active. Apply this node first." msgstr "该 Clash 总节点当前未启用,请先应用该节点。" @@ -2700,9 +2720,9 @@ msgid "" "This panel is available only when the current Clash total node is active." msgstr "该面板仅在当前 Clash 总节点已启用时可用。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:272 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:126 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:314 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_table.htm:331 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:156 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:344 msgid "This section contains no values yet" msgstr "该部分目前无任何内容。" @@ -2714,7 +2734,7 @@ msgstr "通过代理更新" msgid "Through proxy update list, Not Recommended" msgstr "通过路由器自身代理更新订阅" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:78 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:106 msgid "Timeout" msgstr "超时" @@ -2740,7 +2760,7 @@ msgstr "传输协议" msgid "Transport Protocol" msgstr "传输协议" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:411 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:412 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450 msgid "Trojan" msgstr "Trojan" @@ -2749,12 +2769,12 @@ msgstr "Trojan" msgid "Trojan Password" msgstr "Trojan 密码" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:79 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/advanced_switch_compact.htm:107 msgid "Try Count" msgstr "重试次数" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:327 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:702 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:703 msgid "Type" msgstr "类型" @@ -2802,37 +2822,38 @@ msgstr "无法复制 SSR 网址到剪贴板。" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:32 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:42 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:116 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:120 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:121 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:236 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:122 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:126 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:127 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:271 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:289 msgid "Unknown" msgstr "未知" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:87 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:82 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:130 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:252 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:92 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:112 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:160 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:282 msgid "Unknown error" msgstr "未知错误" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:40 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:82 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:45 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:87 msgid "Unsupported ARCH" msgstr "不支持当前架构" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:86 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:91 msgid "Unsupported component" msgstr "不支持的组件" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:54 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:83 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:59 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:88 msgid "Unsupported package manager" msgstr "不支持的包管理器" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:167 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:302 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:303 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:197 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:332 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:333 msgid "Update" msgstr "更新" @@ -2852,39 +2873,46 @@ msgstr "更新模式" msgid "Update cycle (Day/Week)" msgstr "更新周期(天/周)" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:33 -msgid "" -"Update geoip.dat and geosite.dat used by Xray/V2Ray runtime when available." -msgstr "更新 Xray/V2Ray 运行时可用的 geoip.dat 和 geosite.dat 数据库。" - #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:25 msgid "" -"Update the Country.mmdb database used by Mihomo/Clash runtime when available." -msgstr "更新 Mihomo/Clash 运行时可用的 Country.mmdb 数据库。" +"Update the Country.mmdb database used by Xray/V2Ray runtime when available." +msgstr "更新 Xray/V2Ray 运行时可用的 Country.mmdb 数据库。" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:29 msgid "" "Update the GeoSite.dat database used by Mihomo/Clash runtime when available." msgstr "更新 Mihomo/Clash 运行时可用的 GeoSite.dat 数据库。" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:31 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:34 +msgid "Update the geoip.dat used by Xray/V2Ray runtime when available." +msgstr "更新 Xray/V2Ray 运行时可用的 geoip.dat 数据库。" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:38 +msgid "Update the geosite.dat used by Xray/V2Ray runtime when available." +msgstr "更新 Xray/V2Ray 运行时可用的 geosite.dat 数据库。" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe_actions_footer.htm:61 msgid "Updating..." msgstr "更新中..." -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:167 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:417 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:173 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:326 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:481 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:516 msgid "Upgrade" msgstr "升级" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:128 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:134 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:285 msgid "Upgrade available" msgstr "发现可升级版本" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:39 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:44 msgid "Upgrade completed" msgstr "升级完成" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:156 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:162 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:315 msgid "Upgrading..." msgstr "升级中..." @@ -2892,17 +2920,17 @@ msgstr "升级中..." msgid "Uplink Capacity(Default:Mbps)" msgstr "上行链路容量(默认:Mbps)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1742 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1743 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm:3 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_yaml_upload.htm:3 msgid "Upload" msgstr "上传" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:545 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:546 msgid "Upload Custom YAML File" msgstr "上传自定义 YAML 文件" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:547 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:548 msgid "" "Upload a custom Clash/Mihomo YAML file. The file will be preprocessed and " "saved as a local Clash node." @@ -2954,7 +2982,7 @@ msgid "User cancelled." msgstr "用户已取消。" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1362 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:535 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:536 msgid "User-Agent" msgstr "用户代理(User-Agent)" @@ -2977,10 +3005,15 @@ msgstr "用户验证" msgid "Using incorrect encryption mothod may causes service fail to start" msgstr "输入不正确的参数组合可能会导致服务无法启动" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:32 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:441 -msgid "V2Ray GEO Databases" -msgstr "V2Ray GEO 数据库" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:33 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:505 +msgid "V2Ray GeoIP Databases" +msgstr "V2Ray GeoIP 数据库" + +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:37 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:506 +msgid "V2Ray GeoSite Databases" +msgstr "V2Ray GeoSite 数据库" #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:375 msgid "V2Ray/XRay" @@ -3090,7 +3123,7 @@ msgstr "XHTTP 路径" msgid "XTLS" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:405 +#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:406 msgid "Xray" msgstr "Xray" @@ -3103,20 +3136,24 @@ msgid "Xray Noise Packets" msgstr "Xray 噪声数据包" #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:9 -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:405 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:469 msgid "Xray-core" msgstr "Xray-core" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:275 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:351 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:20 msgid "YAML Reload Failed!" msgstr "YAML 重载失败!" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:272 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_main_panel.htm:348 #: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/clash_panel_button.htm:17 msgid "YAML Reloaded!" msgstr "YAML 已重载!" +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:273 +msgid "Yes" +msgstr "是" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 msgid "adblock_url" msgstr "广告屏蔽更新 URL" @@ -3125,15 +3162,15 @@ msgstr "广告屏蔽更新 URL" msgid "aes-128-gcm" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1676 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1677 msgid "allow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1670 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1671 msgid "allow: Allows use Mux connection." msgstr "allow:允许走 Mux 连接。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1586 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1587 msgid "allowInsecure" msgstr "允许不安全连接" @@ -3162,12 +3199,12 @@ msgstr "" msgid "chrome" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1707 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1723 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1708 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1724 msgid "comment_tcpcongestion_disable" msgstr "系统默认值" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1640 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1641 msgid "concurrency" msgstr "TCP 最大并发连接数" @@ -3175,14 +3212,14 @@ msgstr "TCP 最大并发连接数" msgid "curl" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1704 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1720 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1705 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1721 msgid "custom_tcpcongestion" msgstr "连接服务器节点的 TCP 拥塞控制算法" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1482 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1648 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1661 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1483 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1649 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1662 msgid "disable" msgstr "禁用" @@ -3252,11 +3289,11 @@ msgstr "使用 QUIC 流的无损 UDP 中继" msgid "mKCP Camouflage Type" msgstr "mKCP 伪装(混淆)类型" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:50 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:55 msgid "mihomo binary not found in archive" msgstr "压缩包中未找到 mihomo 二进制文件" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:51 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:56 msgid "naive binary not found in archive" msgstr "压缩包中未找到 naive 二进制文件" @@ -3285,7 +3322,7 @@ msgstr "" msgid "randomized" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1675 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1676 msgid "reject" msgstr "" @@ -3306,11 +3343,11 @@ msgstr "服务器名称指示" msgid "shadowTLS protocol Version" msgstr "ShadowTLS 协议版本" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1677 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1678 msgid "skip" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1671 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1672 msgid "" "skip: Not use Mux module to carry UDP 443 traffic, Use original UDP " "transmission method of proxy protocol." @@ -3321,6 +3358,10 @@ msgstr "" msgid "spiderX" msgstr "" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1482 +msgid "unsafe" +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 msgid "v2fly/domain-list-community" msgstr "" @@ -3337,7 +3378,7 @@ msgstr "有效的地址:端口" msgid "warning! Please do not reuse the port!" msgstr "警告!请不要重复使用端口!" -#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:49 +#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/component.htm:54 msgid "xray binary not found in archive" msgstr "压缩包中未找到 xray 二进制文件" @@ -3345,14 +3386,23 @@ msgstr "压缩包中未找到 xray 二进制文件" msgid "xray-plugin" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1653 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1654 msgid "xudpConcurrency" msgstr "UDP 最大并发连接数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1666 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1667 msgid "xudpProxyUDP443" msgstr "对被代理的 UDP/443 流量处理方式" +#~ msgid "CHECK AND UPDATE" +#~ msgstr "检查并更新" + +#~ msgid "GeoSite Database" +#~ msgstr "GeoSite 数据库" + +#~ msgid "V2Ray GEO Databases" +#~ msgstr "V2Ray GEO 数据库" + #~ msgid "Shadowsocks password" #~ msgstr "shadowsocks密码" diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/update_components.sh b/luci-app-ssr-plus/root/usr/share/shadowsocksr/update_components.sh index c1f75c5f..aac9979e 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/update_components.sh +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/update_components.sh @@ -9,15 +9,20 @@ HELLOWORLD_RELEASE_API="https://api.github.com/repos/fw876/helloworld/releases/l XRAY_BINARY="/usr/bin/xray" MIHOMO_BINARY="/usr/bin/mihomo" NAIVEPROXY_BINARY="/usr/bin/naive" -COUNTRY_MMDB_URL="https://testingcf.jsdelivr.net/gh/alecthw/mmdb_china_ip_list@release/lite/Country.mmdb" -GEOSITE_URL="https://testingcf.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat" -GEOIP_DAT_URL="https://testingcf.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat" + +# Geo 数据文件 URL +GEOIP_REPO="Loyalsoldier/geoip" +GEOSITE_REPO="Loyalsoldier/v2ray-rules-dat" +COUNTRY_MMDB_REPO="alecthw/mmdb_china_ip_list" + +# Geo 数据文件路径 COUNTRY_MMDB_FILE="/usr/share/shadowsocksr/Country.mmdb" GEOIP_DAT_FILE="/usr/share/v2ray/geoip.dat" GEOSITE_DAT_FILE="/usr/share/v2ray/geosite.dat" OPENCLASH_GEOSITE_FILE="/etc/openclash/GeoSite.dat" -OPENCLASH_GEOIP_DAT_FILE="/etc/openclash/geoip.dat" -OPENCLASH_GEOSITE_DAT_FILE="/etc/openclash/geosite.dat" + +# geo 版本存储 +GEO_VERSION_FILE="/tmp/ssrplus-geo/geo_versions.json" log_kv() { key="$1" @@ -28,44 +33,10 @@ log_kv() { file_mtime() { local path="$1" [ -f "$path" ] || { - printf '%s' 'File Not Exist' + printf '%s' '' return 0 } - date -r "$path" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || printf '%s' 'Unknown' -} - -file_size() { - local path="$1" - [ -f "$path" ] || { - printf '%s' '0' - return 0 - } - wc -c < "$path" 2>/dev/null | tr -d '[:space:]' -} - -resolve_existing_geo_file() { - local primary="$1" - local fallback="$2" - - if [ -f "$primary" ]; then - printf '%s' "$primary" - elif [ -n "$fallback" ] && [ -f "$fallback" ]; then - printf '%s' "$fallback" - else - printf '%s' "$primary" - fi -} - -resolve_geosite_file() { - resolve_existing_geo_file "$GEOSITE_DAT_FILE" "$OPENCLASH_GEOSITE_FILE" -} - -resolve_v2ray_geoip_file() { - resolve_existing_geo_file "$GEOIP_DAT_FILE" "$OPENCLASH_GEOIP_DAT_FILE" -} - -resolve_v2ray_geosite_file() { - resolve_existing_geo_file "$GEOSITE_DAT_FILE" "$OPENCLASH_GEOSITE_DAT_FILE" + date -r "$path" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || printf '%s' '' } trim_version() { @@ -106,6 +77,15 @@ mirror_wrap_url() { https://github.com/MetaCubeX/mihomo/releases/download/*) printf '%s' "$raw_url" | sed 's#https://github.com/MetaCubeX/mihomo/releases/download/\(v[^/]*\)/\(.*\)#https://fastly.jsdelivr.net/gh/MetaCubeX/mihomo@\1/\2#' ;; + https://github.com/Loyalsoldier/geoip/releases/download/*) + printf '%s' "$raw_url" | sed 's#https://github.com/Loyalsoldier/geoip/releases/download/\([^/]*\)/\(.*\)#https://testingcf.jsdelivr.net/gh/Loyalsoldier/geoip@release/\2#' + ;; + https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/*) + printf '%s' "$raw_url" | sed 's#https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/\([^/]*\)/\(.*\)#https://testingcf.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/\2#' + ;; + https://github.com/alecthw/mmdb_china_ip_list/releases/download/*) + printf '%s' "$raw_url" | sed 's#https://github.com/alecthw/mmdb_china_ip_list/releases/download/\([^/]*\)/\(.*\)#https://testingcf.jsdelivr.net/gh/alecthw/mmdb_china_ip_list@release/lite/\2#' | sed 's#-lite##' + ;; *) printf '%s' "$raw_url" ;; @@ -427,204 +407,672 @@ download_file() { "$wget_cmd" --no-check-certificate --timeout=20 --tries=3 -O "$output" "$url" >/dev/null 2>&1 } -geo_validate_download() { - local new_file="$1" - local current_file="$2" - local new_size current_size - - new_size="$(file_size "$new_file")" - [ "${new_size:-0}" -gt 0 ] 2>/dev/null || return 1 - - if [ -f "$current_file" ]; then - current_size="$(file_size "$current_file")" - [ "${new_size:-0}" -ge "${current_size:-0}" ] 2>/dev/null || return 1 - fi - - return 0 -} - -geo_safe_replace() { - local new_file="$1" - local current_file="$2" - local backup_file="$3" - - mkdir -p "$(dirname "$current_file")" || return 1 - [ -f "$current_file" ] && cp -fp "$current_file" "$backup_file" 2>/dev/null || true - - if ! cp -f "$new_file" "$current_file"; then - [ -f "$backup_file" ] && cp -f "$backup_file" "$current_file" 2>/dev/null || true - return 1 - fi - - return 0 -} - -geo_local_info() { +store_geo_version() { local geo="$1" - local file1="" - local file2="" + local version="$2" + + mkdir -p "$(dirname "$GEO_VERSION_FILE")" + + if [ -f "$GEO_VERSION_FILE" ]; then + if grep -q "\"$geo\":" "$GEO_VERSION_FILE" 2>/dev/null; then + sed -i "s/\"$geo\":\"[^\"]*\"/\"$geo\":\"$version\"/" "$GEO_VERSION_FILE" + else + sed -i "s/}$/,\"$geo\":\"$version\"}/" "$GEO_VERSION_FILE" + fi + else + echo "{\"$geo\":\"$version\"}" > "$GEO_VERSION_FILE" + fi +} - case "$geo" in - country_mmdb) - file1="$COUNTRY_MMDB_FILE" - ;; - geosite) - file1="$(resolve_geosite_file)" - ;; - v2ray_geo) - file1="$(resolve_v2ray_geoip_file)" - file2="$(resolve_v2ray_geosite_file)" - ;; - *) - log_kv error 'unsupported_component' - return 1 - ;; - esac +get_stored_geo_version() { + local geo="$1" + local version="" + + if [ -f "$GEO_VERSION_FILE" ]; then + version="$(cat "$GEO_VERSION_FILE" 2>/dev/null | grep -o "\"$geo\":\"[^\"]*\"" | cut -d'"' -f4)" + fi + printf '%s' "$version" +} - log_kv component "$geo" - log_kv installed "$([ -f "$file1" ] && echo 1 || echo 0)" - log_kv current_version "$(file_mtime "$file1")" - log_kv current_version_extra "$([ -n "$file2" ] && file_mtime "$file2" || echo '')" +get_geo_current_version() { + local geo="$1" + local file_path="$2" + local stored_version="" + local file_version="" + + stored_version="$(get_stored_geo_version "$geo")" + if [ -n "$stored_version" ]; then + printf '%s' "$stored_version" + return 0 + fi + + if [ -f "$file_path" ]; then + file_version="$(file_mtime "$file_path")" + if [ -n "$file_version" ]; then + store_geo_version "$geo" "$file_version" + fi + printf '%s' "$file_version" + return 0 + fi + + return 1 +} + +get_geo_latest_tag() { + local repo="$1" + local location tag + + location="$(effective_url "https://github.com/$repo/releases/latest" 2>/dev/null)" || return 1 + tag="$(printf '%s' "$location" | sed -n 's#.*/tag/\([0-9][^/]*\)$#\1#p' | sed -n '1p')" + [ -n "$tag" ] || return 1 + printf '%s' "$tag" +} + +get_geo_latest_info() { + local repo="$1" + local asset="$2" + local tag version url + + tag="$(get_geo_latest_tag "$repo")" || return 3 + version="$(trim_version "$tag")" + url="$(mirror_wrap_url "https://github.com/$repo/releases/download/$tag/$asset")" + + [ -n "$tag" ] && [ -n "$version" ] && [ -n "$url" ] || return 4 + + log_kv latest_version "$version" + log_kv download_url "$url" + return 0 +} + +get_country_mmdb_current_version() { + get_geo_current_version "country_mmdb" "$COUNTRY_MMDB_FILE" +} + +get_geosite_current_version() { + get_geo_current_version "GeoSite" "$OPENCLASH_GEOSITE_FILE" +} + +get_v2ray_geoip_current_version() { + get_geo_current_version "v2ray_geoip" "$GEOIP_DAT_FILE" +} + +get_v2ray_geosite_current_version() { + get_geo_current_version "v2ray_geosite" "$GEOSITE_DAT_FILE" +} + +country_mmdb_info() { + local current installed latest_output latest_rc latest_version can_upgrade + + installed=0 + current="" + + if current="$(get_country_mmdb_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + latest_output="$(get_geo_latest_info "$COUNTRY_MMDB_REPO" "Country-lite.mmdb" 2>/dev/null)" + latest_rc=$? + + log_kv component country_mmdb + log_kv installed "$installed" + log_kv current_version "$current" + + if [ $latest_rc -ne 0 ]; then + log_kv can_upgrade 0 + case "$latest_rc" in + 3) log_kv error 'fetch_failed' ;; + 4) log_kv error 'asset_not_found' ;; + *) log_kv error 'unknown_error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + can_upgrade=0 + if [ -z "$current" ] || version_gt "$latest_version" "$current"; then + can_upgrade=1 + fi + + printf '%s\n' "$latest_output" | sed '/^download_url=/d' + log_kv can_upgrade "$can_upgrade" + log_kv error '' +} + +geosite_info() { + local current installed latest_output latest_rc latest_version can_upgrade + + installed=0 + current="" + + if current="$(get_geosite_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + latest_output="$(get_geo_latest_info "$GEOSITE_REPO" "geosite.dat" 2>/dev/null)" + latest_rc=$? + + log_kv component geosite + log_kv installed "$installed" + log_kv current_version "$current" + + if [ $latest_rc -ne 0 ]; then + log_kv can_upgrade 0 + case "$latest_rc" in + 3) log_kv error 'fetch_failed' ;; + 4) log_kv error 'asset_not_found' ;; + *) log_kv error 'unknown_error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + can_upgrade=0 + if [ -z "$current" ] || version_gt "$latest_version" "$current"; then + can_upgrade=1 + fi + + printf '%s\n' "$latest_output" | sed '/^download_url=/d' + log_kv can_upgrade "$can_upgrade" + log_kv error '' +} + +v2ray_geoip_info() { + local current installed latest_output latest_rc latest_version can_upgrade + + installed=0 + current="" + + if current="$(get_v2ray_geoip_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + latest_output="$(get_geo_latest_info "$GEOIP_REPO" "geoip-only-cn-private.dat" 2>/dev/null)" + latest_rc=$? + + log_kv component v2ray_geoip + log_kv installed "$installed" + log_kv current_version "$current" + + if [ $latest_rc -ne 0 ]; then + log_kv can_upgrade 0 + case "$latest_rc" in + 3) log_kv error 'fetch_failed' ;; + 4) log_kv error 'asset_not_found' ;; + *) log_kv error 'unknown_error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + can_upgrade=0 + if [ -z "$current" ] || version_gt "$latest_version" "$current"; then + can_upgrade=1 + fi + + printf '%s\n' "$latest_output" | sed '/^download_url=/d' + log_kv can_upgrade "$can_upgrade" + log_kv error '' +} + +v2ray_geosite_info() { + local current installed latest_output latest_rc latest_version can_upgrade + + installed=0 + current="" + + if current="$(get_v2ray_geosite_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + latest_output="$(get_geo_latest_info "$GEOSITE_REPO" "geosite.dat" 2>/dev/null)" + latest_rc=$? + + log_kv component v2ray_geosite + log_kv installed "$installed" + log_kv current_version "$current" + + if [ $latest_rc -ne 0 ]; then + log_kv can_upgrade 0 + case "$latest_rc" in + 3) log_kv error 'fetch_failed' ;; + 4) log_kv error 'asset_not_found' ;; + *) log_kv error 'unknown_error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + can_upgrade=0 + if [ -z "$current" ] || version_gt "$latest_version" "$current"; then + can_upgrade=1 + fi + + printf '%s\n' "$latest_output" | sed '/^download_url=/d' + log_kv can_upgrade "$can_upgrade" + log_kv error '' +} + +country_mmdb_local_info() { + local current installed + + installed=0 + current="" + + if current="$(get_country_mmdb_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + log_kv component country_mmdb + log_kv installed "$installed" + log_kv current_version "$current" log_kv latest_version '' log_kv can_upgrade 0 log_kv error '' } -geo_upgrade() { - local geo="$1" - local tmp_dir file_a url_a file_b url_b msg +geosite_local_info() { + local current installed - tmp_dir="$(mktemp -d /tmp/ssrplus-geo.XXXXXX)" - [ -n "$tmp_dir" ] && [ -d "$tmp_dir" ] || { - log_kv component "$geo" + installed=0 + current="" + + if current="$(get_geosite_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + log_kv component geosite + log_kv installed "$installed" + log_kv current_version "$current" + log_kv latest_version '' + log_kv can_upgrade 0 + log_kv error '' +} + +v2ray_geoip_local_info() { + local current installed + + installed=0 + current="" + + if current="$(get_v2ray_geoip_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + log_kv component v2ray_geoip + log_kv installed "$installed" + log_kv current_version "$current" + log_kv latest_version '' + log_kv can_upgrade 0 + log_kv error '' +} + +v2ray_geosite_local_info() { + local current installed + + installed=0 + current="" + + if current="$(get_v2ray_geosite_current_version)" && [ -n "$current" ]; then + installed=1 + fi + + log_kv component v2ray_geosite + log_kv installed "$installed" + log_kv current_version "$current" + log_kv latest_version '' + log_kv can_upgrade 0 + log_kv error '' +} + +country_mmdb_upgrade() { + local latest_output latest_rc latest_version download_url tmp_dir backup_file current_before current_after + + latest_output="$(get_geo_latest_info "$COUNTRY_MMDB_REPO" "Country-lite.mmdb" 2>/dev/null)" + latest_rc=$? + if [ $latest_rc -ne 0 ]; then + log_kv success 0 + case "$latest_rc" in + 3) log_kv message 'Failed to fetch release metadata' ;; + 4) log_kv message 'Matching release asset not found' ;; + *) log_kv message 'Unknown error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + download_url="$(printf '%s\n' "$latest_output" | sed -n 's/^download_url=//p' | sed -n '1p')" + current_before="$(get_country_mmdb_current_version 2>/dev/null || true)" + + if [ -n "$current_before" ] && ! version_gt "$latest_version" "$current_before"; then + log_kv success 1 + log_kv previous_version "$current_before" + log_kv current_version "$current_before" + log_kv latest_version "$latest_version" + log_kv message 'Already up to date' + return 0 + fi + + tmp_dir="$(mktemp -d /tmp/ssrplus-countrymmdb.XXXXXX)" + if [ -z "$tmp_dir" ] || [ ! -d "$tmp_dir" ]; then log_kv success 0 log_kv message 'Failed to create temp directory' return 0 - } + fi + + backup_file="$tmp_dir/countrymmdb.backup" + trap "rm -rf '$tmp_dir'" EXIT INT TERM - case "$geo" in - country_mmdb) - file_a="$COUNTRY_MMDB_FILE" - url_a="$(mirror_wrap_url "$COUNTRY_MMDB_URL")" - download_file "$url_a" "$tmp_dir/file_a" || { - log_kv component "$geo" - log_kv success 0 - log_kv message 'Download failed' - return 0 - } - geo_validate_download "$tmp_dir/file_a" "$file_a" || { - log_kv component "$geo" - log_kv success 1 - log_kv current_version "$(file_mtime "$file_a")" - log_kv current_version_extra '' - log_kv latest_version "$(file_mtime "$file_a")" - log_kv can_upgrade 0 - log_kv message 'Already up to date' - return 0 - } - geo_safe_replace "$tmp_dir/file_a" "$file_a" "$tmp_dir/file_a.bak" || { - log_kv component "$geo" - log_kv success 0 - log_kv message 'Install failed' - return 0 - } - msg='Upgrade completed' - ;; - geosite) - file_a="$(resolve_geosite_file)" - url_a="$(mirror_wrap_url "$GEOSITE_URL")" - download_file "$url_a" "$tmp_dir/file_a" || { - log_kv component "$geo" - log_kv success 0 - log_kv message 'Download failed' - return 0 - } - geo_validate_download "$tmp_dir/file_a" "$file_a" || { - log_kv component "$geo" - log_kv success 1 - log_kv current_version "$(file_mtime "$file_a")" - log_kv current_version_extra '' - log_kv latest_version "$(file_mtime "$file_a")" - log_kv can_upgrade 0 - log_kv message 'Already up to date' - return 0 - } - geo_safe_replace "$tmp_dir/file_a" "$file_a" "$tmp_dir/file_a.bak" || { - log_kv component "$geo" - log_kv success 0 - log_kv message 'Install failed' - return 0 - } - msg='Upgrade completed' - ;; - v2ray_geo) - file_a="$(resolve_v2ray_geoip_file)" - url_a="$(mirror_wrap_url "$GEOIP_DAT_URL")" - file_b="$(resolve_v2ray_geosite_file)" - url_b="$(mirror_wrap_url "$GEOSITE_URL")" - download_file "$url_a" "$tmp_dir/file_a" || { - log_kv component "$geo" - log_kv success 0 - log_kv message 'Download failed' - return 0 - } - download_file "$url_b" "$tmp_dir/file_b" || { - log_kv component "$geo" - log_kv success 0 - log_kv message 'Download failed' - return 0 - } - geo_validate_download "$tmp_dir/file_a" "$file_a" || { - log_kv component "$geo" - log_kv success 1 - log_kv current_version "$(file_mtime "$file_a")" - log_kv current_version_extra "$(file_mtime "$file_b")" - log_kv latest_version "$(file_mtime "$file_a")" - log_kv can_upgrade 0 - log_kv message 'Already up to date' - return 0 - } - geo_validate_download "$tmp_dir/file_b" "$file_b" || { - log_kv component "$geo" - log_kv success 1 - log_kv current_version "$(file_mtime "$file_a")" - log_kv current_version_extra "$(file_mtime "$file_b")" - log_kv latest_version "$(file_mtime "$file_a")" - log_kv can_upgrade 0 - log_kv message 'Already up to date' - return 0 - } - geo_safe_replace "$tmp_dir/file_a" "$file_a" "$tmp_dir/file_a.bak" || { - log_kv component "$geo" - log_kv success 0 - log_kv message 'Install failed' - return 0 - } - geo_safe_replace "$tmp_dir/file_b" "$file_b" "$tmp_dir/file_b.bak" || { - [ -f "$tmp_dir/file_a.bak" ] && cp -f "$tmp_dir/file_a.bak" "$file_a" 2>/dev/null || true - log_kv component "$geo" - log_kv success 0 - log_kv message 'Install failed' - return 0 - } - msg='Upgrade completed' - ;; - *) - log_kv component "$geo" - log_kv success 0 - log_kv message 'Unsupported component' - return 0 - ;; - esac + if ! download_file "$download_url" "$tmp_dir/Country.mmdb"; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ ! -s "$tmp_dir/Country.mmdb" ]; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ -f "$COUNTRY_MMDB_FILE" ]; then + cp -fp "$COUNTRY_MMDB_FILE" "$backup_file" 2>/dev/null || true + fi + + if ! cp -f "$tmp_dir/Country.mmdb" "$COUNTRY_MMDB_FILE"; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$COUNTRY_MMDB_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Install failed' + return 0 + fi + + store_geo_version "country_mmdb" "$latest_version" + + current_after="$(get_country_mmdb_current_version 2>/dev/null || true)" + if [ -z "$current_after" ]; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$COUNTRY_MMDB_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Installed file failed to verify' + return 0 + fi + + if [ -x /etc/init.d/shadowsocksr ]; then + /etc/init.d/shadowsocksr restart >/dev/null 2>&1 || true + fi - log_kv component "$geo" log_kv success 1 - log_kv current_version "$(file_mtime "$file_a")" - log_kv current_version_extra "$([ -n "${file_b:-}" ] && file_mtime "$file_b" || echo '')" - log_kv latest_version "$(file_mtime "$file_a")" - log_kv can_upgrade 0 - log_kv message "$msg" + log_kv previous_version "$current_before" + log_kv current_version "$current_after" + log_kv latest_version "$latest_version" + log_kv message 'Upgrade completed' + return 0 +} + +geosite_upgrade() { + local latest_output latest_rc latest_version download_url tmp_dir backup_file current_before current_after + + latest_output="$(get_geo_latest_info "$GEOSITE_REPO" "geosite.dat" 2>/dev/null)" + latest_rc=$? + if [ $latest_rc -ne 0 ]; then + log_kv success 0 + case "$latest_rc" in + 3) log_kv message 'Failed to fetch release metadata' ;; + 4) log_kv message 'Matching release asset not found' ;; + *) log_kv message 'Unknown error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + download_url="$(printf '%s\n' "$latest_output" | sed -n 's/^download_url=//p' | sed -n '1p')" + current_before="$(get_geosite_current_version 2>/dev/null || true)" + + if [ -n "$current_before" ] && ! version_gt "$latest_version" "$current_before"; then + log_kv success 1 + log_kv previous_version "$current_before" + log_kv current_version "$current_before" + log_kv latest_version "$latest_version" + log_kv message 'Already up to date' + return 0 + fi + + tmp_dir="$(mktemp -d /tmp/ssrplus-GeoSite.XXXXXX)" + if [ -z "$tmp_dir" ] || [ ! -d "$tmp_dir" ]; then + log_kv success 0 + log_kv message 'Failed to create temp directory' + return 0 + fi + + backup_file="$tmp_dir/GeoSite.backup" + + trap "rm -rf '$tmp_dir'" EXIT INT TERM + + if ! download_file "$download_url" "$tmp_dir/GeoSite.dat"; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ ! -s "$tmp_dir/GeoSite.dat" ]; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ -f "$OPENCLASH_GEOSITE_FILE" ]; then + cp -fp "$OPENCLASH_GEOSITE_FILE" "$backup_file" 2>/dev/null || true + fi + + if ! cp -f "$tmp_dir/GeoSite.dat" "$OPENCLASH_GEOSITE_FILE"; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$OPENCLASH_GEOSITE_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Install failed' + return 0 + fi + + store_geo_version "GeoSite" "$latest_version" + + current_after="$(get_geosite_current_version 2>/dev/null || true)" + if [ -z "$current_after" ]; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$OPENCLASH_GEOSITE_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Installed file failed to verify' + return 0 + fi + + if [ -x /etc/init.d/shadowsocksr ]; then + /etc/init.d/shadowsocksr restart >/dev/null 2>&1 || true + fi + + log_kv success 1 + log_kv previous_version "$current_before" + log_kv current_version "$current_after" + log_kv latest_version "$latest_version" + log_kv message 'Upgrade completed' + return 0 +} + +v2ray_geoip_upgrade() { + local latest_output latest_rc latest_version download_url tmp_dir backup_file current_before current_after + + latest_output="$(get_geo_latest_info "$GEOIP_REPO" "geoip-only-cn-private.dat" 2>/dev/null)" + latest_rc=$? + if [ $latest_rc -ne 0 ]; then + log_kv success 0 + case "$latest_rc" in + 3) log_kv message 'Failed to fetch release metadata' ;; + 4) log_kv message 'Matching release asset not found' ;; + *) log_kv message 'Unknown error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + download_url="$(printf '%s\n' "$latest_output" | sed -n 's/^download_url=//p' | sed -n '1p')" + current_before="$(get_v2ray_geoip_current_version 2>/dev/null || true)" + + if [ -n "$current_before" ] && ! version_gt "$latest_version" "$current_before"; then + log_kv success 1 + log_kv previous_version "$current_before" + log_kv current_version "$current_before" + log_kv latest_version "$latest_version" + log_kv message 'Already up to date' + return 0 + fi + + tmp_dir="$(mktemp -d /tmp/ssrplus-v2raygeoip.XXXXXX)" + if [ -z "$tmp_dir" ] || [ ! -d "$tmp_dir" ]; then + log_kv success 0 + log_kv message 'Failed to create temp directory' + return 0 + fi + + backup_file="$tmp_dir/v2raygeoip.backup" + + trap "rm -rf '$tmp_dir'" EXIT INT TERM + + if ! download_file "$download_url" "$tmp_dir/geoip.dat"; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ ! -s "$tmp_dir/geoip.dat" ]; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ -f "$GEOIP_DAT_FILE" ]; then + cp -fp "$GEOIP_DAT_FILE" "$backup_file" 2>/dev/null || true + fi + + if ! cp -f "$tmp_dir/geoip.dat" "$GEOIP_DAT_FILE"; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$GEOIP_DAT_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Install failed' + return 0 + fi + + store_geo_version "v2ray_geoip" "$latest_version" + + current_after="$(get_v2ray_geoip_current_version 2>/dev/null || true)" + if [ -z "$current_after" ]; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$GEOIP_DAT_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Installed file failed to verify' + return 0 + fi + + if [ -x /etc/init.d/shadowsocksr ]; then + /etc/init.d/shadowsocksr restart >/dev/null 2>&1 || true + fi + + log_kv success 1 + log_kv previous_version "$current_before" + log_kv current_version "$current_after" + log_kv latest_version "$latest_version" + log_kv message 'Upgrade completed' + return 0 +} + +v2ray_geosite_upgrade() { + local latest_output latest_rc latest_version download_url tmp_dir backup_file current_before current_after + + latest_output="$(get_geo_latest_info "$GEOSITE_REPO" "geosite.dat" 2>/dev/null)" + latest_rc=$? + if [ $latest_rc -ne 0 ]; then + log_kv success 0 + case "$latest_rc" in + 3) log_kv message 'Failed to fetch release metadata' ;; + 4) log_kv message 'Matching release asset not found' ;; + *) log_kv message 'Unknown error' ;; + esac + return 0 + fi + + latest_version="$(printf '%s\n' "$latest_output" | sed -n 's/^latest_version=//p' | sed -n '1p')" + download_url="$(printf '%s\n' "$latest_output" | sed -n 's/^download_url=//p' | sed -n '1p')" + current_before="$(get_v2ray_geosite_current_version 2>/dev/null || true)" + + if [ -n "$current_before" ] && ! version_gt "$latest_version" "$current_before"; then + log_kv success 1 + log_kv previous_version "$current_before" + log_kv current_version "$current_before" + log_kv latest_version "$latest_version" + log_kv message 'Already up to date' + return 0 + fi + + tmp_dir="$(mktemp -d /tmp/ssrplus-v2raygeosite.XXXXXX)" + if [ -z "$tmp_dir" ] || [ ! -d "$tmp_dir" ]; then + log_kv success 0 + log_kv message 'Failed to create temp directory' + return 0 + fi + + backup_file="$tmp_dir/v2raygeosite.backup" + + trap "rm -rf '$tmp_dir'" EXIT INT TERM + + if ! download_file "$download_url" "$tmp_dir/geosite.dat"; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ ! -s "$tmp_dir/geosite.dat" ]; then + log_kv success 0 + log_kv message 'Download failed' + return 0 + fi + + if [ -f "$GEOSITE_DAT_FILE" ]; then + cp -fp "$GEOSITE_DAT_FILE" "$backup_file" 2>/dev/null || true + fi + + if ! cp -f "$tmp_dir/geosite.dat" "$GEOSITE_DAT_FILE"; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$GEOSITE_DAT_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Install failed' + return 0 + fi + + store_geo_version "v2ray_geosite" "$latest_version" + + current_after="$(get_v2ray_geosite_current_version 2>/dev/null || true)" + if [ -z "$current_after" ]; then + if [ -f "$backup_file" ]; then + cp -fp "$backup_file" "$GEOSITE_DAT_FILE" 2>/dev/null || true + fi + log_kv success 0 + log_kv message 'Installed file failed to verify' + return 0 + fi + + if [ -x /etc/init.d/shadowsocksr ]; then + /etc/init.d/shadowsocksr restart >/dev/null 2>&1 || true + fi + + log_kv success 1 + log_kv previous_version "$current_before" + log_kv current_version "$current_after" + log_kv latest_version "$latest_version" + log_kv message 'Upgrade completed' return 0 } @@ -1614,7 +2062,9 @@ naiveproxy_upgrade() { return 0 } +# ==================== 主程序入口 ==================== case "${1:-}" in + # 主程序相关 mainprogram_info) mainprogram_info ;; @@ -1624,6 +2074,7 @@ case "${1:-}" in mainprogram_upgrade) mainprogram_upgrade ;; + # Xray 相关 xray_info) xray_info ;; @@ -1633,6 +2084,7 @@ case "${1:-}" in xray_upgrade) xray_upgrade ;; + # Mihomo 相关 mihomo_info) mihomo_info ;; @@ -1642,6 +2094,7 @@ case "${1:-}" in mihomo_upgrade) mihomo_upgrade ;; + # Naiveproxy 相关 naiveproxy_info) naiveproxy_info ;; @@ -1651,36 +2104,49 @@ case "${1:-}" in naiveproxy_upgrade) naiveproxy_upgrade ;; + # Country MMDB 相关 country_mmdb_info) - geo_local_info country_mmdb + country_mmdb_info ;; country_mmdb_local_info) - geo_local_info country_mmdb + country_mmdb_local_info ;; country_mmdb_upgrade) - geo_upgrade country_mmdb + country_mmdb_upgrade ;; + # Geosite (OpenClash) 相关 geosite_info) - geo_local_info geosite + geosite_info ;; geosite_local_info) - geo_local_info geosite + geosite_local_info ;; geosite_upgrade) - geo_upgrade geosite + geosite_upgrade ;; - v2ray_geo_info) - geo_local_info v2ray_geo + # V2Ray GeoIP 相关 + v2ray_geoip_info) + v2ray_geoip_info ;; - v2ray_geo_local_info) - geo_local_info v2ray_geo + v2ray_geoip_local_info) + v2ray_geoip_local_info ;; - v2ray_geo_upgrade) - geo_upgrade v2ray_geo + v2ray_geoip_upgrade) + v2ray_geoip_upgrade + ;; + # V2Ray Geosite 相关 + v2ray_geosite_info) + v2ray_geosite_info + ;; + v2ray_geosite_local_info) + v2ray_geosite_local_info + ;; + v2ray_geosite_upgrade) + v2ray_geosite_upgrade ;; *) log_kv success 0 - log_kv message 'Usage: update_components.sh mainprogram_info|mainprogram_local_info|mainprogram_upgrade|xray_info|xray_local_info|xray_upgrade|mihomo_info|mihomo_local_info|mihomo_upgrade|naiveproxy_info|naiveproxy_local_info|naiveproxy_upgrade|country_mmdb_info|country_mmdb_local_info|country_mmdb_upgrade|geosite_info|geosite_local_info|geosite_upgrade|v2ray_geo_info|v2ray_geo_local_info|v2ray_geo_upgrade' + log_kv message 'Usage: update_components.sh mainprogram_info|mainprogram_local_info|mainprogram_upgrade|xray_info|xray_local_info|xray_upgrade|mihomo_info|mihomo_local_info|mihomo_upgrade|naiveproxy_info|naiveproxy_local_info|naiveproxy_upgrade|country_mmdb_info|country_mmdb_local_info|country_mmdb_upgrade|geosite_info|geosite_local_info|geosite_upgrade|v2ray_geoip_info|v2ray_geoip_local_info|v2ray_geoip_upgrade|v2ray_geosite_info|v2ray_geosite_local_info|v2ray_geosite_upgrade' return 1 2>/dev/null || exit 1 ;; esac