You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
3.9 KiB

2 days ago
  1. #!/bin/bash
  2. #===============================================================================
  3. # 宝塔面板更新预准备脚本
  4. # 功能:在面板更新时,提前准备,避免面板更新失败
  5. # 说明:接收两个参数:1.更新的面板版本号 2.更新的版本是否为稳定版 3.执行时机(prepare, after)
  6. # prepare: 在下载面板文件之前就运行的内容
  7. # after: 在替换文件之后,运行重启之前执行的内容
  8. # 支持:CentOS/RHEL、Ubuntu、Debian系统
  9. #===============================================================================
  10. UPDATE_VERSION="" # 版本号, 形如: 11.2.3
  11. UPDATE_VER_MAJOR="" # 主版本号 -> 11
  12. UPDATE_VER_MINOR="" # 次版本号 -> 2
  13. UPDATE_VER_MICRO="" # 小版本号 -> 3
  14. IS_STABLE=false # 默认不是稳定版而是正式版本
  15. OPPORTUNITY="prepare"
  16. PANEL_PATH="/www/server/panel"
  17. # 输出成功信息, 必须输出 "BT-Panel Update Ready" 才证明预处理成功
  18. function success() {
  19. local message=$1
  20. if [ -n "$message" ]; then
  21. echo "$message"
  22. fi
  23. echo "BT-Panel Update Ready"
  24. }
  25. # 获取当前版本号
  26. function get_now_version() {
  27. local common_file="$PANEL_PATH/class/common.py"
  28. if [ ! -f "$common_file" ]; then
  29. echo "" # 文件不存在时返回空字符串
  30. return 1
  31. fi
  32. # 形如:g.version = '11.2.0'
  33. local version_str=$(grep -E '^\s+g.version\s*=\s*.*$' "$PANEL_PATH/class/common.py" | cut -d "=" -f2 )
  34. # 形如:'11.2.0'
  35. local version=$(echo "$version_str" | sed -n "s/.*['\"]\(.*\)['\"].*/\1/p" )
  36. echo "$version"
  37. return 0
  38. }
  39. # 解析参数
  40. function parse_arguments() {
  41. if [ -z "$1" ]; then
  42. echo "Error: 请指定接下来的更新版本号"
  43. exit 1
  44. fi
  45. if echo "$1" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
  46. :
  47. else
  48. echo "Error: 请指定正确的版本号"
  49. exit 1
  50. fi
  51. UPDATE_VERSION=$1
  52. UPDATE_VER_MAJOR=$(echo $UPDATE_VERSION | cut -d. -f1)
  53. UPDATE_VER_MINOR=$(echo $UPDATE_VERSION | cut -d. -f2)
  54. UPDATE_VER_MICRO=$(echo $UPDATE_VERSION | cut -d. -f3)
  55. case "$2" in
  56. 1|True|true) # 稳定版
  57. IS_STABLE=true
  58. ;;
  59. 0|False|false) # 非稳定版
  60. IS_STABLE=false
  61. ;;
  62. *)
  63. IS_STABLE=false
  64. ;;
  65. esac
  66. case "$3" in
  67. prepare)
  68. OPPORTUNITY="prepare"
  69. ;;
  70. after)
  71. OPPORTUNITY="after"
  72. ;;
  73. *)
  74. OPPORTUNITY="prepare"
  75. ;;
  76. esac
  77. }
  78. # 默认处理,什么都不做
  79. function nothing_do() {
  80. local version=$1
  81. # 输出成功信息
  82. success "已完成[BT-Panel-$version]处理"
  83. }
  84. function replace_bt_command() {
  85. local init_path="${PANEL_PATH}/init.sh"
  86. if [ -f "$init_path" ]; then
  87. \cp -a "$init_path" /etc/init.d/bt
  88. chmod +x /etc/init.d/bt
  89. else
  90. echo "Error: $init_path 文件不存在"
  91. exit 1
  92. fi
  93. }
  94. function prepare_main() {
  95. echo "开始处理预更新..."
  96. local now_version=$(get_now_version)
  97. if [ $? -eq 0 ]; then
  98. echo "当前版本:$now_version, 目标版本:$UPDATE_VERSION"
  99. else
  100. echo "获取当前版本失败"
  101. exit 1
  102. fi
  103. case "$UPDATE_VER_MAJOR.$UPDATE_VER_MINOR.$UPDATE_VER_MICRO" in
  104. 11.3.*)
  105. nothing_do $UPDATE_VERSION
  106. ;;
  107. * )
  108. nothing_do $UPDATE_VERSION
  109. ;;
  110. esac
  111. }
  112. function after_main() {
  113. echo "启动预检测..."
  114. case "$UPDATE_VER_MAJOR.$UPDATE_VER_MINOR.$UPDATE_VER_MICRO" in
  115. 11.3.*)
  116. replace_bt_command
  117. success "已完成[BT-Panel-$UPDATE_VERSION]启动检查处理"
  118. ;;
  119. * )
  120. nothing_do $UPDATE_VERSION
  121. ;;
  122. esac
  123. }
  124. # 主函数
  125. function main() {
  126. if [ "$OPPORTUNITY" = "prepare" ]; then
  127. prepare_main
  128. elif [ "$OPPORTUNITY" = "after" ]; then
  129. after_main
  130. fi
  131. }
  132. # 主函数入口
  133. if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  134. parse_arguments $@
  135. main
  136. fi