diff --git a/fri/server/main.py b/fri/server/main.py index 6ee4624..348f57a 100644 --- a/fri/server/main.py +++ b/fri/server/main.py @@ -1,49 +1,116 @@ -from flask import Flask, request, jsonify, render_template +from flask import Flask, request, jsonify, send_file, send_from_directory from werkzeug.utils import secure_filename import os +from subprocess import call +from pathlib import Path -UPLOAD_FOLDER = "./uploaded_files" - -if not os.path.exists(UPLOAD_FOLDER): - os.makedirs(UPLOAD_FOLDER) - app = Flask(__name__) app.secret_key = "secret key" -app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER - - -@app.route('/upload', methods=['POST']) -def upload(): - if 'files[]' not in request.files: - resp = jsonify({'message' : 'No file in the request'}) - resp.status_code = 400 - return resp - - files = request.files.getlist('files[]') - - errors = {} - success = False - - for file in files: - if file: - filename = secure_filename(file.filename) - file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) - success = True - - if success and errors: - errors['message'] = 'File(s) successfully uploaded' - resp = jsonify(errors) - resp.status_code = 500 - return resp - if success: - resp = jsonify({'message' : 'Files successfully uploaded'}) - resp.status_code = 201 - return resp - else: - resp = jsonify(errors) - resp.status_code = 500 - return resp + +# To upload multiple file. For example, /upload/test?apikey=xyz +@app.route('/upload/', methods=['POST']) +def upload(dir): + apikey = request.args.get('apikey') + dirname = dir + "_" + apikey + + if 'files[]' not in request.files: + resp = jsonify({'message': 'No file in the request'}) + resp.status_code = 400 + return resp + + files = request.files.getlist('files[]') + + errors = {} + success = False + + if not os.path.exists(secure_filename(dirname)): + os.makedirs(secure_filename(dirname)) + + for file in files: + if file: + filename = secure_filename(file.filename) + file.save(secure_filename(dirname)+"/"+filename) + success = True + + if success and errors: + errors['message'] = 'File(s) successfully uploaded' + resp = jsonify(errors) + resp.status_code = 500 + return resp + if success: + resp = jsonify({'message': 'Files successfully uploaded'}) + resp.status_code = 201 + return resp + else: + resp = jsonify(errors) + resp.status_code = 500 + return resp + +# To execute any python file. For example, /execute/test?apikey=xyz +@app.route('/execute/', methods=['POST']) +def execute(dir): + apikey = request.args.get('apikey') + dirname = dir + "_" + apikey + + if 'file' not in request.files: + resp = jsonify({'message': 'No file in the request'}) + resp.status_code = 400 + return resp + + file = request.files['file'] + + if file.filename == '': + resp = jsonify({'message': 'No file selected for Executing'}) + resp.status_code = 400 + return resp + + errors = {} + success = False + + if not os.path.exists(secure_filename(dirname)): + os.makedirs(secure_filename(dirname)) + + if file: + filename = secure_filename(file.filename) + file.save(secure_filename(dirname)+"/"+filename) + output_filename = filename + ".out" + file_path = secure_filename(dirname) + "/"+filename + outputfile_path = secure_filename(dirname)+"/"+output_filename + f = open(outputfile_path, "w") + call(["nohup", "python3", file_path], stdout=f) + success = True + + if success: + resp = jsonify({'message': 'Files successfully executed'}) + resp.status_code = 201 + return resp + else: + resp = jsonify(errors) + resp.status_code = 500 + return resp + + + +# to download /download/?fetch=. For example, /download/test?fetch=example.py.out&apikey=xyz +@app.route('/download/', methods=['POST', 'GET']) +def download(dir): + download_file = request.args.get('fetch') + apikey = request.args.get('apikey') + dirname = dir + "_" + apikey + + if not os.path.exists(secure_filename(dirname)): + resp = jsonify({'message': 'Directory not found'}) + resp.status_code = 400 + return resp + + try: + return send_from_directory(secure_filename(dirname), download_file, as_attachment=True) + except: + resp = jsonify({'message': 'file not found'}) + resp.status_code = 400 + return resp + if __name__ == "__main__": app.run(host="0.0.0.0") diff --git a/fri/service_config.sh b/fri/service_config.sh index c6530e3..7be2144 100644 --- a/fri/service_config.sh +++ b/fri/service_config.sh @@ -1,6 +1,6 @@ #!/bin/bash -SERVICES=('upload' 'execute') +SERVICES=('upload' 'execute' 'download') for service in "${SERVICES[@]}" do name="name="$service