dgd-backupper/backupper.py

126 lines
4.0 KiB
Python

import argparse
import os
import shutil
import subprocess
from datetime import datetime
parser = argparse.ArgumentParser(description='Backup manager for backing up Docker Containers to Google Drive.')
parser.add_argument('--containers', nargs='+', required=True)
parser.add_argument('--data', required=False)
parser.add_argument('--backup', required=True, help='Backup target directory.')
parser.add_argument('--export', required=True, help='Compressed backup file target directory.')
parser.add_argument('--upload', action='store_true', required=False)
parser.add_argument('--clean', action='store_true', required=False)
mysql_parser = parser.add_argument_group('mysql')
mysql_parser.add_argument('--mysql', required=False, help='MySql container name or id')
mysql_parser.add_argument('--user', required=False, help='MySql username')
mysql_parser.add_argument('--password', required=False, help='MySql password')
args = parser.parse_args()
containers = args.containers
data = args.data
mysql = args.mysql
user = args.user
password = args.password
upload = args.upload
folder = args.backup
export = args.export
clean = args.clean
def clear_backup():
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
try:
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
except Exception as e:
print('Failed to delete %s. Reason: %s' % (file_path, e))
def runcommand(cmd):
proc = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True,
universal_newlines=True)
std_out, std_err = proc.communicate()
return proc.returncode, std_out, std_err
if containers:
if not os.path.exists(folder):
os.mkdir(folder)
clear_backup()
for container in containers:
print 'Backing up ' + container + '...'
exitCode = runcommand("docker export " + container + " -o " + folder + "/" + container + ".tar.gz")
if exitCode[0] is 0:
print container + ' successfully backed up.'
else:
print container + ' could not be backed up.'
print exitCode[2]
if data:
if not os.path.exists(data):
print 'Data folder is not exist.'
print 'Backing up data folder...'
exitCode = runcommand("tar -zcf " + folder + "/data.tar.gz " + data)
if exitCode[0] is 0:
print 'Data folder successfully backed up.'
else:
print 'Data folder could not be backed up.'
print exitCode[2]
if mysql:
if not user:
print 'WARNING: MySql username is null.'
if not password:
print 'WARNING: MySql password is null.'
print 'Backing up MySql databases...'
exitCode = runcommand("docker exec " + mysql + " /usr/bin/mysqldump -u " + user + " --password=" + password
+ " --all-databases > " + folder + "/backup.sql")
if exitCode[0] is 0:
print 'MySql databases successfully backed up.'
else:
print 'MySql databases could not be backed up.'
print exitCode[2]
if upload:
backup_name = datetime.now().strftime("%d-%m-%Y_%H-%M-%S")
backup_path = export + "/backup_" + backup_name + ".tar.gz"
print 'Preparing for backup...'
if not os.path.exists(export):
os.mkdir(export)
exitCode = runcommand("tar -zcf " + backup_path + " " + folder)
if exitCode[0] is 0:
print 'Preparing successfully.'
print 'Uploading...'
exitCode = runcommand("mega-put " + backup_path + " /backup/backup_" + backup_name + ".tar.gz")
if exitCode[0] is 0:
print 'Upload successful.'
else:
print 'Upload failed.'
print exitCode[2]
else:
print 'Preparing failed.'
print exitCode[2]
if clean:
if os.path.exists(folder):
shutil.rmtree(folder)
if os.path.exists(export):
shutil.rmtree(export)