mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Clean tmp directory if it not empty
This commit is contained in:
parent
def005d2da
commit
55e9df75d0
1 changed files with 38 additions and 26 deletions
|
@ -326,10 +326,19 @@ class BackupManager():
|
||||||
if not os.path.isdir(self.work_dir):
|
if not os.path.isdir(self.work_dir):
|
||||||
filesystem.mkdir(self.work_dir, 0o750, parents=True, uid='admin')
|
filesystem.mkdir(self.work_dir, 0o750, parents=True, uid='admin')
|
||||||
elif self.is_tmp_work_dir:
|
elif self.is_tmp_work_dir:
|
||||||
logger.debug("temporary directory for backup '%s' already exists",
|
|
||||||
|
logger.debug("temporary directory for backup '%s' already exists... attempting to clean it",
|
||||||
self.work_dir)
|
self.work_dir)
|
||||||
# FIXME May be we should clean the workdir here
|
|
||||||
raise YunohostError('backup_output_directory_not_empty')
|
# Try to recursively unmount stuff (from a previously failed backup ?)
|
||||||
|
if _recursive_umount(self.work_dir) > 0:
|
||||||
|
raise YunohostError('backup_output_directory_not_empty')
|
||||||
|
else:
|
||||||
|
# If umount succeeded, remove the directory (we checked that
|
||||||
|
# we're in /home/yunohost.backup/tmp so that should be okay...
|
||||||
|
# c.f. method clean() which also does this)
|
||||||
|
filesystem.rm(self.work_dir, True, True)
|
||||||
|
filesystem.mkdir(self.work_dir, 0o750, parents=True, uid='admin')
|
||||||
|
|
||||||
#
|
#
|
||||||
# Backup target management #
|
# Backup target management #
|
||||||
|
@ -1514,34 +1523,12 @@ class BackupMethod(object):
|
||||||
directories of the working directories
|
directories of the working directories
|
||||||
"""
|
"""
|
||||||
if self.need_mount():
|
if self.need_mount():
|
||||||
if self._recursive_umount(self.work_dir) > 0:
|
if _recursive_umount(self.work_dir) > 0:
|
||||||
raise YunohostError('backup_cleaning_failed')
|
raise YunohostError('backup_cleaning_failed')
|
||||||
|
|
||||||
if self.manager.is_tmp_work_dir:
|
if self.manager.is_tmp_work_dir:
|
||||||
filesystem.rm(self.work_dir, True, True)
|
filesystem.rm(self.work_dir, True, True)
|
||||||
|
|
||||||
def _recursive_umount(self, directory):
|
|
||||||
"""
|
|
||||||
Recursively umount sub directories of a directory
|
|
||||||
|
|
||||||
Args:
|
|
||||||
directory -- a directory path
|
|
||||||
"""
|
|
||||||
mount_lines = subprocess.check_output("mount").split("\n")
|
|
||||||
|
|
||||||
points_to_umount = [line.split(" ")[2]
|
|
||||||
for line in mount_lines
|
|
||||||
if len(line) >= 3 and line.split(" ")[2].startswith(directory)]
|
|
||||||
ret = 0
|
|
||||||
for point in reversed(points_to_umount):
|
|
||||||
ret = subprocess.call(["umount", point])
|
|
||||||
if ret != 0:
|
|
||||||
ret = 1
|
|
||||||
logger.warning(m18n.n('backup_cleaning_failed', point))
|
|
||||||
continue
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _check_is_enough_free_space(self):
|
def _check_is_enough_free_space(self):
|
||||||
"""
|
"""
|
||||||
Check free space in repository or output directory before to backup
|
Check free space in repository or output directory before to backup
|
||||||
|
@ -2011,6 +1998,7 @@ def backup_create(name=None, description=None, methods=[],
|
||||||
# Check that output directory is empty
|
# Check that output directory is empty
|
||||||
if os.path.isdir(output_directory) and no_compress and \
|
if os.path.isdir(output_directory) and no_compress and \
|
||||||
os.listdir(output_directory):
|
os.listdir(output_directory):
|
||||||
|
|
||||||
raise YunohostError('backup_output_directory_not_empty')
|
raise YunohostError('backup_output_directory_not_empty')
|
||||||
elif no_compress:
|
elif no_compress:
|
||||||
raise YunohostError('backup_output_directory_required')
|
raise YunohostError('backup_output_directory_required')
|
||||||
|
@ -2315,6 +2303,30 @@ def _call_for_each_path(self, callback, csv_path=None):
|
||||||
callback(self, row['source'], row['dest'])
|
callback(self, row['source'], row['dest'])
|
||||||
|
|
||||||
|
|
||||||
|
def _recursive_umount(directory):
|
||||||
|
"""
|
||||||
|
Recursively umount sub directories of a directory
|
||||||
|
|
||||||
|
Args:
|
||||||
|
directory -- a directory path
|
||||||
|
"""
|
||||||
|
mount_lines = subprocess.check_output("mount").split("\n")
|
||||||
|
|
||||||
|
points_to_umount = [line.split(" ")[2]
|
||||||
|
for line in mount_lines
|
||||||
|
if len(line) >= 3 and line.split(" ")[2].startswith(directory)]
|
||||||
|
|
||||||
|
ret = 0
|
||||||
|
for point in reversed(points_to_umount):
|
||||||
|
ret = subprocess.call(["umount", point])
|
||||||
|
if ret != 0:
|
||||||
|
ret = 1
|
||||||
|
logger.warning(m18n.n('backup_cleaning_failed', point))
|
||||||
|
continue
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def free_space_in_directory(dirpath):
|
def free_space_in_directory(dirpath):
|
||||||
stat = os.statvfs(dirpath)
|
stat = os.statvfs(dirpath)
|
||||||
return stat.f_frsize * stat.f_bavail
|
return stat.f_frsize * stat.f_bavail
|
||||||
|
|
Loading…
Add table
Reference in a new issue