adri 1 месяц назад
Родитель
Сommit
eed5c2fd43
1 измененных файлов с 182 добавлено и 0 удалено
  1. 182 0
      pre-update.sh

+ 182 - 0
pre-update.sh

@@ -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
+