diff --git a/CHANGELOG.md b/CHANGELOG.md index cc64adc8..c4a47f56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,14 @@ ### New features TBD ### Bug fixes -TBD +- Fix bug where trying to reconfigure unloaded server would stack ([Commit](https://gitlab.com/crafty-controller/crafty-4/-/commit/1b2fef06fb3b02b76c9506caf7e07e932df95fab)) +- Fix traceback error when a user click the roles config tab while already on the roles config page; **this is for new role creation only** ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/452)) +- Fix logic issue when removing items from backup exclusions ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/453)) +- Cleanup various JS errors ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/455)) +- Temp fix for `&` issue in pathing and minecraft colour codes ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/457)) ### Tweaks -TBD +- Add button to scroll to bottom of vterm ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/454)) +- Persist schedules and execution commands across backup restores ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/458)) ### Lang TBD

diff --git a/app/classes/shared/file_helpers.py b/app/classes/shared/file_helpers.py index 28edbef7..82b5a560 100644 --- a/app/classes/shared/file_helpers.py +++ b/app/classes/shared/file_helpers.py @@ -226,18 +226,24 @@ class FileHelpers: comment, "utf-8" ) # comments over 65535 bytes will be truncated for root, dirs, files in os.walk(path_to_zip, topdown=True): - for l_dir in dirs: + for l_dir in dirs[:]: + # make all paths in exclusions a unix style slash + # to match directories. if str(os.path.join(root, l_dir)).replace("\\", "/") in ex_replace: dirs.remove(l_dir) ziproot = path_to_zip + # iterate through list of files for file in files: + # check if file/dir is in exclusions list. + # Only proceed if not exluded. if ( str(os.path.join(root, file)).replace("\\", "/") not in ex_replace and file != "crafty.sqlite" ): try: - logger.info(f"backing up: {os.path.join(root, file)}") + logger.debug(f"backing up: {os.path.join(root, file)}") + # add trailing slash to zip root dir if not windows. if os.name == "nt": zip_file.write( os.path.join(root, file), @@ -254,12 +260,20 @@ class FileHelpers: f"Error backing up: {os.path.join(root, file)}!" f" - Error was: {e}" ) + # debug logging for exlusions list + else: + logger.debug(f"Found {file} in exclusion list. Skipping...") + + # add current file bytes to total bytes. total_bytes += os.path.getsize(os.path.join(root, file)) + # calcualte percentage based off total size and current archive size percent = round((total_bytes / dir_bytes) * 100, 2) + # package results results = { "percent": percent, "total_files": self.helper.human_readable_file_size(dir_bytes), } + # send status results to page. self.helper.websocket_helper.broadcast_page_params( "/panel/server_detail", {"id": str(server_id)}, diff --git a/app/classes/web/ajax_handler.py b/app/classes/web/ajax_handler.py index bd8f9424..845b2886 100644 --- a/app/classes/web/ajax_handler.py +++ b/app/classes/web/ajax_handler.py @@ -383,6 +383,8 @@ class AjaxHandler(BaseHandler): zip_name = bleach.clean(self.get_argument("zip_file", None)) svr_obj = self.controller.servers.get_server_obj(server_id) server_data = self.controller.servers.get_server_data_by_id(server_id) + + # 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): @@ -401,6 +403,27 @@ class AjaxHandler(BaseHandler): 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 + ): + self.controller.management.create_scheduled_task( + new_server_id, + schedule.action, + schedule.interval, + schedule.interval_type, + schedule.start_time, + schedule.command, + schedule.name, + schedule.enabled, + ) + # preserve execution command + new_server_obj = self.controller.servers.get_server_obj( + new_server_id + ) + new_server_obj.execution_command = server_data["execution_command"] + self.controller.servers.update_server(new_server_obj) + # remove old server's tasks try: self.tasks_manager.remove_all_server_tasks(server_id) except: @@ -424,6 +447,26 @@ class AjaxHandler(BaseHandler): 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 + ): + self.controller.management.create_scheduled_task( + new_server_id, + schedule.action, + schedule.interval, + schedule.interval_type, + schedule.start_time, + schedule.command, + schedule.name, + schedule.enabled, + ) + # preserve execution command + new_server_obj = self.controller.servers.get_server_obj( + new_server_id + ) + new_server_obj.execution_command = server_data["execution_command"] + self.controller.servers.update_server(new_server_obj) try: self.tasks_manager.remove_all_server_tasks(server_id) except: diff --git a/app/classes/web/base_handler.py b/app/classes/web/base_handler.py index b9a69c48..e772d633 100644 --- a/app/classes/web/base_handler.py +++ b/app/classes/web/base_handler.py @@ -104,7 +104,10 @@ class BaseHandler(tornado.web.RequestHandler): strip: bool = True, ) -> t.Optional[str]: arg = self._get_argument(name, default, self.request.arguments, strip) - return self.autobleach(name, arg) + bleached = self.autobleach(name, arg) + if "&" in str(bleached): + bleached = bleached.replace("&", "&") + return bleached def get_arguments(self, name: str, strip: bool = True) -> t.List[str]: if not isinstance(strip, bool): diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index 59ec0abf..cdb018ad 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -1695,7 +1695,7 @@ class PanelHandler(BaseHandler): if interval_type == "days": sch_time = bleach.clean(self.get_argument("time", None)) if action == "command": - command = bleach.clean(self.get_argument("command", None)) + command = self.get_argument("command", None) elif action == "start": command = "start_server" elif action == "stop": @@ -1711,7 +1711,7 @@ class PanelHandler(BaseHandler): delay = bleach.clean(self.get_argument("delay", None)) parent = bleach.clean(self.get_argument("parent", None)) if action == "command": - command = bleach.clean(self.get_argument("command", None)) + command = self.get_argument("command", None) elif action == "start": command = "start_server" elif action == "stop": @@ -1731,7 +1731,7 @@ class PanelHandler(BaseHandler): return action = bleach.clean(self.get_argument("action", None)) if action == "command": - command = bleach.clean(self.get_argument("command", None)) + command = self.get_argument("command", None) elif action == "start": command = "start_server" elif action == "stop": @@ -1857,7 +1857,7 @@ class PanelHandler(BaseHandler): if interval_type == "days": sch_time = bleach.clean(self.get_argument("time", None)) if action == "command": - command = bleach.clean(self.get_argument("command", None)) + command = self.get_argument("command", None) elif action == "start": command = "start_server" elif action == "stop": @@ -1872,7 +1872,7 @@ class PanelHandler(BaseHandler): delay = bleach.clean(self.get_argument("delay", None)) parent = bleach.clean(self.get_argument("parent", None)) if action == "command": - command = bleach.clean(self.get_argument("command", None)) + command = self.get_argument("command", None) elif action == "start": command = "start_server" elif action == "stop": @@ -1892,7 +1892,7 @@ class PanelHandler(BaseHandler): return action = bleach.clean(self.get_argument("action", None)) if action == "command": - command = bleach.clean(self.get_argument("command", None)) + command = self.get_argument("command", None) elif action == "start": command = "start_server" elif action == "stop": diff --git a/app/frontend/templates/base.html b/app/frontend/templates/base.html index 100ab16c..e2634486 100755 --- a/app/frontend/templates/base.html +++ b/app/frontend/templates/base.html @@ -525,10 +525,6 @@ }); }); - - $(window).unload(function () { - jQuery.get("/public/logout") - }); {% block js %} diff --git a/app/frontend/templates/panel/panel_edit_role.html b/app/frontend/templates/panel/panel_edit_role.html index 86ee953a..79751791 100644 --- a/app/frontend/templates/panel/panel_edit_role.html +++ b/app/frontend/templates/panel/panel_edit_role.html @@ -39,7 +39,7 @@