\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
| Path : /var/www/html/yedekledb24/DatabaseBackupMasterv3/ |
|
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)