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:
commit
0df4f1eb1f
2 changed files with 19 additions and 9 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue