From cd475e0cf59c9587dbda49a8c5844172d9d97249 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 1 Mar 2023 13:04:51 -0500 Subject: [PATCH 01/37] Use API to send remote commands to server --- app/classes/web/ajax_handler.py | 63 +------------------ app/frontend/templates/panel/dashboard.html | 49 ++++----------- .../templates/panel/server_backup.html | 2 +- 3 files changed, 14 insertions(+), 100 deletions(-) diff --git a/app/classes/web/ajax_handler.py b/app/classes/web/ajax_handler.py index cd1ccc04..3887a00b 100644 --- a/app/classes/web/ajax_handler.py +++ b/app/classes/web/ajax_handler.py @@ -281,73 +281,12 @@ class AjaxHandler(BaseHandler): exec_user["user_id"], server_id ) - if page == "send_command": - command = self.get_body_argument("command", default=None, strip=True) - server_id = self.get_argument("id", None) - - if server_id is None: - logger.warning("Server ID not found in send_command ajax call") - Console.warning("Server ID not found in send_command ajax call") - - srv_obj = self.controller.servers.get_server_instance_by_id(server_id) - - if command == srv_obj.settings["stop_command"]: - logger.info( - "Stop command detected as terminal input - intercepting." - + f"Starting Crafty's stop process for server with id: {server_id}" - ) - self.controller.management.send_command( - exec_user["user_id"], server_id, self.get_remote_ip(), "stop_server" - ) - command = None - elif command == "restart": - logger.info( - "Restart command detected as terminal input - intercepting." - + f"Starting Crafty's stop process for server with id: {server_id}" - ) - self.controller.management.send_command( - exec_user["user_id"], - server_id, - self.get_remote_ip(), - "restart_server", - ) - command = None - if command: - if srv_obj.check_running(): - srv_obj.send_command(command) - - self.controller.management.add_to_audit_log( - exec_user["user_id"], - f"Sent command to " - f"{self.controller.servers.get_server_friendly_name(server_id)} " - f"terminal: {command}", - server_id, - self.get_remote_ip(), - ) - - elif page == "send_order": + if page == "send_order": self.controller.users.update_server_order( exec_user["user_id"], bleach.clean(self.get_argument("order")) ) return - elif page == "backup_now": - server_id = self.get_argument("id", None) - if server_id is None: - logger.error("Server ID is none. Canceling backup!") - return - - server = self.controller.servers.get_server_instance_by_id(server_id) - self.controller.management.add_to_audit_log_raw( - self.controller.users.get_user_by_id(exec_user["user_id"])["username"], - exec_user["user_id"], - server_id, - f"Backup now executed for server {server_id} ", - source_ip=self.get_remote_ip(), - ) - - server.backup_server() - elif page == "select_photo": if exec_user["superuser"]: photo = urllib.parse.unquote(self.get_argument("photo", "")) diff --git a/app/frontend/templates/panel/dashboard.html b/app/frontend/templates/panel/dashboard.html index 981a4163..a1c25231 100644 --- a/app/frontend/templates/panel/dashboard.html +++ b/app/frontend/templates/panel/dashboard.html @@ -645,10 +645,13 @@ $.ajax({ type: "POST", headers: { 'X-XSRFToken': token }, - url: '/server/command?command=' + command + '&id=' + server_id, + url: `/api/v2/servers/${server_id}/action/${command}`, success: function (data) { console.log("got response:"); console.log(data); + if (command === "clone_server" && data.status === "ok") { + window.location.reload(); + } /*setTimeout(function () { if (command != 'start_server') { location.reload(); @@ -703,24 +706,6 @@ document.querySelector('.dynamicMsg').appendChild(parentEl); } - function send_kill(server_id) { - /* this getCookie function is in base.html */ - const token = getCookie("_xsrf"); - - $.ajax({ - type: "POST", - headers: { 'X-XSRFToken': token }, - url: '/ajax/kill?id=' + server_id, - success: function (data) { - console.log("got response:"); - console.log(data); - /*setTimeout(function () { - location.reload(); - }, 10000);*/ - } - }); - } - function update_one_server_status(server) { /* Mobile view update */ server_cpu = document.getElementById('server_cpu_' + server.id); @@ -899,17 +884,11 @@ }, callback: function (result) { if (result) { - send_kill(server_id); + send_command(server_id, "kill_server"); let dialog = bootbox.dialog({ title: '{% raw translate("dashboard", "killing", data["lang"]) %}', message: '

Loading...

' }); - - dialog.init(function () { - setTimeout(function () { - location.reload(); - }, 15000); - }); } } }); @@ -998,7 +977,13 @@ }, callback: function (result) { if (result) { - cloneServer(server_id); + send_command(server_id, 'clone_server'); + bootbox.dialog({ + backdrop: true, + title: '{% raw translate("dashboard", "sendingCommand", data["lang"]) %}', + message: '
  {% raw translate("dashboard", "bePatientClone", data["lang"]) %}
', + closeButton: false, + }); } } @@ -1006,16 +991,6 @@ }); }); - - function cloneServer(server_id) { - send_command(server_id, 'clone_server'); - bootbox.dialog({ - backdrop: true, - title: '{% raw translate("dashboard", "sendingCommand", data["lang"]) %}', - message: '
  {% raw translate("dashboard", "bePatientClone", data["lang"]) %}
', - closeButton: false, - }); - } diff --git a/app/frontend/templates/panel/server_backup.html b/app/frontend/templates/panel/server_backup.html index ab9b4f2e..1cb8f087 100644 --- a/app/frontend/templates/panel/server_backup.html +++ b/app/frontend/templates/panel/server_backup.html @@ -326,7 +326,7 @@ $.ajax({ type: "POST", headers: { 'X-XSRFToken': token }, - url: '/ajax/backup_now?id=' + server_id, + url: `/api/v2/servers/${server_id}/action/backup_server`, success: function (data) { return; }, From c0bca38319d54503859803b8af956ce3fa8c27c5 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 1 Mar 2023 13:27:06 -0500 Subject: [PATCH 02/37] Cleanup ajax a bit more --- app/classes/web/ajax_handler.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/app/classes/web/ajax_handler.py b/app/classes/web/ajax_handler.py index 3887a00b..fd8ffe4b 100644 --- a/app/classes/web/ajax_handler.py +++ b/app/classes/web/ajax_handler.py @@ -321,23 +321,6 @@ class AjaxHandler(BaseHandler): self.controller.cached_login = "login_1.jpg" return - elif page == "kill": - if not permissions["Commands"] in user_perms: - if not superuser: - self.redirect("/panel/error?error=Unauthorized access to Commands") - return - server_id = self.get_argument("id", None) - svr = self.controller.servers.get_server_instance_by_id(server_id) - try: - svr.kill() - time.sleep(5) - svr.cleanup_server_object() - svr.record_server_stats() - except Exception as e: - logger.error( - f"Could not find PID for requested termsig. Full error: {e}" - ) - return elif page == "eula": server_id = self.get_argument("id", None) svr = self.controller.servers.get_server_instance_by_id(server_id) From 1b6c7dd4787e1e4f88f91a35167b56d3aed65313 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 1 Mar 2023 13:30:21 -0500 Subject: [PATCH 03/37] Edit panel config for API --- app/frontend/templates/panel/server_config.html | 8 ++++---- app/frontend/templates/panel/server_term.html | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/frontend/templates/panel/server_config.html b/app/frontend/templates/panel/server_config.html index ed5186f9..500322ec 100644 --- a/app/frontend/templates/panel/server_config.html +++ b/app/frontend/templates/panel/server_config.html @@ -359,7 +359,7 @@ $.ajax({ type: "DELETE", headers: { 'X-XSRFToken': token }, - url: '/ajax/delete_server?id=' + serverId, + url: `/api/v2/servers/${serverId}`, data: { }, success: function (data) { @@ -373,7 +373,7 @@ $.ajax({ type: "DELETE", headers: { 'X-XSRFToken': token }, - url: '/ajax/delete_server_files?id=' + serverId, + url: `/api/v2/servers/${serverId}?files=true`, data: { }, success: function (data) { @@ -393,7 +393,7 @@ $.ajax({ type: "POST", headers: { 'X-XSRFToken': token }, - url: '/server/command?command=' + command + '&id=' + serverId, + url: `/api/v2/servers/${serverId}/action/${command}`, success: function (data) { console.log("got response:"); console.log(data); @@ -522,7 +522,7 @@ $.ajax({ type: "DELETE", headers: { 'X-XSRFToken': token }, - url: '/ajax/delete_unloaded_server?id=' + serverId, + url: `/api/v2/servers/${serverId}`, data: { }, success: function (data) { diff --git a/app/frontend/templates/panel/server_term.html b/app/frontend/templates/panel/server_term.html index 54ac127a..965d14ab 100644 --- a/app/frontend/templates/panel/server_term.html +++ b/app/frontend/templates/panel/server_term.html @@ -179,7 +179,7 @@ $.ajax({ type: "POST", headers: { 'X-XSRFToken': token }, - url: '/server/command?command=' + command + '&id=' + serverId, + url: `/api/v2/servers/${serverId}/action/${command}`, success: function (data) { console.log("got response:"); console.log(data); From c51d94023442cd389104b104318ca5f792e39996 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 1 Mar 2023 14:38:14 -0500 Subject: [PATCH 04/37] Allow unloaded servers to be deleted API --- app/classes/web/routes/api/servers/server/index.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/classes/web/routes/api/servers/server/index.py b/app/classes/web/routes/api/servers/server/index.py index 3d5e3e2f..1d68b2e8 100644 --- a/app/classes/web/routes/api/servers/server/index.py +++ b/app/classes/web/routes/api/servers/server/index.py @@ -134,7 +134,15 @@ class ApiServersServerIndexHandler(BaseApiHandler): ) self.tasks_manager.remove_all_server_tasks(server_id) - self.controller.remove_server(server_id, remove_files) + failed = False + for item in self.controller.servers.failed_servers[:]: + if item["server_id"] == int(server_id): + self.controller.servers.failed_servers.remove(item) + + if failed: + self.controller.remove_unloaded_server(server_id) + else: + self.controller.remove_server(server_id, remove_files) self.controller.management.add_to_audit_log( auth_data[4]["user_id"], From ec1076fbce753f39e97e72310ff92914d284ae2a Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 1 Mar 2023 14:40:02 -0500 Subject: [PATCH 05/37] Cleanup ajax handler --- app/classes/web/ajax_handler.py | 78 --------------------------------- 1 file changed, 78 deletions(-) diff --git a/app/classes/web/ajax_handler.py b/app/classes/web/ajax_handler.py index fd8ffe4b..750badd3 100644 --- a/app/classes/web/ajax_handler.py +++ b/app/classes/web/ajax_handler.py @@ -590,84 +590,6 @@ class AjaxHandler(BaseHandler): ): os.remove(file_path) - elif page == "delete_server": - if not permissions["Config"] in user_perms: - if not superuser: - self.redirect("/panel/error?error=Unauthorized access to Config") - return - server_id = self.get_argument("id", None) - logger.info( - f"Removing server from panel for server: " - f"{self.controller.servers.get_server_friendly_name(server_id)}" - ) - - server_data = self.controller.servers.get_server_data(server_id) - server_name = server_data["server_name"] - - self.controller.management.add_to_audit_log( - exec_user["user_id"], - f"Deleted server {server_id} named {server_name}", - server_id, - self.get_remote_ip(), - ) - - self.tasks_manager.remove_all_server_tasks(server_id) - self.controller.remove_server(server_id, False) - - elif page == "delete_server_files": - if not permissions["Config"] in user_perms: - if not superuser: - self.redirect("/panel/error?error=Unauthorized access to Config") - return - server_id = self.get_argument("id", None) - logger.info( - f"Removing server and all associated files for server: " - f"{self.controller.servers.get_server_friendly_name(server_id)}" - ) - - server_data = self.controller.servers.get_server_data(server_id) - server_name = server_data["server_name"] - - self.controller.management.add_to_audit_log( - exec_user["user_id"], - f"Deleted server {server_id} named {server_name}", - server_id, - self.get_remote_ip(), - ) - - for server in self.controller.servers.failed_servers: - if server["server_id"] == int(server_id): - return - self.tasks_manager.remove_all_server_tasks(server_id) - self.controller.remove_server(server_id, True) - - elif page == "delete_unloaded_server": - if not permissions["Config"] in user_perms: - if not superuser: - self.redirect("/panel/error?error=Unauthorized access to Config") - return - server_id = self.get_argument("id", None) - logger.info( - f"Removing server and all associated files for server: " - f"{self.controller.servers.get_server_friendly_name(server_id)}" - ) - - server_data = self.controller.servers.get_server_data_by_id(server_id) - server_name = server_data["server_name"] - - self.controller.management.add_to_audit_log( - exec_user["user_id"], - f"Deleted server {server_id} named {server_name}", - server_id, - self.get_remote_ip(), - ) - - self.tasks_manager.remove_all_server_tasks(server_id) - for item in self.controller.servers.failed_servers[:]: - if item["server_id"] == int(server_id): - self.controller.servers.failed_servers.remove(item) - self.controller.remove_unloaded_server(server_id) - def check_server_id(self, server_id, page_name): if server_id is None: logger.warning( From c0381da880a3da0963d1f5b4266bdd2c39853223 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 1 Mar 2023 14:59:30 -0500 Subject: [PATCH 06/37] Fix bug with unloaded server delete --- app/classes/web/routes/api/servers/server/index.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/classes/web/routes/api/servers/server/index.py b/app/classes/web/routes/api/servers/server/index.py index 1d68b2e8..a3623beb 100644 --- a/app/classes/web/routes/api/servers/server/index.py +++ b/app/classes/web/routes/api/servers/server/index.py @@ -138,6 +138,7 @@ class ApiServersServerIndexHandler(BaseApiHandler): for item in self.controller.servers.failed_servers[:]: if item["server_id"] == int(server_id): self.controller.servers.failed_servers.remove(item) + failed = True if failed: self.controller.remove_unloaded_server(server_id) From d473a6ccf408feba499ff8fc0482e8ec98f29c17 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 1 Mar 2023 15:25:28 -0500 Subject: [PATCH 07/37] Add server order to api call --- app/classes/controllers/users_controller.py | 1 + app/frontend/templates/panel/dashboard.html | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/classes/controllers/users_controller.py b/app/classes/controllers/users_controller.py index b9c019e8..667e01b4 100644 --- a/app/classes/controllers/users_controller.py +++ b/app/classes/controllers/users_controller.py @@ -89,6 +89,7 @@ class UsersController: }, }, "hints": {"type": "boolean"}, + "server_order": {"type": "string"}, } # ********************************************************************************** diff --git a/app/frontend/templates/panel/dashboard.html b/app/frontend/templates/panel/dashboard.html index a1c25231..f781cf7a 100644 --- a/app/frontend/templates/panel/dashboard.html +++ b/app/frontend/templates/panel/dashboard.html @@ -1042,12 +1042,12 @@ const token = getCookie("_xsrf") $.ajax({ - type: "POST", + type: "PATCH", headers: { 'X-XSRFToken': token }, - url: '/ajax/send_order?order=' + id_string, - data: { - order: id_string, - }, + url: `/api/v2/users/@me`, + data: JSON.stringify({ + server_order: id_string, + }), success: function (data) { console.log("got response:"); console.log(data); From 81e4e7e450208111214c25ab77b1f7c3ca54052b Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Thu, 2 Mar 2023 13:24:07 -0500 Subject: [PATCH 08/37] Fix command sends to server --- .../panel/server_admin_controls.html | 34 +++++++++++-------- app/frontend/templates/panel/server_term.html | 4 +-- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/frontend/templates/panel/server_admin_controls.html b/app/frontend/templates/panel/server_admin_controls.html index 02e28356..ff7ef83d 100644 --- a/app/frontend/templates/panel/server_admin_controls.html +++ b/app/frontend/templates/panel/server_admin_controls.html @@ -14,7 +14,8 @@