114 |
def iterate_raw_rfs(mirror_rp, inc_rp): |
def iterate_raw_rfs(mirror_rp, inc_rp): |
115 |
"""Iterate all RegressFile objects in mirror/inc directory |
"""Iterate all RegressFile objects in mirror/inc directory |
116 |
|
|
117 |
Also changes permissions of unreadable files to allow access and |
Also changes permissions of unreadable files. We don't have to |
118 |
then changes them back later. |
change them back later because regress will do that for us. |
119 |
|
|
120 |
""" |
""" |
121 |
root_rf = RegressFile(mirror_rp, inc_rp, restore.get_inclist(inc_rp)) |
root_rf = RegressFile(mirror_rp, inc_rp, restore.get_inclist(inc_rp)) |
122 |
def helper(rf): |
def helper(rf): |
123 |
mirror_rp = rf.mirror_rp |
mirror_rp = rf.mirror_rp |
124 |
if (Globals.process_uid != 0 and |
if Globals.process_uid != 0: |
125 |
((mirror_rp.isreg() and not mirror_rp.readable()) or |
if mirror_rp.isreg() and not mirror_rp.readable(): |
126 |
(mirror_rp.isdir() and not mirror_rp.hasfullperms()))): |
mirror_rp.chmod(0400 | mirror_rp.getperms()) |
127 |
unreadable, old_perms = 1, mirror_rp.getperms() |
elif mirror_rp.isdir() and not mirror_rp.hasfullperms(): |
128 |
if mirror_rp.isreg(): mirror_rp.chmod(0400 | old_perms) |
mirror_rp.chmod(0700 | mirror_rp.getperms()) |
|
else: mirror_rp.chmod(0700 | old_perms) |
|
|
else: unreadable = 0 |
|
129 |
yield rf |
yield rf |
|
if unreadable and mirror_rp.isreg(): mirror_rp.chmod(old_perms) |
|
130 |
if rf.mirror_rp.isdir() or rf.inc_rp.isdir(): |
if rf.mirror_rp.isdir() or rf.inc_rp.isdir(): |
131 |
for sub_rf in rf.yield_sub_rfs(): |
for sub_rf in rf.yield_sub_rfs(): |
132 |
for sub_sub_rf in helper(sub_rf): |
for sub_sub_rf in helper(sub_rf): |
133 |
yield sub_sub_rf |
yield sub_sub_rf |
|
if unreadable and mirror_rp.isdir(): mirror_rp.chmod(old_perms) |
|
134 |
return helper(root_rf) |
return helper(root_rf) |
135 |
|
|
136 |
def yield_metadata(): |
def yield_metadata(): |
245 |
if rf.mirror_rp.isreg(): |
if rf.mirror_rp.isreg(): |
246 |
tf = TempFile.new(rf.mirror_rp) |
tf = TempFile.new(rf.mirror_rp) |
247 |
tf.write_from_fileobj(rf.get_restore_fp()) |
tf.write_from_fileobj(rf.get_restore_fp()) |
|
rpath.copy_attribs(rf.metadata_rorp, tf) |
|
248 |
tf.fsync_with_dir() # make sure tf fully written before move |
tf.fsync_with_dir() # make sure tf fully written before move |
249 |
|
rpath.copy_attribs(rf.metadata_rorp, tf) |
250 |
rpath.rename(tf, rf.mirror_rp) # move is atomic |
rpath.rename(tf, rf.mirror_rp) # move is atomic |
251 |
else: |
else: |
252 |
if rf.mirror_rp.lstat(): rf.mirror_rp.delete() |
if rf.mirror_rp.lstat(): rf.mirror_rp.delete() |
253 |
rf.mirror_rp.write_from_fileobj(rf.get_restore_fp()) |
rf.mirror_rp.write_from_fileobj(rf.get_restore_fp()) |
254 |
rpath.copy_attribs(rf.metadata_rorp, rf.mirror_rp) |
rpath.copy_attribs(rf.metadata_rorp, rf.mirror_rp) |
255 |
rf.mirror_rp.fsync_with_dir() # require move before inc delete |
rf.mirror_rp.get_parent_rp().fsync() # require move before inc delete |
256 |
|
|
257 |
def start_process(self, index, rf): |
def start_process(self, index, rf): |
258 |
"""Start processing directory""" |
"""Start processing directory""" |