mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
[enh] Store backup size and check free space before restoring (bugfix #189)
This commit is contained in:
parent
aafa9caeea
commit
4e48aeb388
2 changed files with 21 additions and 1 deletions
|
@ -6,6 +6,7 @@
|
||||||
"installation_failed" : "Installation failed",
|
"installation_failed" : "Installation failed",
|
||||||
"unexpected_error" : "An unexpected error occured",
|
"unexpected_error" : "An unexpected error occured",
|
||||||
"action_invalid" : "Invalid action '{:s}'",
|
"action_invalid" : "Invalid action '{:s}'",
|
||||||
|
"not_enough_disk_space" : "Not enough free disk space on '{path:s}'",
|
||||||
|
|
||||||
"license_undefined" : "undefined",
|
"license_undefined" : "undefined",
|
||||||
"no_appslist_found" : "No apps list found",
|
"no_appslist_found" : "No apps list found",
|
||||||
|
|
|
@ -227,6 +227,11 @@ def backup_create(name=None, description=None, output_directory=None,
|
||||||
_clean_tmp_dir(1)
|
_clean_tmp_dir(1)
|
||||||
raise MoulinetteError(errno.EINVAL, m18n.n('backup_nothings_done'))
|
raise MoulinetteError(errno.EINVAL, m18n.n('backup_nothings_done'))
|
||||||
|
|
||||||
|
# Calculate total size
|
||||||
|
size = subprocess.check_output(
|
||||||
|
['du','-sb', tmp_dir]).split()[0].decode('utf-8')
|
||||||
|
info['size'] = int(size)
|
||||||
|
|
||||||
# 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:
|
||||||
f.write(json.dumps(info))
|
f.write(json.dumps(info))
|
||||||
|
@ -311,6 +316,14 @@ def backup_restore(name, hooks=[], apps=[], ignore_apps=False, ignore_hooks=Fals
|
||||||
tmp_dir)
|
tmp_dir)
|
||||||
os.system('rm -rf %s' % tmp_dir)
|
os.system('rm -rf %s' % tmp_dir)
|
||||||
|
|
||||||
|
# Check available disk space
|
||||||
|
statvfs = os.statvfs(backup_path)
|
||||||
|
free_space = statvfs.f_frsize * statvfs.f_bavail
|
||||||
|
if free_space < info['size']:
|
||||||
|
logger.debug("%dB left but %dB is needed", free_space, info['size'])
|
||||||
|
raise MoulinetteError(
|
||||||
|
errno.EIO, m18n.n('not_enough_disk_space', path=backup_path))
|
||||||
|
|
||||||
def _clean_tmp_dir(retcode=0):
|
def _clean_tmp_dir(retcode=0):
|
||||||
ret = hook_callback('post_backup_restore', args=[tmp_dir, retcode])
|
ret = hook_callback('post_backup_restore', args=[tmp_dir, retcode])
|
||||||
if not ret['failed']:
|
if not ret['failed']:
|
||||||
|
@ -538,7 +551,13 @@ def backup_info(name, with_details=False, human_readable=False):
|
||||||
logger.debug("unable to load '%s'", info_file, exc_info=1)
|
logger.debug("unable to load '%s'", info_file, exc_info=1)
|
||||||
raise MoulinetteError(errno.EIO, m18n.n('backup_invalid_archive'))
|
raise MoulinetteError(errno.EIO, m18n.n('backup_invalid_archive'))
|
||||||
|
|
||||||
size = os.path.getsize(archive_file)
|
# Retrieve backup size
|
||||||
|
size = info.get('size', 0)
|
||||||
|
if not size:
|
||||||
|
tar = tarfile.open(archive_file, "r:gz")
|
||||||
|
size = reduce(lambda x,y: getattr(x, 'size', x)+getattr(y, 'size', y),
|
||||||
|
tar.getmembers())
|
||||||
|
tar.close()
|
||||||
if human_readable:
|
if human_readable:
|
||||||
size = binary_to_human(size) + 'B'
|
size = binary_to_human(size) + 'B'
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue