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 @@