def test_change_permissions(self): newModeFolder = 16832 #rwx------ newModeFile = 33152 #rw------- d = snapshots.FileInfoDict() d[b'foo'] = (newModeFolder, CURRENTUSER.encode('utf-8','replace'), CURRENTGROUP.encode('utf-8','replace')) d[b'bar'] = (newModeFile, CURRENTUSER.encode('utf-8','replace'), CURRENTGROUP.encode('utf-8','replace')) callback = lambda x: self.callback(self.assertRegex, x, r'^chmod /tmp/test/(?:foo|bar) \d+$') self.sn.restorePermission(b'foo', b'/tmp/test/foo', d, callback) self.assertTrue(self.run) self.assertFalse(self.sn.restorePermissionFailed) self.run = False self.sn.restorePermission(b'bar', b'/tmp/test/bar', d, callback) self.assertTrue(self.run) self.assertFalse(self.sn.restorePermissionFailed) s = os.stat(self.pathFolder) self.assertEqual(s.st_mode, newModeFolder) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, CURRENTGID) s = os.stat(self.pathFile) self.assertEqual(s.st_mode, newModeFile) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, CURRENTGID)
def test_change_owner_without_root(self): d = snapshots.FileInfoDict() d[b'foo'] = (self.modeFolder, 'root'.encode('utf-8','replace'), CURRENTGROUP.encode('utf-8','replace')) d[b'bar'] = (self.modeFile, 'root'.encode('utf-8','replace'), CURRENTGROUP.encode('utf-8','replace')) callback = lambda x: self.callback(self.assertRegex, x, r'^chown /tmp/test/(?:foo|bar) 0 : {} : \w+$'.format(CURRENTGID)) self.sn.restorePermission(b'foo', b'/tmp/test/foo', d, callback) self.assertTrue(self.run) self.assertTrue(self.sn.restorePermissionFailed) self.run, self.sn.restorePermissionFailed = False, False self.sn.restorePermission(b'bar', b'/tmp/test/bar', d, callback) self.assertTrue(self.run) self.assertTrue(self.sn.restorePermissionFailed) s = os.stat(self.pathFolder) self.assertEqual(s.st_mode, self.modeFolder) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, CURRENTGID) s = os.stat(self.pathFile) self.assertEqual(s.st_mode, self.modeFile) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, CURRENTGID)
def test_change_group(self): newGroup = [x for x in GROUPS if x != CURRENTGROUP][0] newGID = grp.getgrnam(newGroup).gr_gid d = snapshots.FileInfoDict() d[b'foo'] = (self.modeFolder, CURRENTUSER.encode('utf-8','replace'), newGroup.encode('utf-8','replace')) d[b'bar'] = (self.modeFile, CURRENTUSER.encode('utf-8','replace'), newGroup.encode('utf-8','replace')) callback = lambda x: self.callback(self.assertRegex, x, r'^chgrp /tmp/test/(?:foo|bar) {}$'.format(newGID)) self.sn.restorePermission(b'foo', b'/tmp/test/foo', d, callback) self.assertTrue(self.run) self.assertFalse(self.sn.restorePermissionFailed) self.run = False self.sn.restorePermission(b'bar', b'/tmp/test/bar', d, callback) self.assertTrue(self.run) self.assertFalse(self.sn.restorePermissionFailed) s = os.stat(self.pathFolder) self.assertEqual(s.st_mode, self.modeFolder) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, newGID) s = os.stat(self.pathFile) self.assertEqual(s.st_mode, self.modeFile) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, newGID)
def test_fileInfoErrorRead(self, mock_logger): sid = snapshots.SID('20151219-010324-123', self.cfg) os.makedirs(os.path.join(self.snapshotPath, '20151219-010324-123')) infoFile = sid.path(sid.FILEINFO) # remove all permissions from file with open(infoFile, 'wt') as f: pass with generic.mockPermissions(infoFile): self.assertEqual(sid.fileInfo, snapshots.FileInfoDict()) self.assertTrue(mock_logger.called)
def test_fileInfoErrorRead(self, mock_logger): sid = snapshots.SID('20151219-010324-123', self.cfg) os.makedirs(os.path.join(self.snapshotPath, '20151219-010324-123')) infoFile = sid.path(sid.FILEINFO) # remove all permissions from file with open(infoFile, 'wt') as f: pass os.chmod(infoFile, 0o000) self.assertEqual(sid.fileInfo, snapshots.FileInfoDict()) self.assertTrue(mock_logger.called) # make file read/writeable again for deletion os.chmod(infoFile, 0o600)
def test_fileInfoErrorWrite(self, mock_logger): sid = snapshots.SID('20151219-010324-123', self.cfg) os.makedirs(os.path.join(self.snapshotPath, '20151219-010324-123')) infoFile = sid.path(sid.FILEINFO) # remove all permissions from file with open(infoFile, 'wt') as f: pass with generic.mockPermissions(infoFile): d = snapshots.FileInfoDict() d[b'/tmp'] = (123, b'foo', b'bar') d[b'/tmp/foo'] = (456, b'asdf', b'qwer') sid.fileInfo = d self.assertTrue(mock_logger.called)
def test_collectPermission(self): # force permissions because different distributions will have different umask os.chmod(self.testDirFullPath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH) os.chmod(self.testFileFullPath, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH) d = snapshots.FileInfoDict() testDir = self.testDirFullPath.encode() testFile = self.testFileFullPath.encode() self.sn.collectPermission(d, testDir) self.sn.collectPermission(d, testFile) self.assertIn(testDir, d) self.assertIn(testFile, d) self.assertTupleEqual(d[testDir], (16893, CURRENTUSER.encode(), CURRENTGROUP.encode())) self.assertTupleEqual(d[testFile], (33204, CURRENTUSER.encode(), CURRENTGROUP.encode()))
def test_fileInfo(self): sid1 = snapshots.SID('20151219-010324-123', self.cfg) os.makedirs(os.path.join(self.snapshotPath, '20151219-010324-123')) infoFile = os.path.join(self.snapshotPath, '20151219-010324-123', 'fileinfo.bz2') d = snapshots.FileInfoDict() d[b'/tmp'] = (123, b'foo', b'bar') d[b'/tmp/foo'] = (456, b'asdf', b'qwer') sid1.fileInfo = d self.assertIsFile(infoFile) #load fileInfo in a new snapshot sid2 = snapshots.SID('20151219-010324-123', self.cfg) self.assertDictEqual(sid2.fileInfo, d)
def test_fileInfoErrorWrite(self, mock_logger): sid = snapshots.SID('20151219-010324-123', self.cfg) os.makedirs(os.path.join(self.snapshotPath, '20151219-010324-123')) infoFile = sid.path(sid.FILEINFO) # remove all permissions from file with open(infoFile, 'wt') as f: pass os.chmod(infoFile, 0o000) d = snapshots.FileInfoDict() d[b'/tmp'] = (123, b'foo', b'bar') d[b'/tmp/foo'] = (456, b'asdf', b'qwer') sid.fileInfo = d self.assertTrue(mock_logger.called) # make file read/writeable again for deletion os.chmod(infoFile, 0o600)
def test_no_changes(self): d = snapshots.FileInfoDict() d[b'foo'] = (self.modeFolder, CURRENTUSER.encode('utf-8','replace'), CURRENTGROUP.encode('utf-8','replace')) d[b'bar'] = (self.modeFile, CURRENTUSER.encode('utf-8','replace'), CURRENTGROUP.encode('utf-8','replace')) callback = lambda x: self.callback(self.fail, 'callback function was called unexpectedly') self.sn.restorePermission(b'foo', b'/tmp/test/foo', d, callback) self.sn.restorePermission(b'bar', b'/tmp/test/bar', d, callback) s = os.stat(self.pathFolder) self.assertEqual(s.st_mode, self.modeFolder) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, CURRENTGID) s = os.stat(self.pathFile) self.assertEqual(s.st_mode, self.modeFile) self.assertEqual(s.st_uid, CURRENTUID) self.assertEqual(s.st_gid, CURRENTGID)