196 lines
5.9 KiB
Bash
196 lines
5.9 KiB
Bash
#!/bin/bash
|
|
DEBUG_MODE=0
|
|
POWEROAD_DEVICE=`printenv POWEROAD_DEVICE || echo ems`
|
|
|
|
cd "$(dirname "$(readlink -f "$0")")"
|
|
|
|
MY_INSTALL_DIR=/home/poweroad/${POWEROAD_DEVICE}
|
|
|
|
# 关闭所有文件描述符
|
|
for fd in $(seq 3 256); do
|
|
exec {fd}<&-
|
|
done
|
|
|
|
sleep 5
|
|
|
|
# 定义常量
|
|
APP_START="${MY_INSTALL_DIR}/app_start.sh"
|
|
UPGRADE_BACKUP="${MY_INSTALL_DIR}/upgrade_backup.sh"
|
|
UPGRADE_ROLLBACK="${MY_INSTALL_DIR}/upgrade_rollback.sh"
|
|
UPGRADE_DAEMON="${MY_INSTALL_DIR}/upgrade_daemon.sh"
|
|
PROFILE_SH="/home/poweroad/.profile"
|
|
UPGRADE_STATUS_FILE="/var/poweroad/upgrade_status.txt"
|
|
UPGRADE_LOG="/var/poweroad/upgrade.log"
|
|
UPGRADE_DIR="/var/poweroad"
|
|
ROLLBACK="/var/poweroad/${POWEROAD_DEVICE}/upgrade_rollback.sh"
|
|
|
|
# 日志记录函数
|
|
log() {
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$UPGRADE_LOG"
|
|
}
|
|
|
|
# 检查文件大小是否为 0
|
|
is_file_empty() {
|
|
local file="$1"
|
|
|
|
# 检查文件是否存在
|
|
if [ ! -f "$file" ]; then
|
|
echo "File does not exist: $file"
|
|
return 1 # 文件不存在
|
|
fi
|
|
|
|
if [ ! -s "$file" ]; then
|
|
return 0 # 文件为空,返回0
|
|
else
|
|
return 1 # 文件不为空,返回1
|
|
fi
|
|
}
|
|
|
|
# 清理函数
|
|
cleanup() {
|
|
# 删除 upgrade_status.txt 文件
|
|
if [ -f "$UPGRADE_STATUS_FILE" ]; then
|
|
rm "$UPGRADE_STATUS_FILE"
|
|
log "已删除 upgrade_status.txt"
|
|
fi
|
|
|
|
# 删除 upgrade_dir 下除 upgrade.log 之外的所有文件和文件夹
|
|
find "$UPGRADE_DIR" -maxdepth 1 -mindepth 1 -not -name "upgrade.log" -exec rm -rf {} \+
|
|
log "已删除除 upgrade.log 之外的所有文件和文件夹"
|
|
}
|
|
|
|
# 检查 ${MY_INSTALL_DIR}/bin/DEBUG 文件是否存在
|
|
if [ -f "${MY_INSTALL_DIR}/bin/DEBUG" ]; then
|
|
# log "DEBUG 文件存在,退出脚本"
|
|
# exit 0
|
|
log "DEBUG 文件存在,为调试模式"
|
|
DEBUG_MODE=1
|
|
fi
|
|
|
|
# 初始化计数器
|
|
counter=0
|
|
|
|
# 主逻辑
|
|
while true; do
|
|
# 检查 app_start.sh 文件大小是否为 0
|
|
if is_file_empty "$APP_START"; then
|
|
log "app_start.sh 文件大小为 0,等待 5 秒后再次检查"
|
|
sleep 5
|
|
if is_file_empty "$APP_START"; then
|
|
log "app_start.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本"
|
|
echo "rolled_finished" > "$UPGRADE_STATUS_FILE"
|
|
sync
|
|
/bin/bash "$ROLLBACK"
|
|
fi
|
|
fi
|
|
|
|
# 检查 upgrade_backup.sh 文件大小是否为 0
|
|
if is_file_empty "$UPGRADE_BACKUP"; then
|
|
log "upgrade_backup.sh 文件大小为 0,等待 5 秒后再次检查"
|
|
sleep 5
|
|
if is_file_empty "$UPGRADE_BACKUP"; then
|
|
log "upgrade_backup.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本"
|
|
echo "rolled_finished" > "$UPGRADE_STATUS_FILE"
|
|
sync
|
|
/bin/bash "$ROLLBACK"
|
|
fi
|
|
fi
|
|
|
|
# 检查 upgrade_rollback.sh 文件大小是否为 0
|
|
if is_file_empty "$UPGRADE_ROLLBACK"; then
|
|
log "upgrade_rollback.sh 文件大小为 0,等待 5 秒后再次检查"
|
|
sleep 5
|
|
if is_file_empty "$UPGRADE_ROLLBACK"; then
|
|
log "upgrade_rollback.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本"
|
|
echo "rolled_finished" > "$UPGRADE_STATUS_FILE"
|
|
sync
|
|
/bin/bash "$ROLLBACK"
|
|
fi
|
|
fi
|
|
|
|
# 检查 upgrade_daemon.sh 文件大小是否为 0
|
|
if is_file_empty "$UPGRADE_DAEMON"; then
|
|
log "upgrade_daemon.sh 文件大小为 0,等待 5 秒后再次检查"
|
|
sleep 5
|
|
if is_file_empty "$UPGRADE_DAEMON"; then
|
|
log "upgrade_daemon.sh 文件大小仍为 0,调用 upgrade_rollback.sh 脚本"
|
|
echo "rolled_finished" > "$UPGRADE_STATUS_FILE"
|
|
sync
|
|
/bin/bash "$ROLLBACK"
|
|
fi
|
|
fi
|
|
|
|
# 检查 /home/poweroad/.profile 是否存在或文件大小是否为 0
|
|
if is_file_empty "$PROFILE_SH"; then
|
|
log ".profile 文件不存在或大小为 0,等待 5 秒后再次检查"
|
|
sleep 5
|
|
if is_file_empty "$PROFILE_SH"; then
|
|
log ".profile 文件不存在或大小仍为 0,调用 upgrade_rollback.sh 脚本"
|
|
echo "rolled_finished" > "$UPGRADE_STATUS_FILE"
|
|
sync
|
|
/bin/bash "$ROLLBACK"
|
|
fi
|
|
fi
|
|
|
|
# 检查 upgrade_status.txt 文件内容是否为 "rollback"
|
|
if [ -f "$UPGRADE_STATUS_FILE" ]; then
|
|
content=$(cat "$UPGRADE_STATUS_FILE")
|
|
if [[ "$content" == "rollback" ]]; then
|
|
if [ "$DEBUG_MODE" -eq 1 ]; then
|
|
log "为 DEBUG 模式, 不回滚, 退出脚本!!!"
|
|
exit 0
|
|
fi
|
|
log "upgrade_status.txt 文件内容为 'rollback',回滚中!!!"
|
|
echo "rolled_finished" > "$UPGRADE_STATUS_FILE"
|
|
sync
|
|
/bin/bash "$ROLLBACK"
|
|
fi
|
|
fi
|
|
|
|
if [ -f "$UPGRADE_STATUS_FILE" ]; then
|
|
content=$(cat "$UPGRADE_STATUS_FILE")
|
|
if [[ "$content" == "rolled_finished" ]]; then
|
|
log "已完成回滚,脚本退出!!!"
|
|
sync
|
|
cleanup
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
if [ -f "$UPGRADE_STATUS_FILE" ]; then
|
|
content=$(cat "$UPGRADE_STATUS_FILE")
|
|
if [[ "$content" == "completed" ]]; then
|
|
log "升级已完成,脚本退出!!!"
|
|
sync
|
|
cleanup
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# 增加计数器
|
|
((counter++))
|
|
|
|
# 检查是否达到 6 分钟
|
|
if [ $((counter * 5)) -ge 360 ]; then
|
|
if [ "$DEBUG_MODE" -eq 1 ]; then
|
|
log "已超过 6 分钟,为 DEBUG 模式, 退出脚本!!!"
|
|
exit 0
|
|
fi
|
|
|
|
if [[ "$content" == "requires_validation" ]]; then
|
|
log "升级已超过 6 分钟,回滚中!!!"
|
|
echo "rolled_finished" > "$UPGRADE_STATUS_FILE"
|
|
sync
|
|
/bin/bash "$ROLLBACK"
|
|
exit 0
|
|
fi
|
|
|
|
log "升级已超过 6 分钟,清理资源,退出脚本!!!"
|
|
sync
|
|
cleanup
|
|
exit 0
|
|
fi
|
|
|
|
# 等待一段时间再进行下一轮检查
|
|
sleep 5
|
|
done |