Your IP : 216.73.217.79


Current Path : /home/otto/python/
Upload File :
Current File : //home/otto/python/db-bck.py

import os
import subprocess
import datetime
import glob

# Settings list where each entry is the details of one web site/ database
all_settings = [
    {
        "db_host": "cesa-main-db.local",
        "db_port": 3306,
        "db_name": "cesa",
        "db_user": "cesa",
        "db_pass": "]u9yU[ui92.6V0vN",
        "backup_dir": "/var/backups",
        "retention_days": 7,
        # "db_restore_host": "cesa-main-db.local",
        # "db_restore_port": 3306,
        # "db_restore_name": "cesa",
        # "db_restore_user": "cesa",
        # "db_restore_pass": "MAC4SCg9268c_MCd",
        "storage_engine": "innodb"
    },
    {
        "db_host": "cesa-main-db.local",
        "db_port": 3306,
        "db_name": "cesa_mail",
        "db_user": "cesa_mail",
        "db_pass": "c1yN3zU6ZN/BeXk1",
        "backup_dir": "/var/backups",
        "retention_days": 7,
        # "db_restore_host": "cesa-main-db.local",
        # "db_restore_port": 3306,
        # "db_restore_name": "cesa_mail",
        # "db_restore_user": "cesa_mail",
        # "db_restore_pass": "DIo60ZDXK7A9iSwG",
        "storage_engine": "innodb"
    },
    {
        "db_host": "cesa-main-db.local",
        "db_port": 3306,
        "db_name": "cesa_wp",
        "db_user": "cesa_wp",
        "db_pass": "Ji)YGPcY5Km8uNsy",
        "backup_dir": "/var/backups",
        "retention_days": 7,
        # "db_restore_host": "cesa-main-db.local",
        # "db_restore_port": 3306,
        # "db_restore_name": "cesa_wp",
        # "db_restore_user": "cesa_wp",
        # "db_restore_pass": "r0jYdp5/h)iLA/N5",
        "storage_engine": "myisam"
    }
]

for index, settings in enumerate(all_settings):

    backup_dir = settings["backup_dir"]
    retention_days = settings["retention_days"]
    db_host = settings["db_host"]
    db_port = settings["db_port"]
    db_name = settings["db_name"]
    db_user = settings["db_user"]
    db_pass = settings["db_pass"]

    # Ensure backup directory exists
    os.makedirs(backup_dir, exist_ok=True)

    # Today's date
    today = datetime.date.today().isoformat()
    backup_file = os.path.join(backup_dir, f"{db_name}-{today}.sql.gz")
    all_settings[index]["backup_file"] = backup_file

    print(f"Backing up {db_name} to {backup_file}")
    # Run mysqldump using environment variables to avoid shell interpretation issues
    env = os.environ.copy()
    env['MYSQL_PWD'] = db_pass
    
    # Build mysqldump command without password in command line
    mysqldump_args = [
        "mysqldump",
        "-f",
        "--skip-triggers", 
        "--add-locks",
        "--hex-blob",
        "--single-transaction",
        "-u", db_user,
        "-h", db_host,
        "-P", str(db_port),
        db_name
    ]
    
    # Run mysqldump and pipe through sed commands
    dump_cmd = " ".join(mysqldump_args) + " | sed '1i SET FOREIGN_KEY_CHECKS=0;' | sed '$a SET FOREIGN_KEY_CHECKS=1;' | sed 's/DEFINER[ ]*=[ ]*[^*]*\\*/\\*/' | gzip > " + backup_file
    subprocess.run(dump_cmd, shell=True, check=True, env=env)

for settings in all_settings:
    
    #Check if db_restore_pass is defined
    if "db_restore_pass" in settings:

        db_name = settings["db_name"]
        db_restore_host = settings["db_restore_host"]
        db_restore_port = settings["db_restore_port"]
        db_restore_name = settings["db_restore_name"]
        db_restore_user = settings["db_restore_user"]
        db_restore_pass = settings["db_restore_pass"]
        backup_file = settings["backup_file"]

        # Restore the database from zipped backup file
        print(f"Restoring {db_name} from {backup_file}")
        
        # Use environment variables to avoid shell interpretation issues
        restore_env = os.environ.copy()
        restore_env['MYSQL_PWD'] = db_restore_pass
        
        restore_cmd = (
            f"gunzip -c {backup_file} | "
            f"mysql -u {db_restore_user} -h {db_restore_host} "
            f"-P {db_restore_port} {db_restore_name}"
        )
        subprocess.run(restore_cmd, shell=True, check=True, env=restore_env)

for index, settings in enumerate(all_settings):

    db_name = settings["db_name"]
    retention_days = settings["retention_days"]
    backup_dir = settings["backup_dir"]

    print(f"Deleting old backups of {db_name} older than {retention_days} days")
    # Delete old backups
    cutoff = datetime.datetime.now() - datetime.timedelta(days=retention_days)
    for f in glob.glob(os.path.join(backup_dir, f"{db_name}-*.sql.gz")):
        file_time = datetime.datetime.fromtimestamp(os.path.getmtime(f))
        if file_time < cutoff:
            os.remove(f)