#!/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