Create backupper.py
parent
d5678dcfd1
commit
e6b4fdc17d
|
|
@ -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]
|
||||
Loading…
Reference in New Issue