Crash during backup when OS reports "no such device"
Summary
When a backup is running and the scan of "/" hits a folder (that is in the backup scope, yet even explicitly excluded) where the OS reports "no such device", deja-dup crashes.
In /usr/lib/python3.10/site-packages/duplicity/path.py the function listdir should catch the OSError exception.
Reproduction Steps
1.Configure deja-dup to backup your personal folder to /backupfolder 2. Set up an nfs mount to /nfsmount using any automounter 3. Make sure the NFS server is unavailable. "ls /nfsmount" reports "cannot access /nfsmount: No such device" 4. Initiate a backup, or an incremental backup
Debug Information
(go to the About menu item, where you'll either see a System tab or a Debug Information button, and copy the text copy here)
Traceback (innermost last):
File "/usr/bin/duplicity", line 87, in <module>
with_tempdir(main)
File "/usr/bin/duplicity", line 70, in with_tempdir
fn()
File "/usr/lib/python3.10/site-packages/duplicity/dup_main.py", line 1568, in main
do_backup(action)
File "/usr/lib/python3.10/site-packages/duplicity/dup_main.py", line 1707, in do_backup
incremental_backup(sig_chain)
File "/usr/lib/python3.10/site-packages/duplicity/dup_main.py", line 665, in incremental_backup
bytes_written = dummy_backup(tarblock_iter)
File "/usr/lib/python3.10/site-packages/duplicity/dup_main.py", line 221, in dummy_backup
while next(tarblock_iter):
File "/usr/lib/python3.10/site-packages/duplicity/diffdir.py", line 544, in __next__
result = self.process(next(self.input_iter)) # pylint: disable=assignment-from-no-return
File "/usr/lib/python3.10/site-packages/duplicity/diffdir.py", line 209, in get_delta_iter
for new_path, sig_path in collated:
File "/usr/lib/python3.10/site-packages/duplicity/diffdir.py", line 296, in collate2iters
relem1 = next(riter1)
File "/usr/lib/python3.10/site-packages/duplicity/selection.py", line 95, in __next__
return next(self.iter)
File "/usr/lib/python3.10/site-packages/duplicity/selection.py", line 179, in Iterate
subpath, val = next(diryield_stack[-1])
File "/usr/lib/python3.10/site-packages/duplicity/selection.py", line 146, in diryield
s = self.Select(new_path)
File "/usr/lib/python3.10/site-packages/duplicity/selection.py", line 208, in Select
result = sf(path)
File "/usr/lib/python3.10/site-packages/duplicity/selection.py", line 462, in exclude_sel_func
if check_common_error(error_handler, path.contains, [filename]):
File "/usr/lib/python3.10/site-packages/duplicity/robust.py", line 41, in check_common_error
return function(*args)
File "/usr/lib/python3.10/site-packages/duplicity/path.py", line 588, in contains
return self.isdir() and child in self.listdir()
File "/usr/lib/python3.10/site-packages/duplicity/path.py", line 576, in listdir
return os.listdir(self.name)
OSError: [Errno 19] No such device: b'/truenas'
Edited by Michael Terry