#!/bin/bash # سكريبت النسخ الاحتياطي لنظام الحارس التلقائي # Auto Guardian System Backup Script # ====================================== # إعداداتColors GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # إعدادات النسخ الاحتياطي BACKUP_DIR="backups" BACKUP_PREFIX="auto-guardian" RETENTION_DAYS=30 LOG_FILE="logs/backup.log" # دوال مساعدة print_info() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } log_message() { local level=$1 local message=$2 echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" >> "$LOG_FILE" } # إنشاء مجلد السجلات إن لم يوجد mkdir -p "$(dirname "$LOG_FILE")" print_header() { echo "" echo "==============================================" echo " نظام الحارس التلقائي - النسخ الاحتياطي" echo "==============================================" echo "" } # دالة إنشاء نسخة احتياطية create_backup() { print_info "جاري إنشاء نسخة احتياطية..." # إنشاء مجلد النسخ الاحتياطي إن لم يوجد mkdir -p "$BACKUP_DIR" # إنشاء اسم الملف مع التاريخ والوقت local timestamp=$(date +%Y%m%d_%H%M%S) local backup_filename="${BACKUP_PREFIX}_${timestamp}" local backup_path="${BACKUP_DIR}/${backup_filename}" local tar_filename="${backup_filename}.tar.gz" log_message "INFO" "بدء إنشاء نسخة احتياطية: $tar_filename" # إنشاء مجلد مؤقت للنسخة الاحتياطية local temp_dir=$(mktemp -d) trap "rm -rf $temp_dir" EXIT print_info "جاري تجميع الملفات..." # نسخ الإعدادات print_info "نسخ الإعدادات..." mkdir -p "$temp_dir/config" cp config/settings.yaml "$temp_dir/config/" 2>/dev/null || true cp config/rules.yaml "$temp_dir/config/" 2>/dev/null || true cp config/alerts.yaml "$temp_dir/config/" 2>/dev/null || true cp config/whitelist.yaml "$temp_dir/config/" 2>/dev/null || true cp .env.example "$temp_dir/" 2>/dev/null || true # نسخ السجلات (آخر 7 أيام) print_info "نسخ السجلات..." mkdir -p "$temp_dir/logs" find logs/ -name "*.log" -mtime -7 -exec cp {} "$temp_dir/logs/" \; 2>/dev/null || true # نسخ قاعدة البيانات إن وجدت print_info "نسخ قاعدة البيانات..." if [ -f "data/autoguardian.db" ]; then mkdir -p "$temp_dir/data" cp data/autoguardian.db "$temp_dir/data/" fi # نسخ قائمة العناوكات المحظورة print_info "نسخ قائمة العناوكات المحظورة..." if [ -f "data/blocked_ips.json" ]; then mkdir -p "$temp_dir/data" cp data/blocked_ips.json "$temp_dir/data/" fi # نسخ معلومات الإصدار print_info "نسخ معلومات الإصدار..." echo "{ \"backup_date\": \"$(date -Iseconds)\", \"version\": \"$(git describe --tags 2>/dev/null || echo '1.3.0')\", \"git_branch\": \"$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')\", \"git_commit\": \"$(git rev-parse HEAD 2>/dev/null || echo 'unknown')\" }" > "$temp_dir/backup_info.json" # ضغط الملفات print_info "ضغط الملفات..." tar -czf "$BACKUP_DIR/$tar_filename" -C "$temp_dir" . # حذف المجلد المؤقت rm -rf "$temp_dir" # التحقق من نجاح الضغط if [ -f "$BACKUP_DIR/$tar_filename" ]; then local file_size=$(du -h "$BACKUP_DIR/$tar_filename" | cut -f1) print_success "تم إنشاء النسخة الاحتياطية: $tar_filename ($file_size)" log_message "INFO" "اكتمل النسخ الاحتياطي بنجاح: $tar_filename ($file_size)" # إنشاء ملف فهرس echo "$tar_filename $(date -Iseconds) $(git describe --tags 2>/dev/null || echo 'unknown')" >> "$BACKUP_DIR/backup_index.txt" return 0 else print_error "فشل في إنشاء النسخة الاحتياطية" log_message "ERROR" "فشل في إنشاء النسخة الاحتياطية" return 1 fi } # دالة حذف النسخ القديمة cleanup_old_backups() { print_info "جاري حذف النسخ الاحتياطية القديمة (أقدم من $RETENTION_DAYS يوماً)..." local deleted_count=0 local deleted_size=0 # البحث عن الملفات القديمة while IFS= read -r -d '' file; do local file_size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null || echo 0) deleted_size=$((deleted_size + file_size)) rm -f "$file" ((deleted_count++)) print_info "حُذف: $(basename "$file")" done < <(find "$BACKUP_DIR" -name "${BACKUP_PREFIX}_*.tar.gz" -mtime +$RETENTION_DAYS -print0) if [ $deleted_count -gt 0 ]; then print_success "حُذفت $deleted_count نسخة احتياطية (حوالي $(echo "scale=2; $deleted_size/1048576" | bc) MB)" log_message "INFO" "حُذفت $deleted_count نسخة احتياطية" else print_info "لا توجد نسخ احتياطية قديمة للحذف" fi } # دالة عرض النسخ الاحتياطية المتاحة list_backups() { echo "" echo "النسخ الاحتياطية المتاحة:" echo "----------------------------" if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]; then print_warning "لا توجد نسخ احتياطية" return 1 fi local total_size=0 local count=0 while IFS= read -r -d '' file; do local filename=$(basename "$file") local filesize=$(du -h "$file" | cut -f1) local filedate=$(stat -c %y "$file" 2>/dev/null | cut -d' ' -f1,2 | cut -d'.' -f1 || stat -f "%Sm" -t "%Y-%m-%d %H:%M:%S" "$file" 2>/dev/null) echo " $filename" echo " الحجم: $filesize | التاريخ: $filedate" echo "" total_size=$((total_size + $(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null || echo 0))) ((count++)) done < <(find "$BACKUP_DIR" -name "${BACKUP_PREFIX}_*.tar.gz" -print0 | sort -rz) echo "----------------------------" echo "إجمالي النسخ: $count" echo "الحجم الإجمالي: $(echo "scale=2; $total_size/1048576" | bc) MB" } # دالة استعادة نسخة احتياطية restore_backup() { local backup_file=$1 if [ -z "$backup_file" ]; then print_error "يرجى تحديد ملف النسخ الاحتياطية" echo "الاستخدام: $0 restore " return 1 fi # التحقق من وجود الملف if [ ! -f "$backup_file" ]; then # البحث في مجلد النسخ الاحتياطية if [ -f "$BACKUP_DIR/$backup_file" ]; then backup_file="$BACKUP_DIR/$backup_file" else # البحث عن ملف يبدأ بالاسم backup_file=$(find "$BACKUP_DIR" -name "${backup_file}*.tar.gz" -o -name "*${backup_file}*.tar.gz" 2>/dev/null | head -1) if [ -z "$backup_file" ]; then print_error "الملف غير موجود: $backup_file" return 1 fi fi fi print_warning "سيتم استعادة النسخة الاحتياطية: $(basename "$backup_file")" print_warning "سيتم الكتابة فوق الإعدادات الحالية!" read -p "هل تريد المتابعة؟ (y/N): " confirm if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then print_info "تم الإلغاء" return 0 fi print_info "جاري استعادة النسخة الاحتياطية..." # إنشاء مجلد مؤقت local temp_dir=$(mktemp -d) trap "rm -rf $temp_dir" EXIT # استخراج الملفات tar -xzf "$backup_file" -C "$temp_dir" # التحقق من وجود ملف المعلومات if [ -f "$temp_dir/backup_info.json" ]; then print_info "معلومات النسخة الاحتياطية:" cat "$temp_dir/backup_info.json" echo "" fi # استعادة الإعدادات if [ -f "$temp_dir/config/settings.yaml" ]; then cp "$temp_dir/config/settings.yaml" config/settings.yaml print_success "استُعيدت الإعدادات" fi # استعادة السجلات if [ -d "$temp_dir/logs" ]; then cp -r "$temp_dir/logs/"* logs/ 2>/dev/null || true print_success "استُعيدت السجلات" fi # استعادة قاعدة البيانات if [ -f "$temp_dir/data/autoguardian.db" ]; then mkdir -p data cp "$temp_dir/data/autoguardian.db" data/ print_success "استُعيدت قاعدة البيانات" fi # استعادة قائمة العناوكات المحظورة if [ -f "$temp_dir/data/blocked_ips.json" ]; then mkdir -p data cp "$temp_dir/data/blocked_ips.json" data/ print_success "استُعيدت قائمة العناوكات المحظورة" fi print_success "اكتمل استعادة النسخة الاحتياطية" log_message "INFO" "استُعيدت النسخة الاحتياطية: $(basename "$backup_file")" } # دالة إنشاء نسخة احتياطية للسجلات فقط backup_logs_only() { print_info "جاري إنشاء نسخة احتياطية للسجلات فقط..." local timestamp=$(date +%Y%m%d_%H%M%S) local backup_filename="${BACKUP_PREFIX}_logs_${timestamp}.tar.gz" if [ -d "logs" ] && [ "$(ls -A logs 2>/dev/null)" ]; then tar -czf "$BACKUP_DIR/$backup_filename" logs/ print_success "تم إنشاء: $backup_filename" else print_warning "لا توجد سجلات للنسخ الاحتياطي" fi } # دالة عرض المساعدة show_help() { echo "" echo "استخدام: $0 [الأمر]" echo "" echo "الأوامر المتاحة:" echo "" echo " backup - إنشاء نسخة احتياطية كاملة" echo " backup-logs - إنشاء نسخة احتياطية للسجلات فقط" echo " list - قائمة النسخ الاحتياطية المتاحة" echo " restore - استعادة نسخة احتياطية" echo " cleanup - حذف النسخ القديمة" echo " help - عرض هذه المساعدة" echo "" echo "أمثلة:" echo " $0 backup" echo " $0 list" echo " $0 restore auto-guardian_20241013_120000.tar.gz" echo " $0 cleanup" echo "" } # ======================================== # البرنامج الرئيسي # ======================================== print_header # التحقق من الوسائط case "${1:-backup}" in backup) create_backup cleanup_old_backups ;; backup-logs) backup_logs_only ;; list) list_backups ;; restore) restore_backup "${2:-}" ;; cleanup) cleanup_old_backups ;; help|--help|-h) show_help ;; *) print_error "أمر غير معروف: $1" show_help exit 1 ;; esac echo "" print_success "اكتمل العمل بنجاح!" echo ""