def __init__(self, mcdr_server: 'MCDReforgedServer'): self.plugin_directories = [] # type: List[str] self.mcdr_server = mcdr_server self.logger = mcdr_server.logger # id -> Plugin plugin storage self.plugins = {} # type: Dict[str, AbstractPlugin] # file_path -> id mapping self.plugin_file_path = {} # type: Dict[str, str] # storage for event listeners, help messages and commands self.registry_storage = PluginRegistryStorage(self) self.last_operation_result = PluginOperationResult(self) # not used currently self.thread_pool = PluginThreadPool( self.mcdr_server, max_thread=constant.PLUGIN_THREAD_POOL_SIZE) # thread local storage, to store current plugin self.tls = ThreadLocalStorage() # plugin manipulation lock self.mani_lock = threading.RLock() file_util.touch_directory(PLUGIN_CONFIG_DIRECTORY)
def on_first_start(self): self.logger.info( 'Some of the user files are missing, check them before launch MCDR again' ) default_config = self.config.get_default() file_util.touch_directory(default_config['working_directory']) self.plugin_manager.set_plugin_directories( default_config['plugin_directories']) # to touch the directory
def set_plugin_directories(self, plugin_directories: Optional[List[str]]): if plugin_directories is None: plugin_directories = [] for plugin_directory in self.plugin_directories: try: sys.path.remove(plugin_directory) except ValueError: self.logger.exception( 'Fail to remove old plugin directory "{}" in sys.path'. format(plugin_directory)) self.plugin_directories = misc_util.unique_list(plugin_directories) for plugin_directory in self.plugin_directories: file_util.touch_directory(plugin_directory) sys.path.append(plugin_directory)
def set_file(self, file_name): if self.file_handler is not None: self.removeHandler(self.file_handler) file_util.touch_directory(os.path.dirname(file_name)) if os.path.isfile(file_name): modify_time = time.strftime('%Y-%m-%d', time.localtime(os.stat(file_name).st_mtime)) counter = 0 while True: counter += 1 zip_file_name = '{}/{}-{}.zip'.format(os.path.dirname(file_name), modify_time, counter) if not os.path.isfile(zip_file_name): break zipf = zipfile.ZipFile(zip_file_name, 'w') zipf.write(file_name, arcname=os.path.basename(file_name), compress_type=zipfile.ZIP_DEFLATED) zipf.close() os.remove(file_name) self.file_handler = logging.FileHandler(file_name, encoding='utf8') self.file_handler.setFormatter(self.FILE_FMT) self.addHandler(self.file_handler)
def __init__(self, *, generate_default_only: bool = False, initialize_environment: bool = False): """ :param generate_default_only: If set to true, MCDR will only generate the default configure and permission files """ self.mcdr_state = MCDReforgedState.INITIALIZING self.server_state = ServerState.STOPPED self.server_information = ServerInformation() self.process = None # type: Optional[PIPE] self.flags = MCDReforgedFlag.NONE self.starting_server_lock = Lock() # to prevent multiple start_server() call self.stop_lock = Lock() # to prevent multiple stop() call # will be assigned in on_config_changed() self.encoding_method = None # type: Optional[str] self.decoding_method = None # type: Optional[str] # --- Constructing fields --- # self.logger = MCDReforgedLogger() self.config = Config(self.logger) self.permission_manager = PermissionManager(self) self.basic_server_interface = ServerInterface(self) self.task_executor = TaskExecutor(self) self.console_handler = ConsoleHandler(self) self.watch_dog = WatchDog(self) self.update_helper = UpdateHelper(self) self.translation_manager = TranslationManager(self.logger) self.rcon_manager = RconManager(self) self.server_handler_manager = ServerHandlerManager(self) self.reactor_manager = InfoReactorManager(self) self.command_manager = CommandManager(self) self.plugin_manager = PluginManager(self) self.preference_manager = PreferenceManager(self) self.__check_environment() # --- Input arguments "generate_default_only" processing --- # if generate_default_only: self.config.save_default() self.permission_manager.save_default() return # --- Initialize fields instance --- # self.translation_manager.load_translations() # translations are used for logging, so load them first if initialize_environment: # Prepare config / permission files if they're missing if not self.config.file_presents(): self.config.save_default() default_config = self.config.get_default_yaml() file_util.touch_directory(default_config['working_directory']) # create server/ folder if not self.permission_manager.file_presents(): self.permission_manager.save_default() # Check if there's any file missing # If there's any, MCDR environment might not be probably setup file_missing = False def load(kind: str, func: Callable[[], Any]) -> bool: nonlocal file_missing try: func() except FileNotFoundError: self.logger.error('{} is missing'.format(kind.title())) file_missing = True except YAMLError as e: self.logger.error('Failed to load {}: {}'.format(kind, type(e).__name__)) for line in str(e).splitlines(): self.logger.error(line) return False else: return True # load_config: config, language, handlers, plugin directories, reactors, handlers # load_permission_file: permission # config change will lead to creating plugin folders loading_success = \ load('configure', lambda: self.load_config(allowed_missing_file=False, echo=not initialize_environment)) and \ load('permission', lambda: self.permission_manager.load_permission_file(allowed_missing_file=False)) if file_missing: self.__on_file_missing() return if not loading_success: return # MCDR environment has been setup, so continue creating default folders and loading stuffs self.logger.set_file(core_constant.LOGGING_FILE) # will create logs/ folder self.plugin_manager.touch_directory() # will create config/ folder # --- Done --- # self.set_mcdr_state(MCDReforgedState.INITIALIZED)
def set_plugin_directories(self, plugin_directories: Optional[List[str]]): if plugin_directories is None: plugin_directories = [] self.plugin_directories = misc_util.unique_list(plugin_directories) for plugin_directory in self.plugin_directories: file_util.touch_directory(plugin_directory)
def touch_directory(cls): file_util.touch_directory(plugin_constant.PLUGIN_CONFIG_DIRECTORY)
def __init__(self, *, generate_default_only: bool = False, initialize_environment: bool = False): """ :param generate_default_only: If set to true, MCDR will only generate the default configure and permission files """ self.mcdr_state = MCDReforgedState.INITIALIZING self.server_state = ServerState.STOPPED self.process = None # type: Optional[PIPE] self.flags = MCDReforgedFlag.NONE self.starting_server_lock = Lock( ) # to prevent multiple start_server() call self.stop_lock = Lock() # to prevent multiple stop() call # will be assigned in on_config_changed() self.encoding_method = None # type: Optional[str] self.decoding_method = None # type: Optional[str] # --- Constructing fields --- # self.logger = MCDReforgedLogger(self) self.config = Config(self.logger) self.permission_manager = PermissionManager(self) self.basic_server_interface = ServerInterface(self) self.task_executor = TaskExecutor(self) self.console_handler = ConsoleHandler(self) self.watch_dog = WatchDog(self) self.update_helper = UpdateHelper(self) self.translation_manager = TranslationManager(self.logger) self.rcon_manager = RconManager(self) self.server_handler_manager = ServerHandlerManager(self) self.reactor_manager = InfoReactorManager(self) self.command_manager = CommandManager(self) self.plugin_manager = PluginManager(self) # --- Input arguments "generate_default_only" processing --- # if generate_default_only: self.config.save_default() self.permission_manager.save_default() return # --- Initialize fields instance --- # self.translation_manager.load_translations( ) # translations are used for logging, so load them first if initialize_environment: # Prepare config / permission files if they're missing if not self.config.file_presents(): self.config.save_default() default_config = self.config.get_default_yaml() file_util.touch_directory(default_config['working_directory'] ) # create server/ folder if not self.permission_manager.file_presents(): self.permission_manager.save_default() # Check if there's any file missing # If there's any, MCDR environment might not be probably setup file_missing = False try: # loads config, language, handlers # config change will lead to creating plugin folders self.load_config(allowed_missing_file=False, echo=not initialize_environment) except FileNotFoundError: self.logger.error('Configure is missing') file_missing = True try: self.permission_manager.load_permission_file( allowed_missing_file=False) except FileNotFoundError: self.logger.error('Permission file is missing') file_missing = True if file_missing: self.on_file_missing() return # MCDR environment has been setup, so continue creating default folders and loading stuffs self.logger.set_file( core_constant.LOGGING_FILE) # will create logs/ folder self.plugin_manager.touch_directory() # will create config/ folder # --- Done --- # self.set_mcdr_state(MCDReforgedState.INITIALIZED)