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