easyctf-2017/server/app.py

101 lines
3.2 KiB
Python
Raw Normal View History

2016-03-10 07:29:27 +00:00
#!/usr/bin/python
2015-12-23 06:26:27 +00:00
from argparse import ArgumentParser
2015-12-21 07:04:00 +00:00
from flask import Flask
2015-12-23 06:26:27 +00:00
2016-01-16 16:41:16 +00:00
app = Flask(__name__)
2015-12-27 01:21:15 +00:00
import api
2015-12-21 21:08:50 +00:00
import config
2015-12-23 06:26:27 +00:00
import json
2016-03-10 07:29:27 +00:00
import logging
import os
2015-12-23 01:37:38 +00:00
2016-01-07 00:23:43 +00:00
from api.decorators import api_wrapper
2016-01-16 16:41:16 +00:00
app.config.from_object(config)
2015-12-31 02:56:00 +00:00
if not os.path.exists(app.config["UPLOAD_FOLDER"]):
os.makedirs(app.config["UPLOAD_FOLDER"])
2015-12-24 02:06:49 +00:00
with app.app_context():
2016-01-02 20:45:05 +00:00
from api.models import db, Files, Teams, Problems, Solves, Users
2015-12-24 05:29:04 +00:00
db.init_app(app)
db.create_all()
2015-12-24 02:06:49 +00:00
2015-12-25 01:37:49 +00:00
app.secret_key = config.SECRET_KEY
2015-12-21 07:04:00 +00:00
2015-12-25 00:57:58 +00:00
app.register_blueprint(api.admin.blueprint, url_prefix="/api/admin")
2015-12-31 02:56:00 +00:00
app.register_blueprint(api.problem.blueprint, url_prefix="/api/problem")
2016-01-18 06:41:11 +00:00
app.register_blueprint(api.stats.blueprint, url_prefix="/api/stats")
2016-01-12 03:54:26 +00:00
app.register_blueprint(api.team.blueprint, url_prefix="/api/team")
app.register_blueprint(api.user.blueprint, url_prefix="/api/user")
2015-12-27 01:21:15 +00:00
api.logger.initialize_logs()
2015-12-25 00:57:58 +00:00
2015-12-23 06:26:27 +00:00
@app.route("/api")
2016-01-07 00:23:43 +00:00
@api_wrapper
2015-12-23 23:23:18 +00:00
def api_main():
2016-01-07 00:23:43 +00:00
return { "success": 1, "message": "The API is online." }
2016-03-10 07:29:27 +00:00
def run(args):
2015-12-24 05:29:04 +00:00
with app.app_context():
app.debug = keyword_args["debug"]
2015-12-24 04:14:54 +00:00
app.run(host="0.0.0.0", port=8000)
2016-03-10 07:29:27 +00:00
def load_problems(args):
if not os.path.exists(config.PROBLEM_DIR):
logging.critical("Problems directory doesn't exist.")
return
for (dirpath, dirnames, filenames) in os.walk(config.PROBLEM_DIR):
if "problem.json" in filenames:
json_file = os.path.join(dirpath, "problem.json")
contents = open(json_file).read()
try:
data = json.loads(contents)
except ValueError as e:
logging.warning("Invalid JSON format in file {filename} ({exception})".format(filename=json_file, exception=e))
continue
if not isinstance(data, dict):
logging.warning("{filename} is not a dict.".format(filename=json_file))
continue
missing_keys = []
for key in ["pid", "title", "category", "value"]:
if key not in data:
missing_keys.append(key)
if len(missing_keys) > 0:
logging.warning("{filename} is missing the following keys: {keys}".format(filename=json_file, keys=", ".join(missing_keys)))
continue
relative_path = os.path.relpath(dirpath, config.PROBLEM_DIR)
logging.info("Found problem '{}'".format(data["title"]))
try:
api.problem.insert_problem(data)
except Exception as e:
logging.warning("Problem '{}' was not added to the database. Error: {}".format(data["title"], e))
if __name__ == "__main__":
parser = ArgumentParser(description="EasyCTF Server Management")
subparser = parser.add_subparsers(help="Select one of the following actions.")
parser_problems = subparser.add_parser("problems", help="Manage problems.")
subparser_problems = parser_problems.add_subparsers(help="Select one of the following actions.")
parser_problems_load = subparser_problems.add_parser("load", help="Load all problems into database.")
parser_problems_load.set_defaults(func=load_problems)
parser_run = subparser.add_parser("run", help="Run the server.")
parser_run.add_argument("-d", "--debug", action="store_true", help="Run the server in debug mode.", default=False)
parser_run.set_defaults(func=run)
args = parser.parse_args()
keyword_args, _ = dict(args._get_kwargs()), args._get_args()
logging.getLogger().setLevel(logging.INFO)
if "func" in args:
args.func(args)
else:
parser.print_help()