#!/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