Refactored tornado into gevent for non-blocking server

This commit is contained in:
VakarisZ 2020-10-12 16:54:38 +03:00
parent 53f3625172
commit a9af6fe736
6 changed files with 18 additions and 16 deletions

View File

@ -1,3 +1,6 @@
from gevent import monkey
monkey.patch_all()
from monkey_island.cc.main import main from monkey_island.cc.main import main

View File

@ -6,6 +6,8 @@ from pathlib import Path
from threading import Thread from threading import Thread
# Add the monkey_island directory to the path, to make sure imports that don't start with "monkey_island." work. # Add the monkey_island directory to the path, to make sure imports that don't start with "monkey_island." work.
from gevent.pywsgi import WSGIServer
MONKEY_ISLAND_DIR_BASE_PATH = str(Path(__file__).parent.parent) MONKEY_ISLAND_DIR_BASE_PATH = str(Path(__file__).parent.parent)
if str(MONKEY_ISLAND_DIR_BASE_PATH) not in sys.path: if str(MONKEY_ISLAND_DIR_BASE_PATH) not in sys.path:
sys.path.insert(0, MONKEY_ISLAND_DIR_BASE_PATH) sys.path.insert(0, MONKEY_ISLAND_DIR_BASE_PATH)
@ -46,9 +48,6 @@ def main(should_setup_only=False):
def start_island_server(should_setup_only): def start_island_server(should_setup_only):
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.wsgi import WSGIContainer
mongo_url = os.environ.get('MONGO_URL', env_singleton.env.get_mongo_url()) mongo_url = os.environ.get('MONGO_URL', env_singleton.env.get_mongo_url())
wait_for_mongo_db_server(mongo_url) wait_for_mongo_db_server(mongo_url)
@ -69,12 +68,11 @@ def start_island_server(should_setup_only):
if env_singleton.env.is_debug(): if env_singleton.env.is_debug():
app.run(host='0.0.0.0', debug=True, ssl_context=(crt_path, key_path)) app.run(host='0.0.0.0', debug=True, ssl_context=(crt_path, key_path))
else: else:
http_server = HTTPServer(WSGIContainer(app), http_server = WSGIServer(('0.0.0.0', env_singleton.env.get_island_port()), app,
ssl_options={'certfile': os.environ.get('SERVER_CRT', crt_path), certfile=os.environ.get('SERVER_CRT', crt_path),
'keyfile': os.environ.get('SERVER_KEY', key_path)}) keyfile=os.environ.get('SERVER_KEY', key_path))
http_server.listen(env_singleton.env.get_island_port())
log_init_info() log_init_info()
IOLoop.instance().start() http_server.serve_forever()
def log_init_info(): def log_init_info():

View File

@ -8,8 +8,8 @@ from monkey_island.cc.resources.test.utils.telem_store import TestTelemStore
from monkey_island.cc.services.config import ConfigService from monkey_island.cc.services.config import ConfigService
from monkey_island.cc.services.node import NodeService from monkey_island.cc.services.node import NodeService
from monkey_island.cc.services.reporting.report import ReportService from monkey_island.cc.services.reporting.report import ReportService
from monkey_island.cc.services.reporting.report_generation_synchronisation import ( from monkey_island.cc.services.reporting.report_generation_synchronisation import safe_generate_reports, \
is_report_being_generated, safe_generate_reports) is_report_being_generated
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -1,5 +1,5 @@
import logging import logging
import threading from gevent.lock import Semaphore
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -7,9 +7,9 @@ logger = logging.getLogger(__name__)
# Report generation can be quite slow if there is a lot of data, and the UI queries the Root service often; without # Report generation can be quite slow if there is a lot of data, and the UI queries the Root service often; without
# the locks, these requests would accumulate, overload the server, eventually causing it to crash. # the locks, these requests would accumulate, overload the server, eventually causing it to crash.
logger.debug("Initializing report generation locks.") logger.debug("Initializing report generation locks.")
__report_generating_lock = threading.Semaphore() __report_generating_lock = Semaphore()
__attack_report_generating_lock = threading.Semaphore() __attack_report_generating_lock = Semaphore()
__regular_report_generating_lock = threading.Semaphore() __regular_report_generating_lock = Semaphore()
def safe_generate_reports(): def safe_generate_reports():

View File

@ -74,7 +74,8 @@ module.exports = {
proxy: { proxy: {
'/api': { '/api': {
target: 'https://localhost:5000', target: 'https://localhost:5000',
secure: false secure: false,
changeOrigin: true
} }
} }
} }

View File

@ -8,6 +8,7 @@ botocore==1.17.54
cffi>=1.8,!=1.11.3 cffi>=1.8,!=1.11.3
dpath>=2.0 dpath>=2.0
flask>=1.1 flask>=1.1
gevent>=20.9.0
ipaddress>=1.0.23 ipaddress>=1.0.23
jsonschema==3.2.0 jsonschema==3.2.0
mongoengine>=0.20 mongoengine>=0.20
@ -20,7 +21,6 @@ requests>=2.24
ring>=0.7.3 ring>=0.7.3
stix2>=2.0.2 stix2>=2.0.2
six>=1.13.0 six>=1.13.0
tornado>=6.0.4
tqdm>=4.47 tqdm>=4.47
virtualenv>=20.0.26 virtualenv>=20.0.26
werkzeug>=1.0.1 werkzeug>=1.0.1