Files
ShellCrash/scripts/menus/upgrade.sh
2025-12-21 22:11:05 +08:00

1080 lines
38 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# Copyright (C) Juewuy
. "$CRASHDIR"/libs/check_dir_avail.sh
error_down(){
echo -e "\033[33m请尝试切换至其他安装源后重新下载\033[0m"
echo -e "或者参考 \033[32;4mhttps://juewuy.github.io/bdaz\033[0m 进行本地安装!"
sleep 1
}
#主界面
upgrade(){
echo "-----------------------------------------------"
echo -ne "\033[32m正在检查更新\033[0m\r"
checkupdate
[ -z "$core_v" ] && core_v=$crashcore
core_v_new=$(eval echo \$"$crashcore"_v)
echo -e "\033[30;47m欢迎使用更新功能\033[0m"
echo "-----------------------------------------------"
echo -e "当前目录(\033[32m$CRASHDIR\033[0m)剩余空间:\033[36m$(dir_avail "$CRASHDIR" -h)\033[0m"
[ "$(dir_avail "$CRASHDIR")" -le 5120 ] && [ "$CRASHDIR" = "$BINDIR" ] && {
echo -e "\033[33m当前目录剩余空间较低建议开启小闪存模式\033[0m"
sleep 1
}
echo "-----------------------------------------------"
echo -e " 1 更新\033[36m管理脚本 \033[33m$versionsh_l\033[0m > \033[32m$version_new \033[36m$release_type\033[0m"
echo -e " 2 切换\033[33m内核文件 \033[33m$core_v\033[0m > \033[32m$core_v_new\033[0m"
echo -e " 3 更新\033[32m数据库文件\033[0m > \033[32m$GeoIP_v\033[0m"
echo -e " 4 安装本地\033[35mDashboard\033[0m面板"
echo -e " 5 安装/更新本地\033[33m根证书文件\033[0m"
echo -e " 6 查看\033[32mPAC\033[0m自动代理配置"
echo "-----------------------------------------------"
echo -e " 7 切换\033[36m安装源\033[0m及\033[36m安装版本\033[0m"
echo -e " 8 \033[32m配置自动更新\033[0m"
echo -e " 9 \033[31m卸载ShellCrash\033[0m"
echo "-----------------------------------------------"
echo -e "99 \033[36m鸣谢\033[0m"
echo "-----------------------------------------------"
echo -e " 0 返回上级菜单"
echo "-----------------------------------------------"
read -p "请输入对应数字 > " num
case "$num" in
0)
;;
1)
setscripts
;;
2)
setcore
upgrade
;;
3)
setgeo
upgrade
;;
4)
setdb
upgrade
;;
5)
setcrt
upgrade
;;
6)
echo "-----------------------------------------------"
echo -e "PAC配置链接为\033[30;47m http://$host:$db_port/ui/pac \033[0m"
echo -e "PAC的使用教程请参考\033[4;32mhttps://juewuy.github.io/ehRUeewcv\033[0m"
sleep 2
upgrade
;;
7)
setserver
upgrade
;;
8)
. "$CRASHDIR"/task/task.sh && task_add
upgrade
;;
9)
uninstall
exit
;;
99)
echo "-----------------------------------------------"
echo -e "感谢:\033[32mClash项目 \033[0m作者\033[36m Dreamacro\033[0m"
echo -e "感谢:\033[32msing-box项目 \033[0m作者\033[36m SagerNet\033[0m 项目地址:\033[32mhttps://github.com/SagerNet/sing-box\033[0m"
echo -e "感谢:\033[32mMetaCubeX项目 \033[0m作者\033[36m MetaCubeX\033[0m 项目地址:\033[32mhttps://github.com/MetaCubeX\033[0m"
echo -e "感谢:\033[32mYACD面板项目 \033[0m作者\033[36m haishanh\033[0m 项目地址:\033[32mhttps://github.com/haishanh/yacd\033[0m"
echo -e "感谢:\033[32mzashboard项目 \033[0m作者\033[36m Zephyruso\033[0m 项目地址:\033[32mhttps://github.com/Zephyruso/zashboard\033[0m"
echo -e "感谢:\033[32mSubconverter \033[0m作者\033[36m tindy2013\033[0m 项目地址:\033[32mhttps://github.com/tindy2013/subconverter\033[0m"
echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m PuerNya\033[0m 项目地址:\033[32mhttps://github.com/PuerNya/sing-box\033[0m"
echo -e "感谢:\033[32msing-box分支项目 \033[0m作者\033[36m reF1nd\033[0m 项目地址:\033[32mhttps://github.com/reF1nd/sing-box\033[0m"
echo -e "感谢:\033[32mDustinWin相关项目 \033[0m作者\033[36m DustinWin\033[0m 作者地址:\033[32mhttps://github.com/DustinWin\033[0m"
echo "-----------------------------------------------"
echo -e "特别感谢:\033[36m所有帮助及赞助过此项目的同仁们\033[0m"
echo "-----------------------------------------------"
sleep 2
upgrade
;;
*)
errornum
;;
esac
}
#检查更新
checkupdate(){
"$CRASHDIR"/start.sh get_bin "$TMPDIR"/version_new version echooff
[ "$?" = "0" ] && {
version_new=$(cat "$TMPDIR"/version_new)
"$CRASHDIR"/start.sh get_bin "$TMPDIR"/version_new bin/version echooff
}
if [ "$?" = "0" ];then
. "$TMPDIR"/version_new 2>/dev/null
else
echo -e "\033[31m检查更新失败请尝试切换其他安装源\033[0m"
setserver
[ "$checkupdate" = false ] || checkupdate
fi
rm -rf "$TMPDIR"/version_new
}
#更新脚本
getscripts(){
"$CRASHDIR"/start.sh get_bin "$TMPDIR"/ShellCrash.tar.gz ShellCrash.tar.gz
if [ "$?" != "0" ];then
echo -e "\033[33m文件下载失败\033[0m"
error_down
else
"$CRASHDIR"/start.sh stop 2>/dev/null
#解压
echo "-----------------------------------------------"
echo "开始解压文件!"
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"
error_down
else
. "$CRASHDIR"/init.sh >/dev/null
echo -e "\033[32m脚本更新成功\033[0m"
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
}
#更新内核
getcpucore(){ #自动获取内核架构
cputype=$(uname -ms | tr ' ' '_' | tr '[A-Z]' '[a-z]')
[ -n "$(echo $cputype | grep -E "linux.*armv.*")" ] && cpucore="armv5"
[ -n "$(echo $cputype | grep -E "linux.*armv7.*")" ] && [ -n "$(cat /proc/cpuinfo | grep vfp)" ] && [ ! -d /jffs ] && cpucore="armv7"
[ -n "$(echo $cputype | grep -E "linux.*aarch64.*|linux.*armv8.*")" ] && cpucore="arm64"
[ -n "$(echo $cputype | grep -E "linux.*86.*")" ] && cpucore="386"
[ -n "$(echo $cputype | grep -E "linux.*86_64.*")" ] && cpucore="amd64"
if [ -n "$(echo $cputype | grep -E "linux.*mips.*")" ];then
mipstype=$(echo -n I | hexdump -o 2>/dev/null | awk '{ print substr($2,6,1); exit}') #通过判断大小端判断mips或mipsle
[ "$mipstype" = "0" ] && cpucore="mips-softfloat" || cpucore="mipsle-softfloat"
fi
[ -n "$cpucore" ] && setconfig cpucore $cpucore
}
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
[ -n "$num" ] && setcpucore=$(echo $cpucore_list | awk '{print $"'"$num"'"}' )
if [ -z "$setcpucore" ];then
echo -e "\033[31m请输入正确的处理器架构\033[0m"
sleep 1
cpucore=""
else
cpucore=$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
}
switch_core(){ #clash与singbox内核切换
#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 fake-ip #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
[ "$res" = '0' ] && {
[ "$core_old" = "clash" ] && {
geodate='Country.mmdb GeoSite.dat ruleset/*.mrs ruleset/*.yaml ruleset/*.yml'
geodate_v='Country_v cn_mini_v geosite_v mrs_geosite_cn_v'
}
[ "$core_old" = "singbox" ] && {
geodate='geoip.db geosite.db ruleset/*.srs ruleset/*.json'
geodate_v='geoip_cn_v geosite_cn_v srs_geoip_cn_v srs_geosite_cn_v'
}
for text in ${geodate} ;do
rm -rf "$CRASHDIR"/${text}
done
for text in ${geodate_v} ;do
setconfig "$text"
done
}
}
if echo "$crashcore" | grep -q 'singbox';then
COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"'
else
COMMAND='"$TMPDIR/CrashCore -d $BINDIR -f $TMPDIR/config.yaml"'
fi
setconfig COMMAND "$COMMAND" "$CRASHDIR"/configs/command.env && . "$CRASHDIR"/configs/command.env
}
getcore(){ #下载内核文件
[ -z "$crashcore" ] && crashcore=meta
[ -z "$cpucore" ] && getcpucore
echo "$crashcore" | grep -q 'singbox' && core_new=singbox || core_new=clash
#获取在线内核文件
echo "-----------------------------------------------"
echo "正在在线获取$crashcore核心文件……"
if [ -n "$custcorelink" ];then
zip_type=$(echo $custcorelink | grep -oE 'tar.gz$')
[ -z "$zip_type" ] && zip_type=$(echo $custcorelink | grep -oE 'gz$')
if [ -n "$zip_type" ];then
"$CRASHDIR"/start.sh webget "$TMPDIR"/core_new.${zip_type} "$custcorelink"
else
echo -e "\033[31m链接不是以.tar.gz或.gz结尾下载已取消\033[0m"
exit
fi
else
"$CRASHDIR"/start.sh get_bin "$TMPDIR"/core_new.tar.gz bin/${crashcore}/${core_new}-linux-${cpucore}.tar.gz
fi
if [ "$?" = "1" ];then
echo -e "\033[31m核心文件下载失败\033[0m"
rm -rf "$TMPDIR"/core_new.tar.gz
[ -z "$custcorelink" ] && error_down
else
[ -n "$(pidof CrashCore)" ] && {
"$CRASHDIR"/start.sh stop #停止内核服务防止内存不足
rm -rf "$TMPDIR"/CrashCore #删除缓存内核防止缓存空间不足
}
[ -f "$TMPDIR"/core_new.tar.gz ] && {
mkdir -p "$TMPDIR"/core_tmp
[ "$BINDIR" = "$TMPDIR" ] && rm -rf "$TMPDIR"/CrashCore #小闪存模式防止空间不足
tar -zxf ""$TMPDIR"/core_new.tar.gz" ${tar_para} -C "$TMPDIR"/core_tmp/
for file in $(find "$TMPDIR"/core_tmp 2>/dev/null);do
[ -f $file ] && [ -n "$(echo $file | sed 's#.*/##' | grep -iE '(CrashCore|sing|meta|mihomo|clash|premium)')" ] && mv -f $file "$TMPDIR"/core_new
done
rm -rf "$TMPDIR"/core_tmp
}
[ -f "$TMPDIR"/core_new.gz ] && gunzip "$TMPDIR"/core_new.gz && rm -rf "$TMPDIR"/core_new.gz
chmod +x "$TMPDIR"/core_new
[ "$crashcore" = unknow ] && setcoretype
if echo "$crashcore" | grep -q 'singbox';then
core_v=$("$TMPDIR"/core_new version 2>/dev/null | grep version | awk '{print $3}')
else
core_v=$("$TMPDIR"/core_new -v 2>/dev/null | head -n 1 | sed 's/ linux.*//;s/.* //')
fi
if [ -z "$core_v" ];then
echo -e "\033[31m核心文件下载成功但校验失败请尝试手动指定CPU版本\033[0m"
rm -rf "$TMPDIR"/core_new
rm -rf "$TMPDIR"/core_new.tar.gz
setcpucore
else
echo -e "\033[32m$crashcore核心下载成功\033[0m"
sleep 1
mv -f "$TMPDIR"/core_new "$TMPDIR"/CrashCore
if [ -f "$TMPDIR"/core_new.tar.gz ];then
mv -f "$TMPDIR"/core_new.tar.gz "$BINDIR"/CrashCore.tar.gz
else
tar -zcf "$BINDIR"/CrashCore.tar.gz ${tar_para} -C "$TMPDIR" CrashCore
fi
setconfig crashcore $crashcore
setconfig core_v $core_v
setconfig custcorelink $custcorelink
switch_core
fi
fi
}
setcustcore(){ #自定义内核
checkcustcore(){
[ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag"
#通过githubapi获取内核信息
echo -e "\033[32m正在获取内核文件链接\033[0m"
"$CRASHDIR"/start.sh 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
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
case "$num" in
0)
setcustcore
;;
[1-9]|[1-9][0-9])
if [ "$num" -le "$(wc -l < "$TMPDIR"/core.list)" ];then
custcorelink=$(sed -n "$num"p "$TMPDIR"/core.list)
getcore
else
errornum
fi
;;
*)
errornum
;;
esac
else
echo -e "\033[31m找不到可用内核可能是作者没有编译相关CPU架构版本的内核文件\033[0m"
sleep 1
fi
else
echo -e "\033[31m查找失败请尽量在服务启动后再使用本功能\033[0m"
sleep 1
fi
rm -rf "$TMPDIR"/core.list
}
[ -z "$cpucore" ] && getcpucore
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"
[ -n "$custcore" ] && {
echo "-----------------------------------------------"
echo -e "当前内核为:\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[36mMetaCubeX/mihomo\033[32m@alpha\033[0m版本官方内核"
echo -e "3 \033[36mvernesong/mihomo\033[32m@alpha\033[0m版本内核(支持Smart策略)"
echo -e "4 \033[36mSagerNet/sing-box\033[32m@release\033[0m版本官方内核"
echo -e "5 \033[36mreF1nd/sing-box\033[32m@release\033[0m版本内核(完整编译)"
echo -e "6 \033[36mreF1nd/sing-box\033[32m@dev\033[0m版本内核(完整编译)"
echo -e "7 Premium-2023.08.17内核(已停止维护)"
echo -e "a \033[33m自定义内核链接 \033[0m"
echo "-----------------------------------------------"
read -p "请输入对应数字 > " num
case "$num" in
1)
project=MetaCubeX/mihomo
api_tag=latest
crashcore=meta
checkcustcore
;;
2)
project=MetaCubeX/mihomo
api_tag=Prerelease-Alpha
crashcore=meta
checkcustcore
;;
3)
project=vernesong/mihomo
api_tag=Prerelease-Alpha
crashcore=meta
checkcustcore
;;
4)
project=SagerNet/sing-box
api_tag=latest
crashcore=singbox
checkcustcore
;;
5)
project=juewuy/ShellCrash
api_tag=singbox_core_reF1nd
crashcore=singboxr
checkcustcore
;;
6)
project=juewuy/ShellCrash
api_tag=singbox_core_dev_reF1nd
crashcore=singboxr
checkcustcore
;;
7)
project=juewuy/ShellCrash
api_tag=clash.premium.latest
crashcore=clashpre
checkcustcore
;;
a)
read -p "请输入自定义内核的链接地址(必须是以.tar.gz或.gz结尾的压缩文件) > " link
[ -n "$link" ] && custcorelink="$link"
crashcore=unknow
getcore
;;
*)
errornum
;;
esac
}
setcore(){ #内核选择菜单
#获取核心及版本信息
[ -z "$crashcore" ] && crashcore="unknow"
[ ! -f "$CRASHDIR"/CrashCore.tar.gz -o ! -f "$BINDIR"/CrashCore.tar.gz ] && crashcore="未安装核心"
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 "-----------------------------------------------"
[ -z "$cpucore" ] && getcpucore
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如需本地上传请将二进制文件上传至 /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"
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"
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"
echo "-----------------------------------------------"
echo -e "5 \033[36m自定义内核\033[0m $custcore"
echo -e "6 \033[32m更新当前内核\033[0m"
echo "-----------------------------------------------"
echo "9 手动指定处理器架构"
echo "-----------------------------------------------"
echo 0 返回上级菜单
read -p "请输入对应数字 > " num
case "$num" in
0)
;;
1)
[ -d "/jffs" ] && {
echo -e "\033[31mMeta内核使用的GeoSite.dat数据库在华硕设备存在被系统误删的问题可能无法使用!\033[0m"
sleep 3
}
crashcore=meta
custcorelink=''
getcore
;;
2)
crashcore=singboxr
custcorelink=''
getcore
;;
3)
crashcore=singbox
custcorelink=''
getcore
;;
4)
crashcore=clash
custcorelink=''
getcore
;;
5)
setcustcore
setcore
;;
6)
getcore
;;
9)
setcpucore
;;
*)
errornum
;;
esac
}
#数据库
getgeo(){ #下载Geo文件
#生成链接
echo "-----------------------------------------------"
echo 正在从服务器获取数据库文件…………
"$CRASHDIR"/start.sh get_bin "$TMPDIR"/${geoname} bin/geodata/$geotype
if [ "$?" = "1" ];then
echo "-----------------------------------------------"
echo -e "\033[31m文件下载失败\033[0m"
error_down
else
echo "$geoname" | grep -Eq '.mrs|.srs|.tar.gz' && {
geofile='ruleset/'
[ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset
}
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
rm -rf "$TMPDIR"/${geoname}
else
mv -f "$TMPDIR"/${geoname} "$BINDIR"/${geofile}${geoname}
fi
echo "-----------------------------------------------"
echo -e "\033[32m$geotype数据库文件下载成功\033[0m"
geo_v="$(echo $geotype | awk -F "." '{print $1}')_v"
setconfig $geo_v $GeoIP_v
fi
sleep 1
}
setcustgeo(){ #下载自定义数据库文件
getcustgeo(){
echo "-----------------------------------------------"
echo "正在获取数据库文件…………"
"$CRASHDIR"/start.sh webget "$TMPDIR"/$geoname $custgeolink
if [ "$?" = "1" ];then
echo "-----------------------------------------------"
echo -e "\033[31m文件下载失败\033[0m"
error_down
else
echo "$geoname" | grep -Eq '.mrs|.srs' && {
geofile='ruleset/'
[ ! -d "$BINDIR"/ruleset ] && mkdir -p "$BINDIR"/ruleset
}
mv -f "$TMPDIR"/${geoname} "$BINDIR"/${geofile}${geoname}
echo "-----------------------------------------------"
echo -e "\033[32m$geotype数据库文件下载成功\033[0m"
fi
sleep 1
}
checkcustgeo(){
[ "$api_tag" = "latest" ] && api_url=latest || api_url="tags/$api_tag"
[ ! -s "$TMPDIR"/geo.list ] && {
echo -e "\033[32m正在查找可更新的数据库文件\033[0m"
"$CRASHDIR"/start.sh 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
case "$num" in
0)
;;
[1-99])
if [ "$num" -le "$(wc -l < "$TMPDIR"/geo.list)" ];then
geotype=$(sed -n "$num"p "$TMPDIR"/geo.list)
[ -n "$(echo $geotype | grep -oiE 'GeoSite.*dat')" ] && geoname=GeoSite.dat
[ -n "$(echo $geotype | grep -oiE 'Country.*mmdb')" ] && geoname=Country.mmdb
[ -n "$(echo $geotype | grep -oiE '.*(.srs|.mrs)')" ] && geoname=$geotype
custgeolink=https://github.com/${project}/releases/download/${release_tag}/${geotype}
getcustgeo
checkcustgeo
else
errornum
fi
;;
*)
errornum
;;
esac
else
echo -e "\033[31m查找失败请尽量在服务启动后再使用本功能\033[0m"
sleep 1
fi
}
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
case "$num" in
0)
;;
1)
project=MetaCubeX/meta-rules-dat
api_tag=latest
checkcustgeo
setcustgeo
;;
2)
project=DustinWin/ruleset_geodata
api_tag=mihomo-geodata
checkcustgeo
setcustgeo
;;
3)
project=DustinWin/ruleset_geodata
api_tag=sing-box-ruleset
checkcustgeo
setcustgeo
;;
4)
project=DustinWin/ruleset_geodata
api_tag=mihomo-ruleset
checkcustgeo
setcustgeo
;;
5)
project=Loyalsoldier/geoip
api_tag=latest
checkcustgeo
setcustgeo
;;
9)
read -p "请输入自定义数据库的链接地址 > " link
[ -n "$link" ] && custgeolink="$link"
getgeo
setcustgeo
;;
*)
errornum
;;
esac
}
setgeo(){
. $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 -e " 5 Mihomo-mrs数据库常用包(约1mb) \033[33m$mrs_v\033[0m"
echo "-----------------------------------------------"
echo -e " 6 Singbox-srs数据库常用包(约0.8mb) \033[33m$srs_v\033[0m"
echo "-----------------------------------------------"
echo -e " 8 \033[32m自定义数据库文件\033[0m"
echo -e " 9 \033[31m清理数据库文件\033[0m"
echo " 0 返回上级菜单"
echo "-----------------------------------------------"
read -p "请输入对应数字 > " num
case "$num" in
0)
;;
1)
geotype=china_ip_list.txt
geoname=cn_ip.txt
getgeo
setgeo
;;
2)
geotype=china_ipv6_list.txt
geoname=cn_ipv6.txt
getgeo
setgeo
;;
3)
geotype=cn_mini.mmdb
geoname=Country.mmdb
getgeo
setgeo
;;
4)
geotype=geosite.dat
geoname=GeoSite.dat
getgeo
setgeo
;;
5)
geotype=mrs.tar.gz
geoname=mrs.tar.gz
getgeo
setgeo
;;
6)
geotype=srs.tar.gz
geoname=srs.tar.gz
getgeo
setgeo
;;
8)
setcustgeo
setgeo
;;
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
}
setgeo
;;
*)
errornum
;;
esac
}
#Dashboard
getdb(){
dblink="${update_url}/"
echo "-----------------------------------------------"
echo 正在连接服务器获取安装文件…………
"$CRASHDIR"/start.sh get_bin "$TMPDIR"/clashdb.tar.gz bin/dashboard/${db_type}.tar.gz
if [ "$?" = "1" ];then
echo "-----------------------------------------------"
echo -e "\033[31m文件下载失败\033[0m"
echo "-----------------------------------------------"
error_down
setdb
else
echo -e "\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
#修改默认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
sed -i "s/9090/${db_port}/g" $dbdir/assets/*.js
elif [ "$db_type" = "meta_xd" ];then
sed -i "s/127.0.0.1:9090/${host}:${db_port}/g" $dbdir/_nuxt/*.js
else
sed -i "s/127.0.0.1:9090/${host}:${db_port}/g" $dbdir/*.html
fi
#写入配置文件
setconfig hostdir "'$hostdir'"
echo "-----------------------------------------------"
echo -e "\033[32m面板安装成功\033[36m如未生效请使用【Ctrl+F5】强制刷新浏览器\033[0m"
rm -rf "$TMPDIR"/clashdb.tar.gz
fi
sleep 1
}
setdb(){
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
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
setdb
echo -e "\033[33m安装已取消\033[0m"
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
if [ "$num" = '1' ]; then
dbdir="$CRASHDIR"/ui
hostdir=":$db_port/ui"
getdb
elif [ "$num" = '2' ]; then
dbdir=/www/clash
hostdir='/clash'
getdb
else
setdb
echo -e "\033[33m安装已取消\033[0m"
fi
else
dbdir="$CRASHDIR"/ui
hostdir=":$db_port/ui"
getdb
fi
}
echo "-----------------------------------------------"
echo -e "\033[36m安装本地版dashboard管理面板\033[0m"
echo -e "\033[32m打开管理面板的速度更快且更稳定\033[0m"
echo "-----------------------------------------------"
echo -e "请选择面板\033[33m安装类型\033[0m"
echo "-----------------维护中------------------------"
echo -e " 1 安装\033[32mzashboard面板\033[0m(约2.2mb)"
echo -e " 2 安装\033[32mMetaXD面板\033[0m(约1.5mb)"
echo -e " 3 安装\033[32mYacd-Meta魔改面板\033[0m(约1.7mb)"
echo "---------------已停止维护----------------------"
echo -e " 4 安装\033[32m基础面板\033[0m(约500kb)"
echo -e " 5 安装\033[32mMeta基础面板\033[0m(约800kb)"
echo -e " 6 安装\033[32mYacd面板\033[0m(约1.1mb)"
echo "-----------------------------------------------"
echo -e " 9 卸载\033[33m本地面板\033[0m"
echo " 0 返回上级菜单"
read -p "请输入对应数字 > " num
case "$num" in
0) ;;
1)
db_type=zashboard
echo $update_url
setconfig external_ui_url "https://raw.githubusercontent.com/juewuy/ShellCrash/update/bin/dashboard/zashboard.tar.gz"
dbdir
;;
2)
db_type=meta_xd
setconfig external_ui_url "https://raw.githubusercontent.com/juewuy/ShellCrash/update/bin/dashboard/meta_xd.tar.gz"
dbdir
;;
3)
db_type=meta_yacd
dbdir
;;
4)
db_type=clashdb
dbdir
;;
5)
db_type=meta_db
dbdir
;;
6)
db_type=yacd
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
;;
*)
errornum
;;
esac
}
#根证书
getcrt(){
echo "-----------------------------------------------"
echo "正在连接服务器获取安装文件…………"
"$CRASHDIR"/start.sh get_bin "$TMPDIR"/ca-certificates.crt bin/fix/ca-certificates.crt
if [ "$?" = "1" ];then
echo "-----------------------------------------------"
echo -e "\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
mv -f "$TMPDIR"/ca-certificates.crt $crtdir
"$CRASHDIR"/start.sh webget /dev/null https://baidu.com echooff rediron skipceroff
if [ "$?" = "1" ];then
export CURL_CA_BUNDLE=$crtdir
echo "export CURL_CA_BUNDLE=$crtdir" >> /etc/profile
fi
echo -e "\033[32m证书安装成功\033[0m"
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
else
errornum
fi
else
echo "-----------------------------------------------"
echo -e "\033[33m设备可能尚未安装openssl无法安装证书文件\033[0m"
sleep 1
fi
}
#安装源
setserver(){
[ -z "$release_type" ] && release_name=未指定
[ -n "$release_type" ] && release_name="$release_type(回退)"
[ "$release_type" = stable ] && release_name=稳定版
[ "$release_type" = master ] && release_name=公测版
[ "$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"
saveserver(){
#写入配置文件
setconfig update_url "'$update_url'"
setconfig url_id $url_id
setconfig release_type $release_type
echo "-----------------------------------------------"
echo -e "\033[32m源地址切换成功\033[0m"
}
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
case "$num" in
0)
checkupdate=false
;;
[1-99])
url_id_new=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n ""$num"p" | awk '{print $1}')
if [ -z "$url_id_new" ];then
errornum
sleep 1
setserver
elif [ "$url_id_new" -ge 200 ];then
update_url=$(grep -E "^1|$release_name" "$CRASHDIR"/configs/servers.list | sed -n ""$num"p" | awk '{print $3}')
url_id=''
saveserver
else
url_id=$url_id_new
update_url=''
saveserver
fi
unset url_id_new
;;
a)
release_type=stable
[ -z "$url_id" ] && url_id=101
saveserver
setserver
;;
b)
release_type=master
[ -z "$url_id" ] && url_id=101
saveserver
setserver
;;
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
setserver
;;
d)
echo "-----------------------------------------------"
read -p "请输入个人源路径 > " update_url
if [ -z "$update_url" ];then
echo "-----------------------------------------------"
echo -e "\033[31m取消输入返回上级菜单\033[0m"
else
url_id=''
release_type=''
saveserver
fi
;;
e)
echo "-----------------------------------------------"
if [ -n "$url_id" ] && [ "$url_id" -lt 200 ];then
echo -ne "\033[32m正在获取版本信息\033[0m\r"
"$CRASHDIR"/start.sh 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
setserver
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
setserver
fi
else
echo "-----------------------------------------------"
echo -e "\033[31m版本回退信息获取失败请尝试更换其他安装源\033[0m"
sleep 1
setserver
fi
rm -rf "$TMPDIR"/release_version
else
echo -e "\033[31m当前源不支持版本回退请尝试更换其他安装源\033[0m"
sleep 1
setserver
fi
;;
*)
errornum
;;
esac
}