From dfaf2da1683d9e8d8f53e18747f5a681673f49df Mon Sep 17 00:00:00 2001 From: sofia <253282481+sofia-riese@users.noreply.github.com> Date: Tue, 20 Jan 2026 09:52:08 +0800 Subject: [PATCH 1/2] feat(9_upgrade.sh): redesign TUI --- scripts/menu.sh | 126 ++--- scripts/menus/9_upgrade.sh | 1046 +++++++++++++++++++++++------------- 2 files changed, 733 insertions(+), 439 deletions(-) diff --git a/scripts/menu.sh b/scripts/menu.sh index bd4d704b..815f1c17 100644 --- a/scripts/menu.sh +++ b/scripts/menu.sh @@ -26,8 +26,10 @@ load_lang common load_lang menu errornum() { - echo "-----------------------------------------------" - echo -e "\033[31m$MENU_ERR_INPUT\033[0m" + double_line_break + separator_line "=" + content_line "\033[31m$MENU_ERR_INPUT\033[0m" + separator_line "=" } checkrestart() { @@ -110,7 +112,7 @@ ckstatus() { #脚本启动前检查 echo "-----------------------------------------------" #检查新手引导 if [ -z "$userguide" ]; then - . "$CRASHDIR"/menus/userguide.sh && userguide + . "$CRASHDIR"/menus/userguide.sh && userguide setconfig userguide 1 fi #检查执行权限 @@ -120,18 +122,18 @@ ckstatus() { #脚本启动前检查 echo -e "$MENU_TMP_CORE_FOUND \033[36m/tmp/$file\033[0m " read -p "$MENU_TMP_CORE_ASK(1/0) > " res [ "$res" = 1 ] && { - zip_type=$(echo "$file" | grep -oE 'tar.gz$|upx$|gz$') - . "$CRASHDIR"/menus/9_upgrade.sh && setcoretype - . "$CRASHDIR"/libs/core_tools.sh && core_check "/tmp/$file" + zip_type=$(echo "$file" | grep -oE 'tar.gz$|upx$|gz$') + . "$CRASHDIR"/menus/9_upgrade.sh && setcoretype + . "$CRASHDIR"/libs/core_tools.sh && core_check "/tmp/$file" if [ "$?" = 0 ]; then - echo -e "\033[32m$MENU_CORE_LOADED_OK\033[0m " - switch_core + echo -e "\033[32m$MENU_CORE_LOADED_OK\033[0m " + switch_core else echo -e "\033[33m$MENU_CORE_LOADED_BAD033[0m" rm -rf /tmp/"$file" - echo -e "\033[33m$MENU_CORE_REMOVED\033[0m" + echo -e "\033[33m$MENU_CORE_REMOVED\033[0m" fi - sleep 1 + sleep 1 } echo "-----------------------------------------------" done @@ -239,64 +241,64 @@ main_menu() { } case "$1" in - "") - main_menu +"") + main_menu ;; - -t) - shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash - $shtype -x "$CRASHDIR"/menu.sh +-t) + shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash + $shtype -x "$CRASHDIR"/menu.sh ;; - -s) - "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 +-s) + "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 ;; - -i) - . "$CRASHDIR"/init.sh 2>/dev/null +-i) + . "$CRASHDIR"/init.sh 2>/dev/null ;; - -st) - shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash - $shtype -x "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 +-st) + shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash + $shtype -x "$CRASHDIR"/start.sh $2 $3 $4 $5 $6 ;; - -d) - shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash - echo -e "$MENU_TEST_RUNNING\033[32;4mt.me/ShellClash\033[0m" - $shtype "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh_bug.log - $shtype -x "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh.log - echo ----------------------------------------- - cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug - if [ -s "$TMPDIR"/sh_bug ]; then - while read line; do - echo -e "$MENU_ERROR_FOUND\033[33;4m$line\033[0m" - grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log - echo ----------------------------------------- - done <"$TMPDIR"/sh_bug - rm -rf "$TMPDIR"/sh_bug - echo -e "\033[32m$MENU_TEST_DONE_FAIL\033[0m$MENU_TEST_LOG_HINT\033[36m$TMPDIR/debug_sh.log\033[0m" - else - echo -e "\033[32m$MENU_TEST_DONE_OK\033[0m" - rm -rf "$TMPDIR"/debug_sh.log - fi - "$CRASHDIR"/start.sh stop +-d) + shtype=sh && [ -n "$(ls -l /bin/sh | grep -o dash)" ] && shtype=bash + echo -e "$MENU_TEST_RUNNING\033[32;4mt.me/ShellClash\033[0m" + $shtype "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh_bug.log + $shtype -x "$CRASHDIR"/start.sh debug >/dev/null 2>"$TMPDIR"/debug_sh.log + echo ----------------------------------------- + cat "$TMPDIR"/debug_sh_bug.log | grep 'start\.sh' >"$TMPDIR"/sh_bug + if [ -s "$TMPDIR"/sh_bug ]; then + while read line; do + echo -e "$MENU_ERROR_FOUND\033[33;4m$line\033[0m" + grep -A 1 -B 3 "$line" "$TMPDIR"/debug_sh.log + echo ----------------------------------------- + done <"$TMPDIR"/sh_bug + rm -rf "$TMPDIR"/sh_bug + echo -e "\033[32m$MENU_TEST_DONE_FAIL\033[0m$MENU_TEST_LOG_HINT\033[36m$TMPDIR/debug_sh.log\033[0m" + else + echo -e "\033[32m$MENU_TEST_DONE_OK\033[0m" + rm -rf "$TMPDIR"/debug_sh.log + fi + "$CRASHDIR"/start.sh stop ;; - -u) - . "$CRASHDIR"/menus/uninstall.sh && uninstall +-u) + . "$CRASHDIR"/menus/uninstall.sh && uninstall ;; - *) - echo ----------------------------------------- - echo "$MENU_CLI_WELCOME" - echo ----------------------------------------- - echo " -t $MENU_CLI_TEST" - echo " -h $MENU_CLI_HELP" - echo " -u $MENU_CLI_UNINSTALL" - echo " -i $MENU_CLI_INIT" - echo " -d $MENU_CLI_DEBUG" - echo ----------------------------------------- - echo " crash -s start $MENU_CLI_START" - echo " crash -s stop $MENU_CLI_STOP" - echo " $CRASHDIR/start.sh init $MENU_CLI_BOOT_INIT" - echo ----------------------------------------- - echo "$MENU_HELP_ONLINE t.me/ShellClash" - echo "$MENU_HELP_BLOG juewuy.github.io" - echo "$MENU_HELP_GITHUB github.com/juewuy/ShellCrash" - echo ----------------------------------------- +*) + echo ----------------------------------------- + echo "$MENU_CLI_WELCOME" + echo ----------------------------------------- + echo " -t $MENU_CLI_TEST" + echo " -h $MENU_CLI_HELP" + echo " -u $MENU_CLI_UNINSTALL" + echo " -i $MENU_CLI_INIT" + echo " -d $MENU_CLI_DEBUG" + echo ----------------------------------------- + echo " crash -s start $MENU_CLI_START" + echo " crash -s stop $MENU_CLI_STOP" + echo " $CRASHDIR/start.sh init $MENU_CLI_BOOT_INIT" + echo ----------------------------------------- + echo "$MENU_HELP_ONLINE t.me/ShellClash" + echo "$MENU_HELP_BLOG juewuy.github.io" + echo "$MENU_HELP_GITHUB github.com/juewuy/ShellCrash" + echo ----------------------------------------- ;; esac diff --git a/scripts/menus/9_upgrade.sh b/scripts/menus/9_upgrade.sh index 51f290ec..8bf6c436 100644 --- a/scripts/menus/9_upgrade.sh +++ b/scripts/menus/9_upgrade.sh @@ -9,25 +9,27 @@ __IS_MODULE_9_UPGRADE_LOADED=1 . "$CRASHDIR"/libs/web_get_bin.sh error_down() { - echo -e "\033[33m请尝试切换至其他安装源后重新下载!\033[0m" - echo -e "或者参考 \033[32;4mhttps://juewuy.github.io/bdaz\033[0m 进行本地安装!" + content_line "\033[33m请尝试切换至其他安装源后重新下载!\033[0m" + content_line "或者参考 \033[32;4mhttps://juewuy.github.io/bdaz\033[0m 进行本地安装!" + separator_line "=" sleep 1 } # 更新/卸载功能菜单 upgrade() { - double_line_break while true; do - [ -z "$version_new" ] && checkupdate + + if [ -z "$version_new" ]; then + checkupdate + double_line_break + else + double_line_break + fi [ -z "$core_v" ] && core_v=$crashcore core_v_new=$(eval echo \$"$crashcore"_v) - # Automatically generate '====' lines separator_line "=" - content_line "\033[30;47m更新与支持\033[0m" - - # Automatically generate '- - - ' lines separator_line "-" content_line "当前目录(\033[32m$CRASHDIR\033[0m)剩余空间:\033[36m$(dir_avail "$CRASHDIR" -h)\033[0m" @@ -35,20 +37,20 @@ upgrade() { content_line "\033[33m当前目录剩余空间较低,建议开启小闪存模式!\033[0m" } separator_line "-" - content_line "1) 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$version_new \033[36m$release_type\033[0m" - content_line "2) 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m" - content_line "3) 更新\033[32m数据库文件\033[0m > \033[32m$GeoIP_v\033[0m" - content_line "4) 安装本地\033[35mDashboard\033[0m面板" - content_line "5) 安装/更新本地\033[33m根证书文件\033[0m" - content_line "6) 查看\033[32mPAC\033[0m自动代理配置" - content_line "7) 切换\033[36m安装源\033[0m及\033[36m安装版本\033[0m" - content_line "8) \033[32m配置自动更新\033[0m" - content_line "9) \033[31m卸载ShellCrash\033[0m" - content_line "99) \033[36m鸣谢!\033[0m" - content_line "0) 返回上级菜单" + content_line "1) 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$version_new \033[36m$release_type\033[0m" + content_line "2) 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m" + content_line "3) 更新\033[32m数据库文件\033[0m > \033[32m$GeoIP_v\033[0m" + content_line "4) 安装本地\033[35mDashboard\033[0m面板" + content_line "5) 安装/更新本地\033[33m根证书文件\033[0m" + content_line "6) 查看\033[32mPAC\033[0m自动代理配置" + content_line "7) 切换\033[36m安装源\033[0m及\033[36m安装版本\033[0m" + content_line "8) \033[32m配置自动更新\033[0m" + content_line "9) \033[31m卸载ShellCrash\033[0m" + content_line "a) \033[36m鸣谢!\033[0m" + content_line "0) 返回上级菜单" separator_line "=" - read -p "请输入对应数字> " num + read -r -p "请输入对应标号> " num case "$num" in "" | 0) break @@ -63,14 +65,13 @@ upgrade() { setgeo ;; 4) - double_line_break setdb - double_line_break ;; 5) setcrt ;; 6) + double_line_break separator_line "=" content_line "PAC配置链接为:\033[30;47m http://$host:$db_port/ui/pac \033[0m" content_line "PAC的使用教程请参考:\033[4;32mhttps://juewuy.github.io/ehRUeewcv\033[0m" @@ -86,7 +87,8 @@ upgrade() { 9) . "$CRASHDIR"/menus/uninstall.sh && uninstall ;; - 99) + a) + double_line_break separator_line "=" content_line "感谢以下项目和作者!" separator_line "-" @@ -134,85 +136,125 @@ upgrade() { *) errornum sleep 1 - break ;; esac done } -#检查更新 +# 检查更新 checkupdate() { - echo -ne "\033[32m正在检查更新!\033[0m\r" + double_line_break + separator_line "=" + content_line "\033[32m正在检查更新......\033[0m" get_bin "$TMPDIR"/version_new version echooff [ "$?" = "0" ] && { version_new=$(cat "$TMPDIR"/version_new) get_bin "$TMPDIR"/version_new bin/version echooff + content_line "\033[32m检查更新成功\033[0m" + separator_line "=" } if [ "$?" = "0" ]; then . "$TMPDIR"/version_new 2>/dev/null else - echo -e "\033[31m检查更新失败!请尝试切换其他安装源!\033[0m" + content_line "\033[31m检查更新失败!请尝试切换其他安装源!\033[0m" + separator_line "=" setserver - [ "$checkupdate" = false ] || checkupdate + if [ "$checkupdate" != false ]; then + checkupdate + fi fi rm -rf "$TMPDIR"/version_new } -#更新脚本 +# 更新脚本 getscripts() { + double_line_break + separator_line "=" get_bin "$TMPDIR"/ShellCrash.tar.gz ShellCrash.tar.gz + if [ "$?" != "0" ]; then - echo -e "\033[33m文件下载失败!\033[0m" + content_line "\033[33m文件下载失败!\033[0m" error_down else "$CRASHDIR"/start.sh stop 2>/dev/null - #解压 - echo "-----------------------------------------------" - echo "开始解压文件!" + # 解压 + content_line "开始解压文件......" mkdir -p "$CRASHDIR" >/dev/null tar -zxf "$TMPDIR/ShellCrash.tar.gz" ${tar_para} -C "$CRASHDIR"/ if [ $? -ne 0 ]; then - echo -e "\033[33m文件解压失败!\033[0m" + content_line "\033[33m文件解压失败!\033[0m" error_down else . "$CRASHDIR"/init.sh >/dev/null - echo -e "\033[32m脚本更新成功!\033[0m" + content_line "\033[32m脚本更新成功!\033[0m" + separator_line "=" fi fi rm -rf "$TMPDIR"/ShellCrash.tar.gz exit } + setscripts() { - echo "-----------------------------------------------" - echo -e "当前脚本版本为:\033[33m $versionsh_l \033[0m" - echo -e "最新脚本版本为:\033[32m $version_new \033[0m" - echo -e "注意更新时会停止服务!" - echo "-----------------------------------------------" - read -p "是否更新脚本?[1/0] > " res - if [ "$res" = '1' ]; then - #下载更新 - getscripts - #提示 - echo "-----------------------------------------------" - echo -e "\033[32m管理脚本更新成功!\033[0m" - echo "-----------------------------------------------" - exit - fi + while true; do + double_line_break + separator_line "=" + content_line "\033[33m注意:更新时会停止服务!\033[0m" + content_line "当前脚本版本为:\033[36m$versionsh_l\033[0m" + content_line "最新脚本版本为:\033[32m$version_new\033[0m" + separator_line "-" + content_line "1) 立即更新" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " res + case "$res" in + "" | 0) + break + ;; + 1) + # 下载更新 + getscripts + # 提示 + double_line_break + separator_line "=" + content_line "\033[32m管理脚本更新成功!\033[0m" + separator_line "=" + exit 0 + ;; + *) + errornum + sleep 1 + ;; + esac + done } -#更新内核 -setcpucore() { #手动设置内核架构 +# 更新内核 +# 手动设置内核架构 +setcpucore() { cpucore_list="armv5 armv7 arm64 386 amd64 mipsle-softfloat mipsle-hardfloat mips-softfloat" - echo "-----------------------------------------------" - echo -e "\033[31m仅适合脚本无法正确识别核心或核心无法正常运行时使用!\033[0m" - echo -e "当前可供在线下载的处理器架构为:" - echo "$cpucore_list" | awk -F " " '{for(i=1;i<=NF;i++) {print i" "$i }}' - echo -e "不知道如何获取核心版本?请参考:\033[36;4mhttps://juewuy.github.io/bdaz\033[0m" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num + double_line_break + separator_line "=" + content_line "\033[31m仅适合脚本无法正确识别核心或核心无法正常运行时使用!\033[0m" + content_line "不知道如何获取核心版本?\033[0m" + content_line "请参考:\033[36;4mhttps://juewuy.github.io/bdaz\033[0m" + separator_line "-" + content_line "当前可供在线下载的处理器架构为:" + separator_line "-" + + echo "$cpucore_list" | + awk '{for(i=1;i<=NF;i++) print i") "$i}' | + while IFS= read -r line; do + content_line "$line" + done + + separator_line "=" + read -r -p "请输入对应标号> " num [ -n "$num" ] && setcpucore=$(echo "$cpucore_list" | awk '{print $"'"$num"'"}') if [ -z "$setcpucore" ]; then - echo -e "\033[31m请输入正确的处理器架构!\033[0m" + double_line_break + separator_line "=" + content_line "\033[31m请输入正确的处理器架构!\033[0m" + separator_line "=" sleep 1 cpucore="" else @@ -220,32 +262,67 @@ setcpucore() { #手动设置内核架构 setconfig cpucore "$cpucore" fi } -setcoretype() { #手动指定内核类型 - echo "$crashcore" | grep -q 'singbox' && core_old=singbox || core_old=clash - echo -e "\033[33m请确认该自定义内核的类型:\033[0m" - echo -e " 1 Clash基础内核" - echo -e " 2 Clash-Premium内核" - echo -e " 3 Mihomo(Meta)内核" - echo -e " 4 Sing-Box内核" - echo -e " 5 Sing-Box-reF1nd内核" - read -p "请输入对应数字 > " num - case "$num" in - 2) crashcore=clashpre ;; - 3) crashcore=meta ;; - 4) crashcore=singbox ;; - 5) crashcore=singboxr ;; - *) crashcore=clash ;; - esac - echo "$crashcore" | grep -q 'singbox' && core_new=singbox || core_new=clash + +# 手动指定内核类型 +setcoretype() { + while true; do + double_line_break + separator_line "=" + echo "$crashcore" | grep -q 'singbox' && core_old=singbox || core_old=clash + content_line "\033[33m请确认该自定义内核的类型:\033[0m" + separator_line "-" + content_line "1) Clash基础内核" + content_line "2) Clash-Premium内核" + content_line "3) Mihomo(Meta)内核" + content_line "4) Sing-Box内核" + content_line "5) Sing-Box-reF1nd内核" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num + case "$num" in + "" | 0) ;; + 1) + crashcore=clash + ;; + 2) + crashcore=clashpre + ;; + 3) + crashcore=meta + ;; + 4) + crashcore=singbox + ;; + 5) + crashcore=singboxr + ;; + *) + errornum + sleep 1 + continue + ;; + esac + echo "$crashcore" | grep -q 'singbox' && core_new=singbox || core_new=clash + break + done } -switch_core() { #clash与singbox内核切换 - #singbox和clash内核切换时提示是否保留文件 + +# clash与singbox内核切换 +switch_core() { + # singbox和clash内核切换时提示是否保留文件 [ "$core_new" != "$core_old" ] && { [ "$dns_mod" = "redir_host" ] && [ "$core_old" = "clash" ] && setconfig dns_mod mix #singbox自动切换dns [ "$dns_mod" = "mix" ] && [ "$crashcore" = 'clash' -o "$crashcore" = 'clashpre' ] && setconfig dns_mod redir_host #singbox自动切换dns - echo -e "\033[33m已从$core_old内核切换至$core_new内核\033[0m" - echo -e "\033[33m二者Geo数据库及yaml/json配置文件不通用\033[0m" - read -p "是否保留相关数据库文件?(1/0) > " res + double_line_break + separator_line "=" + content_line "\033[33m已从$core_old内核切换至$core_new内核\033[0m" + content_line "\033[33m二者Geo数据库及yaml/json配置文件不通用\033[0m" + content_line "是否保留相关数据库文件?" + separator_line "-" + content_line "1) 保留" + content_line "0) 不保留" + separator_line "=" + read -r -p "请输入对应标号> " res [ "$res" = '0' ] && { [ "$core_old" = "clash" ] && { geodate='Country.mmdb GeoSite.dat ruleset/*.mrs ruleset/*.yaml ruleset/*.yml' @@ -273,23 +350,33 @@ getcore() { [ -z "$crashcore" ] && crashcore=meta [ -z "$cpucore" ] && check_cpucore [ "$crashcore" = unknow ] && setcoretype - echo "$crashcore" | grep -q 'singbox' && core_new=singbox || core_new=clash + if echo "$crashcore" | grep -q 'singbox'; then + core_new=singbox + else + core_new=clash + fi # 获取在线内核文件 - echo "-----------------------------------------------" - echo "正在在线获取$crashcore核心文件......" + double_line_break + separator_line "=" + content_line "正在在线获取$crashcore核心文件......" core_webget case "$?" in 0) - echo -e "\033[32m$crashcore核心下载成功!\033[0m" + content_line "\033[32m$crashcore核心下载成功!\033[0m" + separator_line "=" sleep 1 switch_core ;; 1) - echo -e "\033[31m核心文件下载失败!\033[0m" + content_line "\033[31m核心文件下载失败!\033[0m" + separator_line "=" [ -z "$custcorelink" ] && error_down ;; *) - echo -e "\033[31m核心文件下载成功但校验失败!请尝试手动指定CPU版本\033[0m" + content_line "\033[31m核心文件下载成功但校验失败\033[0m" + content_line "\033[31m请尝试手动指定CPU版本\033[0m" + separator_line "=" + sleep 1 rm -rf "${TMPDIR}"/core_new rm -rf "${TMPDIR}"/core_new.tar.gz setcpucore @@ -300,27 +387,40 @@ getcore() { checkcustcore() { [ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag" # 通过githubapi获取内核信息 - echo -e "\033[32m正在获取内核文件链接!\033[0m" + double_line_break + separator_line "=" + content_line "\033[32m正在获取内核文件链接......\033[0m" webget "$TMPDIR"/github_api https://api.github.com/repos/"${project}"/releases/"${api_url}" if [ "$?" = 0 ]; then release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') release_date=$(cat "$TMPDIR"/github_api | grep '"published_at":' | awk -F '"' '{print $4}') update_date=$(cat "$TMPDIR"/github_api | grep '"updated_at":' | head -n 1 | awk -F '"' '{print $4}') - [ -n "$(echo "$cpucore" | grep mips)" ] && cpu_type=mips || cpu_type=$cpucore + echo "$cpucore" | grep -q 'mips' && cpu_type=mips || cpu_type=$cpucore cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE "https://github.com/${project}/releases/download.*linux.*${cpu_type}.*\.gz\"$" | sed 's/"//' >"$TMPDIR"/core.list rm -rf "$TMPDIR"/github_api if [ -s "$TMPDIR"/core.list ]; then - echo "-----------------------------------------------" - echo -e "内核版本:\033[36m$release_tag\033[0m" - echo -e "发布时间:\033[33m$release_date\033[0m" - echo -e "更新时间:\033[32m$update_date\033[0m" - echo "-----------------------------------------------" - echo -e "\033[33m请确认内核信息并选择:\033[0m" - cat "$TMPDIR"/core.list | grep -oE "$release_tag.*" | sed 's|.*/||' | awk '{print " "NR" "$1}' - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num + separator_line "=" + + double_line_break + separator_line "=" + content_line "内核版本:\033[36m$release_tag\033[0m" + content_line "发布时间:\033[33m$release_date\033[0m" + content_line "更新时间:\033[32m$update_date\033[0m" + separator_line "-" + content_line "\033[33m请确认内核信息并选择:\033[0m" + separator_line "-" + grep -oE "$release_tag.*" "$TMPDIR/core.list" | + sed 's|.*/||' | + awk '{print NR") "$1}' | + while IFS= read -r line; do + content_line "$line" + done + + content_line "" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in 0) return 0 @@ -340,11 +440,13 @@ checkcustcore() { ;; esac else - echo -e "\033[31m找不到可用内核,可能是作者没有编译相关CPU架构版本的内核文件!\033[0m" + content_line "\033[31m找不到可用内核,可能是作者没有编译相关CPU架构版本的内核文件!\033[0m" + separator_line "=" sleep 1 fi else - echo -e "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m" + content_line "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m" + separator_line "=" sleep 1 fi rm -rf "$TMPDIR"/core.list @@ -354,25 +456,27 @@ checkcustcore() { setcustcore() { while true; do [ -z "$cpucore" ] && check_cpucore - echo "-----------------------------------------------" - echo -e "\033[36m此处内核通常源自互联网采集,此处致谢各位开发者!\033[0m" - echo -e "\033[33m自定义内核未经过完整适配,使用出现问题请自行解决!\033[0m" - echo -e "\033[31m自定义内核已适配定时任务,但不支持小闪存模式!\033[0m" - echo -e "\033[32m如遇到网络错误请先启动ShellCrash服务!\033[0m" + double_line_break + separator_line "=" + content_line "\033[36m此处内核通常源自互联网采集,此处致谢各位开发者!\033[0m" + content_line "\033[33m自定义内核未经过完整适配,使用出现问题请自行解决!\033[0m" + content_line "\033[31m自定义内核已适配定时任务,但不支持小闪存模式!\033[0m" + content_line "\033[32m如遇到网络错误请先启动ShellCrash服务!\033[0m" [ -n "$custcore" ] && { - echo "-----------------------------------------------" - echo -e "当前内核为:\033[36m$custcore\033[0m" + content_line "当前内核为:\033[36m$custcore\033[0m" } - echo "-----------------------------------------------" - echo -e "\033[33m请选择需要使用的核心!\033[0m" - echo -e "1 \033[36mMetaCubeX/mihomo\033[32m@release\033[0m版本官方内核" - echo -e "2 \033[36mvernesong/mihomo\033[32m@alpha\033[0m版本内核(支持Smart策略)" - echo -e "3 \033[36mSagerNet/sing-box\033[32m@release\033[0m版本官方内核" - echo -e "4 Premium-2023.08.17内核(已停止维护)" - echo -e "9 \033[33m自定义内核链接 \033[0m" - echo "-----------------------------------------------" - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num + separator_line "-" + content_line "请选择需要使用的核心:" + separator_line "-" + content_line "1) \033[36mMetaCubeX/mihomo\033[32m@release\033[0m版本官方内核" + content_line "2) \033[36mvernesong/mihomo\033[32m@alpha\033[0m版本内核(支持Smart策略)" + content_line "3) \033[36mSagerNet/sing-box\033[32m@release\033[0m版本官方内核" + content_line "4) Premium-2023.08.17内核(已停止维护)" + content_line "9) \033[33m自定义内核链接 \033[0m" + content_line "" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in "" | 0) break @@ -402,32 +506,46 @@ setcustcore() { checkcustcore ;; 9) - read -p "请输入自定义内核的链接地址(必须是以.tar.gz或.gz结尾的压缩文件) > " link - [ -n "$link" ] && custcorelink="$link" - setcoretype - getcore + double_line_break + separator_line "=" + content_line "请输入自定义内核的链接地址" + content_line "(必须是以.tar.gz或.gz结尾的压缩文件)" + content_line "" + content_line "或者输入 0 返回上级菜单" + separator_line "=" + read -r -p "请输入> " link + if [ "$link" = 0 ]; then + continue + elif [ -n "$link" ]; then + custcorelink="$link" + setcoretype + getcore + fi ;; *) errornum sleep 1 - break ;; esac done } setziptype() { - echo "-----------------------------------------------" - echo -e "请选择内核内核分支及压缩方式:\033[0m" - echo "-----------------------------------------------" - echo -e " 1 \033[36m最简编译release版本,upx压缩\033[0m-不支持Gvisor,Tailscale,Wireguard,NaiveProxy" - echo -e " 2 \033[32m标准编译release版本,tar.gz压缩\033[0m-完整支持脚本全部内置功能" - echo -e " 3 \033[33m完整编译alpha版本,gz压缩\033[0m-占用可能略高,稳定性自测" - echo "-----------------------------------------------" - echo " 0 返回上级菜单" - read -p "请输入对应数字 > " num + double_line_break + separator_line "=" + content_line "请选择内核内核分支及压缩方式:\033[0m" + separator_line "-" + content_line "1) \033[36m最简编译release版本,upx压缩\033[0m" + sub_content_line "不支持Gvisor、Tailscale、Wireguard、NaiveProxy" + content_line "2) \033[32m标准编译release版本,tar.gz压缩\033[0m" + sub_content_line "完整支持脚本全部内置功能" + content_line "3) \033[33m完整编译alpha版本,gz压缩\033[0m" + sub_content_line "占用可能略高,稳定性自测" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in - 0) ;; + "" | 0) ;; 1) zip_type='upx' ;; @@ -439,6 +557,7 @@ setziptype() { ;; *) errornum + sleep 1 ;; esac setconfig zip_type "$zip_type" @@ -452,47 +571,51 @@ setcore() { [ -z "$zip_type" ] && zip_type="tar.gz" echo "$crashcore" | grep -q 'singbox' && core_old=singbox || core_old=clash [ -n "$custcorelink" ] && custcore="$(echo "$custcorelink" | sed 's#.*github.com##; s#/releases/download/#@#; s#-linux.*$##')" - ### - echo "-----------------------------------------------" + + double_line_break + separator_line "=" [ -z "$cpucore" ] && check_cpucore - echo -e "当前内核:\033[42;30m $crashcore \033[47;30m$core_v\033[0m" - echo -e "当前系统处理器架构:\033[32m $cpucore \033[0m" - echo -e "\033[33m请选择需要使用的核心版本!\033[0m" - echo -e "\033[36m如需本地上传,请将.upx .gz .tar.gz文件上传至 /tmp 目录后重新运行crash命令\033[0m" - echo "-----------------------------------------------" - echo -e "1 \033[43;30m Mihomo \033[0m: \033[32m(原meta内核)支持全面\033[0m" - echo -e " >>\033[32m$meta_v \033[33m占用略高\033[0m" - echo -e " 说明文档: \033[36;4mhttps://wiki.metacubex.one\033[0m" - echo -e "2 \033[43;30m SingBoxR \033[0m: \033[32m支持全面\033[0m" - echo -e " >>\033[32m$singboxr_v \033[33m使用reF1nd增强分支\033[0m" - echo -e " 说明文档: \033[36;4mhttps://sing-boxr.dustinwin.us.kg\033[0m" + + content_line "当前内核:\033[42;30m$crashcore\033[47;30m $core_v\033[0m" + content_line "当前系统处理器架构:\033[32m$cpucore\033[0m" + content_line "\033[36m如需本地上传,请将.upx .gz .tar.gz文件上传至 /tmp 目录后重新运行crash命令\033[0m" + separator_line "-" + content_line "\033[33m请选择需要使用的核心版本:\033[0m" + separator_line "-" + content_line "1) \033[43;30mMihomo\033[0m:\033[32m$meta_v \033[32m(原meta内核)支持全面\033[0m \033[33m占用略高\033[0m" + sub_content_line "说明文档:\033[36;4mhttps://wiki.metacubex.one\033[0m" + + content_line "2) \033[43;30mSingBoxR\033[0m:\033[32m$singboxr_v \033[32m支持全面\033[0m \033[33m使用reF1nd增强分支\033[0m" + sub_content_line "说明文档:\033[36;4mhttps://sing-boxr.dustinwin.us.kg\033[0m" + [ "$zip_type" = 'upx' ] && { - echo -e "3 \033[43;30m SingBox \033[0m: \033[32m占用较低\033[0m" - echo -e " >>\033[32m$singbox_v \033[33m不支持providers\033[0m" - echo -e " 说明文档: \033[36;4mhttps://sing-box.sagernet.org\033[0m" + content_line "3) \033[43;30mSingBox\033[0m:\033[32m$singbox_v \033[32m占用较低\033[0m \033[33m不支持providers\033[0m" + sub_content_line "说明文档:\033[36;4mhttps://sing-box.sagernet.org\033[0m" } [ "$zip_type" = 'upx' ] && { - echo -e "4 \033[43;30m Clash \033[0m: \033[32m占用低\033[0m" - echo -e " >>\033[32m$clash_v \033[33m不安全,已停止维护\033[0m" - echo -e " 说明文档: \033[36;4mhttps://lancellc.gitbook.io\033[0m" + content_line "4) \033[43;30mClash\033[0m:\033[32m$clash_v \033[32m占用低\033[0m \033[33m不安全,已停止维护\033[0m" + sub_content_line "说明文档:\033[36;4mhttps://lancellc.gitbook.io\033[0m" } - echo "-----------------------------------------------" - echo -e "5 切换版本分支及压缩方式: \033[32m$zip_type\033[0m" - echo -e "6 \033[36m使用自定义内核\033[0m $custcore" - echo -e "7 \033[32m更新当前内核\033[0m" - echo "-----------------------------------------------" - echo "9 手动指定处理器架构" - echo "-----------------------------------------------" - echo "0 返回上级菜单" - read -p "请输入对应数字 > " num + content_line "5) 切换版本分支及压缩方式:\033[32m$zip_type\033[0m" + content_line "6) \033[36m使用自定义内核\033[0m $custcore" + content_line "7) \033[32m更新当前内核\033[0m" + content_line "9) 手动指定处理器架构" + content_line "" + content_line "0 返回上级菜单" + + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in "" | 0) break ;; 1) [ -d "/jffs" ] && { - echo -e "\033[31mMeta内核使用的GeoSite.dat数据库在华硕设备存在被系统误删的问题,可能无法使用!\033[0m" - sleep 3 + double_line_break + separator_line "=" + content_line "\033[31mMeta内核使用的GeoSite.dat数据库在华硕设备存在被系统误删的问题,可能无法使用!\033[0m" + separator_line "=" + sleep 2 } crashcore=meta custcorelink='' @@ -534,21 +657,21 @@ setcore() { *) errornum sleep 1 - break ;; esac done } -#数据库 -getgeo() { #下载Geo文件 - #生成链接 - echo "-----------------------------------------------" - echo "正在从服务器获取数据库文件......" +# 数据库 +# 下载Geo文件 +getgeo() { + # 生成链接 + double_line_break + separator_line "=" + content_line "正在从服务器获取数据库文件......" get_bin "$TMPDIR"/"${geoname}" bin/geodata/"$geotype" if [ "$?" = "1" ]; then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" + content_line "\033[31m文件下载失败!\033[0m" error_down else echo "$geoname" | grep -Eq '.mrs|.srs|.tar.gz' && { @@ -557,13 +680,19 @@ getgeo() { #下载Geo文件 } if echo "$geoname" | grep -Eq '.tar.gz'; then tar -zxf "$TMPDIR"/"${geoname}" "${tar_para}" -C "$BINDIR"/"${geofile}" >/dev/null - [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf "$TMPDIR"/${geoname} && exit 1 + if [ $? -ne 0 ]; then + content_line "文件解压失败!" + separator_line "=" + sleep 1 + double_line_break + rm -rf "$TMPDIR"/${geoname} + exit 1 + fi rm -rf "$TMPDIR"/${geoname} else mv -f "$TMPDIR"/"${geoname}" "$BINDIR"/"${geofile}""${geoname}" fi - echo "-----------------------------------------------" - echo -e "\033[32m$geotype数据库文件下载成功!\033[0m" + content_line "\033[32m$geotype数据库文件下载成功!\033[0m" geo_v="$(echo "$geotype" | awk -F "." '{print $1}')_v" setconfig "$geo_v" "$GeoIP_v" fi @@ -571,12 +700,12 @@ getgeo() { #下载Geo文件 } getcustgeo() { - echo "-----------------------------------------------" - echo "正在获取数据库文件......" + double_line_break + separator_line "=" + content_line "正在获取数据库文件......" webget "$TMPDIR"/"$geoname" "$custgeolink" if [ "$?" = "1" ]; then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" + content_line "\033[31m文件下载失败!\033[0m" error_down else echo "$geoname" | grep -Eq '.mrs|.srs' && { @@ -585,7 +714,8 @@ getcustgeo() { } mv -f "$TMPDIR"/"${geoname}" "$BINDIR"/"${geofile}""${geoname}" echo "-----------------------------------------------" - echo -e "\033[32m$geotype数据库文件下载成功!\033[0m" + content_line "\033[32m$geotype数据库文件下载成功!\033[0m" + separator_line "=" fi sleep 1 } @@ -594,19 +724,28 @@ checkcustgeo() { while true; do [ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag" [ ! -s "$TMPDIR"/geo.list ] && { - echo -e "\033[32m正在查找可更新的数据库文件!\033[0m" + double_line_break + separator_line "=" + content_line "\033[32m正在查找可更新的数据库文件......\033[0m" + separator_line "=" webget "$TMPDIR"/github_api https://api.github.com/repos/${project}/releases/${api_url} release_tag=$(cat "$TMPDIR"/github_api | grep '"tag_name":' | awk -F '"' '{print $4}') cat "$TMPDIR"/github_api | grep "browser_download_url" | grep -oE 'releases/download.*' | grep -oiE 'geosite.*\.dat"$|country.*\.mmdb"$|.*.mrs|.*.srs' | sed 's|.*/||' | sed 's/"//' >"$TMPDIR"/geo.list rm -rf "$TMPDIR"/github_api } if [ -s "$TMPDIR"/geo.list ]; then - echo -e "请选择需要更新的数据库文件:" - echo "-----------------------------------------------" - cat "$TMPDIR"/geo.list | awk '{print " "NR" "$1}' - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num + + double_line_break + separator_line "=" + content_line "请选择需要更新的数据库文件:" + separator_line "-" + awk '{print NR") "$1}' "$TMPDIR/geo.list" | + while IFS= read -r line; do + content_line "$line" + done + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in "" | 0) break @@ -628,11 +767,13 @@ checkcustgeo() { *) errornum sleep 1 - beak ;; esac else - echo -e "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m" + double_line_break + separator_line "=" + content_line "\033[31m查找失败,请尽量在服务启动后再使用本功能!\033[0m" + separator_line "=" sleep 1 fi done @@ -642,22 +783,34 @@ checkcustgeo() { setcustgeo() { while true; do rm -rf "$TMPDIR"/geo.list - echo "-----------------------------------------------" - echo -e "\033[36m此处数据库均源自互联网采集,此处致谢各位开发者!\033[0m" - echo -e "\033[32m请点击或复制链接前往项目页面查看具体说明!\033[0m" - echo -e "\033[31m自定义数据库不支持定时任务及小闪存模式!\033[0m" - echo -e "\033[33m如遇到网络错误请先启动ShellCrash服务!\033[0m" - echo -e "\033[0m请选择需要更新的数据库项目来源:\033[0m" - echo "-----------------------------------------------" - echo -e " 1 \033[36;4mhttps://github.com/MetaCubeX/meta-rules-dat\033[0m (仅限Clash/Mihomo)" - echo -e " 2 \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m (仅限Clash/Mihomo)" - echo -e " 3 \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m (仅限SingBox-srs)" - echo -e " 4 \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m (仅限Mihomo-mrs)" - echo -e " 5 \033[36;4mhttps://github.com/Loyalsoldier/geoip\033[0m (仅限Clash-GeoIP)" - echo "-----------------------------------------------" - echo -e " 9 \033[33m自定义数据库链接 \033[0m" - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num + double_line_break + separator_line "=" + content_line "\033[36m此处数据库均源自互联网采集,此处致谢各位开发者!\033[0m" + content_line "\033[32m请点击或复制链接前往项目页面查看具体说明!\033[0m" + content_line "\033[31m自定义数据库不支持定时任务及小闪存模式!\033[0m" + content_line "\033[33m如遇到网络错误请先启动ShellCrash服务!\033[0m" + separator_line "-" + content_line "\033[0m请选择需要更新的数据库项目来源:\033[0m" + separator_line "-" + content_line "1) \033[36;4mhttps://github.com/MetaCubeX/meta-rules-dat\033[0m" + sub_content_line "(仅限Clash/Mihomo)" + + content_line "2) \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m" + sub_content_line "(仅限Clash/Mihomo)" + + content_line "3) \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m" + sub_content_line "(仅限SingBox-srs)" + + content_line "4) \033[36;4mhttps://github.com/DustinWin/ruleset_geodata\033[0m" + sub_content_line "(仅限Mihomo-mrs)" + + content_line "5) \033[36;4mhttps://github.com/Loyalsoldier/geoip\033[0m" + sub_content_line "(仅限Clash-GeoIP)" + + content_line "9) \033[33m自定义数据库链接 \033[0m" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in "" | 0) break @@ -688,41 +841,45 @@ setcustgeo() { checkcustgeo ;; 9) - read -p "请输入自定义数据库的链接地址 > " link + double_line_break + read -r -p "请输入自定义数据库的链接地址 > " link [ -n "$link" ] && custgeolink="$link" getgeo ;; *) errornum sleep 1 - break ;; esac done } + setgeo() { while true; do + double_line_break . $CFG_PATH >/dev/null [ -n "$cn_mini_v" ] && geo_type_des=精简版 || geo_type_des=全球版 - echo "-----------------------------------------------" - echo -e "\033[36m请选择需要更新的Geo数据库文件:\033[0m" - echo -e "\033[36mMihomo内核和SingBox内核的数据库文件不通用\033[0m" - echo -e "在线数据库最新版本(每日同步上游):\033[32m$GeoIP_v\033[0m" - echo "-----------------------------------------------" - echo -e " 1 CN-IP绕过文件(约0.1mb) \033[33m$china_ip_list_v\033[0m" - echo -e " 2 CN-IPV6绕过文件(约30kb) \033[33m$china_ipv6_list_v\033[0m" - echo "-----------------------------------------------" - echo -e " 3 Mihomo精简版GeoIP_cn数据库(约0.1mb) \033[33m$cn_mini_v\033[0m" - echo -e " 4 Mihomo完整版GeoSite数据库(约5mb) \033[33m$geosite_v\033[0m" - echo "-----------------------------------------------" - echo -e " 5 Mihomo-mrs数据库常用包(约1mb,非必要勿用)" - echo -e " 6 Singbox-srs数据库常用包(约0.8mb,非必要勿用)" - echo "-----------------------------------------------" - echo -e " 8 \033[32m自定义数据库文件\033[0m" - echo -e " 9 \033[31m清理数据库文件\033[0m" - echo " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应数字 > " num + separator_line "=" + content_line "\033[33m注意:Mihomo内核和SingBox内核的数据库文件不通用\033[0m" + content_line "在线数据库最新版本(每日同步上游):\033[32m$GeoIP_v\033[0m" + separator_line "-" + content_line "请选择需要更新的Geo数据库文件:" + separator_line "-" + content_line "1) CN-IP绕过文件(约0.1mb) \033[33m$china_ip_list_v\033[0m" + content_line "2) CN-IPV6绕过文件(约30kb) \033[33m$china_ipv6_list_v\033[0m" + content_line "" + content_line "3) Mihomo精简版GeoIP_cn数据库(约0.1mb) \033[33m$cn_mini_v\033[0m" + content_line "4) Mihomo完整版GeoSite数据库(约5mb) \033[33m$geosite_v\033[0m" + content_line "" + content_line "5) Mihomo-mrs数据库常用包(约1mb,非必要勿用)" + content_line "6) Singbox-srs数据库常用包(约0.8mb,非必要勿用)" + content_line "" + content_line "8) \033[36m自定义数据库文件\033[0m" + content_line "9) \033[31m清理数据库文件\033[0m" + content_line "" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in "" | 0) break @@ -761,49 +918,74 @@ setgeo() { setcustgeo ;; 9) - echo "-----------------------------------------------" - echo -e "\033[33m这将清理$CRASHDIR目录及/ruleset目录下所有数据库文件!\033[0m" - echo -e "\033[36m清理后启动服务即可自动下载所需文件~\033[0m" - echo "-----------------------------------------------" - read -p "确认清理?[1/0] > " res - [ "$res" = '1' ] && { - for file in cn_ip.txt cn_ipv6.txt Country.mmdb GeoSite.dat geoip.db geosite.db; do - rm -rf $CRASHDIR/$file - done - for var in Country_v cn_mini_v china_ip_list_v china_ipv6_list_v geosite_v geoip_cn_v geosite_cn_v mrs_geosite_cn_v srs_geoip_cn_v srs_geosite_cn_v mrs_v srs_v; do - setconfig $var - done - rm -rf "$CRASHDIR"/ruleset/* - echo -e "\033[33m所有数据库文件均已清理!\033[0m" - sleep 1 - } + while true; do + double_line_break + separator_line "=" + content_line "\033[33m这将清理$CRASHDIR目录及/ruleset目录下所有数据库文件!\033[0m" + content_line "清理后启动服务即可自动下载所需文件" + separator_line "-" + content_line "1) 确认清理" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " res + case "$res" in + "" | 0) + break + ;; + 1) + for file in cn_ip.txt cn_ipv6.txt Country.mmdb GeoSite.dat geoip.db geosite.db; do + rm -rf $CRASHDIR/$file + done + for var in Country_v cn_mini_v china_ip_list_v china_ipv6_list_v geosite_v geoip_cn_v geosite_cn_v mrs_geosite_cn_v srs_geoip_cn_v srs_geosite_cn_v mrs_v srs_v; do + setconfig $var + done + rm -rf "$CRASHDIR"/ruleset/* + double_line_break + separator_line "=" + content_line "\033[33m所有数据库文件均已清理!\033[0m" + separator_line "=" + sleep 1 + break + ;; + *) + errornum + sleep 1 + ;; + esac + done ;; *) errornum sleep 1 - break ;; esac done } -#Dashboard +# Dashboard getdb() { dblink="${update_url}/" - echo "-----------------------------------------------" - echo "正在连接服务器获取安装文件…………" + double_line_break + separator_line "=" + content_line "正在连接服务器获取安装文件......" get_bin "$TMPDIR"/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz if [ "$?" = "1" ]; then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" - echo "-----------------------------------------------" + content_line "\033[31m文件下载失败!\033[0m" error_down return 1 else - echo -e "\033[33m下载成功,正在解压文件!\033[0m" + content_line "\033[33m下载成功,正在解压文件......\033[0m" mkdir -p "$dbdir" >/dev/null tar -zxf "$TMPDIR/clashdb.tar.gz" "${tar_para}" -C "$dbdir" >/dev/null - [ $? -ne 0 ] && echo "文件解压失败!" && rm -rf "$TMPDIR"/clashfm.tar.gz && exit 1 + if [ $? -ne 0 ]; then + content_line "文件解压失败!" + separator_line "=" + double_line_break + sleep 1 + rm -rf "$TMPDIR"/clashfm.tar.gz + exit 1 + fi + #修改默认host和端口 if [ "$db_type" = "clashdb" -o "$db_type" = "meta_db" -o "$db_type" = "zashboard" ]; then sed -i "s/127.0.0.1/${host}/g" "$dbdir"/assets/*.js @@ -815,37 +997,49 @@ getdb() { fi #写入配置文件 setconfig hostdir "'$hostdir'" - echo "-----------------------------------------------" - echo -e "\033[32m面板安装成功!\033[36m如未生效,请使用【Ctrl+F5】强制刷新浏览器!!!\033[0m" + content_line "\033[32m面板安装成功!\033[0m" + content_line "\033[36m如未生效,请使用【Ctrl+F5】强制刷新浏览器!\033[0m" + separator_line "=" + sleep 1 rm -rf "$TMPDIR"/clashdb.tar.gz fi sleep 1 } dbdir() { - if [ -f /www/clash/CNAME -o -f "$CRASHDIR"/ui/CNAME ]; then - echo "-----------------------------------------------" - echo -e "\033[31m检测到您已经安装过本地面板了!\033[0m" - echo "-----------------------------------------------" - read -p "是否升级/覆盖安装?[1/0] > " res + double_line_break + separator_line "=" + if [ -f /www/clash/CNAME ] || [ -f "$CRASHDIR"/ui/CNAME ]; then + content_line "\033[33m检测到已经安装过本地面板\033[0m" + separator_line "-" + content_line "请选择操作:" + separator_line "-" + content_line "1) 升级/覆盖安装" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " res if [ "$res" = 1 ]; then rm -rf "$BINDIR"/ui [ -f /www/clash/CNAME ] && rm -rf /www/clash && dbdir=/www/clash [ -f "$CRASHDIR"/ui/CNAME ] && rm -rf "$CRASHDIR"/ui && dbdir="$CRASHDIR"/ui getdb else - echo -e "\033[33m安装已取消!\033[0m" + double_line_break + separator_line "=" + separator_line "\033[33m安装已取消\033[0m" + separator_line "=" return 1 fi - elif [ -w /www -a -n "$(pidof nginx)" ]; then - echo "-----------------------------------------------" - echo -e "请选择面板\033[33m安装目录:\033[0m" - echo "-----------------------------------------------" - echo -e " 1 在${CRASHDIR}/ui目录安装" - echo -e " 2 在/www/clash目录安装" - echo "-----------------------------------------------" - echo " 0 返回上级菜单" - read -p "请输入对应数字 > " num + + elif [ -w /www ] && [ -n "$(pidof nginx)" ]; then + separator_line "请选择面板\033[33m安装目录:\033[0m" + separator_line "-" + content_line " 1) 在${CRASHDIR}/ui目录安装" + content_line " 2) 在/www/clash目录安装" + content_line "" + separator_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in "" | 0) return 0 @@ -875,26 +1069,29 @@ dbdir() { setdb() { while true; do - separator_line "=" - content_line "\033[36m安装 dashboard 管理面板到本地\033[0m" - content_line "\033[32m打开管理面板的速度更快且更稳定\033[0m" - separator_line "-" + double_line_break + separator_line "=" + content_line "\033[36m安装 dashboard 管理面板到本地\033[0m" + content_line "\033[32m打开管理面板的速度更快且更稳定\033[0m" + separator_line "-" + content_line "请选择面板安装类型:" + separator_line "-" + content_line " - - - - - - -维护中- - - - - - -" + content_line "1) 安装\033[32mzashboard面板\033[0m(约2.2mb)" + content_line "2) 安装\033[32mMetaXD面板\033[0m(约1.5mb)" + content_line "3) 安装\033[32mYacd-Meta魔改面板\033[0m(约1.7mb)" + content_line "" + content_line " - - - - - -已停止维护- - - - - -" + content_line "4) 安装\033[32m基础面板\033[0m(约500kb)" + content_line "5) 安装\033[32mMeta基础面板\033[0m(约800kb)" + content_line "6) 安装\033[32mYacd面板\033[0m(约1.1mb)" + content_line "" + content_line "9) \033[31m卸载本地面板\033[0m" + content_line "" + content_line "0) 返回上级菜单" + separator_line "=" - content_line "请选择面板\033[33m安装类型:\033[0m" - content_line " - - - - - - -维护中- - - - - - -" - content_line "1) 安装\033[32mzashboard面板\033[0m(约2.2mb)" - content_line "2) 安装\033[32mMetaXD面板\033[0m(约1.5mb)" - content_line "3) 安装\033[32mYacd-Meta魔改面板\033[0m(约1.7mb)" - content_line " - - - - - -已停止维护- - - - - -" - content_line "4) 安装\033[32m基础面板\033[0m(约500kb)" - content_line "5) 安装\033[32mMeta基础面板\033[0m(约800kb)" - content_line "6) 安装\033[32mYacd面板\033[0m(约1.1mb)" - content_line "" - content_line "9) 卸载\033[33m本地面板\033[0m" - content_line "0) 返回上级菜单" - separator_line "=" - - read -p "请输入对应数字 > " num + read -r -p "请输入对应标号> " num case "$num" in "" | 0) break @@ -926,36 +1123,56 @@ setdb() { dbdir ;; 9) - read -p "确认卸载本地面板?(1/0) > " res - if [ "$res" = 1 ]; then - rm -rf /www/clash - rm -rf "$CRASHDIR"/ui - rm -rf "$BINDIR"/ui - echo "-----------------------------------------------" - echo -e "\033[31m面板已经卸载!\033[0m" - sleep 1 - fi + while true; do + double_line_break + separator_line "=" + content_line "是否卸载本地面板:" + separator_line "-" + content_line "1) 确认卸载" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " res + case "$res" in + "" | 0) + break + ;; + 1) + rm -rf /www/clash + rm -rf "$CRASHDIR"/ui + rm -rf "$BINDIR"/ui + + double_line_break + separator_line "=" + content_line "\033[31m面板已经卸载!\033[0m" + separator_line "=" + sleep 1 + break + ;; + *) + errornum + sleep 1 + ;; + esac + done ;; *) errornum sleep 1 - break ;; esac done } -#根证书 +# 根证书 getcrt() { - echo "-----------------------------------------------" - echo "正在连接服务器获取安装文件......" - get_bin "$TMPDIR"/ca-certificates.crt bin/fix/ca-certificates.crt + double_line_break + separator_line "=" + content_line "正在连接服务器获取安装文件......" + get_bin "$TMPDIR"/ca-certificates.crt bin/fix/ca-certificates.crt echooff if [ "$?" = "1" ]; then - echo "-----------------------------------------------" - echo -e "\033[31m文件下载失败!\033[0m" + content_line "\033[31m文件下载失败!\033[0m" error_down else - echo "-----------------------------------------------" [ "$systype" = 'mi_snapshot' ] && cp -f "$TMPDIR"/ca-certificates.crt "$CRASHDIR"/tools #镜像化设备特殊处理 [ -f "$openssldir"/certs ] && rm -rf "$openssldir"/certs #如果certs不是目录而是文件则删除并创建目录 mkdir -p "$openssldir"/certs @@ -965,40 +1182,67 @@ getcrt() { export CURL_CA_BUNDLE="$crtdir" echo "export CURL_CA_BUNDLE=$crtdir" >>/etc/profile fi - echo -e "\033[32m证书安装成功!\033[0m" + content_line "\033[32m证书安装成功!\033[0m" + separator_line "=" sleep 1 fi } -setcrt() { - openssldir="$(openssl version -d 2>&1 | awk -F '"' '{print $2}')" - if [ -d "$openssldir/certs/" ]; then - crtdir="$openssldir/certs/ca-certificates.crt" - else - crtdir="/etc/ssl/certs/ca-certificates.crt" - fi - if [ -n "$openssldir" ]; then - echo "-----------------------------------------------" - echo -e "\033[36m安装/更新本地根证书文件(ca-certificates.crt)\033[0m" - echo -e "\033[33m用于解决证书校验错误,x509报错等问题\033[0m" - echo -e "\033[31m无上述问题的设备请勿使用!\033[0m" - echo "-----------------------------------------------" - [ -f "$crtdir" ] && echo -e "\033[33m检测到系统已经存在根证书文件($crtdir)了!\033[0m\n-----------------------------------------------" - read -p "是否覆盖更新?(1/0) > " res - if [ -z "$res" ]; then - errornum - elif [ "$res" = '0' ]; then - i= - elif [ "$res" = '1' ]; then - getcrt +setcrt() { + while true; do + openssldir="$(openssl version -d 2>&1 | awk -F '"' '{print $2}')" + if [ -d "$openssldir/certs/" ]; then + crtdir="$openssldir/certs/ca-certificates.crt" else - errornum + crtdir="/etc/ssl/certs/ca-certificates.crt" fi - else - echo "-----------------------------------------------" - echo -e "\033[33m设备可能尚未安装openssl,无法安装证书文件!\033[0m" - sleep 1 - fi + + if [ -n "$openssldir" ]; then + double_line_break + separator_line "=" + content_line "安装/更新本地根证书文件(ca-certificates.crt)" + content_line "\033[33m用于解决证书校验错误,x509报错等问题\033[0m" + content_line "\033[31m无上述问题的设备请勿使用!\033[0m" + if [ -f "$crtdir" ]; then + content_line "" + content_line "\033[33m检测到系统已经存在根证书文件:\033[0m" + content_line "\033[33m($crtdir)\033[0m" + fi + separator_line "-" + + if [ -f "$crtdir" ]; then + content_line "1) 覆盖更新" + else + content_line "1) 立即安装" + fi + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " res + case "$res" in + "" | 0) + break + ;; + 1) + getcrt + break + ;; + *) + errornum + sleep 1 + continue + ;; + esac + + else + double_line_break + separator_line "=" + content_line "\033[33m设备可能尚未安装openssl,无法安装证书文件!\033[0m" + separator_line "=" + sleep 1 + break + fi + + done } # 写入配置文件 @@ -1007,13 +1251,16 @@ saveserver() { setconfig url_id "$url_id" setconfig release_type "$release_type" version_new='' - echo "-----------------------------------------------" - echo -e "\033[32m源地址切换成功!\033[0m" + double_line_break + separator_line "=" + content_line "\033[32m源地址切换成功!\033[0m" + separator_line "=" } # 安装源 setserver() { while true; do + double_line_break [ -z "$release_type" ] && release_name=未指定 [ -n "$release_type" ] && release_name="$release_type(回退)" [ "$release_type" = stable ] && release_name=稳定版 @@ -1021,21 +1268,30 @@ setserver() { [ "$release_type" = dev ] && release_name=开发版 [ -n "$url_id" ] && url_name=$(grep "$url_id" "$CRASHDIR"/configs/servers.list 2>/dev/null | awk '{print $2}') || url_name="$update_url" - echo "-----------------------------------------------" - echo -e "\033[30;47m切换ShellCrash版本及更新源地址\033[0m" - echo -e "当前版本:\033[4;33m$release_name\033[0m 当前源:\033[4;32m$url_name\033[0m" - echo "-----------------------------------------------" - grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$2}' - echo "-----------------------------------------------" - echo -e " a 切换至\033[32m稳定版-stable\033[0m" - echo -e " b 切换至\033[36m公测版-master\033[0m" - echo -e " c 切换至\033[33m开发版-dev\033[0m" - echo "-----------------------------------------------" - echo -e " d 自定义源地址(用于本地源或自建源)" - echo -e " e \033[31m版本回退\033[0m" - echo -e " 0 返回上级菜单" - echo "-----------------------------------------------" - read -p "请输入对应字母或数字 > " num + separator_line "=" + content_line "\033[30;47m切换ShellCrash版本及更新源地址\033[0m" + separator_line "-" + content_line "当前版本:\033[4;33m$release_name\033[0m" + content_line "当前源:\033[4;32m$url_name\033[0m" + separator_line "-" + + grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | + awk '{print NR") "$2}' | + while IFS= read -r line; do + content_line "$line" + done + + content_line + content_line "a) 切换至\033[32m稳定版-stable\033[0m" + content_line "b) 切换至\033[36m公测版-master\033[0m" + content_line "c) 切换至\033[33m开发版-dev\033[0m" + content_line + content_line "d) 自定义源地址(用于本地源或自建源)" + content_line "e) \033[31m版本回退\033[0m" + content_line + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " num case "$num" in "" | 0) checkupdate=false @@ -1071,60 +1327,97 @@ setserver() { saveserver ;; c) - echo "-----------------------------------------------" - echo -e "\033[33m开发版未经过妥善测试,可能依然存在大量bug!!!\033[0m" - echo -e "\033[36m如果你没有足够的耐心或者测试经验,切勿使用此版本!\033[0m" - echo -e "请务必加入我们的讨论组:\033[32;4mhttps://t.me/ShellClash\033[0m" - read -p "是否依然切换到开发版?(1/0) > " res - if [ "$res" = 1 ]; then - release_type=dev - [ -z "$url_id" ] && url_id=101 - saveserver - fi + while true; do + double_line_break + separator_line "=" + content_line "\033[33m开发版未经过妥善测试,可能依然存在大量bug!!!\033[0m" + content_line "\033[33m如果你没有足够的耐心或者测试经验,切勿使用此版本!\033[0m" + content_line "请务必加入我们的讨论组:\033[36;4mhttps://t.me/ShellClash\033[0m" + separator_line "-" + content_line "是否依然切换到开发版:" + separator_line "-" + content_line "1) 确认切换" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "请输入对应标号> " res + case "$res" in + "" | 0) + break + ;; + 1) + release_type=dev + [ -z "$url_id" ] && url_id=101 + saveserver + break + ;; + *) + errornum + sleep 1 + ;; + esac + done ;; d) - echo "-----------------------------------------------" - read -p "请输入个人源路径 > " update_url - if [ -z "$update_url" ]; then - echo "-----------------------------------------------" - echo -e "\033[31m取消输入,返回上级菜单\033[0m" - else + double_line_break + separator_line "=" + content_line "请直接输入个人源路径" + content_line "" + content_line "或者输入 0 返回上级菜单" + separator_line "=" + read -r -p "请输入个人源路径> " update_url + if [ "$update_url" = 0 ]; then + continue + elif [ ! -z "$update_url" ]; then url_id='' release_type='' saveserver fi ;; e) - echo "-----------------------------------------------" + double_line_break + separator_line "=" if [ -n "$url_id" ] && [ "$url_id" -lt 200 ]; then - echo -ne "\033[32m正在获取版本信息!\033[0m\r" + content_line "\033[32m正在获取版本信息......\033[0m" get_bin "$TMPDIR"/release_version bin/release_version if [ "$?" = "0" ]; then - echo -e "\033[31m请选择想要回退至的稳定版版本:\033[0m" - cat "$TMPDIR"/release_version | awk '{print " "NR" "$1}' - echo -e " 0 返回上级菜单" - read -p "请输入对应数字 > " num - if [ -z "$num" -o "$num" = 0 ]; then + content_line "\033[32m获取版本信息成功\033[0m" + separator_line "=" + + double_line_break + separator_line "=" + content_line "\033[31m请选择想要回退至的稳定版版本:\033[0m" + + cat "$TMPDIR"/release_version | + awk '{print NR") "$1}' | + while IFS= read -r line; do + content_line "$line" + done + + content_line + content_line "0) 返回上级菜单" + read -r -p "请输入对应标号> " num + if [ -z "$num" ] || [ "$num" = 0 ]; then continue elif [ "$num" -le $(cat "$TMPDIR"/release_version 2>/dev/null | awk 'END{print NR}') ]; then release_type=$(cat "$TMPDIR"/release_version | awk '{print $1}' | sed -n "$num"p) update_url='' saveserver else - echo "-----------------------------------------------" errornum sleep 1 continue fi else - echo "-----------------------------------------------" - echo -e "\033[31m版本回退信息获取失败,请尝试更换其他安装源!\033[0m" + content_line "\033[31m版本回退信息获取失败,请尝试更换其他安装源!\033[0m" + separator_line "=" sleep 1 continue fi rm -rf "$TMPDIR"/release_version else - echo -e "\033[31m当前源不支持版本回退,请尝试更换其他安装源!\033[0m" + content_line "\033[31m当前源不支持版本回退\033[0m" + content_line "\033[31m请尝试更换其他安装源!\033[0m" + separator_line "=" sleep 1 continue fi @@ -1132,7 +1425,6 @@ setserver() { *) errornum sleep 1 - break ;; esac done From 83139a4936dd6e8d82f6dbb0e21a0cce2ad26f91 Mon Sep 17 00:00:00 2001 From: sofia <253282481+sofia-riese@users.noreply.github.com> Date: Tue, 20 Jan 2026 09:52:20 +0800 Subject: [PATCH 2/2] Update 9_upgrade.sh --- scripts/menus/9_upgrade.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/menus/9_upgrade.sh b/scripts/menus/9_upgrade.sh index 8bf6c436..3fba2299 100644 --- a/scripts/menus/9_upgrade.sh +++ b/scripts/menus/9_upgrade.sh @@ -713,7 +713,6 @@ getcustgeo() { [ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset } mv -f "$TMPDIR"/"${geoname}" "$BINDIR"/"${geofile}""${geoname}" - echo "-----------------------------------------------" content_line "\033[32m$geotype数据库文件下载成功!\033[0m" separator_line "=" fi