| Current Path : /var/www/cesa.co.za/python/ |
| Current File : /var/www/cesa.co.za/python/db-transfer-no-longer-needed.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": "sql1.cpt2.host-h.net",
"db_port": 3306,
"db_name": "saacedb",
"db_user": "saacea_1",
"db_pass": "heJxoP40d",
"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": "sql1.cpt2.host-h.net",
"db_port": 3306,
"db_name": "saacemail",
"db_user": "saacea_3",
"db_pass": "GFTcREk8",
"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": "sql8.cpt2.host-h.net",
"db_port": 3306,
"db_name": "cesa_wp",
"db_user": "saacea_7",
"db_pass": "WbtTYUYUu58",
"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
dump_cmd = f"mysqldump -f --skip-triggers --add-locks --hex-blob --single-transaction" \
+ f" -u {db_user} -p{db_pass} -h {db_host} -P {db_port} {db_name} "\
+ f"| 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)
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}")
restore_cmd = (
f"gunzip -c {backup_file} | "
f"mysql -u {db_restore_user} -p{db_restore_pass} -h {db_restore_host} "
f"-P {db_restore_port} {db_restore_name}"
)
subprocess.run(restore_cmd, shell=True, check=True)
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)