diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e353a321f8dcb5b3b3361c5be5c75c70847eed4..ef6fdf998d163645e3707a85a29780a1a6a64527 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

diff --git a/app/classes/helpers/file_helpers.py b/app/classes/helpers/file_helpers.py index f855792dd819afb9997ff4a299c1c5f428625a36..06ea5f0f4aeea708dc0bf38b710ddcf1761b957c 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 876d71110235cf110f1d5251cb01006c097c80fc..ffa8ffdcfcf9a5049a4c24ef64ae4ea21e5b6496 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,40 @@ 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)) + 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) + if error: + for user in server_users: + WebSocketManager().broadcast_user( + user, + "send_start_error", + self.helper.translation.translate( + "notify", "restoreFailed", HelperUsers.get_user_lang_by_id(user) + ), + ) + else: + for user in server_users: + WebSocketManager().broadcast_user( + user, + "notification", + self.helper.translation.translate( + "notify", + "restoreSuccess", + HelperUsers.get_user_lang_by_id(user), + ), + ) def backup_starter(self, backup_config, server): """Notify users of backup starting, and start the backup. diff --git a/app/translations/en_EN.json b/app/translations/en_EN.json index 3e65cc6029170b839f6daa952e131223ac2feee5..6c29f479a33579dd17fc3de81d0cacce2732878f 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"