|
|
@@ -0,0 +1,182 @@
|
|
|
+#!/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
|
|
|
+
|