btcloud/public/install/update/update_prep_script.sh
2025-11-05 21:29:13 +08:00

148 lines
3.9 KiB
Bash
Raw Permalink 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/bash
#===============================================================================
# 宝塔面板更新预准备脚本
# 功能:在面板更新时,提前准备,避免面板更新失败
# 说明接收两个参数1.更新的面板版本号 2.更新的版本是否为稳定版 3.执行时机(prepare, after)
# prepare: 在下载面板文件之前就运行的内容
# after: 在替换文件之后,运行重启之前执行的内容
# 支持CentOS/RHEL、Ubuntu、Debian系统
#===============================================================================
UPDATE_VERSION="" # 版本号, 形如: 11.2.3
UPDATE_VER_MAJOR="" # 主版本号 -> 11
UPDATE_VER_MINOR="" # 次版本号 -> 2
UPDATE_VER_MICRO="" # 小版本号 -> 3
IS_STABLE=false # 默认不是稳定版而是正式版本
OPPORTUNITY="prepare"
PANEL_PATH="/www/server/panel"
# 输出成功信息, 必须输出 "BT-Panel Update Ready" 才证明预处理成功
function success() {
local message=$1
if [ -n "$message" ]; then
echo "$message"
fi
echo "BT-Panel Update Ready"
}
# 获取当前版本号
function get_now_version() {
local common_file="$PANEL_PATH/class/common.py"
if [ ! -f "$common_file" ]; then
echo "" # 文件不存在时返回空字符串
return 1
fi
# 形如g.version = '11.2.0'
local version_str=$(grep -E '^\s+g.version\s*=\s*.*$' "$PANEL_PATH/class/common.py" | cut -d "=" -f2 )
# 形如:'11.2.0'
local version=$(echo "$version_str" | sed -n "s/.*['\"]\(.*\)['\"].*/\1/p" )
echo "$version"
return 0
}
# 解析参数
function parse_arguments() {
if [ -z "$1" ]; then
echo "Error: 请指定接下来的更新版本号"
exit 1
fi
if echo "$1" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
:
else
echo "Error: 请指定正确的版本号"
exit 1
fi
UPDATE_VERSION=$1
UPDATE_VER_MAJOR=$(echo $UPDATE_VERSION | cut -d. -f1)
UPDATE_VER_MINOR=$(echo $UPDATE_VERSION | cut -d. -f2)
UPDATE_VER_MICRO=$(echo $UPDATE_VERSION | cut -d. -f3)
case "$2" in
1|True|true) # 稳定版
IS_STABLE=true
;;
0|False|false) # 非稳定版
IS_STABLE=false
;;
*)
IS_STABLE=false
;;
esac
case "$3" in
prepare)
OPPORTUNITY="prepare"
;;
after)
OPPORTUNITY="after"
;;
*)
OPPORTUNITY="prepare"
;;
esac
}
# 默认处理,什么都不做
function nothing_do() {
local version=$1
# 输出成功信息
success "已完成[BT-Panel-$version]处理"
}
function replace_bt_command() {
local init_path="${PANEL_PATH}/init.sh"
if [ -f "$init_path" ]; then
\cp -a "$init_path" /etc/init.d/bt
chmod +x /etc/init.d/bt
else
echo "Error: $init_path 文件不存在"
exit 1
fi
}
function prepare_main() {
echo "开始处理预更新..."
local now_version=$(get_now_version)
if [ $? -eq 0 ]; then
echo "当前版本:$now_version, 目标版本:$UPDATE_VERSION"
else
echo "获取当前版本失败"
exit 1
fi
case "$UPDATE_VER_MAJOR.$UPDATE_VER_MINOR.$UPDATE_VER_MICRO" in
11.3.*)
nothing_do $UPDATE_VERSION
;;
* )
nothing_do $UPDATE_VERSION
;;
esac
}
function after_main() {
echo "启动预检测..."
case "$UPDATE_VER_MAJOR.$UPDATE_VER_MINOR.$UPDATE_VER_MICRO" in
11.3.*)
replace_bt_command
success "已完成[BT-Panel-$UPDATE_VERSION]启动检查处理"
;;
* )
nothing_do $UPDATE_VERSION
;;
esac
}
# 主函数
function main() {
if [ "$OPPORTUNITY" = "prepare" ]; then
prepare_main
elif [ "$OPPORTUNITY" = "after" ]; then
after_main
fi
}
# 主函数入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
parse_arguments $@
main
fi