import logging import tempfile import os from flask import Flask, request, Response, jsonify, make_response from cisco.bass.core import Bass import traceback import datetime app = Flask(__name__) log = logging.getLogger("cisco.bass") bass = Bass() @app.route("/job", methods = ["POST"]) def job_create(): try: job = bass.create_job() return jsonify(message = "ok", job = job.json()) except Exception as ex: return make_response(jsonify(message = str(ex), trace = traceback.format_exc()), 400) @app.route("/job", methods = ["GET"]) def jobs_list(): return jsonify(message = "ok", jobs = [j.json() for j in bass.list_jobs()]) @app.route("/job/<int:job_id>", methods = ["GET"]) def job_get_status(job_id): try: return jsonify(message = "ok", job = bass.get_job(job_id).json()) except KeyError: return make_response(jsonify(message = "Invalid job id"), 400) except Exception as ex: return make_response(jsonify(message = str(ex), trace = traceback.format_exc()), 400) @app.route("/job/<int:job_id>/add_sample", methods = ["POST"]) def job_add_sample(job_id): try: samples = [] for name, file_ in request.files.items(): handle, filename = tempfile.mkstemp() os.close(handle) file_.save(filename) samples.append(bass.get_job(job_id).add_sample(filename, name)) return jsonify(message = "ok", samples = [s.json() for s in samples]) except KeyError: log.exception("Invalid job id") return make_response(jsonify(message = "Invalid job id"), 400) @app.route("/job/<int:job_id>/submit", methods = ["POST"]) def job_submit(job_id): try: bass.submit_job(job_id) return jsonify(message = "ok") except KeyError: return make_response(jsonify(message = "Invalid job id"), 400) @app.route("/job/<int:job_id>", methods = ["DELETE"]) def job_delete(job_id): try: bass.delete_job(job_id) return jsonify(message = "ok") except KeyError: return make_response(jsonify(message = "Invalid job id"), 400) @app.route("/whitelist", methods = ["POST"]) def whitelist_add(): log.info("whitelist_add called") try: file_ = request.files["file"] handle, filename = tempfile.mkstemp() os.close(handle) file_.save(filename) data = request.get_json() if data and "functions" in data: functions = data["functions"] else: functions = None bass.whitelist_add(filename, functions) os.unlink(filename) except KeyError: log.exception("") return make_response(jsonify(message = "Sample file 'file' missing in POST request"), 400) return jsonify(message = "OK") if __name__ == "__main__": logging.basicConfig(filename = datetime.datetime.now().strftime("/logs/bass_%Y-%m-%d_%H-%M-%S.log"), level = logging.DEBUG) logging.getLogger().setLevel(logging.DEBUG) app.run(debug = True, host = "0.0.0.0")