2017-08-25 22:47:08 +08:00
|
|
|
from datetime import datetime
|
|
|
|
|
2017-08-29 23:41:39 +08:00
|
|
|
from bson.json_util import dumps
|
2017-08-25 22:47:08 +08:00
|
|
|
from flask import Flask, send_from_directory, redirect, make_response
|
|
|
|
import flask_restful
|
|
|
|
|
|
|
|
from cc.database import mongo
|
|
|
|
from cc.resources.monkey import Monkey
|
|
|
|
from cc.resources.local_run import LocalRun
|
|
|
|
from cc.resources.telemetry import Telemetry
|
2017-08-29 19:12:07 +08:00
|
|
|
from cc.resources.monkey_configuration import MonkeyConfiguration
|
2017-08-25 22:47:08 +08:00
|
|
|
from cc.resources.monkey_download import MonkeyDownload
|
|
|
|
from cc.resources.netmap import NetMap
|
2017-08-29 23:41:39 +08:00
|
|
|
from cc.resources.edge import Edge, Node
|
|
|
|
|
2017-08-25 22:47:08 +08:00
|
|
|
from cc.resources.root import Root
|
|
|
|
|
|
|
|
__author__ = 'Barak'
|
|
|
|
|
|
|
|
|
2017-08-29 19:12:07 +08:00
|
|
|
def serve_static_file(path):
|
|
|
|
print 'requested', path
|
2017-08-29 23:41:39 +08:00
|
|
|
if path.startswith('api/'):
|
|
|
|
return make_response(404)
|
2017-08-29 19:12:07 +08:00
|
|
|
return send_from_directory('ui/dist', path)
|
2017-08-25 22:47:08 +08:00
|
|
|
|
|
|
|
|
2017-08-29 19:12:07 +08:00
|
|
|
def serve_home():
|
|
|
|
return serve_static_file('index.html')
|
2017-08-25 22:47:08 +08:00
|
|
|
|
|
|
|
|
|
|
|
def normalize_obj(obj):
|
|
|
|
if obj.has_key('_id') and not obj.has_key('id'):
|
|
|
|
obj['id'] = obj['_id']
|
|
|
|
del obj['_id']
|
|
|
|
|
|
|
|
for key, value in obj.items():
|
|
|
|
if type(value) is bson.objectid.ObjectId:
|
|
|
|
obj[key] = str(value)
|
|
|
|
if type(value) is datetime:
|
|
|
|
obj[key] = str(value)
|
|
|
|
if type(value) is dict:
|
|
|
|
obj[key] = normalize_obj(value)
|
|
|
|
if type(value) is list:
|
|
|
|
for i in range(0, len(value)):
|
|
|
|
if type(value[i]) is dict:
|
|
|
|
value[i] = normalize_obj(value[i])
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
2017-08-29 23:41:39 +08:00
|
|
|
def output_json(obj, code, headers=None):
|
|
|
|
obj = normalize_obj(obj)
|
|
|
|
resp = make_response(dumps(obj), code)
|
|
|
|
resp.headers.extend(headers or {})
|
|
|
|
return resp
|
|
|
|
|
|
|
|
|
2017-08-25 22:47:08 +08:00
|
|
|
def init_app(mongo_url):
|
|
|
|
app = Flask(__name__)
|
|
|
|
|
|
|
|
api = flask_restful.Api(app)
|
2017-08-29 23:41:39 +08:00
|
|
|
api.representations = {'application/json': output_json}
|
2017-08-25 22:47:08 +08:00
|
|
|
|
|
|
|
app.config['MONGO_URI'] = mongo_url
|
|
|
|
mongo.init_app(app)
|
|
|
|
|
2017-08-29 19:12:07 +08:00
|
|
|
app.add_url_rule('/', 'serve_home', serve_home)
|
|
|
|
app.add_url_rule('/<path:path>', 'serve_static_file', serve_static_file)
|
2017-08-25 22:47:08 +08:00
|
|
|
|
|
|
|
api.add_resource(Root, '/api')
|
|
|
|
api.add_resource(Monkey, '/api/monkey', '/api/monkey/', '/api/monkey/<string:guid>')
|
|
|
|
api.add_resource(LocalRun, '/api/island', '/api/island/')
|
|
|
|
api.add_resource(Telemetry, '/api/telemetry', '/api/telemetry/', '/api/telemetry/<string:monkey_guid>')
|
2017-08-29 19:12:07 +08:00
|
|
|
api.add_resource(MonkeyConfiguration, '/api/configuration', '/api/configuration/')
|
2017-08-25 22:47:08 +08:00
|
|
|
api.add_resource(MonkeyDownload, '/api/monkey/download', '/api/monkey/download/',
|
|
|
|
'/api/monkey/download/<string:path>')
|
|
|
|
api.add_resource(NetMap, '/api/netmap', '/api/netmap/')
|
2017-08-29 23:41:39 +08:00
|
|
|
api.add_resource(Edge, '/api/netmap/edge', '/api/netmap/edge/')
|
|
|
|
api.add_resource(Node, '/api/netmap/node', '/api/netmap/node/')
|
2017-08-25 22:47:08 +08:00
|
|
|
|
|
|
|
return app
|