diff --git a/backupper.py b/backupper.py new file mode 100644 index 0000000..6c8835a --- /dev/null +++ b/backupper.py @@ -0,0 +1,116 @@ +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.') +#group = parser.add_mutually_exclusive_group(required=True) + +# parser.add_argument('--export', action='store_true', help="Back up the Docker Container with the load method.") +# parser.add_argument('--containers', action='store_true', type=list, help="Back up the Docker Container with the +# load method.", required=True) +parser.add_argument('--containers', nargs='+', required=True) +parser.add_argument('--data', required=False) +parser.add_argument('--upload', action='store_true', required=False) + +#sub = parser.add_subparsers(help='Backup mysql databases.') +#mysql_parser = sub.add_parser +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 + + +def clear_backup(): + folder = '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('backup'): + os.mkdir('backup') + + clear_backup() + + for container in containers: + print 'Backing up ' + container + '...' + exitCode = runcommand("docker export " + container + " -o backup/" + 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 backup/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 > backup/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") + print 'Preparing for backup...' + exitCode = runcommand("tar -zcf backup_" + backup_name + ".tar.gz backup") + if exitCode[0] is 0: + print 'Preparing successfully.' + print 'Uploading...' + exitCode = runcommand("mega-put backup_" + backup_name + ".tar.gz /backup/backup_" + backup_name + ".tar.gz") + if exitCode[0] is 0: + print 'Upload successful.' + else: + print 'Upload failed.' + print exitCode[2] + if os.path.exists("backup_" + backup_name + ".tar.gz"): + os.remove("backup_" + backup_name + ".tar.gz") + else: + print 'Preparing failed.' + print exitCode[2]