[enh] Use new filesystem utils in backup_create

This commit is contained in:
Jérôme Lebleu 2015-10-02 20:31:57 +02:00
parent 20c4937f81
commit 007dfed607
2 changed files with 24 additions and 23 deletions

View file

@ -35,6 +35,7 @@ import subprocess
from collections import OrderedDict from collections import OrderedDict
from moulinette.core import MoulinetteError from moulinette.core import MoulinetteError
from moulinette.utils import filesystem
from moulinette.utils.log import getActionLogger from moulinette.utils.log import getActionLogger
backup_path = '/home/yunohost.backup' backup_path = '/home/yunohost.backup'
@ -115,15 +116,11 @@ def backup_create(name=None, description=None, output_directory=None,
if os.path.isdir(tmp_dir): if os.path.isdir(tmp_dir):
logger.warning("temporary directory for backup '%s' already exists", logger.warning("temporary directory for backup '%s' already exists",
tmp_dir) tmp_dir)
os.system('rm -rf %s' % tmp_dir) filesystem.rm(tmp_dir, recursive=True)
try: filesystem.mkdir(tmp_dir, 0750, parents=True, uid='admin')
os.mkdir(tmp_dir, 0750)
except OSError: def _clean_tmp_dir():
# Create temporary directory recursively filesystem.rm(tmp_dir, True, True)
os.makedirs(tmp_dir, 0750)
os.system('chown -hR admin: %s' % backup_path)
else:
os.system('chown -hR admin: %s' % tmp_dir)
# Initialize backup info # Initialize backup info
info = { info = {
@ -169,17 +166,17 @@ def backup_create(name=None, description=None, output_directory=None,
'warning') 'warning')
continue continue
tmp_app_dir = '{:s}/{:s}'.format(tmp_dir, app_id) tmp_app_dir = '{:s}/apps/{:s}'.format(tmp_dir, app_id)
tmp_app_bkp_dir = tmp_app_dir + '/backup'
msignals.display(m18n.n('backup_running_app_script', app_id)) msignals.display(m18n.n('backup_running_app_script', app_id))
try: try:
# Prepare backup directory for the app # Prepare backup directory for the app
os.mkdir(tmp_app_dir, 0750) filesystem.mkdir(tmp_app_bkp_dir, 0750, True, uid='admin')
os.mkdir(tmp_app_dir + '/backup', 0750)
shutil.copytree(app_setting_path, tmp_app_dir + '/settings') shutil.copytree(app_setting_path, tmp_app_dir + '/settings')
# Copy app backup script in a temporary folder and execute it # Copy app backup script in a temporary folder and execute it
subprocess.call(['install', '-Dm555', app_script, tmp_script]) subprocess.call(['install', '-Dm555', app_script, tmp_script])
hook_exec(tmp_script, args=[tmp_app_dir + '/backup', app_id]) hook_exec(tmp_script, args=[tmp_app_bkp_dir, app_id])
except: except:
logger.exception("error while executing backup of '%s'", app_id) logger.exception("error while executing backup of '%s'", app_id)
msignals.display(m18n.n('backup_app_failed', app=app_id), msignals.display(m18n.n('backup_app_failed', app=app_id),
@ -193,10 +190,12 @@ def backup_create(name=None, description=None, output_directory=None,
'version': i['version'], 'version': i['version'],
} }
finally: finally:
try: filesystem.rm(tmp_script, force=True)
os.unlink(tmp_script)
except OSError: # Check if something has been saved
pass if ignore_hooks and not info['apps']:
_clean_tmp_dir()
raise MoulinetteError(errno.EINVAL, m18n.n('backup_nothings_done'))
# Create backup info file # Create backup info file
with open("%s/info.json" % tmp_dir, 'w') as f: with open("%s/info.json" % tmp_dir, 'w') as f:
@ -217,7 +216,7 @@ def backup_create(name=None, description=None, output_directory=None,
try: try:
tar = tarfile.open(archive_file, "w:gz") tar = tarfile.open(archive_file, "w:gz")
except: except:
logger.exception("unable to open the archive '%s' for writing " logger.exception("unable to open '%s' for writing "
"after creating directory '%s'", "after creating directory '%s'",
archive_file, archives_path) archive_file, archives_path)
tar = None tar = None
@ -225,18 +224,19 @@ def backup_create(name=None, description=None, output_directory=None,
logger.exception("unable to open the archive '%s' for writing", logger.exception("unable to open the archive '%s' for writing",
archive_file) archive_file)
if tar is None: if tar is None:
_clean_tmp_dir()
raise MoulinetteError(errno.EIO, raise MoulinetteError(errno.EIO,
m18n.n('backup_archive_open_failed')) m18n.n('backup_archive_open_failed'))
tar.add(tmp_dir, arcname='') tar.add(tmp_dir, arcname='')
tar.close() tar.close()
# Copy info file # Move info file
os.system('mv %s/info.json %s/%s.info.json' % os.rename(tmp_dir + '/info.json',
(tmp_dir, archives_path, name)) '{:s}/{:s}.info.json'.format(archives_path, name))
# Clean temporary directory # Clean temporary directory
if tmp_dir != output_directory: if tmp_dir != output_directory:
os.system('rm -rf %s' % tmp_dir) _clean_tmp_dir()
msignals.display(m18n.n('backup_complete'), 'success') msignals.display(m18n.n('backup_complete'), 'success')

View file

@ -139,7 +139,7 @@
"packages_upgrade_failed" : "Unable to upgrade all packages", "packages_upgrade_failed" : "Unable to upgrade all packages",
"system_upgraded" : "System successfully upgraded", "system_upgraded" : "System successfully upgraded",
"backup_action_required" : "You must specify something to backup", "backup_action_required" : "You must specify something to save",
"backup_output_directory_required" : "You must provide an output directory for the backup", "backup_output_directory_required" : "You must provide an output directory for the backup",
"backup_output_directory_forbidden" : "Forbidden output directory", "backup_output_directory_forbidden" : "Forbidden output directory",
"backup_output_directory_not_empty" : "Output directory is not empty", "backup_output_directory_not_empty" : "Output directory is not empty",
@ -151,6 +151,7 @@
"backup_archive_name_unknown" : "Unknown local backup archive named '{:s}'", "backup_archive_name_unknown" : "Unknown local backup archive named '{:s}'",
"backup_archive_name_exists" : "Backup archive name already exists", "backup_archive_name_exists" : "Backup archive name already exists",
"backup_app_failed" : "Unable to back up the app '{app:s}'", "backup_app_failed" : "Unable to back up the app '{app:s}'",
"backup_nothings_done" : "There is nothing to save",
"backup_complete" : "Backup complete", "backup_complete" : "Backup complete",
"backup_invalid_archive" : "Invalid backup archive", "backup_invalid_archive" : "Invalid backup archive",
"restore_confirm_yunohost_installed" : "Do you really want to restore an already installed system? [{answers:s}]", "restore_confirm_yunohost_installed" : "Do you really want to restore an already installed system? [{answers:s}]",