Commit 25b8649d authored by bescoto's avatar bescoto

Mostly another unreadable regress fix


git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup@463 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
parent 086ef41e
......@@ -114,27 +114,23 @@ def remove_rbdir_increments():
def iterate_raw_rfs(mirror_rp, inc_rp):
"""Iterate all RegressFile objects in mirror/inc directory
Also changes permissions of unreadable files to allow access and
then changes them back later.
Also changes permissions of unreadable files. We don't have to
change them back later because regress will do that for us.
"""
root_rf = RegressFile(mirror_rp, inc_rp, restore.get_inclist(inc_rp))
def helper(rf):
mirror_rp = rf.mirror_rp
if (Globals.process_uid != 0 and
((mirror_rp.isreg() and not mirror_rp.readable()) or
(mirror_rp.isdir() and not mirror_rp.hasfullperms()))):
unreadable, old_perms = 1, mirror_rp.getperms()
if mirror_rp.isreg(): mirror_rp.chmod(0400 | old_perms)
else: mirror_rp.chmod(0700 | old_perms)
else: unreadable = 0
if Globals.process_uid != 0:
if mirror_rp.isreg() and not mirror_rp.readable():
mirror_rp.chmod(0400 | mirror_rp.getperms())
elif mirror_rp.isdir() and not mirror_rp.hasfullperms():
mirror_rp.chmod(0700 | mirror_rp.getperms())
yield rf
if unreadable and mirror_rp.isreg(): mirror_rp.chmod(old_perms)
if rf.mirror_rp.isdir() or rf.inc_rp.isdir():
for sub_rf in rf.yield_sub_rfs():
for sub_sub_rf in helper(sub_rf):
yield sub_sub_rf
if unreadable and mirror_rp.isdir(): mirror_rp.chmod(old_perms)
return helper(root_rf)
def yield_metadata():
......@@ -248,14 +244,14 @@ class RegressITRB(rorpiter.ITRBranch):
if rf.mirror_rp.isreg():
tf = TempFile.new(rf.mirror_rp)
tf.write_from_fileobj(rf.get_restore_fp())
rpath.copy_attribs(rf.metadata_rorp, tf)
tf.fsync_with_dir() # make sure tf fully written before move
rpath.copy_attribs(rf.metadata_rorp, tf)
rpath.rename(tf, rf.mirror_rp) # move is atomic
else:
if rf.mirror_rp.lstat(): rf.mirror_rp.delete()
rf.mirror_rp.write_from_fileobj(rf.get_restore_fp())
rpath.copy_attribs(rf.metadata_rorp, rf.mirror_rp)
rf.mirror_rp.fsync_with_dir() # require move before inc delete
rf.mirror_rp.get_parent_rp().fsync() # require move before inc delete
def start_process(self, index, rf):
"""Start processing directory"""
......
......@@ -151,7 +151,7 @@ def copy_attribs(rpin, rpout):
"""
log.Log("Copying attributes from %s to %s" % (rpin.index, rpout.path), 7)
assert rpin.lstat() == rpout.lstat() is not None, "different file types"
assert rpin.lstat() == rpout.lstat() or rpin.isspecial()
if rpin.issym(): return # symlinks have no valid attributes
if Globals.write_resource_forks and rpin.isreg():
rpout.write_resource_fork(rpin.get_resource_fork())
......
......@@ -132,8 +132,8 @@ class RegressTest(unittest.TestCase):
"""Change attributes in directory, so regress will request fp"""
subdir = self.output_rp.append('unreadable_dir')
assert subdir.lstat()
filerp = subdir.append('to_be_unreadable')
filerp.chmod(0)
rp1_1 = subdir.append('to_be_unreadable')
rp1_1.chmod(0)
subdir.chmod(0)
......
......@@ -126,6 +126,23 @@ class HalfRoot(unittest.TestCase):
rp2_3.chmod(0)
return rp1, rp2
def cause_regress(self, rp):
"""Change some of the above to trigger regress"""
rp1_1 = rp.append('foo')
rp1_1.chmod(04)
rp_new = rp.append('lala')
rp_new.write_string('asoentuh')
rp_new.chmod(0)
assert not os.system('chown %s %s' % (user, rp_new.path))
rp1_3 = rp.append('unreadable_dir')
rp1_3.chmod(0700)
rp1_3_1 = rp1_3.append('file_inside')
rp1_3_1.chmod(01)
rp1_3.chmod(0)
rbdir = rp.append('rdiff-backup-data')
rbdir.append('current_mirror.2000-12-31T21:33:20-07:00.data').touch()
def test_backup(self):
"""Test back up, simple restores"""
in_rp1, in_rp2 = self.make_dirs()
......@@ -173,6 +190,12 @@ class HalfRoot(unittest.TestCase):
assert rout_perms == 0, rout_perms
assert outrp_perms == 0, outrp_perms
self.cause_regress(outrp)
cmd5 = ('su -c "rdiff-backup --check-destination-dir %s" %s' %
(outrp.path, user))
print "Executing regress: ", cmd5
assert not os.system(cmd5)
class NonRoot(unittest.TestCase):
"""Test backing up as non-root user
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment