pre-update.sh 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/bash
  2. # Configuration
  3. SOURCE_DIR="XML"
  4. BACKUP_DIR="backup"
  5. CONTAINER_NAME="agentdvr"
  6. TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
  7. # Colors for output
  8. RED='\033[0;31m'
  9. GREEN='\033[0;32m'
  10. YELLOW='\033[1;33m'
  11. NC='\033[0m' # No Color
  12. # Function to print messages
  13. log_info() {
  14. echo -e "${GREEN}[INFO]${NC} $1"
  15. }
  16. log_warn() {
  17. echo -e "${YELLOW}[WARN]${NC} $1"
  18. }
  19. log_error() {
  20. echo -e "${RED}[ERROR]${NC} $1"
  21. }
  22. # Check if source directory exists
  23. if [ ! -d "$SOURCE_DIR" ]; then
  24. log_error "Source directory '$SOURCE_DIR' does not exist!"
  25. exit 1
  26. fi
  27. # Get the image ID of the agentdvr container
  28. log_info "Detecting Docker image ID for container: $CONTAINER_NAME"
  29. IMAGE_ID=$(docker inspect --format='{{.Image}}' "$CONTAINER_NAME" 2>/dev/null | cut -d':' -f2 | cut -c1-12)
  30. if [ -z "$IMAGE_ID" ]; then
  31. log_error "Failed to get image ID for container '$CONTAINER_NAME'"
  32. log_error "Make sure Docker is running and the container exists"
  33. exit 1
  34. fi
  35. log_info "Current image ID: $IMAGE_ID"
  36. # Set backup filename with image ID
  37. BACKUP_FILE="${BACKUP_DIR}/agent_backup-${IMAGE_ID}-${TIMESTAMP}.tar.gz"
  38. # Create backup directory if it doesn't exist
  39. if [ ! -d "$BACKUP_DIR" ]; then
  40. log_info "Creating backup directory: $BACKUP_DIR"
  41. mkdir -p "$BACKUP_DIR"
  42. fi
  43. # Find files to backup
  44. FILES=$(find "$SOURCE_DIR" -type f \( -name "*.json" -o -name "*.db3" \))
  45. FILE_COUNT=$(echo "$FILES" | grep -c .)
  46. if [ -z "$FILES" ] || [ "$FILE_COUNT" -eq 0 ]; then
  47. log_warn "No *.json or *.db3 files found in $SOURCE_DIR"
  48. exit 0
  49. fi
  50. log_info "Found $FILE_COUNT files to backup"
  51. # Create the backup
  52. log_info "Creating backup: $BACKUP_FILE"
  53. if tar -czf "$BACKUP_FILE" -C "$SOURCE_DIR" $(cd "$SOURCE_DIR" && find . -type f \( -name "*.json" -o -name "*.db3" \)) 2>/dev/null; then
  54. log_info "Backup created successfully: $BACKUP_FILE"
  55. BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
  56. log_info "Backup size: $BACKUP_SIZE"
  57. else
  58. log_error "Failed to create backup!"
  59. exit 1
  60. fi
  61. # Cleanup old backups
  62. log_info "Cleaning up old backups..."
  63. # Get list of all backup files sorted by modification time (newest first)
  64. BACKUPS=$(ls -t "$BACKUP_DIR"/agent_backup-*.tar.gz 2>/dev/null)
  65. if [ -z "$BACKUPS" ]; then
  66. log_info "No backups to clean up"
  67. exit 0
  68. fi
  69. # Convert to array
  70. BACKUP_ARRAY=($BACKUPS)
  71. TOTAL_BACKUPS=${#BACKUP_ARRAY[@]}
  72. log_info "Total backups found: $TOTAL_BACKUPS"
  73. # Keep track of backups to preserve
  74. declare -a KEEP_BACKUPS
  75. # Step 3: Find the newest backup with a different image ID
  76. DIFFERENT_IMAGE_BACKUP=""
  77. for backup in "${BACKUP_ARRAY[@]}"; do
  78. # Extract image ID from filename (format: agent_backup-IMAGE_ID-YYYYMMDD_HHMMSS.tar.gz)
  79. BACKUP_IMAGE_ID=$(basename "$backup" | sed -n 's/agent_backup-\([^-]*\)-.*/\1/p')
  80. if [ "$BACKUP_IMAGE_ID" != "$IMAGE_ID" ]; then
  81. DIFFERENT_IMAGE_BACKUP="$backup"
  82. log_info "Found backup from different image version: $(basename $backup) (Image: $BACKUP_IMAGE_ID)"
  83. break
  84. fi
  85. done
  86. # Step 3a: If no different image version, find the oldest backup of current version
  87. OLDEST_BACKUP=""
  88. if [ -z "$DIFFERENT_IMAGE_BACKUP" ]; then
  89. log_info "No different image version found, looking for oldest backup..."
  90. # Iterate in reverse (oldest first)
  91. for ((i=${#BACKUP_ARRAY[@]}-1; i>=0; i--)); do
  92. backup="${BACKUP_ARRAY[$i]}"
  93. BACKUP_IMAGE_ID=$(basename "$backup" | sed -n 's/agent_backup-\([^-]*\)-.*/\1/p')
  94. if [ "$BACKUP_IMAGE_ID" = "$IMAGE_ID" ]; then
  95. OLDEST_BACKUP="$backup"
  96. log_info "Found oldest backup: $(basename $backup)"
  97. break
  98. fi
  99. done
  100. fi
  101. # Step 4: Keep up to 4 newest backups
  102. KEEP_RECENT=4
  103. log_info "Keeping 4 newest backups"
  104. COUNT=0
  105. for backup in "${BACKUP_ARRAY[@]}"; do
  106. if [ $COUNT -lt $KEEP_RECENT ]; then
  107. KEEP_BACKUPS+=("$backup")
  108. COUNT=$((COUNT + 1))
  109. fi
  110. done
  111. # Add the special backup (different image or oldest) if found and not already in list
  112. SPECIAL_BACKUP=""
  113. if [ -n "$DIFFERENT_IMAGE_BACKUP" ]; then
  114. SPECIAL_BACKUP="$DIFFERENT_IMAGE_BACKUP"
  115. log_info "Preserving newest backup from different image version"
  116. elif [ -n "$OLDEST_BACKUP" ]; then
  117. SPECIAL_BACKUP="$OLDEST_BACKUP"
  118. log_info "Preserving oldest backup from current image version"
  119. fi
  120. if [ -n "$SPECIAL_BACKUP" ]; then
  121. ALREADY_KEPT=false
  122. for keep in "${KEEP_BACKUPS[@]}"; do
  123. if [ "$keep" = "$SPECIAL_BACKUP" ]; then
  124. ALREADY_KEPT=true
  125. break
  126. fi
  127. done
  128. if [ "$ALREADY_KEPT" = false ]; then
  129. KEEP_BACKUPS+=("$SPECIAL_BACKUP")
  130. fi
  131. fi
  132. # Step 5: Delete backups that are not in the keep list
  133. for backup in "${BACKUP_ARRAY[@]}"; do
  134. SHOULD_KEEP=false
  135. for keep in "${KEEP_BACKUPS[@]}"; do
  136. if [ "$backup" = "$keep" ]; then
  137. SHOULD_KEEP=true
  138. break
  139. fi
  140. done
  141. if [ "$SHOULD_KEEP" = false ]; then
  142. log_info "Deleting old backup: $(basename $backup)"
  143. rm -f "$backup"
  144. fi
  145. done
  146. # Summary
  147. REMAINING=$(ls "$BACKUP_DIR"/agent_backup-*.tar.gz 2>/dev/null | wc -l)
  148. log_info "Backup complete! Remaining backups: $REMAINING"
  149. log_info "Current image ID: $IMAGE_ID"
  150. exit 0