aboutsummaryrefslogtreecommitdiffstats
path: root/moon_manager/moon_manager/http_server.py
diff options
context:
space:
mode:
Diffstat (limited to 'moon_manager/moon_manager/http_server.py')
-rw-r--r--moon_manager/moon_manager/http_server.py45
1 files changed, 25 insertions, 20 deletions
diff --git a/moon_manager/moon_manager/http_server.py b/moon_manager/moon_manager/http_server.py
index a98cab43..204e7e04 100644
--- a/moon_manager/moon_manager/http_server.py
+++ b/moon_manager/moon_manager/http_server.py
@@ -2,9 +2,9 @@
# This software is distributed under the terms and conditions of the 'Apache-2.0'
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
-
-from flask import Flask, jsonify
+from flask import Flask, jsonify, Response, make_response
from flask_cors import CORS, cross_origin
+from json import dumps
from flask_restful import Resource, Api
import logging
import sqlalchemy.exc
@@ -21,7 +21,9 @@ from moon_manager.api.perimeter import Subjects, Objects, Actions
from moon_manager.api.data import SubjectData, ObjectData, ActionData
from moon_manager.api.assignments import SubjectAssignments, ObjectAssignments, ActionAssignments
from moon_manager.api.rules import Rules
-from python_moonutilities import configuration, exceptions
+from moon_manager.api.json_import import JsonImport
+from moon_manager.api.json_export import JsonExport
+from python_moonutilities import configuration
from python_moondb.core import PDPManager
@@ -33,7 +35,7 @@ __API__ = (
Subjects, Objects, Actions, Rules,
SubjectAssignments, ObjectAssignments, ActionAssignments,
SubjectData, ObjectData, ActionData,
- Models, Policies, PDP, Slaves
+ Models, Policies, PDP, Slaves, JsonImport, JsonExport
)
@@ -98,38 +100,41 @@ class Root(Resource):
if _method in dir(item):
_methods.append(_method)
tree[item.__name__]["methods"] = _methods
- tree[item.__name__]["description"] = item.__doc__.strip()
+ tree[item.__name__]["description"] = item.__doc__.strip() if item.__doc__ else ""
return {
"version": __version__,
"tree": tree
}
+class CustomApi(Api):
+
+ @staticmethod
+ def handle_error(e):
+ try:
+ error_message = dumps({"result": False, 'message': str(e), "code": getattr(e, "code", 500)})
+ logger.error(e, exc_info=True)
+ logger.error(error_message)
+ return make_response(error_message, getattr(e, "code", 500))
+ except Exception as e2: # unhandled exception in the api...
+ logger.exception(str(e2))
+ return make_response(error_message, 500)
+
+
class HTTPServer(Server):
def __init__(self, host="localhost", port=80, **kwargs):
super(HTTPServer, self).__init__(host=host, port=port, **kwargs)
self.app = Flask(__name__)
+ self.app.config['TRAP_HTTP_EXCEPTIONS'] = True
conf = configuration.get_configuration("components/manager")
self.manager_hostname = conf["components/manager"].get("hostname",
"manager")
self.manager_port = conf["components/manager"].get("port", 80)
# TODO : specify only few urls instead of *
CORS(self.app)
- self.api = Api(self.app)
+ self.api = CustomApi(self.app, catch_all_404s=True)
self.__set_route()
- self.__hook_errors()
-
- def __hook_errors(self):
-
- def get_404_json(e):
- return jsonify({"result": False, "code": 404, "description": str(e)}), 404
- self.app.register_error_handler(404, get_404_json)
-
- def get_400_json(e):
- return jsonify({"result": False, "code": 400, "description": str(e)}), 400
- self.app.register_error_handler(400, lambda e: get_400_json)
- self.app.register_error_handler(403, exceptions.AuthException)
def __set_route(self):
self.api.add_resource(Root, '/')
@@ -143,7 +148,7 @@ class HTTPServer(Server):
while True:
try:
PDPManager.get_pdp(user_id="admin", pdp_id=None)
- except sqlalchemy.exc.ProgrammingError:
+ except (sqlalchemy.exc.ProgrammingError, sqlalchemy.exc.InternalError):
time.sleep(1)
if first:
logger.warning("Waiting for the database...")
@@ -154,4 +159,4 @@ class HTTPServer(Server):
def run(self):
self.__check_if_db_is_up()
- self.app.run(debug=True, host=self._host, port=self._port) # nosec
+ self.app.run(host=self._host, port=self._port, threaded=True) # nosec