docker_images/odoo/scripts/backup.py

74 lines
2.7 KiB
Python

# -*- coding: utf-8 -*-
""" Odoo backup script """
from datetime import datetime
import argparse
import httplib
import urllib
import common
def datefmt():
""" Get adapted date format """
today = datetime.today()
return today.strftime('%Y-%m-%d_%Hh%Mm%Ss')
def dump(odoo, args):
""" Dumps a database list from API or HTTP call """
for dbname in args.names.split(','):
if args.alternative == 'no':
dumpf = odoo.db.dump(args.password, dbname, args.format)
else:
conn = httplib.HTTPConnection(args.host, args.port)
if odoo.version != '8.0':
params = urllib.urlencode({'master_pwd': args.password,
'name': dbname,
'backup_format': args.format})
headers = {"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain"}
conn.request('POST', '/web/database/backup', params, headers)
else:
headers = {"Accept": "text/plain"}
url = (u'/web/database/backup?backup_pwd=%s&backup_db=%s'
'&backup_format=%s&token=') % (args.password, dbname, args.format)
conn.request('GET', url, '', headers)
dumpf = conn.getresponse()
fpath = '{bakpath}/{date}_{host}_{dbname}.{fmt}'.format(
bakpath=args.directory, host=args.host, dbname=dbname,
date=datefmt(), fmt=args.format
)
with open(fpath, 'wb') as zipf:
zipf.write(dumpf.read())
if args.alternative != 'no':
conn.close()
return True
def main():
""" Main function with argument parsing """
parser = argparse.ArgumentParser(description='Backup Odoo databases')
parser = common.parser(parser)
parser.add_argument('-pw', '--password', type=str, required=True,
help='the odoo master password')
parser.add_argument('-D', '--directory', type=str, required=True,
help='the directory path where to save backups')
parser.add_argument('-n', '--names', type=str,
help='optional database names (default:all)')
parser.add_argument('-f', '--format', type=str, default='zip',
help='optional database format (default:zip)')
parser.add_argument('-alt', '--alternative', type=str, default='no',
help='alternative dump through HTTP calls (default:no)')
args = parser.parse_args()
# Connection
odoo = common.connection(args)
# Backup actions
if not args.names:
args.names = odoo.db.list()
dump(odoo, args)
if __name__ == "__main__":
main()