diff --git a/scripts/menus/fw_filter.sh b/scripts/menus/fw_filter.sh index 605e587f..1b5877ed 100644 --- a/scripts/menus/fw_filter.sh +++ b/scripts/menus/fw_filter.sh @@ -105,80 +105,82 @@ set_fw_filter() { } set_common_ports() { - [ -z "$multiport" ] && multiport='22,80,443,8080,8443' - echo "-----------------------------------------------" - echo -e "\033[31m注意:\033[0mMIX模式下,所有fake-ip来源的非常用端口流量不会被过滤" - [ -n "$common_ports" ] && - echo -e "当前放行端口:\033[36m$multiport\033[0m" - echo "-----------------------------------------------" - echo -e " 1 启用/关闭端口过滤: \033[36m$common_ports\033[0m" - echo -e " 2 添加放行端口" - echo -e " 3 移除指定放行端口" - echo -e " 4 重置默认放行端口" - echo -e " 5 重置为旧版放行端口" - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num - case $num in - 1) - if [ "$common_ports" = ON ];then - common_ports=OFF - else - common_ports=ON - fi - setconfig common_ports "$common_ports" - set_common_ports - ;; - 2) - port_count=$(echo "$multiport" | awk -F',' '{print NF}' ) - if [ "$port_count" -ge 15 ];then - echo -e "\033[31m最多支持设置放行15个端口,请先减少一些!\033[0m" - else - read -p "请输入要放行的端口号 > " port - if echo ",$multiport," | grep -q ",$port,";then - echo -e "\033[31m输入错误!请勿重复添加!\033[0m" - elif [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then - echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m" - else - multiport=$(echo "$multiport,$port" | sed "s/^,//") - setconfig multiport "$multiport" - fi - fi - sleep 1 - set_common_ports - ;; - 3) - read -p "请输入要移除的端口号 > " port - if echo ",$multiport," | grep -q ",$port,";then - if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then - echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m" - else - multiport=$(echo ",$multiport," | sed "s/,$port//; s/^,//; s/,$//") - setconfig multiport "$multiport" - fi - else - echo -e "\033[31m输入错误!请输入已添加过的端口!\033[0m" - fi - sleep 1 - set_common_ports - ;; - 4) - multiport='' - setconfig multiport - sleep 1 - set_common_ports - ;; - 5) - multiport='22,80,143,194,443,465,587,853,993,995,5222,8080,8443' - setconfig multiport "$multiport" - sleep 1 - set_common_ports - ;; - *) - errornum - ;; - esac + while true; do + [ -z "$multiport" ] && multiport='22,80,443,8080,8443' + echo "-----------------------------------------------" + echo -e "\033[31m注意:\033[0mMIX模式下,所有fake-ip来源的非常用端口流量不会被过滤" + [ -n "$common_ports" ] && + echo -e "当前放行端口:\033[36m$multiport\033[0m" + echo "-----------------------------------------------" + echo -e " 1 启用/关闭端口过滤: \033[36m$common_ports\033[0m" + echo -e " 2 添加放行端口" + echo -e " 3 移除指定放行端口" + echo -e " 4 重置默认放行端口" + echo -e " 5 重置为旧版放行端口" + echo -e " 0 返回上级菜单" + echo "-----------------------------------------------" + read -r -p "请输入对应数字 > " num + case "$num" in + "" | 0) + break + ;; + 1) + if [ "$common_ports" = ON ]; then + common_ports=OFF + else + common_ports=ON + fi + setconfig common_ports "$common_ports" + ;; + 2) + port_count=$(echo "$multiport" | awk -F',' '{print NF}') + if [ "$port_count" -ge 15 ]; then + echo -e "\033[31m最多支持设置放行15个端口,请先减少一些!\033[0m" + else + read -r -p "请输入要放行的端口号 > " port + if echo ",$multiport," | grep -q ",$port,"; then + echo -e "\033[31m输入错误!请勿重复添加!\033[0m" + elif [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then + echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m" + else + multiport=$(echo "$multiport,$port" | sed "s/^,//") + setconfig multiport "$multiport" + fi + fi + sleep 1 + ;; + 3) + read -r -p "请输入要移除的端口号 > " port + if echo ",$multiport," | grep -q ",$port,"; then + if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then + echo -e "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m" + else + multiport=$(echo ",$multiport," | sed "s/,$port//; s/^,//; s/,$//") + setconfig multiport "$multiport" + fi + else + echo -e "\033[31m输入错误!请输入已添加过的端口!\033[0m" + fi + sleep 1 + ;; + 4) + multiport='' + setconfig multiport + sleep 1 + ;; + 5) + multiport='22,80,143,194,443,465,587,853,993,995,5222,8080,8443' + setconfig multiport "$multiport" + sleep 1 + ;; + *) + errornum + sleep 1 + ;; + esac + done } + set_cust_host_ipv4() { #自定义ipv4透明路由网段 [ -z "$replace_default_host_ipv4" ] && replace_default_host_ipv4="OFF" . "$CRASHDIR"/starts/fw_getlanip.sh && getlanip diff --git a/scripts/menus/tui_layout.sh b/scripts/menus/tui_layout.sh index 7c10ddba..2e6bc65b 100644 --- a/scripts/menus/tui_layout.sh +++ b/scripts/menus/tui_layout.sh @@ -14,10 +14,35 @@ FULL_EQ="======================================================================= FULL_DASH="- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " # function to print content lines -# (using cursor jump) +# (using cursor jump with auto-wrapping and color handling) content_line() { local param="${1:-}" - echo -e " ${param}\033[${TABLE_WIDTH}G||" + + # Calculate Available Text Width + local text_width=$((TABLE_WIDTH - 3)) + + # 1. Extract color codes (if present) + # Use sed to capture the leading ANSI Escape Code (\x1b is the hexadecimal representation of ESC) + # This line extracts \033[33m... from \033[33m and stores it in color_code + local color_code + color_code=$(echo -e "$param" | sed -n 's/^\(\x1b\[[0-9;]*m\).*/\1/p') + + # 2. Generate Clean Text + # Use sed to remove all ANSI color codes, retaining only plain text content + # This allows fold to accurately count characters without premature line breaks + local clean_text + clean_text=$(echo -e "$param" | sed 's/\x1b\[[0-9;]*m//g') + + if [ -z "$clean_text" ]; then + echo -e " \033[${TABLE_WIDTH}G||" + else + # 3. Insert line breaks in plain text + echo "$clean_text" | fold -s -w "$text_width" | while IFS= read -r line; do + # 4. Output Restructuring + # Force the addition of color_code to each line and append \033[0m to reset at the end + echo -e " ${color_code}${line}\033[0m\033[${TABLE_WIDTH}G||" + done + fi } # function to print sub content lines