import json import logging import typing import uuid import time from clients.webclients import Client, CLIENTS from flask import Flask, render_template, request, redirect, session from tasks import tasks from selector.temp_config import CONFIGS, URLS, HOSTS, RESULT_HOST app = Flask(__name__) clients: typing.Dict[str, Client] = {} log: logging.Logger = logging.getLogger(__name__) @app.route("/") def index(): return render_template("index.html", clients=CLIENTS) @app.route("/login", methods=["POST"]) def login(): game = request.form["game"] if not game in CLIENTS or game not in HOSTS: return redirect("/?invalid_game") client = CLIENTS[game](host=HOSTS[game], username=request.form['username'], password=request.form['password']) if client.login(): session['logged_in'] = True session['uid'] = str(uuid.uuid4()) session['username'] = request.form['username'] session['cookies'] = client.cookies session['game'] = game session['host'] = BIOGAMES_HOST clients[session['uid']] = client return redirect("/results") return redirect("/?fail") @app.route("/results") def results(): if not ('logged_in' in session and session['logged_in']): return redirect("/") if session['logged_in'] and not session['uid'] in clients: clients[session['uid']] = CLIENTS[session['game']](host=session['host'], **session['cookies']) status = tasks.redis.get(session['username']) if status: job_status = json.loads(status) else: job_status = {} #for job in job_status: # results = [] # for path in job_status[job]['results']: # results.append(path.replace(tasks.DATA_PATH, RESULT_HOST)) # print(results) #TODO??? return render_template("results.html", jobs=job_status) @app.route("/games") def games(): if not ('logged_in' in session and session['logged_in']): return redirect("/") if session['logged_in'] and not session['uid'] in clients: clients[session['uid']] = CLIENTS[session['game']](host=session['host'], **session['cookies']) return render_template("games.html", logs=clients[session['uid']].list(), configs=CONFIGS) @app.route("/start", methods=['POST']) def start(): print(str(request.form['logs'])) status = { "status": "PENDING", "submit": time.strftime("%c"), "log_ids": request.form.getlist('logs'), "config": request.form['config'], } params = { "log_ids": request.form.getlist('logs'), "config": CONFIGS[request.form['config']], "username": session['username'], "cookies": session['cookies'], "host": session['host'], "clientName": session['game'], "name": request.form['name'], } tasks.status_update(session['username'], request.form['name'], status) tasks.analyze.delay(**params) return redirect("/results") @app.route("/status") def status(): return json.dumps(json.loads(tasks.redis.get(session['username'])), indent=2) @app.template_filter('get_url') def get_url(path: str): return path.replace(tasks.DATA_PATH, RESULT_HOST) @app.template_filter('get_name') def get_url(path: str): return path.replace(tasks.DATA_PATH, "") @app.template_filter('get_prefix') def get_prefix(job): print(job) try: return RESULT_HOST + URLS[job['config']] except: return RESULT_HOST + "#" if __name__ == '__main__': app.config.update({"SECRET_KEY": "59765798-2784-11e8-8d05-db4d6f6606c9"}) app.run(host="0.0.0.0", debug=True)