1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2024-12-27 18:28:42 +00:00

Merge pull request #1397 from enkore/issue/1395

Fix some issues in --verify-data
This commit is contained in:
enkore 2016-07-28 19:13:28 +02:00 committed by GitHub
commit 0df4f1eb1f
2 changed files with 19 additions and 9 deletions

View file

@ -909,6 +909,8 @@ def check(self, repository, repair=False, archive=None, last=None, prefix=None,
self.repository = repository
self.init_chunks()
self.key = self.identify_key(repository)
if verify_data:
self.verify_data()
if Manifest.MANIFEST_ID not in self.chunks:
logger.error("Repository manifest not found!")
self.error_found = True
@ -916,8 +918,6 @@ def check(self, repository, repair=False, archive=None, last=None, prefix=None,
else:
self.manifest, _ = Manifest.load(repository, key=self.key)
self.rebuild_refcounts(archive=archive, last=last, prefix=prefix)
if verify_data:
self.verify_data()
self.orphan_chunks_check()
self.finish(save_space=save_space)
if self.error_found:
@ -954,20 +954,25 @@ def identify_key(self, repository):
def verify_data(self):
logger.info('Starting cryptographic data integrity verification...')
pi = ProgressIndicatorPercent(total=len(self.chunks), msg="Verifying data %6.2f%%", step=0.01, same_line=True)
count = errors = 0
count = len(self.chunks)
errors = 0
pi = ProgressIndicatorPercent(total=count, msg="Verifying data %6.2f%%", step=0.01, same_line=True)
for chunk_id, (refcount, *_) in self.chunks.iteritems():
pi.show()
if not refcount:
continue
encrypted_data = self.repository.get(chunk_id)
try:
_, data = self.key.decrypt(chunk_id, encrypted_data)
encrypted_data = self.repository.get(chunk_id)
except Repository.ObjectNotFound:
self.error_found = True
errors += 1
logger.error('chunk %s not found', bin_to_hex(chunk_id))
continue
try:
_chunk_id = None if chunk_id == Manifest.MANIFEST_ID else chunk_id
_, data = self.key.decrypt(_chunk_id, encrypted_data)
except IntegrityError as integrity_error:
self.error_found = True
errors += 1
logger.error('chunk %s, integrity error: %s', bin_to_hex(chunk_id), integrity_error)
count += 1
pi.finish()
log = logger.error if errors else logger.info
log('Finished cryptographic data integrity verification, verified %d chunks with %d integrity errors.', count, errors)

View file

@ -96,6 +96,11 @@ class CheckNeeded(ErrorWithTraceback):
class ObjectNotFound(ErrorWithTraceback):
"""Object with key {} not found in repository {}."""
def __init__(self, id, repo):
if isinstance(id, bytes):
id = bin_to_hex(id)
super().__init__(id, repo)
def __init__(self, path, create=False, exclusive=False, lock_wait=None, lock=True, append_only=False):
self.path = os.path.abspath(path)
self._location = Location('file://%s' % self.path)