forked from p15670423/monkey
island: Prompt user for old data dir's deletion during Island setup if old data dir's and Island's versions mismatch
This commit is contained in:
parent
27d04e4de6
commit
dd480d1703
|
@ -1,6 +1,7 @@
|
||||||
import atexit
|
import atexit
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
@ -32,6 +33,7 @@ from monkey_island.cc.services.initialize import initialize_services # noqa: E4
|
||||||
from monkey_island.cc.services.reporting.exporter_init import populate_exporter_list # noqa: E402
|
from monkey_island.cc.services.reporting.exporter_init import populate_exporter_list # noqa: E402
|
||||||
from monkey_island.cc.services.utils.network_utils import local_ip_addresses # noqa: E402
|
from monkey_island.cc.services.utils.network_utils import local_ip_addresses # noqa: E402
|
||||||
from monkey_island.cc.setup import island_config_options_validator # noqa: E402
|
from monkey_island.cc.setup import island_config_options_validator # noqa: E402
|
||||||
|
from monkey_island.cc.setup.data_dir import OldDataError # noqa: E402
|
||||||
from monkey_island.cc.setup.gevent_hub_error_handler import GeventHubErrorHandler # noqa: E402
|
from monkey_island.cc.setup.gevent_hub_error_handler import GeventHubErrorHandler # noqa: E402
|
||||||
from monkey_island.cc.setup.island_config_options import IslandConfigOptions # noqa: E402
|
from monkey_island.cc.setup.island_config_options import IslandConfigOptions # noqa: E402
|
||||||
from monkey_island.cc.setup.mongo import mongo_setup # noqa: E402
|
from monkey_island.cc.setup.mongo import mongo_setup # noqa: E402
|
||||||
|
@ -68,6 +70,24 @@ def _setup_data_dir(island_args: IslandCmdArgs) -> Tuple[IslandConfigOptions, st
|
||||||
except json.JSONDecodeError as ex:
|
except json.JSONDecodeError as ex:
|
||||||
print(f"Error loading server config: {ex}")
|
print(f"Error loading server config: {ex}")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
except OldDataError as ex:
|
||||||
|
user_response = input(
|
||||||
|
f"\nExisting data directory ({ex.old_data_dir}) needs to be deleted."
|
||||||
|
" All data from previous runs will be lost. Proceed to delete? (y/n) "
|
||||||
|
)
|
||||||
|
if user_response == "y":
|
||||||
|
shutil.rmtree(ex.old_data_dir)
|
||||||
|
print("\nOld data directory was deleted. Trying to set up again...\n")
|
||||||
|
return _setup_data_dir(island_args)
|
||||||
|
elif user_response == "n":
|
||||||
|
print(
|
||||||
|
"\nExiting. Please backup and delete the existing data directory. Then, try again."
|
||||||
|
"\nTo learn how to restore and use a backup, please refer to the documentation.\n"
|
||||||
|
)
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
print("\nExiting. Unrecognized response, please try again.\n")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
def _exit_on_invalid_config_options(config_options: IslandConfigOptions):
|
def _exit_on_invalid_config_options(config_options: IslandConfigOptions):
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import logging
|
import logging
|
||||||
import shutil
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from common.version import get_version
|
from common.version import get_version
|
||||||
|
@ -7,27 +6,32 @@ from monkey_island.cc.server_utils.file_utils import create_secure_directory
|
||||||
from monkey_island.cc.setup.version_file_setup import get_version_from_dir, write_version
|
from monkey_island.cc.setup.version_file_setup import get_version_from_dir, write_version
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
_data_dir_backup_suffix = ".old"
|
_data_dir_backup_suffix = ".old"
|
||||||
|
|
||||||
|
|
||||||
def setup_data_dir(data_dir_path: Path):
|
class OldDataError(Exception):
|
||||||
logger.info(f"Setting up data directory in {data_dir_path}.")
|
def __init__(self, old_data_dir: Path) -> None:
|
||||||
_backup_current_data_dir(data_dir_path)
|
self.old_data_dir = old_data_dir
|
||||||
|
|
||||||
|
|
||||||
|
def setup_data_dir(data_dir_path: Path) -> None:
|
||||||
|
logger.info(f"Setting up data directory at {data_dir_path}.")
|
||||||
|
if data_dir_path.exists():
|
||||||
|
logger.info(f"Data directory already exists at {data_dir_path}.")
|
||||||
|
_check_current_data_dir(data_dir_path)
|
||||||
create_secure_directory(str(data_dir_path))
|
create_secure_directory(str(data_dir_path))
|
||||||
write_version(data_dir_path)
|
write_version(data_dir_path)
|
||||||
logger.info("Data directory set up.")
|
logger.info("Data directory set up.")
|
||||||
|
|
||||||
|
|
||||||
def _backup_current_data_dir(data_dir_path: Path):
|
def _check_current_data_dir(data_dir_path: Path) -> None:
|
||||||
if _is_backup_needed(data_dir_path):
|
if _data_dir_version_mismatch_exists(data_dir_path):
|
||||||
logger.debug("Data directory backup needed.")
|
logger.info("Version in data directory does not match the Island's version.")
|
||||||
try:
|
raise OldDataError(data_dir_path)
|
||||||
return _rename_data_dir(data_dir_path)
|
|
||||||
except FileNotFoundError:
|
|
||||||
logger.debug("No data directory found to backup, this is likely a first installation.")
|
|
||||||
|
|
||||||
|
|
||||||
def _is_backup_needed(data_dir_path: Path) -> bool:
|
def _data_dir_version_mismatch_exists(data_dir_path: Path) -> bool:
|
||||||
try:
|
try:
|
||||||
data_dir_version = get_version_from_dir(data_dir_path)
|
data_dir_version = get_version_from_dir(data_dir_path)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
|
@ -39,14 +43,14 @@ def _is_backup_needed(data_dir_path: Path) -> bool:
|
||||||
return island_version != data_dir_version
|
return island_version != data_dir_version
|
||||||
|
|
||||||
|
|
||||||
def _rename_data_dir(data_dir_path: Path):
|
# def _rename_data_dir(data_dir_path: Path):
|
||||||
backup_path = _get_backup_path(data_dir_path)
|
# backup_path = _get_backup_path(data_dir_path)
|
||||||
if backup_path.is_dir():
|
# if backup_path.is_dir():
|
||||||
shutil.rmtree(backup_path)
|
# shutil.rmtree(backup_path)
|
||||||
Path(data_dir_path).replace(backup_path)
|
# Path(data_dir_path).replace(backup_path)
|
||||||
logger.info(f"Old data directory renamed to {backup_path}.")
|
# logger.info(f"Old data directory renamed to {backup_path}.")
|
||||||
|
|
||||||
|
|
||||||
def _get_backup_path(data_dir_path: Path) -> Path:
|
# def _get_backup_path(data_dir_path: Path) -> Path:
|
||||||
backup_dir_name = data_dir_path.name + _data_dir_backup_suffix
|
# backup_dir_name = data_dir_path.name + _data_dir_backup_suffix
|
||||||
return Path(data_dir_path.parent, backup_dir_name)
|
# return Path(data_dir_path.parent, backup_dir_name)
|
||||||
|
|
Loading…
Reference in New Issue