\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/DatabaseBackupMasterv8/ |
|
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())