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