# HG changeset patch # User cmlenz # Date 1129816259 0 # Node ID 86281f8eef44235ec8babd8bda45c65b2b46483f # Parent 9d93e622f9632fc3c6fdf8ed9bef471623d60295 Include the filename instead of the absolute file path in MD5 files, so that the snapshots directory can be moved without invalidating all the archives already created. diff --git a/bitten/util/md5sum.py b/bitten/util/md5sum.py --- a/bitten/util/md5sum.py +++ b/bitten/util/md5sum.py @@ -23,17 +23,17 @@ @param filename: the absolute path to the file @return: string containing the checksum """ - md5sum = md5.new() + checksum = md5.new() fileobj = file(filename, 'rb') try: while True: chunk = fileobj.read(4096) if not chunk: break - md5sum.update(chunk) + checksum.update(chunk) finally: fileobj.close() - return md5sum.hexdigest() + ' ' + filename + return checksum.hexdigest() def write(filename, md5file=None): """Write an MD5 checksum file for the specified file. @@ -50,7 +50,7 @@ fileobj = file(md5file, 'w') try: - fileobj.write(generate(filename)) + fileobj.write(generate(filename) + ' ' + os.path.basename(filename)) finally: fileobj.close() return md5file @@ -76,9 +76,15 @@ raise IntegrityError, 'Checksum file not found' fileobj = file(md5file, 'r') try: - checksum = fileobj.read() + content = fileobj.read() finally: fileobj.close() + try: + checksum, path = content.split(' ') + except ValueError: + raise IntegrityError, 'Checksum file invalid' + if path != os.path.basename(filename): + raise IntegrityError, 'Checksum for a different file' expected = generate(filename) if expected != checksum: diff --git a/bitten/util/tests/md5sum.py b/bitten/util/tests/md5sum.py --- a/bitten/util/tests/md5sum.py +++ b/bitten/util/tests/md5sum.py @@ -34,9 +34,8 @@ def test_generate(self): filename = self._create_file('test.xyz', 'Foo bar') - checksum = md5sum.generate(filename).split(' ') - self.assertEqual(md5.new('Foo bar').hexdigest(), checksum[0]) - self.assertEqual(filename, checksum[1]) + checksum = md5sum.generate(filename) + self.assertEqual(md5.new('Foo bar').hexdigest(), checksum) def test_write(self): filename = self._create_file('test.xyz', 'Foo bar') @@ -44,11 +43,11 @@ self.assertEqual(filename + '.md5', md5file) fileobj = file(md5file, 'r') try: - checksum = fileobj.read().split(' ') + checksum, path = fileobj.read().split(' ') finally: fileobj.close() - self.assertEqual(md5.new('Foo bar').hexdigest(), checksum[0]) - self.assertEqual(filename, checksum[1]) + self.assertEqual(md5.new('Foo bar').hexdigest(), checksum) + self.assertEqual('test.xyz', path) def test_write_with_md5file(self): filename = self._create_file('test.xyz', 'Foo bar') @@ -56,11 +55,11 @@ self.assertEqual(md5file, md5sum.write(filename, md5file=md5file)) fileobj = file(md5file, 'r') try: - checksum = fileobj.read().split(' ') + checksum, path = fileobj.read().split(' ') finally: fileobj.close() - self.assertEqual(md5.new('Foo bar').hexdigest(), checksum[0]) - self.assertEqual(filename, checksum[1]) + self.assertEqual(md5.new('Foo bar').hexdigest(), checksum) + self.assertEqual('test.xyz', path) def test_validate_missing(self): filename = self._create_file('test.xyz', 'Foo bar') @@ -72,6 +71,12 @@ md5file = self._create_file('test.xyz.md5', checksum) self.assertRaises(md5sum.IntegrityError, md5sum.validate, filename) + def test_validate_invalid_format(self): + filename = self._create_file('test.xyz', 'Foo bar') + checksum = md5.new('Foo bar').hexdigest() + ',' + filename + md5file = self._create_file('test.xyz.md5', checksum) + self.assertRaises(md5sum.IntegrityError, md5sum.validate, filename) + def test_validate_incorrect_path(self): filename = self._create_file('test.xyz', 'Foo bar') checksum = md5.new('Foo bar').hexdigest() + ' ' + '/etc/test' @@ -80,8 +85,7 @@ def test_validate_with_checksum(self): filename = self._create_file('test.xyz', 'Foo bar') - checksum = md5.new('Foo bar').hexdigest() + ' ' + filename - md5sum.validate(filename, checksum) + md5sum.validate(filename, md5.new('Foo bar').hexdigest()) def suite():