class ScriptManager(): """ Script upload and runn manager class """ def __init__(self): self.db_manager = DBManager() def upload_script(self, request): """ Upload python script on server and add that entry in database :param self: :param request: http request parameter """ response = Response() file = self.get_file_object(request) if file is None: response.Error = "Please upload valid python file with .py extension." return response.toJSON(), 400 unique_id = str(uuid.uuid1()) upload_file_directory = os.path.join(UPLOAD_DIRECTORY, unique_id) if not os.path.exists(upload_file_directory): os.makedirs(upload_file_directory) filename = secure_filename(file.filename) file.save(os.path.join(upload_file_directory, filename)) self.db_manager.add_file(unique_id, filename) response.scriptId = unique_id response.scriptLink = HOST_ADDRESS + ":" + str( HOST_PORT) + "/api/v1/scripts/" + unique_id return response.toJSON(), 201 def run_script(self, uuid): """ Run uploaded python script on server with uuid and get the result of the file in return statement :param self: :param uuid: """ response = Response() filename = self.db_manager.get_file(uuid) if filename is None: response.Error = "Invalid Script. Script Not Found." return response.toJSON(), 400 strFilePath = UPLOAD_DIRECTORY + uuid + '/' + filename cmd = "python " + strFilePath #cmd = "docker run -it --rm -v " + UPLOAD_DIRECTORY + uuid + ":/usr/src/myapp -w /usr/src/myapp ubuntu-python3.6-rocksdb-grpc:1.0 python3 " + filename cmd = cmd.split() sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) out, err = sp.communicate() if err: return err.strip('\n') return out.strip('\n') def get_file_object(self, request): """ Get file object from request object return None if something is wrong with the request else file object :param self: :param request: """ if 'data' not in request.files: return None file = request.files['data'] if file.filename == '' or self.allowed_files(file.filename): return None return file def allowed_files(self, filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() not in ALLOWED_FILE_EXTENSIONS