Skip to content

Commit 47b631f

Browse files
committed
updated FRI
1 parent 5ef179b commit 47b631f

2 files changed

Lines changed: 105 additions & 91 deletions

File tree

fri/server/main.py

Lines changed: 104 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,115 @@
1-
from flask import Flask, request, jsonify, send_from_directory
1+
from flask import Flask, request, jsonify, send_file, send_from_directory
22
from werkzeug.utils import secure_filename
33
import os
44
from subprocess import call
55
from pathlib import Path
66

7-
EXECUTABLE_FOLDER = "./executable_files"
8-
DOWNLOAD_FOLDER = "./download_files"
9-
UPLOAD_FOLDER = "./uploaded_files"
10-
11-
if not os.path.exists(UPLOAD_FOLDER):
12-
os.makedirs(UPLOAD_FOLDER)
137

148
app = Flask(__name__)
159
app.secret_key = "secret key"
16-
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
17-
app.config['EXECUTABLE_FOLDER'] = EXECUTABLE_FOLDER
18-
app.config['DOWNLOAD_FOLDER'] = DOWNLOAD_FOLDER
19-
20-
21-
@app.route('/upload', methods=['POST'])
22-
def upload():
23-
if 'files[]' not in request.files:
24-
resp = jsonify({'message' : 'No file in the request'})
25-
resp.status_code = 400
26-
return resp
27-
28-
files = request.files.getlist('files[]')
29-
30-
errors = {}
31-
success = False
32-
33-
for file in files:
34-
if file:
35-
filename = secure_filename(file.filename)
36-
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
37-
success = True
38-
39-
if success and errors:
40-
errors['message'] = 'File(s) successfully uploaded'
41-
resp = jsonify(errors)
42-
resp.status_code = 500
43-
return resp
44-
if success:
45-
resp = jsonify({'message' : 'Files successfully uploaded'})
46-
resp.status_code = 201
47-
return resp
48-
else:
49-
resp = jsonify(errors)
50-
resp.status_code = 500
51-
return resp
52-
53-
54-
@app.route('/execute', methods=['POST'])
55-
def execute():
56-
if 'file' not in request.files:
57-
resp = jsonify({'message' : 'No file in the request'})
58-
resp.status_code = 400
59-
return resp
60-
61-
62-
file = request.files['file']
63-
if file.filename == '':
64-
resp = jsonify({'message' : 'No file selected for Executing'})
65-
resp.status_code = 400
66-
return resp
67-
68-
errors = {}
69-
success = False
70-
71-
72-
if file:
73-
filename = secure_filename(file.filename)
74-
file.save(os.path.join(app.config['EXECUTABLE_FOLDER'], filename))
75-
output_file = filename + ".out"
76-
path = app.config['EXECUTABLE_FOLDER']+"/"+filename
77-
call(["python3", path, ">", output_file, "&"])
78-
success = True
79-
80-
if success:
81-
resp = jsonify({'message' : 'Files successfully executed'})
82-
resp.status_code = 201
83-
return resp
84-
else:
85-
resp = jsonify(errors)
86-
resp.status_code = 500
87-
return resp
88-
89-
90-
91-
@app.route('/download/<file_name>', methods=['POST','GET'])
92-
def download(file_name):
93-
try:
94-
return send_from_directory(app.config["DOWNLOAD_FOLDER"], file_name, as_attachment=True)
95-
except:
96-
resp = jsonify({'message' : 'file not found'})
97-
resp.status_code = 400
98-
return resp
10+
11+
# To upload multiple file. For example, /upload/test?apikey=xyz
12+
@app.route('/upload/<dir>', methods=['POST'])
13+
def upload(dir):
14+
apikey = request.args.get('apikey')
15+
dirname = dir + "_" + apikey
16+
17+
if 'files[]' not in request.files:
18+
resp = jsonify({'message': 'No file in the request'})
19+
resp.status_code = 400
20+
return resp
21+
22+
files = request.files.getlist('files[]')
23+
24+
errors = {}
25+
success = False
26+
27+
if not os.path.exists(secure_filename(dirname)):
28+
os.makedirs(secure_filename(dirname))
29+
30+
for file in files:
31+
if file:
32+
filename = secure_filename(file.filename)
33+
file.save(secure_filename(dirname)+"/"+filename)
34+
success = True
35+
36+
if success and errors:
37+
errors['message'] = 'File(s) successfully uploaded'
38+
resp = jsonify(errors)
39+
resp.status_code = 500
40+
return resp
41+
if success:
42+
resp = jsonify({'message': 'Files successfully uploaded'})
43+
resp.status_code = 201
44+
return resp
45+
else:
46+
resp = jsonify(errors)
47+
resp.status_code = 500
48+
return resp
49+
50+
# To execute any python file. For example, /execute/test?apikey=xyz
51+
@app.route('/execute/<dir>', methods=['POST'])
52+
def execute(dir):
53+
apikey = request.args.get('apikey')
54+
dirname = dir + "_" + apikey
55+
56+
if 'file' not in request.files:
57+
resp = jsonify({'message': 'No file in the request'})
58+
resp.status_code = 400
59+
return resp
60+
61+
file = request.files['file']
62+
63+
if file.filename == '':
64+
resp = jsonify({'message': 'No file selected for Executing'})
65+
resp.status_code = 400
66+
return resp
67+
68+
errors = {}
69+
success = False
70+
71+
if not os.path.exists(secure_filename(dirname)):
72+
os.makedirs(secure_filename(dirname))
73+
74+
if file:
75+
filename = secure_filename(file.filename)
76+
file.save(secure_filename(dirname)+"/"+filename)
77+
output_filename = filename + ".out"
78+
file_path = secure_filename(dirname) + "/"+filename
79+
outputfile_path = secure_filename(dirname)+"/"+output_filename
80+
f = open(outputfile_path, "w")
81+
call(["nohup", "python3", file_path], stdout=f)
82+
success = True
83+
84+
if success:
85+
resp = jsonify({'message': 'Files successfully executed'})
86+
resp.status_code = 201
87+
return resp
88+
else:
89+
resp = jsonify(errors)
90+
resp.status_code = 500
91+
return resp
92+
93+
94+
95+
# to download /download/<dir>?fetch=<downloadfile>. For example, /download/test?fetch=example.py.out&apikey=xyz
96+
@app.route('/download/<dir>', methods=['POST', 'GET'])
97+
def download(dir):
98+
download_file = request.args.get('fetch')
99+
apikey = request.args.get('apikey')
100+
dirname = dir + "_" + apikey
101+
102+
if not os.path.exists(secure_filename(dirname)):
103+
resp = jsonify({'message': 'Directory not found'})
104+
resp.status_code = 400
105+
return resp
106+
107+
try:
108+
return send_from_directory(secure_filename(dirname), download_file, as_attachment=True)
109+
except:
110+
resp = jsonify({'message': 'file not found'})
111+
resp.status_code = 400
112+
return resp
99113

100114

101115
if __name__ == "__main__":

fri/service_config.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/bash
22

3-
SERVICES=('upload' 'execute')
3+
SERVICES=('upload' 'execute' 'download')
44
for service in "${SERVICES[@]}"
55
do
66
name="name="$service

0 commit comments

Comments
 (0)