From f74194f0e523586d7d8e580b8a2dd5fe110bfcd7 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 26 Sep 2023 21:07:56 -0400 Subject: [PATCH 1/4] Fix backups status not showing up --- app/classes/shared/server.py | 8 --- .../templates/panel/server_backup.html | 51 ++++++++++--------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 8205bd8a..2f62dc68 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1047,13 +1047,6 @@ class ServerInstance: logger.info(f"Backup Thread started for server {self.settings['server_name']}.") def a_backup_server(self): - if len(WebSocketManager().clients) > 0: - WebSocketManager().broadcast_page_params( - "/panel/server_detail", - {"id": str(self.server_id)}, - "backup_reload", - {"percent": 0, "total_files": 0}, - ) was_server_running = None logger.info(f"Starting server {self.name} (ID {self.server_id}) backup") server_users = PermissionsServers.get_server_user_list(self.server_id) @@ -1566,7 +1559,6 @@ class ServerInstance: # process stats p_stats = Stats._try_get_process_stats(self.process, self.check_running()) - internal_ip = server["server_ip"] server_port = server["server_port"] server_name = server.get("server_name", f"ID#{server_id}") diff --git a/app/frontend/templates/panel/server_backup.html b/app/frontend/templates/panel/server_backup.html index d8bdea51..d79e710e 100644 --- a/app/frontend/templates/panel/server_backup.html +++ b/app/frontend/templates/panel/server_backup.html @@ -44,25 +44,25 @@


-
- {% if data['backing_up'] %} -
-
{{ - data['backup_stats']['percent'] }}%
-
-

Backing up {{data['server_stats']['world_size']}}

- {% end %} + {% if data['backing_up'] %} +
+
{{ + data['backup_stats']['percent'] }}%
+
+

Backing up {{data['server_stats']['world_size']}}

+ {% end %} -
- {% if not data['backing_up'] %} -
- -
- {% end %} +
+ {% if not data['backing_up'] %} +
+ +
+ {% end %} +
{% if data['super_user'] %}
+

Backing up {{data['server_stats']['world_size']}}

`); } else { bootbox.alert({ From 6c396fdf11ed5defb81741fd3dae8583bacbaa27 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 26 Sep 2023 21:08:11 -0400 Subject: [PATCH 2/4] Fix backup restore --- app/classes/shared/main_controller.py | 63 +++++++- app/classes/shared/tasks.py | 2 +- .../servers/server/backups/backup/index.py | 140 +++++++++--------- 3 files changed, 137 insertions(+), 68 deletions(-) diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index 4100b21e..541e45ad 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -594,6 +594,66 @@ class Controller: return False return True + def restore_java_zip_server( + self, + server_name: str, + zip_path: str, + server_jar: str, + min_mem: int, + max_mem: int, + port: int, + user_id: int, + ): + server_id = Helpers.create_uuid() + new_server_dir = os.path.join(self.helper.servers_dir, server_id) + backup_path = os.path.join(self.helper.backup_path, server_id) + if Helpers.is_os_windows(): + new_server_dir = Helpers.wtol_path(new_server_dir) + backup_path = Helpers.wtol_path(backup_path) + new_server_dir.replace(" ", "^ ") + backup_path.replace(" ", "^ ") + + temp_dir = Helpers.get_os_understandable_path(zip_path) + Helpers.ensure_dir_exists(new_server_dir) + Helpers.ensure_dir_exists(backup_path) + + full_jar_path = os.path.join(new_server_dir, server_jar) + + if Helpers.is_os_windows(): + server_command = ( + f"java -Xms{Helpers.float_to_string(min_mem)}M " + f"-Xmx{Helpers.float_to_string(max_mem)}M " + f'-jar "{full_jar_path}" nogui' + ) + else: + server_command = ( + f"java -Xms{Helpers.float_to_string(min_mem)}M " + f"-Xmx{Helpers.float_to_string(max_mem)}M " + f"-jar {full_jar_path} nogui" + ) + logger.debug("command: " + server_command) + server_log_file = "./logs/latest.log" + server_stop = "stop" + + new_id = self.register_server( + server_name, + server_id, + new_server_dir, + backup_path, + server_command, + server_jar, + server_log_file, + server_stop, + port, + user_id, + server_type="minecraft-java", + ) + ServersController.set_import(new_id) + self.import_helper.import_java_zip_server( + temp_dir, new_server_dir, port, new_id + ) + return new_id + # ********************************************************************************** # BEDROCK IMPORTS # ********************************************************************************** @@ -691,7 +751,7 @@ class Controller: self.import_helper.download_bedrock_server(new_server_dir, new_id) return new_id - def import_bedrock_zip_server( + def restore_bedrock_zip_server( self, server_name: str, zip_path: str, @@ -836,6 +896,7 @@ class Controller: srv_obj = server["server_obj"] srv_obj.server_scheduler.shutdown() + srv_obj.dir_scheduler.shutdown() running = srv_obj.check_running() if running: diff --git a/app/classes/shared/tasks.py b/app/classes/shared/tasks.py index 28e932be..c89be9d8 100644 --- a/app/classes/shared/tasks.py +++ b/app/classes/shared/tasks.py @@ -102,7 +102,7 @@ class TasksManager: ) except: logger.error( - "Server value requested does not exist! " + f"Server value {cmd['server_id']} requested does not exist! " "Purging item from waiting commands." ) continue diff --git a/app/classes/web/routes/api/servers/server/backups/backup/index.py b/app/classes/web/routes/api/servers/server/backups/backup/index.py index 20a9ded0..25329000 100644 --- a/app/classes/web/routes/api/servers/server/backups/backup/index.py +++ b/app/classes/web/routes/api/servers/server/backups/backup/index.py @@ -121,11 +121,11 @@ class ApiServersServerBackupsBackupIndexHandler(BaseApiHandler): server_data = self.controller.servers.get_server_data_by_id(server_id) zip_name = data["filename"] # import the server again based on zipfile - if server_data["type"] == "minecraft-java": - backup_path = svr_obj.backup_path - if Helpers.validate_traversal(backup_path, zip_name): - temp_dir = Helpers.unzip_backup_archive(backup_path, zip_name) - new_server = self.controller.import_zip_server( + backup_path = svr_obj.backup_path + if Helpers.validate_traversal(backup_path, zip_name): + temp_dir = Helpers.unzip_backup_archive(backup_path, zip_name) + if server_data["type"] == "minecraft-java": + new_server = self.controller.restore_java_zip_server( svr_obj.server_name, temp_dir, server_data["executable"], @@ -134,71 +134,79 @@ class ApiServersServerBackupsBackupIndexHandler(BaseApiHandler): server_data["server_port"], server_data["created_by"], ) - new_server_id = new_server - new_server = self.controller.servers.get_server_data(new_server) - self.controller.rename_backup_dir( - server_id, new_server_id, new_server["server_uuid"] + elif server_data["type"] == "minecraft-bedrock": + new_server = self.controller.restore_bedrock_zip_server( + svr_obj.server_name, + temp_dir, + server_data["executable"], + server_data["server_port"], + server_data["created_by"], ) - # preserve current schedules - for schedule in self.controller.management.get_schedules_by_server( - server_id - ): - self.tasks_manager.update_job( - schedule.schedule_id, {"server_id": new_server_id} - ) - # preserve execution command - new_server_obj = self.controller.servers.get_server_obj( - new_server_id + new_server_id = new_server + new_server = self.controller.servers.get_server_data(new_server) + self.controller.rename_backup_dir( + server_id, new_server_id, new_server["server_uuid"] + ) + # preserve current schedules + for schedule in self.controller.management.get_schedules_by_server( + server_id + ): + job_data = self.controller.management.get_scheduled_task( + schedule.schedule_id ) - new_server_obj.execution_command = server_data["execution_command"] - # reset executable path - if svr_obj.path in svr_obj.executable: - new_server_obj.executable = str(svr_obj.executable).replace( - svr_obj.path, new_server_obj.path - ) - # reset run command path - if svr_obj.path in svr_obj.execution_command: - new_server_obj.execution_command = str( - svr_obj.execution_command - ).replace(svr_obj.path, new_server_obj.path) - # reset log path - if svr_obj.path in svr_obj.log_path: - new_server_obj.log_path = str(svr_obj.log_path).replace( - svr_obj.path, new_server_obj.path - ) - self.controller.servers.update_server(new_server_obj) + job_data["server_id"] = new_server_id + del job_data["schedule_id"] + print(job_data) + self.tasks_manager.update_job(schedule.schedule_id, job_data) + # preserve execution command + new_server_obj = self.controller.servers.get_server_obj(new_server_id) + new_server_obj.execution_command = server_data["execution_command"] + # reset executable path + if svr_obj.path in svr_obj.executable: + new_server_obj.executable = str(svr_obj.executable).replace( + svr_obj.path, new_server_obj.path + ) + # reset run command path + if svr_obj.path in svr_obj.execution_command: + new_server_obj.execution_command = str( + svr_obj.execution_command + ).replace(svr_obj.path, new_server_obj.path) + # reset log path + if svr_obj.path in svr_obj.log_path: + new_server_obj.log_path = str(svr_obj.log_path).replace( + svr_obj.path, new_server_obj.path + ) + self.controller.servers.update_server(new_server_obj) - # preserve backup config - backup_config = self.controller.management.get_backup_config( - server_id - ) - excluded_dirs = [] - server_obj = self.controller.servers.get_server_obj(server_id) - loop_backup_path = self.helper.wtol_path(server_obj.path) - for item in self.controller.management.get_excluded_backup_dirs( - server_id - ): - item_path = self.helper.wtol_path(item) - bu_path = os.path.relpath(item_path, loop_backup_path) - bu_path = os.path.join(new_server_obj.path, bu_path) - excluded_dirs.append(bu_path) - self.controller.management.set_backup_config( - new_server_id, - new_server_obj.backup_path, - backup_config["max_backups"], - excluded_dirs, - backup_config["compress"], - backup_config["shutdown"], - ) - # remove old server's tasks - try: - self.tasks_manager.remove_all_server_tasks(server_id) - except JobLookupError as e: - logger.info("No active tasks found for server: {e}") - self.controller.remove_server(server_id, True) - except Exception: + # preserve backup config + backup_config = self.controller.management.get_backup_config(server_id) + excluded_dirs = [] + server_obj = self.controller.servers.get_server_obj(server_id) + loop_backup_path = self.helper.wtol_path(server_obj.path) + for item in self.controller.management.get_excluded_backup_dirs( + server_id + ): + item_path = self.helper.wtol_path(item) + bu_path = os.path.relpath(item_path, loop_backup_path) + bu_path = os.path.join(new_server_obj.path, bu_path) + excluded_dirs.append(bu_path) + self.controller.management.set_backup_config( + new_server_id, + new_server_obj.backup_path, + backup_config["max_backups"], + excluded_dirs, + backup_config["compress"], + backup_config["shutdown"], + ) + # remove old server's tasks + try: + self.tasks_manager.remove_all_server_tasks(server_id) + except JobLookupError as e: + logger.info("No active tasks found for server: {e}") + self.controller.remove_server(server_id, True) + except Exception as e: return self.finish_json( - 400, {"status": "error", "error": "NO BACKUP FOUND"} + 400, {"status": "error", "error": f"NO BACKUP FOUND {e}"} ) self.controller.management.add_to_audit_log( auth_data[4]["user_id"], From 6af4f7b19659da1be0667bff8fcd7003f1023a95 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 27 Sep 2023 16:13:02 -0400 Subject: [PATCH 3/4] Remove print statement --- .../web/routes/api/servers/server/backups/backup/index.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/classes/web/routes/api/servers/server/backups/backup/index.py b/app/classes/web/routes/api/servers/server/backups/backup/index.py index 25329000..b92e1e9f 100644 --- a/app/classes/web/routes/api/servers/server/backups/backup/index.py +++ b/app/classes/web/routes/api/servers/server/backups/backup/index.py @@ -156,7 +156,6 @@ class ApiServersServerBackupsBackupIndexHandler(BaseApiHandler): ) job_data["server_id"] = new_server_id del job_data["schedule_id"] - print(job_data) self.tasks_manager.update_job(schedule.schedule_id, job_data) # preserve execution command new_server_obj = self.controller.servers.get_server_obj(new_server_id) From 449523b3daadd26f4a6546973fba777095958339 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Wed, 27 Sep 2023 21:42:46 +0100 Subject: [PATCH 4/4] Update changelog !634 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ad5a697..266ec6bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Fix select installs failing to start, returning missing python package `packaging` ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/629)) - Fix public status page not updating #255 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/615)) - Fix service worker vulrn and CQ raised by SonarQ ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/631)) +- Fix Backup Restore/Schedules, Backup button function on `remote-comms2` ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/634)) ### Refactor - Consolidate remaining frontend functions into API V2, and remove ajax internal API ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/585)) - Replace bleach with nh3 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/628))