22import time
33import subprocess
44import tempfile
5+ import shutil
56from collections import OrderedDict
7+ from typing import List , Dict
68
79# web imports
810from flask import safe_join
@@ -74,7 +76,6 @@ def run_command(self, cmd, key) -> Report:
7476 :returns:
7577 A ConcurrentFuture object where future.result = Report()
7678 """
77- job_key : str = self .make_key (key )
7879 start_time = time .time ()
7980 try :
8081 proc = subprocess .Popen (cmd , stdout = subprocess .PIPE , stderr = subprocess .PIPE )
@@ -88,7 +89,7 @@ def run_command(self, cmd, key) -> Report:
8889 else :
8990 status = "failed"
9091
91- logger .info (f"Job: '{ job_key } ' finished with status: '{ status } '." )
92+ logger .info (f"Job: '{ key } ' --> finished with status: '{ status } '." )
9293 return Report (
9394 key = key ,
9495 report = stdout ,
@@ -100,7 +101,7 @@ def run_command(self, cmd, key) -> Report:
100101 except Exception as e :
101102 str_err = str (e )
102103 self .cancel_job (key )
103- logger .error (f"Job: '{ job_key } ' failed. Reason: { str_err } ." )
104+ logger .error (f"Job: '{ key } ' --> failed. Reason: { str_err } ." )
104105 return Report (
105106 key = key ,
106107 report = None ,
@@ -128,8 +129,11 @@ def save_result(self, future) -> None:
128129 def get_all (self ):
129130 return self .__results
130131
131- def get_one (self , key ) -> Report :
132- return self .__results .get (key )
132+ def pop_and_get_one (self , key ) -> Report :
133+ try :
134+ return self .__results .pop (key )
135+ except KeyError :
136+ return None
133137
134138
135139class RequestParser :
@@ -138,8 +142,10 @@ class RequestParser:
138142 Internal use Only.
139143 """
140144
145+ __tmpdirs : Dict [str , str ] = {}
146+
141147 @staticmethod
142- def __parse_multipart_req (args : list , files ):
148+ def __parse_multipart_req (args : List [ str ] , files ) -> ( List [ str ], str ):
143149 # Check if file part exists
144150 fnames = []
145151 for arg in args :
@@ -154,7 +160,7 @@ def __parse_multipart_req(args: list, files):
154160 )
155161
156162 # create a new temporary directory
157- tmpdir = tempfile .mkdtemp ()
163+ tmpdir : str = tempfile .mkdtemp ()
158164 for fname in fnames :
159165 if fname not in files :
160166 raise Exception (
@@ -173,33 +179,45 @@ def __parse_multipart_req(args: list, files):
173179 logger .debug (f"Request files saved under temp directory: '{ tmpdir } '" )
174180 return args , tmpdir
175181
176- def parse_req (self , request ) -> (str , str ):
182+ def parse_req (self , request , base_command : str ) -> (str , str ):
183+ args : List [str ] = []
184+ tmpdir = None
177185 if request .is_json :
178186 # request does not contain a file
179187 args = request .json .get ("args" , [])
180188 elif request .files :
181189 # request contains file
182190 received_args = request .form .getlist ("args" )
183- args , self . tmpdir = RequestParser .__parse_multipart_req (
191+ args , tmpdir = RequestParser .__parse_multipart_req (
184192 received_args , request .files
185193 )
186194 else :
187195 # request is w/o any data
188196 # i.e. just run-script
189197 args = []
190198
191- cmd : list = self . command_name .split (" " )
199+ cmd : List [ str ] = base_command .split (" " )
192200 cmd .extend (args )
193- return cmd , calc_hash (cmd )
194-
195- def cleanup_temp_dir (self , _ ) -> None :
196- if hasattr (self , "tmpdir" ):
197- try :
198- __import__ ("shutil" ).rmtree (self .tmpdir )
199- logger .debug (f"temp directory: '{ self .tmpdir } ' was deleted." )
200- del self .tmpdir
201- except Exception :
202- logger .debug (f"Failed to clear temp directory: '{ self .tmpdir } '." )
203-
204- def __init__ (self , command_name ) -> None :
205- self .command_name = command_name
201+ key : str = calc_hash (cmd )
202+ if tmpdir :
203+ self .__tmpdirs .update ({key : tmpdir })
204+
205+ return cmd , key
206+
207+ def cleanup_temp_dir (self , future ) -> None :
208+ key : str = future .result ().key
209+ tmpdir : str = self .__tmpdirs .get (key , None )
210+ if not tmpdir :
211+ return None
212+
213+ try :
214+ shutil .rmtree (tmpdir )
215+ logger .debug (
216+ f"Job: '{ key } ' --> Temporary directory: '{ tmpdir } ' "
217+ "successfully deleted."
218+ )
219+ self .__tmpdirs .pop (key )
220+ except Exception :
221+ logger .debug (
222+ f"Job: '{ key } ' --> Failed to clear Temporary directory: '{ tmpdir } '."
223+ )
0 commit comments