J'ai du mal à restaurer les sauvegardes d'une ancienne installation d'Ubuntu vers une nouvelle installation sur Ubuntu 16.04. J'obtiens l'erreur suivante lors de la tentative de restauration :
Failed with an unknown error
Suivi de :
Traceback (most recent call last):
File "/usr/bin/duplicity", line 1532, in <module>
with_tempdir(main)
File "/usr/bin/duplicity", line 1526, in with_tempdir
fn()
File "/usr/bin/duplicity", line 1380, in main
do_backup(action)
File "/usr/bin/duplicity", line 1461, in do_backup
list_current(col_stats)
File "/usr/bin/duplicity", line 698, in list_current
for path in path_iter:
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 354, in combine_path_iters
refresh_triple_list(triple_list)
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 341, in refresh_triple_list
new_triple = get_triple(old_triple[1])
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 327, in get_triple
path = path_iter_list[iter_index].next()
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 239, in sigtar2path_iter
for tarinfo in tf:
File "/usr/lib/python2.7/tarfile.py", line 2508, in next
tarinfo = self.tarfile.next()
File "/usr/lib/python2.7/tarfile.py", line 2350, in next
raise ReadError("unexpected end of data")
ReadError: unexpected end of data
La sauvegarde s'est terminée avec succès mais je n'arrive pas à la restaurer.
Merci d'avance !
Réponse acceptée :
Modifier : Avis de non-responsabilité - Je n'ai pas beaucoup d'expérience avec Python ou le code de la duplicité, donc je ne peux pas dire si cette modification causera ou non des effets néfastes. Pour ma part, j'ai pu terminer ma restauration en ajoutant la ligne de code ci-dessous.
Solution : J'ai pu dépasser cela en insérant une vérification de clé pour le volume_name_dict
objet.
Nouvelle ligne :if vol_num in backup_set.volume_name_dict.keys():
En duplicité 0.7.06, vous pouvez remplacer cette méthode à la ligne 752 :
def get_fileobj_iter(backup_set):
"""Get file object iterator from backup_set contain given index"""
manifest = backup_set.get_manifest()
volumes = manifest.get_containing_volumes(index)
for vol_num in volumes:
if vol_num in backup_set.volume_name_dict.keys():
yield restore_get_enc_fileobj(backup_set.backend,
backup_set.
volume_name_dict[vol_num],
manifest.
volume_info_dict[vol_num])
cur_vol[0] += 1
log.Progress(_('Processed volume %d of %d') %
(cur_vol[0], num_vols),
cur_vol[0], num_vols)
if hasattr(globals.backend, 'pre_process_download'):
file_names = []
for backup_set in backup_setlist:
manifest = backup_set.get_manifest()
volumes = manifest.get_containing_volumes(index)
for vol_num in volumes:
file_names.append(backup_set.volume_name_dict[vol_num])
globals.backend.pre_process_download(file_names)
fileobj_iters = list(map(get_fileobj_iter, backup_setlist))
tarfiles = list(map(patchdir.TarFile_FromFileobjs, fileobj_iters))
return patchdir.tarfiles2rop_iter(tarfiles, index)
Si vous n'êtes pas familier avec Python (je ne le suis pas), vous pouvez valider le code ici :http://pep8online.com/ - les indentations doivent s'aligner correctement.