def remove_fsobj(self, pkgplan, path):
"""Shared logic for removing file and link objects."""
# Necessary since removal logic is reused by install.
fmri = pkgplan.destination_fmri
if not fmri:
fmri = pkgplan.origin_fmri
try:
portable.remove(path)
except EnvironmentError as e:
if e.errno == errno.ENOENT:
# Already gone; don't care.
return
elif e.errno == errno.EBUSY and os.path.ismount(path):
# User has replaced item with mountpoint, or a
# package has been poorly implemented.
err_txt = _("Unable to remove {0}; it is in use "
"as a mountpoint. To continue, please "
"unmount the filesystem at the target "
"location and try again.").format(path)
raise apx.ActionExecutionError(self,
details=err_txt, error=e, fmri=fmri)
elif e.errno == errno.EBUSY:
# os.path.ismount() is broken for lofs
# filesystems, so give a more generic
# error.
err_txt = _("Unable to remove {0}; it is in "
"use by the system, another process, or "
"as a mountpoint.").format(path)
raise apx.ActionExecutionError(self,
details=err_txt, error=e, fmri=fmri)
elif e.errno == errno.EPERM and \
not stat.S_ISDIR(os.lstat(path).st_mode):
# Was expecting a directory in this failure
# case, it is not, so raise the error.
raise
elif e.errno in (errno.EACCES, errno.EROFS):
# Raise these permissions exceptions as-is.
raise
elif e.errno != errno.EPERM:
# An unexpected error.
raise apx.ActionExecutionError(self, error=e,
fmri=fmri)
# Attempting to remove a directory as performed above
# gives EPERM. First, try to remove the directory,
# if it isn't empty, salvage it.
try:
os.rmdir(path)
except OSError as e:
if e.errno in (errno.EPERM, errno.EACCES):
# Raise permissions exceptions as-is.
raise
elif e.errno not in (errno.EEXIST,
errno.ENOTEMPTY):
# An unexpected error.
raise apx.ActionExecutionError(self,
error=e, fmri=fmri)
pkgplan.salvage(path)
评论列表
文章目录