#!/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-full") shift full_patch_workflow "$@" ;; "generate") shift "$SCRIPT_DIR/patch_generator.sh" "$@" ;; "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 [args]" echo "命令:" echo " generate-full <旧目录> <新目录> [补丁名称] # 生成补丁" echo " generate <旧目录> <新目录> [补丁名称] # 生成补丁" echo " apply <补丁包路径> [dry-run] # 应用补丁" echo " rollback [回滚包路径] # 回滚补丁" echo " verify <补丁包路径> [验证类型] # 验证补丁" echo " batch-verify <目录> # 批量验证" echo "" echo "示例:" echo " 进入项目目录,然后执行" echo " $0 generate /old/version /new/version" 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 "$@"