Commit 27ef2387 authored by Kento HASEGAWA's avatar Kento HASEGAWA

Merge branch 'comm-server' into 'comm'

Use web socket to update status

See merge request adc2018/adc2018-system!16
parents 5942a463 51414a36
......@@ -17,6 +17,8 @@ import threading
import time
from collections import OrderedDict
from flask import Flask, render_template, request, g
from gevent import pywsgi, monkey
from geventwebsocket.handler import WebSocketHandler
from queue import Queue
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../../solver')
......@@ -25,10 +27,12 @@ import BoardStr
import adcclilib
app = Flask(__name__)
monkey.patch_all()
app_args = {}
questions = None
clients = None
current_seed = 1
wsq = None
def load_questions():
global app_args
......@@ -58,10 +62,10 @@ def load_questions():
"path": v,
"status": "Not solved",
"answer": "",
"queue": Queue(),
"board_size": board_size,
"line_num": line_num,
"last_req": None,
"solver": OrderedDict(),
"answers": OrderedDict(),
}
......@@ -79,7 +83,7 @@ def load_questions():
with open(v, "r") as fp:
_ans_dat = fp.read()
try:
questions[_name]["status"] = "Solved"
questions[_name]["status"] = "Saved"
questions[_name]["answer"] = _ans_dat
except KeyError as e:
pass
......@@ -88,9 +92,14 @@ def update_answer_list(qname):
global app_args
global questions
global clients
questions[qname]['solver'] = OrderedDict()
questions[qname]['answers'] = OrderedDict()
for c in clients['solver']:
questions[qname]['solver'][c[0]] = "-"
_folder_name = os.path.splitext(qname)[0]
_answers_path = "{}/{}".format(app_args['out'], _folder_name)
if os.path.isdir(_answers_path):
......@@ -98,6 +107,8 @@ def update_answer_list(qname):
answer_log_file.sort()
answer_log_file.reverse()
is_solved = False
for v2 in answer_log_file:
json_name = os.path.basename(v2)
with open(v2, "r") as fp:
......@@ -107,6 +118,17 @@ def update_answer_list(qname):
if questions[qname]['answer'] == answer_log['answer']:
questions[qname]['best_json'] = json_name
if (questions[qname]['last_req'] == float(answer_log['req_id'])):
if answer_log['solver'] in questions[qname]['solver']:
if answer_log['solved'] == "True":
questions[qname]['solver'][answer_log['solver']] = "Solved"
is_solved = True
else:
questions[qname]['solver'][answer_log['solver']] = "DNS"
if is_solved > 0:
questions[qname]['status'] = "Solved"
@app.before_request
def before_request():
global app_args
......@@ -118,10 +140,13 @@ def post():
global questions
global app_args
global wsq
_qname = request.form["qname"]
_answer = request.form["answer"]
_answer = request.form["solution"]
_client = request.form["client"]
_req_id = request.form["req_id"]
_is_solved = request.form["solved"]
if "solver" in request.form:
_solver = request.form["solver"]
......@@ -132,14 +157,18 @@ def post():
receive_time_str = receive_time.strftime("%Y%m%d%H%M%S")
dat = {
"req_id": request.form['req_id'],
"req_id": _req_id,
"qname": _qname,
"client": _client,
"solver": _solver,
"answer": _answer,
"cputime": request.form['cputime'],
"timestamp": receive_time.strftime("%Y/%m/%d %H:%M:%S")
"timestamp": receive_time.strftime("%Y/%m/%d %H:%M:%S"),
"nlcheck": -1,
"solved": _is_solved,
}
if _is_solved == "True":
# Create a temporary file to execute "nlcheck.py"
tmp_path = "{}/{}".format(app_args['out'], "tmp")
if not os.path.isdir(tmp_path):
......@@ -160,8 +189,6 @@ def post():
m = re.match(pattern, nlcheck)
if m and (m.group(1) == "True"):
dat["nlcheck"] = float(m.group(2))
else:
dat["nlcheck"] = -1
save_path = "{}/{}".format(app_args['out'], os.path.splitext(_qname)[0])
if not os.path.isdir(save_path):
......@@ -171,6 +198,17 @@ def post():
save_file_path = "{}/{}".format(save_path, file_name)
with open(save_file_path, "w") as fp:
json.dump(dat, fp, indent=4)
else:
save_path = "{}/{}".format(app_args['out'], os.path.splitext(_qname)[0])
if not os.path.isdir(save_path):
os.makedirs(save_path)
file_name = "{}-{}.json".format(receive_time_str, _solver.replace(":", "."))
save_file_path = "{}/{}".format(save_path, file_name)
with open(save_file_path, "w") as fp:
json.dump(dat, fp, indent=4)
wsq.put(dat)
res = {"status": "OK"}
......@@ -317,6 +355,7 @@ def save_best_solution():
with open(out_file_path, 'w') as fp:
fp.write(questions[qname]['answers'][_best_json]['answer'])
questions[_name]["status"] = "Saved"
questions[qname]['best_json'] = _best_json
res = {"status": "OK"}
......@@ -549,6 +588,22 @@ def question_status():
return render_template("part_question_status.html", qname=qname, qdata=qdata, solvers=clients["solver"])
@app.route('/ws')
def ws():
global wsq
if request.environ.get('wsgi.websocket'):
ws = request.environ['wsgi.websocket']
while True:
if wsq is None:
time.sleep(1)
continue
else:
data = wsq.get()
str_data = json.dumps(data)
ws.send(str_data)
@app.route("/")
def index():
......@@ -567,9 +622,7 @@ def init_system():
global app_args
global questions
global clients
if questions is None:
load_questions()
global wsq
if clients is None:
......@@ -592,6 +645,12 @@ def init_system():
"resolver": resolver
}
if questions is None:
load_questions()
if wsq is None:
wsq = Queue()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="PYNQ control panel.")
......@@ -607,5 +666,9 @@ if __name__ == "__main__":
if args["debug"]:
app.debug = True
app.run(host='0.0.0.0', threaded=True)
app.threaded = True
# app.run(host='0.0.0.0', threaded=True)
server = pywsgi.WSGIServer(("", 5000), app, handler_class=WebSocketHandler)
server.serve_forever()
......@@ -63,7 +63,6 @@ var PynqManager = (function(){
}).done(function(res){
var answer = res;
$("#solving-question-status").text(answer["status"]);
$("#solved-client").text(answer["answer"]["client"]);
if (after !== null){
after();
......@@ -110,6 +109,7 @@ $(function(){
var pynqClients = {}
var pm = null;
var last_req = 0;
var refresh_question_table = function(){
$.ajax({
......@@ -179,7 +179,7 @@ $(function(){
$("#adccli-status").text("ログアウト");
});
pm.getStatus();
if(pm) pm.getStatus();
});
}
......@@ -195,7 +195,7 @@ $(function(){
$("#client-control-pane").find(".start-button").eq(0).click(function(){
var qname = $(this).data("qname");
pm.sendQuestion(qname, after=refresh_question_table);
pm.sendQuestion(qname);
});
$("#client-control-pane").find(".stop-button").eq(0).click(function(){
pm.sendStop();
......@@ -241,6 +241,19 @@ $(function(){
}
}).trigger('hashchange');
var ws = new WebSocket("ws://" + location.host + "/ws");
ws.onmessage = function(e){
var recv = JSON.parse(e.data.replace(/\n/g, "\\n"));
console.log(recv);
var hash = location.hash.replace("#", "");
if(hash == recv['qname']){
show_question_status(hash);
}
refresh_question_table();
};
refresh_question_table();
$.ajax({
......@@ -250,6 +263,10 @@ $(function(){
}).done(function(d){
pynqClients = d;
pm = PynqManager(pynqClients);
if(location.hash.replace("#", "") == ""){
pm.getStatus();
}
});
});
......@@ -28,7 +28,7 @@
 ({{c[2]}})
{% endif %}
</td>
<td></td>
<td>{{qdata.solver[c[0]]}}</td>
</tr>
{% endfor %}
</table>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment