Merge "Adds temporary chown to sparse_copy."
This commit is contained in:
@@ -1523,3 +1523,23 @@ def read_file_as_root(file_path):
|
|||||||
return out
|
return out
|
||||||
except exception.ProcessExecutionError:
|
except exception.ProcessExecutionError:
|
||||||
raise exception.FileNotFound(file_path=file_path)
|
raise exception.FileNotFound(file_path=file_path)
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def temporary_chown(path, owner_uid=None):
|
||||||
|
"""Temporarily chown a path.
|
||||||
|
|
||||||
|
:params owner_uid: UID of temporary owner (defaults to current user)
|
||||||
|
"""
|
||||||
|
if owner_uid is None:
|
||||||
|
owner_uid = os.getuid()
|
||||||
|
|
||||||
|
orig_uid = os.stat(path).st_uid
|
||||||
|
|
||||||
|
if orig_uid != owner_uid:
|
||||||
|
execute('chown', owner_uid, path, run_as_root=True)
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
if orig_uid != owner_uid:
|
||||||
|
execute('chown', orig_uid, path, run_as_root=True)
|
||||||
|
@@ -1651,6 +1651,11 @@ def _sparse_copy(src_path, dst_path, virtual_size, block_size=4096):
|
|||||||
"virtual_size=%(virtual_size)d block_size=%(block_size)d"),
|
"virtual_size=%(virtual_size)d block_size=%(block_size)d"),
|
||||||
locals())
|
locals())
|
||||||
|
|
||||||
|
# NOTE(sirp): we need read/write access to the devices; since we don't have
|
||||||
|
# the luxury of shelling out to a sudo'd command, we temporarily take
|
||||||
|
# ownership of the devices.
|
||||||
|
with utils.temporary_chown(src_path):
|
||||||
|
with utils.temporary_chown(dst_path):
|
||||||
with open(src_path, "r") as src:
|
with open(src_path, "r") as src:
|
||||||
with open(dst_path, "w") as dst:
|
with open(dst_path, "w") as dst:
|
||||||
data = src.read(min(block_size, left))
|
data = src.read(min(block_size, left))
|
||||||
|
Reference in New Issue
Block a user