diff --git a/app/classes/controllers/servers_controller.py b/app/classes/controllers/servers_controller.py index 650a16b0..b125590e 100644 --- a/app/classes/controllers/servers_controller.py +++ b/app/classes/controllers/servers_controller.py @@ -108,19 +108,19 @@ class ServersController(metaclass=Singleton): return ret @staticmethod - def set_download(server_id): + def set_import(server_id): srv = ServersController().get_server_instance_by_id(server_id) - return srv.stats_helper.set_download() + return srv.stats_helper.set_import() @staticmethod - def finish_download(server_id): + def finish_import(server_id): srv = ServersController().get_server_instance_by_id(server_id) - return srv.stats_helper.finish_download() + return srv.stats_helper.finish_import() @staticmethod - def get_download_status(server_id): + def get_import_status(server_id): server = ServersController().get_server_instance_by_id(server_id) - return server.stats_helper.get_download_status() + return server.stats_helper.get_import_status() def remove_server(self, server_id): roles_list = PermissionsServers.get_roles_from_server(server_id) diff --git a/app/classes/minecraft/serverjars.py b/app/classes/minecraft/serverjars.py index a5eb11ba..90b49236 100644 --- a/app/classes/minecraft/serverjars.py +++ b/app/classes/minecraft/serverjars.py @@ -175,7 +175,7 @@ class ServerJars: # we submit a db update for it's stats. while True: try: - ServersController.set_download(server_id) + ServersController.set_import(server_id) for user in server_users: self.helper.websocket_helper.broadcast_user( user, "send_start_reload", {} diff --git a/app/classes/models/server_stats.py b/app/classes/models/server_stats.py index e3c943e3..906eed8b 100644 --- a/app/classes/models/server_stats.py +++ b/app/classes/models/server_stats.py @@ -53,7 +53,7 @@ class ServerStats(Model): waiting_start = BooleanField(default=False) first_run = BooleanField(default=True) crashed = BooleanField(default=False) - downloading = BooleanField(default=False) + importing = BooleanField(default=False) class Meta: table_name = "server_stats" @@ -207,26 +207,26 @@ class HelperServerStats: ServerStats.server_id == self.server_id ).execute(self.database) - def set_download(self): + def set_import(self): # self.select_database(self.server_id) - ServerStats.update(downloading=True).where( + ServerStats.update(importing=True).where( ServerStats.server_id == self.server_id ).execute(self.database) - def finish_download(self): + def finish_import(self): # self.select_database(self.server_id) - ServerStats.update(downloading=False).where( + ServerStats.update(importing=False).where( ServerStats.server_id == self.server_id ).execute(self.database) - def get_download_status(self): + def get_import_status(self): # self.select_database(self.server_id) - download_status = ( + import_status = ( ServerStats.select() .where(ServerStats.server_id == self.server_id) .get(self.database) ) - return download_status.downloading + return import_status.importing def server_crash_reset(self): if self.server_id is None: @@ -249,7 +249,6 @@ class HelperServerStats: def set_update(self, value): if self.server_id is None: return - # self.select_database(self.server_id) try: # Checks if server even exists diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index bca24fe8..2332355c 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -5,6 +5,7 @@ import platform import shutil import time import logging +import threading from peewee import DoesNotExist # TZLocal is set as a hidden import on win pipeline @@ -16,6 +17,7 @@ from app.classes.models.server_permissions import EnumPermissionsServer from app.classes.shared.main_models import DatabaseShortcuts from app.classes.models.users import HelperUsers from app.classes.models.roles import HelperRoles +from app.classes.models.server_permissions import PermissionsServers from app.classes.models.management import HelpersManagement from app.classes.models.servers import HelperServers from app.classes.controllers.crafty_perms_controller import CraftyPermsController @@ -537,25 +539,6 @@ class Controller: Helpers.ensure_dir_exists(new_server_dir) Helpers.ensure_dir_exists(backup_path) server_path = Helpers.get_os_understandable_path(server_path) - try: - FileHelpers.copy_dir(server_path, new_server_dir, True) - except shutil.Error as ex: - logger.error(f"Server import failed with error: {ex}") - - has_properties = False - for item in os.listdir(new_server_dir): - if str(item) == "server.properties": - has_properties = True - if not has_properties: - logger.info( - f"No server.properties found on zip file import. " - f"Creating one with port selection of {str(port)}" - ) - with open( - os.path.join(new_server_dir, "server.properties"), "w", encoding="utf-8" - ) as file: - file.write(f"server-port={port}") - file.close() full_jar_path = os.path.join(new_server_dir, server_jar) @@ -586,8 +569,41 @@ class Controller: port, server_type="minecraft-java", ) + import_thread = threading.Thread( + name=f"server_import-{server_id}", + target=self.import_threaded_jar_server, + daemon=True, + args=(server_path, new_server_dir, port, new_id), + ) + self.servers.set_import(new_id) + import_thread.start() return new_id + def import_threaded_jar_server(self, server_path, new_server_dir, port, new_id): + try: + FileHelpers.copy_dir(server_path, new_server_dir, True) + except shutil.Error as ex: + logger.error(f"Server import failed with error: {ex}") + + has_properties = False + for item in os.listdir(new_server_dir): + if str(item) == "server.properties": + has_properties = True + if not has_properties: + logger.info( + f"No server.properties found on zip file import. " + f"Creating one with port selection of {str(port)}" + ) + with open( + os.path.join(new_server_dir, "server.properties"), "w", encoding="utf-8" + ) as file: + file.write(f"server-port={port}") + file.close() + self.servers.finish_import(new_id) + server_users = PermissionsServers.get_server_user_list(new_id) + for user in server_users: + self.helper.websocket_helper.broadcast_user(user, "send_start_reload", {}) + def import_zip_server( self, server_name: str, diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 499a0080..e0e0552f 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -293,7 +293,7 @@ class ServerInstance: else: user_lang = HelperUsers.get_user_lang_by_id(user_id) - if self.stats_helper.get_download_status(): + if self.stats_helper.get_import_status(): if user_id: self.helper.websocket_helper.broadcast_user( user_id, diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index a5e56029..5e2c495d 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -453,8 +453,8 @@ class PanelHandler(BaseHandler): for server in un_used_servers[:]: if flag == 0: server["stats"][ - "downloading" - ] = self.controller.servers.get_download_status( + "importing" + ] = self.controller.servers.get_import_status( str(server["stats"]["server_id"]["server_id"]) ) server["stats"]["crashed"] = self.controller.servers.is_crashed( @@ -571,11 +571,11 @@ class PanelHandler(BaseHandler): "started": "False", } if not self.failed_server: - page_data["downloading"] = self.controller.servers.get_download_status( + page_data["importing"] = self.controller.servers.get_import_status( server_id ) else: - page_data["downloading"] = False + page_data["importing"] = False page_data["server_id"] = server_id try: page_data["waiting_start"] = self.controller.servers.get_waiting_start( diff --git a/app/frontend/templates/panel/dashboard.html b/app/frontend/templates/panel/dashboard.html index ec5a21db..59805ddf 100644 --- a/app/frontend/templates/panel/dashboard.html +++ b/app/frontend/templates/panel/dashboard.html @@ -399,12 +399,12 @@ data['lang']) }} - {% elif server['stats']['downloading']%} + {% elif server['stats']['importing']%}