Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot restore a file from a mounted cifs volume #314

Open
arthursw opened this issue Sep 28, 2023 · 10 comments
Open

Cannot restore a file from a mounted cifs volume #314

arthursw opened this issue Sep 28, 2023 · 10 comments

Comments

@arthursw
Copy link

Describe the bug
I remove a file located in a remote cifs volume with trash /remote_volume_path/test_file.txt, and when I try trash-restore it says: No files trashed from current dir ('/remote_volume_path/').

trash-cli version
0.23.9.23

Are you using the latest version of trash-cli?
Yes

Have you tried if the bug is present in the latest version of trash-cli?
Yes

Operating system:
Ubuntu 18.04.6 LTS

To Reproduce

amasson@niseko:/data/amasson/nas-stk/amasson/test$ touch test
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-put test
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-restore
No files trashed from current dir ('/data/amasson/nas-stk/amasson/test')

trash-list does not help either (showing trashed files from other locations).

Expected behavior
Trash cli should show the file I just trashed.

Volumes detail

amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-list --debug-volumes
physical ->
 [...]
[sdiskpart(device='//stk-empenn.irisa.fr/empenn', mountpoint='/data/amasson/nas-stk', fstype='cifs', opts='rw,relatime,vers=default,cache=strict,username=amasson,domain=AD,uid=1005,forceuid,gid=1005,forcegid,addr=131.254.130.152,file_mode=0755,dir_mode=0755,soft,nounix,mapposix,rsize=65536,wsize=65536,echo_interval=60,actimeo=1', maxfile=255, maxpath=4096),
 sdiskpart(device='//stk-empenn.irisa.fr/empenn', mountpoint='/data/amasson/nas-stk', fstype='cifs', opts='rw,relatime,vers=default,cache=strict,username=amasson,domain=AD,uid=1005,forceuid,gid=1005,forcegid,addr=131.254.130.152,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=65536,wsize=65536,echo_interval=60,actimeo=1', maxfile=255, maxpath=4096),
 [...]
//stk-empenn.irisa.fr/empenn 20401094656 19268856944 1132237712      95% /data/amasson/nas-stk
[...]

@arthursw
Copy link
Author

Note: I was able to find the trashed file by searching for the newest files in my computer: find /data/amasson/nas-stk -mtime -1 -ls
This pointed me to /data/amasson/nas-stk/.Trash-1005/files.

@andreafrancia
Copy link
Owner

You are using an old version of trash-cli. Please uninstall trash-cli and reinstall using pip install trash-cli.
It's important to use pip because apt or apt-get are not able to install an updated version of trash-cli.

If the problem persists update me adding another comment here.

@arthursw
Copy link
Author

I iused trash-cli version 0.23.9.23 ; what's the latest one?

@andreafrancia
Copy link
Owner

Yes, it is a recent version.

Can you please run

amasson@niseko:/data/amasson/nas-stk/amasson/test$ touch test
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-put test
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-list
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-restore

There are some symlink in the components of /data/amasson/nas-stk/amasson/test?

@andreafrancia andreafrancia reopened this Oct 31, 2023
@arthursw
Copy link
Author

Here is the test:

amasson@niseko:/data/amasson/nas-stk/amasson/test$ touch test
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-put test
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-list
2023-10-30 11:23:38 /data/users/nnunet/models/nnUNet
2023-10-25 15:03:12 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/dcm
2023-10-25 15:03:20 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/nifti
2023-10-26 11:54:55 /data/amasson/evaluation/TheseJLB/Session.zip
2023-10-25 15:03:14 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/dcm2
2023-10-25 15:03:06 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/0010177_26332_3D_FLAIR_3D_FLAIR_FS_OFSEP_nii.zip
2023-10-25 15:02:59 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/0010177_26332_3D_FLAIR_3D_FLAIR_FS_OFSEP_nii
amasson@niseko:/data/amasson/nas-stk/amasson/test$ trash-restore
No files trashed from current dir ('/data/amasson/nas-stk/amasson/test')

Note that /data/amasson/nas-stk is a mounted volume with the following command:

sudo mount -t cifs -o username=amasson,domain=AD,uid=$(id -u),gid=$(id -g),forceuid,forcegid //domain.address.fr/path /data/amasson/nas-stk/

@andreafrancia
Copy link
Owner

Unfortunately I didn't have never tested directly CIFS.
Maybe I can do something if I receive enough information.

Please search in the volume trashdirs:

find /data/amasson/nas-stk/.Trash/$(id -u) -ls
find /data/amasson/nas-stk/.Trash-$(id -u) -ls

There should be two files:

  • /info/test.trashinfo
  • /files/test

Please check also the permission of the trash directories:

ls -lad /data/amasson/nas-stk/{Trash,Trash-$(id -u)}/

Thanks

@arthursw
Copy link
Author

arthursw commented Nov 3, 2023

There are tons of files in the /data/amasson/nas-stk/.Trash-$(id -u) directory. ; but the first path (/data/amasson/nas-stk/.Trash/$(id -u)) does not exist.

Here is the content of /data/amasson/nas-stk/.Trash-$(id -u)/info/test.trashinfo :

[Trash Info]
Path=amasson/test/test
DeletionDate=2023-09-28T11:11:20

The file /data/amasson/nas-stk/.Trash-1005/files/test exists.

The permissions: drwxr-xr-x 2 amasson amasson 0 févr. 4 2022 /data/amasson/nas-stk/.Trash-1005/.

Thanks!

@andreafrancia
Copy link
Owner

Please check if any of these command is able to see your trashed file:

$ trash-restore /data/amasson/nas-stk/amasson/test
$ trash-restore /data/amasson/nas-stk/amasson
$ trash-restore /data/amasson/nas-stk
$ trash-restore /data/amasson

And try to execute these python commands:

$ cd /data/amasson/nas-stk/amasson/test
$ python -c "import os; print(os.path.realpath(os.curdir))"
$ python -c "import os; print(os.path.normpath(os.path.join(os.path.realpath(os.curdir) + os.path.sep, '')))"

Thank you

@arthursw
Copy link
Author

arthursw commented Nov 5, 2023

(base) amasson@niseko:~$ trash-restore /data/amasson/nas-stk/amasson/test
No files trashed from current dir ('/home/amasson')
(base) amasson@niseko:~$ cd /data/amasson/
(base) amasson@niseko:/data/amasson$ trash-restore /data/amasson/nas-stk/amasson/test
No files trashed from current dir ('/data/amasson')
(base) amasson@niseko:/data/amasson$ trash-restore /data/amasson/nas-stk/amasson/
No files trashed from current dir ('/data/amasson')
(base) amasson@niseko:/data/amasson$ trash-restore /data/amasson/nas-stk
No files trashed from current dir ('/data/amasson')
(base) amasson@niseko:/data/amasson$ trash-restore /data/amasson
   0 2023-10-25 15:02:59 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/0010177_26332_3D_FLAIR_3D_FLAIR_FS_OFSEP_nii
   1 2023-10-25 15:03:06 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/0010177_26332_3D_FLAIR_3D_FLAIR_FS_OFSEP_nii.zip
   2 2023-10-25 15:03:12 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/dcm
   3 2023-10-25 15:03:14 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/dcm2
   4 2023-10-25 15:03:20 /data/amasson/evaluation/TheseJLB/Session/Switch 4/27_10_2017/nifti
   5 2023-10-26 11:54:55 /data/amasson/evaluation/TheseJLB/Session.zip
What file to restore [0..5]: 
Exiting
(base) amasson@niseko:/data/amasson$ cd /data/amasson/nas-stk/amasson/test
(base) amasson@niseko:/data/amasson/nas-stk/amasson/test$ python -c "import os; print(os.path.realpath(os.curdir))"
/data/amasson/nas-stk/amasson/test
(base) amasson@niseko:/data/amasson/nas-stk/amasson/test$ python -c "import os; print(os.path.normpath(os.path.join(os.path.realpath(os.curdir) + os.path.sep, '')))"
/data/amasson/nas-stk/amasson/test
(base) amasson@niseko:/data/amasson/nas-stk/amasson/test$

Thank you

@andreafrancia
Copy link
Owner

Sorry, but I'm not still able to figure out the problem.

The file is going to the "(2)" trash dir, $topdir/.Trash-$uid (by the specs: https://specifications.freedesktop.org/trash-spec/trashspec-latest.html) .

It seems that you have this directory and its name is /data/amasson/nas-stk/.Trash-1005
You also have the trashed file in it

/data/amasson/nas-stk/.Trash-1005/info/test.trashinfo
/data/amasson/nas-stk/.Trash-1005/files/test

The trashinfo seems well formed:

[Trash Info]
Path=amasson/test/test
DeletionDate=2023-09-28T11:11:20

It's seems all ok.

I have prepared a version with some additional debug message that can help me to understand the situation.
Can you install it and run it:

# remove previous version
pip uninstall trash-cli 
# install the debug version
pip install git+https://github.com/andreafrancia/[email protected]
# run
trash-put --version
cd /data/amasson/nas-stk/amasson/test
touch test
trash-put test
trash-list --trash-dirs
# for this step is important to enable the debug:
TRASHCLI_DEBUG=1 trash-restore 

The debug print I have added are expressed in this patch

commit 005a363181fd9a3802a18f343962c7f1336fe2ea
Author: Andrea Francia <[email protected]>
Date:   Thu Nov 9 12:00:07 2023 +0100

    Add some debug prints to solve https://github.com/andreafrancia/trash-cli/issues/314

diff --git a/trashcli/restore/info_dir_searcher.py b/trashcli/restore/info_dir_searcher.py
index 12577bc..215aa23 100644
--- a/trashcli/restore/info_dir_searcher.py
+++ b/trashcli/restore/info_dir_searcher.py
@@ -1,7 +1,10 @@
-from typing import NamedTuple, Iterable, Optional
+from typing import Iterable
+from typing import NamedTuple
+from typing import Optional
 
 from trashcli.restore.info_files import InfoFiles
 from trashcli.restore.trash_directories import TrashDirectories
+from trashcli.trash import debug_print
 
 
 class InfoDirSearcher:
@@ -17,6 +20,7 @@ class InfoDirSearcher:
                              ): # type: (...) -> Iterable[FileFound]
         for trash_dir_path, volume in self.trash_directories.list_trash_dirs(
                 trash_dir_from_cli):
+            debug_print(">>>> found trash dir: %s" % trash_dir_path)
             for type, path in self.info_files.all_info_files(trash_dir_path):
                 yield FileFound(type, path, volume)
 
diff --git a/trashcli/restore/info_files.py b/trashcli/restore/info_files.py
index 4cf1938..f0bf0a7 100644
--- a/trashcli/restore/info_files.py
+++ b/trashcli/restore/info_files.py
@@ -1,6 +1,7 @@
 import os
 
 from trashcli.restore.file_system import ListingFileSystem
+from trashcli.trash import debug_print
 
 
 class InfoFiles:
@@ -14,9 +15,10 @@ class InfoFiles:
         info_dir = os.path.join(norm_path, 'info')
         try:
             for info_file in self.fs.list_files_in_dir(info_dir):
+                debug_print(">>>> info_file: %s" % info_file)
                 if not os.path.basename(info_file).endswith('.trashinfo'):
                     yield ('non_trashinfo', info_file)
                 else:
                     yield ('trashinfo', info_file)
-        except OSError:  # when directory does not exist
-            pass
+        except OSError as e:  # when directory does not exist
+            debug_print(">>>> exception: %s" % e)
diff --git a/trashcli/restore/trash_directories.py b/trashcli/restore/trash_directories.py
index 4f1c180..73f5661 100644
--- a/trashcli/restore/trash_directories.py
+++ b/trashcli/restore/trash_directories.py
@@ -1,14 +1,17 @@
 # Copyright (C) 2007-2023 Andrea Francia Trivolzio(PV) Italy
-from abc import abstractmethod, ABCMeta
+from abc import ABCMeta
+from abc import abstractmethod
+from typing import Optional
 
 import six
-from typing import Optional
 
 from trashcli.fstab.volume_of import VolumeOf
 from trashcli.fstab.volumes import Volumes
 from trashcli.lib.environ import Environ
-from trashcli.lib.trash_dirs import (
-    volume_trash_dir1, volume_trash_dir2, home_trash_dir)
+from trashcli.lib.trash_dirs import home_trash_dir
+from trashcli.lib.trash_dirs import volume_trash_dir1
+from trashcli.lib.trash_dirs import volume_trash_dir2
+from trashcli.trash import debug_print
 
 
 @six.add_metaclass(ABCMeta)
@@ -65,6 +68,7 @@ class TrashDirectories1:
 
     def all_trash_directories(self):
         volumes_to_check = self.volumes.list_mount_points()
+        debug_print(">>>> volumes_to_check: %s" % volumes_to_check)
         for path1, volume1 in home_trash_dir(self.environ, self.volumes):
             yield path1, volume1
         for volume in volumes_to_check:
diff --git a/trashcli/trash.py b/trashcli/trash.py
index db1a088..30f61ee 100644
--- a/trashcli/trash.py
+++ b/trashcli/trash.py
@@ -1,3 +1,11 @@
 # Copyright (C) 2007-2011 Andrea Francia Trivolzio(PV) Italy
 
 version = '0.23.9.23'
+
+
+def debug_print(msg):
+    import os
+    import sys
+    if os.environ.get('TRASHCLI_DEBUG')  == '1':
+        print(msg, file=sys.stderr)
+

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants