From 1ed9f448cd15d1afa371f8904e9972d811466d38 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 12 Nov 2025 18:01:37 -0500 Subject: [PATCH 1/3] Provide better feedback on restore failures --- app/classes/helpers/file_helpers.py | 16 ++++++++++------ app/classes/shared/backup_mgr.py | 21 ++++++++++++++++++++- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/classes/helpers/file_helpers.py b/app/classes/helpers/file_helpers.py index f855792d..06ea5f0f 100644 --- a/app/classes/helpers/file_helpers.py +++ b/app/classes/helpers/file_helpers.py @@ -126,6 +126,7 @@ class FileHelpers: @staticmethod def del_dirs(path): path = pathlib.Path(path) + clean = True for sub in path.iterdir(): if sub.is_dir(): # Delete folder if it is a folder @@ -135,26 +136,29 @@ class FileHelpers: try: sub.unlink() except Exception as e: + clean = False logger.error(f"Unable to delete file {sub}: {e}") try: # This removes the top-level folder: path.rmdir() - except Exception as e: + except Exception: logger.error("Unable to remove top level") - return e - return True + return False + return clean @staticmethod def del_file(path): path = pathlib.Path(path) + clean = True try: logger.debug(f"Deleting file: {path}") # Remove the file os.remove(path) - return True - except (FileNotFoundError, PermissionError) as e: + return clean + except (FileNotFoundError, PermissionError): logger.error(f"Path specified is not a file or does not exist. {path}") - return e + clean = False + return clean def check_mime_types(self, file_path): m_type, _value = self.mime_types.guess_type(file_path) diff --git a/app/classes/shared/backup_mgr.py b/app/classes/shared/backup_mgr.py index 876d7111..7c0c67f8 100644 --- a/app/classes/shared/backup_mgr.py +++ b/app/classes/shared/backup_mgr.py @@ -45,6 +45,7 @@ class BackupManager: self, backup_config, backup_location, backup_file, svr_obj, in_place ): server_path = svr_obj.settings["path"] + error = False if Helpers.validate_traversal(backup_location, backup_file): if svr_obj.check_running(): svr_obj.stop_server() @@ -58,10 +59,28 @@ class BackupManager: os.path.isdir(os.path.join(server_path, item)) and item != "db_stats" ): - self.file_helper.del_dirs(os.path.join(server_path, item)) + result = self.file_helper.del_dirs( + os.path.join(server_path, item) + ) + if not result: + error = True else: self.file_helper.del_file(os.path.join(server_path, item)) self.file_helper.restore_archive(backup_location, server_path) + server_users = PermissionsServers.get_server_user_list(svr_obj.server_id) + time.sleep(3) + if error: + for user in server_users: + WebSocketManager().broadcast_user( + user, + "send_start_error", + "Restore failure. Could not delete existing files", + ) + else: + for user in server_users: + WebSocketManager().broadcast_user( + user, "notification", "Restore completed" + ) def backup_starter(self, backup_config, server): """Notify users of backup starting, and start the backup. -- GitLab From 85596b860ab3cb4189f112daa47d043bac4abc83 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 12 Nov 2025 18:15:50 -0500 Subject: [PATCH 2/3] Add translations to restore process --- app/classes/shared/backup_mgr.py | 18 +++++++++++++++--- app/translations/en_EN.json | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/classes/shared/backup_mgr.py b/app/classes/shared/backup_mgr.py index 7c0c67f8..ffa8ffdc 100644 --- a/app/classes/shared/backup_mgr.py +++ b/app/classes/shared/backup_mgr.py @@ -65,7 +65,11 @@ class BackupManager: if not result: error = True else: - self.file_helper.del_file(os.path.join(server_path, item)) + result = self.file_helper.del_file( + os.path.join(server_path, item) + ) + if not result: + error = True self.file_helper.restore_archive(backup_location, server_path) server_users = PermissionsServers.get_server_user_list(svr_obj.server_id) time.sleep(3) @@ -74,12 +78,20 @@ class BackupManager: WebSocketManager().broadcast_user( user, "send_start_error", - "Restore failure. Could not delete existing files", + self.helper.translation.translate( + "notify", "restoreFailed", HelperUsers.get_user_lang_by_id(user) + ), ) else: for user in server_users: WebSocketManager().broadcast_user( - user, "notification", "Restore completed" + user, + "notification", + self.helper.translation.translate( + "notify", + "restoreSuccess", + HelperUsers.get_user_lang_by_id(user), + ), ) def backup_starter(self, backup_config, server): diff --git a/app/translations/en_EN.json b/app/translations/en_EN.json index 3e65cc60..6c29f479 100644 --- a/app/translations/en_EN.json +++ b/app/translations/en_EN.json @@ -283,6 +283,8 @@ "finishedPreparing": "We've finished preparing your support logs. Please click download to download", "logout": "Logout", "preparingLogs": " Please wait while we prepare your logs... We`ll send a notification when they`re ready. This may take a while for large deployments.", + "restoreFailed": "Backup restore failed. Could not delete files from server directory.", + "restoreSuccess": "Server files restored successfully.", "schedule_desc": "We detected some or all of your scheduled tasks were not successfully transferred during the upgrade. Please confirm your schedules in the schedules tab.", "schedule_title": "Schedules Migration Warning", "supportLogs": "Support Logs" -- GitLab From c6f72ba12acce22f28d297df49194b771db09a95 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Sat, 22 Nov 2025 16:52:24 +0000 Subject: [PATCH 3/3] Update changelog !914 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e353a32..ef6fdf99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ TBD - Fix failue deleting server's DB files on server delete ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/916)) - Fix server.properties overwritten in bedrock update ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/915)) ### Tweaks -TBD +- Provide better feedback on restore failures ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/914)) ### Lang TBD

-- GitLab