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"