chore: 针对备份及还原处理
This commit is contained in:
153
scripts/patch_tools/patch_workflow.sh
Normal file
153
scripts/patch_tools/patch_workflow.sh
Normal file
@@ -0,0 +1,153 @@
|
||||
#!/bin/bash
|
||||
# patch_workflow.sh - 完整补丁管理工作流
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
SCRIPT_DIR="/opt/patch-management"
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"; }
|
||||
error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||
|
||||
# 完整工作流
|
||||
full_patch_workflow() {
|
||||
local source_dir="$1"
|
||||
local target_dir="$2"
|
||||
local patch_name="$3"
|
||||
|
||||
log "开始完整补丁管理工作流"
|
||||
echo "========================================"
|
||||
|
||||
# 1. 生成补丁包
|
||||
log "步骤1: 生成补丁包"
|
||||
if ! "$SCRIPT_DIR/patch_generator.sh" "$source_dir" "$target_dir" "$patch_name"; then
|
||||
error "补丁包生成失败"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 获取生成的补丁包路径
|
||||
local patch_file=$(find "/opt/patches" -name "*${patch_name}*" -type f | head -1)
|
||||
if [[ -z "$patch_file" ]]; then
|
||||
error "未找到补丁包文件"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 2. 验证补丁包
|
||||
log "步骤2: 验证补丁包"
|
||||
if ! "$SCRIPT_DIR/patch_verifier.sh" "$patch_file" "pre-apply"; then
|
||||
error "补丁包验证失败"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 3. 应用补丁包(干跑模式)
|
||||
log "步骤3: 干跑模式应用补丁"
|
||||
if ! "$SCRIPT_DIR/patch_applier.sh" "$patch_file" "dry-run"; then
|
||||
error "干跑模式应用失败"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 4. 实际应用补丁包
|
||||
read -p "是否继续实际应用补丁? (y/N): " confirm
|
||||
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
||||
log "步骤4: 实际应用补丁"
|
||||
if ! "$SCRIPT_DIR/patch_applier.sh" "$patch_file"; then
|
||||
error "补丁应用失败"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
log "操作取消"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 5. 应用后验证
|
||||
log "步骤5: 应用后验证"
|
||||
if ! "$SCRIPT_DIR/patch_verifier.sh" "$patch_file" "post-apply"; then
|
||||
error "应用后验证失败"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "🎉 完整补丁管理工作流完成"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 回滚工作流
|
||||
rollback_workflow() {
|
||||
local rollback_file="${1:-}"
|
||||
|
||||
log "开始回滚工作流"
|
||||
echo "========================================"
|
||||
|
||||
# 1. 干跑模式回滚
|
||||
log "步骤1: 干跑模式回滚"
|
||||
if ! "$SCRIPT_DIR/patch_rollback.sh" "$rollback_file" "dry-run"; then
|
||||
error "干跑模式回滚失败"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 2. 实际回滚
|
||||
read -p "是否继续实际回滚? (y/N): " confirm
|
||||
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
||||
log "步骤2: 实际回滚"
|
||||
if ! "$SCRIPT_DIR/patch_rollback.sh" "$rollback_file"; then
|
||||
error "回滚失败"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
log "操作取消"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "✅ 回滚工作流完成"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
case "${1:-}" in
|
||||
"generate")
|
||||
shift
|
||||
full_patch_workflow "$@"
|
||||
;;
|
||||
"apply")
|
||||
shift
|
||||
"$SCRIPT_DIR/patch_applier.sh" "$@"
|
||||
;;
|
||||
"rollback")
|
||||
shift
|
||||
rollback_workflow "$@"
|
||||
;;
|
||||
"verify")
|
||||
shift
|
||||
"$SCRIPT_DIR/patch_verifier.sh" "$@"
|
||||
;;
|
||||
"batch-verify")
|
||||
shift
|
||||
"$SCRIPT_DIR/patch_verifier.sh" "$1" "standalone" "batch"
|
||||
;;
|
||||
*)
|
||||
echo "用法: $0 <command> [args]"
|
||||
echo "命令:"
|
||||
echo " generate <源目录> <目标目录> <补丁名称> # 完整工作流"
|
||||
echo " apply <补丁包路径> [dry-run] # 应用补丁"
|
||||
echo " rollback [回滚包路径] # 回滚补丁"
|
||||
echo " verify <补丁包路径> [验证类型] # 验证补丁"
|
||||
echo " batch-verify <目录> # 批量验证"
|
||||
echo ""
|
||||
echo "示例:"
|
||||
echo " $0 generate /old/version /new/version security-hotfix"
|
||||
echo " $0 apply /opt/patches/patch.tar.gz dry-run"
|
||||
echo " $0 rollback /var/backups/patch/backup.tar.gz"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 异常处理
|
||||
trap 'error "脚本执行中断"; cleanup; exit 1' INT TERM
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user