Files

196 lines
5.9 KiB
Bash
Raw Permalink Normal View History

2026-06-22 15:35:18 +08:00
#!/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