@@ -72,3 +72,75 @@ def afs_print_acl(folder, is_server=False):
7272 log_error (f"Failed to remove ACL on { folder } for user { user } .\n { stderr } " , e , is_server = is_server )
7373 return 1
7474
75+
76+ def afs_rm (path , is_server = False ):
77+ try :
78+ path = Path (path ).expanduser ().resolve ()
79+ cmd = subprocess .run (['rm' , path ], stdout = subprocess .PIPE , stderr = subprocess .PIPE )
80+ if cmd .returncode == 0 :
81+ return 0
82+ else :
83+ stderr = cmd .stderr .decode ('UTF-8' ).strip ().split ('\n ' )
84+ log_error (f"Failed afs_rm for { path } !\n { stderr } " , is_server = is_server )
85+ return 1
86+ except Exception as e :
87+ log_error (f"Failed afs_rm for { path } !\n " , e , is_server = is_server )
88+ return 1
89+
90+
91+ # Always use this file by file, not for a list of files
92+ def cp_from_afs (source , target , maximum_trials = 10 , wait = 2.7 , is_server = False ):
93+ try :
94+ source = Path (source ).expanduser ().resolve ()
95+ target = Path (target ).expanduser ().resolve ()
96+ for i in range (maximum_trials ):
97+ cmd = subprocess .run (['cp' , source .as_posix (), target .as_posix ()])
98+ if cmd .returncode == 0 and target .exists () and target .stat ().st_size != 0 :
99+ return 0
100+ if i != maximum_trials - 1 :
101+ log_debug (f"Failed to copy { str (source )} to { str (target )} !\n Retrying ({ i } ).." , is_server = is_server )
102+ sleep (abs (wait + random .normalvariate (0 , 0.1 * wait )))
103+ log_error (f"Failed to copy { str (source )} to { str (target )} !" , is_server = is_server )
104+ if not target .exists () or target .stat ().st_size == 0 :
105+ log_error (f"Command succeeds but destination file is not created!" , is_server = is_server )
106+ else :
107+ stderr = cmd .stderr .decode ('UTF-8' ).strip ().split ('\n ' )
108+ log_error (f"Command failed: { stderr } " , is_server = is_server )
109+ log_error ("\n Giving up." , is_server = is_server )
110+ return 1
111+ except Exception as e :
112+ log_error (f"Failed to copy { str (source )} to { str (target )} !\n " , e , is_server = is_server )
113+ return 1
114+
115+ def mv_from_afs (source , target , maximum_trials = 10 , wait = 2.7 , is_server = False ):
116+ if not cp_from_afs (source , target , maximum_trials , wait , is_server = is_server ): # returncode 0 means success
117+ afs_rm (source , is_server = is_server )
118+
119+
120+ # Always use this file by file, not for a list of files
121+ def cp_to_afs (source , target , maximum_trials = 10 , wait = 2.7 , is_server = False ):
122+ try :
123+ source = Path (source ).expanduser ().resolve ()
124+ target = Path (target ).expanduser ().resolve ()
125+ for i in range (maximum_trials ):
126+ cmd = subprocess .run (['cp' , source .as_posix (), target .as_posix ()])
127+ if cmd .returncode == 0 and target .exists () and target .stat ().st_size != 0 :
128+ return 0
129+ if i != maximum_trials - 1 :
130+ log_debug (f"Failed to copy { str (source )} to { str (target )} !\n Retrying ({ i } ).." , is_server = is_server )
131+ sleep (abs (wait + random .normalvariate (0 , 0.1 * wait )))
132+ log_error (f"Failed to copy { str (source )} to { str (target )} !" , is_server = is_server )
133+ if not target .exists () or target .stat ().st_size == 0 :
134+ log_error (f"Command succeeds but destination file is not created!" , is_server = is_server )
135+ else :
136+ stderr = cmd .stderr .decode ('UTF-8' ).strip ().split ('\n ' )
137+ log_error (f"Command failed: { stderr } " , is_server = is_server )
138+ log_error ("\n Giving up." , is_server = is_server )
139+ return 1
140+ except Exception as e :
141+ log_error (f"Failed to copy { str (source )} to { str (target )} !\n " , e , is_server = is_server )
142+ return 1
143+
144+ def mv_to_afs (source , target , maximum_trials = 10 , wait = 2.7 , is_server = False ):
145+ if not cp_to_afs (source , target , maximum_trials , wait , is_server = is_server ): # returncode 0 means success
146+ source .unlink ()
0 commit comments