forked from p15670423/monkey
island: Clean up MongoDB subprocess when Monkey Island shuts down
This commit is contained in:
parent
d1a2501a5b
commit
559af47928
|
@ -28,6 +28,7 @@ from monkey_island.cc.setup.mongo.database_initializer import init_collections
|
||||||
from monkey_island.cc.setup.mongo.mongo_setup import ( # noqa: E402
|
from monkey_island.cc.setup.mongo.mongo_setup import ( # noqa: E402
|
||||||
MONGO_URL,
|
MONGO_URL,
|
||||||
connect_to_mongodb,
|
connect_to_mongodb,
|
||||||
|
register_mongo_shutdown_callback,
|
||||||
start_mongodb,
|
start_mongodb,
|
||||||
)
|
)
|
||||||
from monkey_island.setup.config_setup import setup_data_dir # noqa: E402
|
from monkey_island.setup.config_setup import setup_data_dir # noqa: E402
|
||||||
|
@ -43,7 +44,10 @@ def run_monkey_island():
|
||||||
_configure_logging(config_options)
|
_configure_logging(config_options)
|
||||||
_initialize_global_resources(config_options, server_config_path)
|
_initialize_global_resources(config_options, server_config_path)
|
||||||
|
|
||||||
start_mongodb(config_options)
|
if config_options.start_mongodb:
|
||||||
|
mongo_db_process = start_mongodb(config_options)
|
||||||
|
register_mongo_shutdown_callback(mongo_db_process)
|
||||||
|
|
||||||
connect_to_mongodb()
|
connect_to_mongodb()
|
||||||
|
|
||||||
bootloader_server_thread = _start_bootloader_server(MONGO_URL)
|
bootloader_server_thread = _start_bootloader_server(MONGO_URL)
|
||||||
|
|
|
@ -11,6 +11,7 @@ logger = logging.getLogger(__name__)
|
||||||
DB_DIR_NAME = "db"
|
DB_DIR_NAME = "db"
|
||||||
DB_DIR_PARAM = "--dbpath"
|
DB_DIR_PARAM = "--dbpath"
|
||||||
MONGO_LOG_FILENAME = "mongo_log.txt"
|
MONGO_LOG_FILENAME = "mongo_log.txt"
|
||||||
|
TERMINATE_TIMEOUT = 10
|
||||||
|
|
||||||
|
|
||||||
class MongoDbProcess:
|
class MongoDbProcess:
|
||||||
|
@ -21,11 +22,25 @@ class MongoDbProcess:
|
||||||
"""
|
"""
|
||||||
self.db_dir_parent_path = db_dir_parent_path
|
self.db_dir_parent_path = db_dir_parent_path
|
||||||
self.logging_dir_path = logging_dir_path
|
self.logging_dir_path = logging_dir_path
|
||||||
|
self._process = None
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
db_path = self._create_db_dir()
|
db_path = self._create_db_dir()
|
||||||
self._start_mongodb_process(db_path)
|
self._start_mongodb_process(db_path)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
if self._process:
|
||||||
|
logger.info("Terminating MongoDB process")
|
||||||
|
self._process.terminate()
|
||||||
|
try:
|
||||||
|
self._process.wait(timeout=TERMINATE_TIMEOUT)
|
||||||
|
logger.info("MongoDB process terminated successfully")
|
||||||
|
except subprocess.TimeoutExpired as te:
|
||||||
|
logger.warning(
|
||||||
|
f"MongoDB did not terminate gracefully and will be forcefully killed: {te}"
|
||||||
|
)
|
||||||
|
self._process.kill()
|
||||||
|
|
||||||
def _create_db_dir(self) -> str:
|
def _create_db_dir(self) -> str:
|
||||||
db_path = os.path.join(self.db_dir_parent_path, DB_DIR_NAME)
|
db_path = os.path.join(self.db_dir_parent_path, DB_DIR_NAME)
|
||||||
logger.info(f"Database content directory: {db_path}.")
|
logger.info(f"Database content directory: {db_path}.")
|
||||||
|
@ -42,7 +57,7 @@ class MongoDbProcess:
|
||||||
logger.info(f"Mongodb log will be available at {mongo_log_path}.")
|
logger.info(f"Mongodb log will be available at {mongo_log_path}.")
|
||||||
|
|
||||||
with open(mongo_log_path, "w") as log:
|
with open(mongo_log_path, "w") as log:
|
||||||
subprocess.Popen(mongo_run_cmd, stderr=subprocess.STDOUT, stdout=log)
|
self._process = subprocess.Popen(mongo_run_cmd, stderr=subprocess.STDOUT, stdout=log)
|
||||||
logger.info("MongoDb launched successfully!")
|
logger.info("MongoDb launched successfully!")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import atexit
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
@ -18,11 +19,18 @@ MINIMUM_MONGO_DB_VERSION_REQUIRED = "4.2.0"
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def start_mongodb(config_options: IslandConfigOptions):
|
def start_mongodb(config_options: IslandConfigOptions) -> MongoDbProcess:
|
||||||
if config_options.start_mongodb:
|
mongo_db_process = MongoDbProcess(
|
||||||
MongoDbProcess(
|
db_dir_parent_path=config_options.data_dir, logging_dir_path=config_options.data_dir
|
||||||
db_dir_parent_path=config_options.data_dir, logging_dir_path=config_options.data_dir
|
)
|
||||||
).start()
|
|
||||||
|
mongo_db_process.start()
|
||||||
|
|
||||||
|
return mongo_db_process
|
||||||
|
|
||||||
|
|
||||||
|
def register_mongo_shutdown_callback(mongo_db_process: MongoDbProcess):
|
||||||
|
atexit.register(mongo_db_process.stop)
|
||||||
|
|
||||||
|
|
||||||
def connect_to_mongodb():
|
def connect_to_mongodb():
|
||||||
|
|
Loading…
Reference in New Issue