| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #!/bin/bash
- # Configuration
- SOURCE_DIR="XML"
- BACKUP_DIR="backup"
- CONTAINER_NAME="agentdvr"
- TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
- # Colors for output
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- NC='\033[0m' # No Color
- # Function to print messages
- log_info() {
- echo -e "${GREEN}[INFO]${NC} $1"
- }
- log_warn() {
- echo -e "${YELLOW}[WARN]${NC} $1"
- }
- log_error() {
- echo -e "${RED}[ERROR]${NC} $1"
- }
- # Check if source directory exists
- if [ ! -d "$SOURCE_DIR" ]; then
- log_error "Source directory '$SOURCE_DIR' does not exist!"
- exit 1
- fi
- # Get the image ID of the agentdvr container
- log_info "Detecting Docker image ID for container: $CONTAINER_NAME"
- IMAGE_ID=$(docker inspect --format='{{.Image}}' "$CONTAINER_NAME" 2>/dev/null | cut -d':' -f2 | cut -c1-12)
- if [ -z "$IMAGE_ID" ]; then
- log_error "Failed to get image ID for container '$CONTAINER_NAME'"
- log_error "Make sure Docker is running and the container exists"
- exit 1
- fi
- log_info "Current image ID: $IMAGE_ID"
- # Set backup filename with image ID
- BACKUP_FILE="${BACKUP_DIR}/agent_backup-${IMAGE_ID}-${TIMESTAMP}.tar.gz"
- # Create backup directory if it doesn't exist
- if [ ! -d "$BACKUP_DIR" ]; then
- log_info "Creating backup directory: $BACKUP_DIR"
- mkdir -p "$BACKUP_DIR"
- fi
- # Find files to backup
- FILES=$(find "$SOURCE_DIR" -type f \( -name "*.json" -o -name "*.db3" \))
- FILE_COUNT=$(echo "$FILES" | grep -c .)
- if [ -z "$FILES" ] || [ "$FILE_COUNT" -eq 0 ]; then
- log_warn "No *.json or *.db3 files found in $SOURCE_DIR"
- exit 0
- fi
- log_info "Found $FILE_COUNT files to backup"
- # Create the backup
- log_info "Creating backup: $BACKUP_FILE"
- if tar -czf "$BACKUP_FILE" -C "$SOURCE_DIR" $(cd "$SOURCE_DIR" && find . -type f \( -name "*.json" -o -name "*.db3" \)) 2>/dev/null; then
- log_info "Backup created successfully: $BACKUP_FILE"
- BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
- log_info "Backup size: $BACKUP_SIZE"
- else
- log_error "Failed to create backup!"
- exit 1
- fi
- # Cleanup old backups
- log_info "Cleaning up old backups..."
- # Get list of all backup files sorted by modification time (newest first)
- BACKUPS=$(ls -t "$BACKUP_DIR"/agent_backup-*.tar.gz 2>/dev/null)
- if [ -z "$BACKUPS" ]; then
- log_info "No backups to clean up"
- exit 0
- fi
- # Convert to array
- BACKUP_ARRAY=($BACKUPS)
- TOTAL_BACKUPS=${#BACKUP_ARRAY[@]}
- log_info "Total backups found: $TOTAL_BACKUPS"
- # Keep track of backups to preserve
- declare -a KEEP_BACKUPS
- # Step 3: Find the newest backup with a different image ID
- DIFFERENT_IMAGE_BACKUP=""
- for backup in "${BACKUP_ARRAY[@]}"; do
- # Extract image ID from filename (format: agent_backup-IMAGE_ID-YYYYMMDD_HHMMSS.tar.gz)
- BACKUP_IMAGE_ID=$(basename "$backup" | sed -n 's/agent_backup-\([^-]*\)-.*/\1/p')
- if [ "$BACKUP_IMAGE_ID" != "$IMAGE_ID" ]; then
- DIFFERENT_IMAGE_BACKUP="$backup"
- log_info "Found backup from different image version: $(basename $backup) (Image: $BACKUP_IMAGE_ID)"
- break
- fi
- done
- # Step 3a: If no different image version, find the oldest backup of current version
- OLDEST_BACKUP=""
- if [ -z "$DIFFERENT_IMAGE_BACKUP" ]; then
- log_info "No different image version found, looking for oldest backup..."
- # Iterate in reverse (oldest first)
- for ((i=${#BACKUP_ARRAY[@]}-1; i>=0; i--)); do
- backup="${BACKUP_ARRAY[$i]}"
- BACKUP_IMAGE_ID=$(basename "$backup" | sed -n 's/agent_backup-\([^-]*\)-.*/\1/p')
- if [ "$BACKUP_IMAGE_ID" = "$IMAGE_ID" ]; then
- OLDEST_BACKUP="$backup"
- log_info "Found oldest backup: $(basename $backup)"
- break
- fi
- done
- fi
- # Step 4: Keep up to 4 newest backups
- KEEP_RECENT=4
- log_info "Keeping 4 newest backups"
- COUNT=0
- for backup in "${BACKUP_ARRAY[@]}"; do
- if [ $COUNT -lt $KEEP_RECENT ]; then
- KEEP_BACKUPS+=("$backup")
- COUNT=$((COUNT + 1))
- fi
- done
- # Add the special backup (different image or oldest) if found and not already in list
- SPECIAL_BACKUP=""
- if [ -n "$DIFFERENT_IMAGE_BACKUP" ]; then
- SPECIAL_BACKUP="$DIFFERENT_IMAGE_BACKUP"
- log_info "Preserving newest backup from different image version"
- elif [ -n "$OLDEST_BACKUP" ]; then
- SPECIAL_BACKUP="$OLDEST_BACKUP"
- log_info "Preserving oldest backup from current image version"
- fi
- if [ -n "$SPECIAL_BACKUP" ]; then
- ALREADY_KEPT=false
- for keep in "${KEEP_BACKUPS[@]}"; do
- if [ "$keep" = "$SPECIAL_BACKUP" ]; then
- ALREADY_KEPT=true
- break
- fi
- done
- if [ "$ALREADY_KEPT" = false ]; then
- KEEP_BACKUPS+=("$SPECIAL_BACKUP")
- fi
- fi
- # Step 5: Delete backups that are not in the keep list
- for backup in "${BACKUP_ARRAY[@]}"; do
- SHOULD_KEEP=false
- for keep in "${KEEP_BACKUPS[@]}"; do
- if [ "$backup" = "$keep" ]; then
- SHOULD_KEEP=true
- break
- fi
- done
-
- if [ "$SHOULD_KEEP" = false ]; then
- log_info "Deleting old backup: $(basename $backup)"
- rm -f "$backup"
- fi
- done
- # Summary
- REMAINING=$(ls "$BACKUP_DIR"/agent_backup-*.tar.gz 2>/dev/null | wc -l)
- log_info "Backup complete! Remaining backups: $REMAINING"
- log_info "Current image ID: $IMAGE_ID"
- exit 0
|