From 7f412954d717f7f4678c37d95820926651139adb Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 30 Aug 2022 17:27:19 -0400 Subject: [PATCH 01/14] Fix metrics schedule lag --- app/classes/controllers/servers_controller.py | 4 +--- app/classes/models/server_stats.py | 4 +++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/classes/controllers/servers_controller.py b/app/classes/controllers/servers_controller.py index a0948769..c9434b13 100644 --- a/app/classes/controllers/servers_controller.py +++ b/app/classes/controllers/servers_controller.py @@ -106,11 +106,9 @@ class ServersController(metaclass=Singleton): return ret def get_history_stats(self, server_id): - max_age = self.helper.get_setting("history_max_age") now = datetime.datetime.now() - minimum_to_exist = now - datetime.timedelta(days=max_age) srv = ServersController().get_server_instance_by_id(server_id) - return srv.stats_helper.get_history_stats(server_id, minimum_to_exist) + return srv.stats_helper.get_history_stats(server_id) @staticmethod def update_unloaded_server(server_obj): diff --git a/app/classes/models/server_stats.py b/app/classes/models/server_stats.py index 6e589ffc..d6c6efdc 100644 --- a/app/classes/models/server_stats.py +++ b/app/classes/models/server_stats.py @@ -1,6 +1,7 @@ import os import logging import datetime +from datetime import timedelta from app.classes.models.servers import Servers, HelperServers from app.classes.shared.helpers import Helpers @@ -137,7 +138,8 @@ class HelperServerStats: ) return server_data - def get_history_stats(self, server_id, max_age): + def get_history_stats(self, server_id): + max_age = datetime.datetime.now() - timedelta(days=1) return ( ServerStats.select() .where(ServerStats.created > max_age) From b445d085c8bcff69ff5ed49d355f2eb04166ddb7 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 31 Aug 2022 16:11:49 -0400 Subject: [PATCH 02/14] Fix no id on import3 servers --- app/classes/shared/import3.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/classes/shared/import3.py b/app/classes/shared/import3.py index 5cb2bfa6..4da9bcb8 100644 --- a/app/classes/shared/import3.py +++ b/app/classes/shared/import3.py @@ -74,6 +74,7 @@ class Import3: min_mem=(int(server["memory_min"]) / 1000), max_mem=(int(server["memory_max"]) / 1000), port=server["server_port"], + user_id=HelperUsers.get_user_id_by_name("system"), ) Console.info( f"Imported server {server['server_name']}[{server['id']}] " @@ -91,6 +92,7 @@ class Import3: min_mem=(int(json_data["memory_min"]) / 1000), max_mem=(int(json_data["memory_max"]) / 1000), port=json_data["server_port"], + user_id=HelperUsers.get_user_id_by_name("system"), ) Console.info( f"Imported server {json_data['server_name']}[{json_data['id']}] " From bd38fcd6e40c7a29c5bc5ae51ffb612432d063d5 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Wed, 31 Aug 2022 19:59:46 -0400 Subject: [PATCH 03/14] Add try/except around download --- app/classes/shared/server.py | 43 ++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index bd8d29f6..072045d9 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1115,24 +1115,33 @@ class ServerInstance: ) else: # downloads zip from remote url - bedrock_url = Helpers.get_latest_bedrock_url() - if bedrock_url.lower().startswith("https"): - urllib.request.urlretrieve( - bedrock_url, - os.path.join(self.settings["path"], "bedrock_server.zip"), + try: + bedrock_url = Helpers.get_latest_bedrock_url() + if bedrock_url.lower().startswith("https"): + urllib.request.urlretrieve( + bedrock_url, + os.path.join(self.settings["path"], "bedrock_server.zip"), + ) + + unzip_path = os.path.join(self.settings["path"], "bedrock_server.zip") + unzip_path = self.helper.wtol_path(unzip_path) + # unzips archive that was downloaded. + FileHelpers.unzip_file(unzip_path) + # adjusts permissions for execution if os is not windows + if not self.helper.is_os_windows(): + os.chmod( + os.path.join(self.settings["path"], "bedrock_server"), 0o0744 + ) + + # we'll delete the zip we downloaded now + os.remove(os.path.join(self.settings["path"], "bedrock_server.zip")) + downloaded = True + except Exception as e: + logger.critical( + f"Failed to download bedrock executable for update \n{e}" ) - - unzip_path = os.path.join(self.settings["path"], "bedrock_server.zip") - unzip_path = self.helper.wtol_path(unzip_path) - # unzips archive that was downloaded. - FileHelpers.unzip_file(unzip_path) - # adjusts permissions for execution if os is not windows - if not self.helper.is_os_windows(): - os.chmod(os.path.join(self.settings["path"], "bedrock_server"), 0o0744) - - # we'll delete the zip we downloaded now - os.remove(os.path.join(self.settings["path"], "bedrock_server.zip")) - downloaded = True + downloaded = True + return while self.stats_helper.get_server_stats()["updating"]: if downloaded and not self.is_backingup: From d5ecfe91286d3a5f0dd4f069c4d93e0e79d2ea9f Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Thu, 1 Sep 2022 12:46:37 -0400 Subject: [PATCH 04/14] Add spinner to update button --- app/classes/shared/server.py | 3 ++ app/frontend/templates/panel/dashboard.html | 3 +- .../templates/panel/server_config.html | 28 ++++++++++++++++++- app/frontend/templates/panel/server_term.html | 3 +- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 072045d9..d3e443f9 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1173,6 +1173,9 @@ class ServerInstance: self.helper.websocket_helper.broadcast_page( "/panel/dashboard", "send_start_reload", {} ) + self.helper.websocket_helper.broadcast_page( + "/panel/server_detail", "remove_spinner", {} + ) server_users = PermissionsServers.get_server_user_list(self.server_id) for user in server_users: self.helper.websocket_helper.broadcast_user( diff --git a/app/frontend/templates/panel/dashboard.html b/app/frontend/templates/panel/dashboard.html index 23ebf2c7..c89d00b2 100644 --- a/app/frontend/templates/panel/dashboard.html +++ b/app/frontend/templates/panel/dashboard.html @@ -186,7 +186,8 @@ {% elif server['stats']['updating']%} - {{ translate('serverTerm', 'updating', +  {{ translate('serverTerm', 'updating', data['lang']) }} {% elif server['stats']['waiting_start']%} diff --git a/app/frontend/templates/panel/server_config.html b/app/frontend/templates/panel/server_config.html index b065ef6f..d6117683 100644 --- a/app/frontend/templates/panel/server_config.html +++ b/app/frontend/templates/panel/server_config.html @@ -253,14 +253,31 @@ + {% if data['server_stats']['updating'] %} + + {% else %} + + {% end %} {{ translate('serverConfig', 'deleteServer', data['lang']) }}
{{ translate('serverConfig', 'stopBeforeDeleting', data['lang']) }} {% else %} {% if not data['failed'] %} + {% if data['server_stats']['updating'] %} + 'update', data['lang']) }}  + {% else %} + + {% end %} {% end %} {% if not data['failed'] %} + From 6d2055afe39cc6b7a6f704cd159daf3158d2efb9 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Fri, 2 Sep 2022 13:19:46 +0100 Subject: [PATCH 05/14] Update changelog !440 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c295a456..4d1de8b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,9 @@ # Changelog -## --- [4.0.12] - 2022/TBD +## --- [4.0.12] - 2022/09/04 ### New features TBD ### Bug fixes -TBD +- Fix performance issues on server metrics panels (Temporarily setting to 24hr query) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/440)) ### Tweaks TBD ### Lang From eeadea97064c781465843ddf611d97af18853f60 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Fri, 2 Sep 2022 13:28:33 +0100 Subject: [PATCH 06/14] Update changelog !442 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d1de8b3..9e89da07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ TBD ### Bug fixes - Fix performance issues on server metrics panels (Temporarily setting to 24hr query) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/440)) +- Fix no id on import3 servers ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/442)) ### Tweaks TBD ### Lang From 9a7a1cc5d8d89928080b4407b0edebe76d02acc5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 3 Sep 2022 12:46:35 -0400 Subject: [PATCH 07/14] Change elif to else --- app/classes/shared/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index d3e443f9..285759b8 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1193,7 +1193,7 @@ class ServerInstance: ) if was_started: self.start_server() - elif not downloaded and not self.is_backingup: + else: time.sleep(5) server_users = PermissionsServers.get_server_user_list(self.server_id) for user in server_users: From 6559112e1ba4144c621aa48b9a6bd9a3b581e5f1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 3 Sep 2022 13:16:03 -0400 Subject: [PATCH 08/14] Fix update logic --- app/classes/shared/server.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 285759b8..3fcc2b47 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1140,8 +1140,6 @@ class ServerInstance: logger.critical( f"Failed to download bedrock executable for update \n{e}" ) - downloaded = True - return while self.stats_helper.get_server_stats()["updating"]: if downloaded and not self.is_backingup: @@ -1193,7 +1191,7 @@ class ServerInstance: ) if was_started: self.start_server() - else: + elif not downloaded and not self.is_backingup: time.sleep(5) server_users = PermissionsServers.get_server_user_list(self.server_id) for user in server_users: From 5d688522bd2561014087889849760888bfcdf888 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 3 Sep 2022 13:23:30 -0400 Subject: [PATCH 09/14] Fix backup logic --- app/classes/shared/server.py | 120 +++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 54 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 3fcc2b47..8d37e26c 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1108,6 +1108,21 @@ class ServerInstance: except FileNotFoundError: logger.error("Could not create backup of jarfile. File not found.") + # wait for backup + while self.is_backingup: + time.sleep(10) + + # check if backup was successful + if self.last_backup_failed: + server_users = PermissionsServers.get_server_user_list(self.server_id) + for user in server_users: + self.helper.websocket_helper.broadcast_user( + user, + "notification", + "Backup failed for " + self.name + ". canceling update.", + ) + + # lets download the files if HelperServers.get_server_type_by_id(self.server_id) != "minecraft-bedrock": # boolean returns true for false for success downloaded = Helpers.download_file( @@ -1141,39 +1156,13 @@ class ServerInstance: f"Failed to download bedrock executable for update \n{e}" ) - while self.stats_helper.get_server_stats()["updating"]: - if downloaded and not self.is_backingup: - logger.info("Executable updated successfully. Starting Server") + if downloaded: + logger.info("Executable updated successfully. Starting Server") - self.stats_helper.set_update(False) - if len(self.helper.websocket_helper.clients) > 0: - # There are clients - self.check_update() - server_users = PermissionsServers.get_server_user_list( - self.server_id - ) - for user in server_users: - self.helper.websocket_helper.broadcast_user( - user, - "notification", - "Executable update finished for " + self.name, - ) - time.sleep(3) - self.helper.websocket_helper.broadcast_page( - "/panel/server_detail", - "update_button_status", - { - "isUpdating": self.check_update(), - "server_id": self.server_id, - "wasRunning": was_started, - }, - ) - self.helper.websocket_helper.broadcast_page( - "/panel/dashboard", "send_start_reload", {} - ) - self.helper.websocket_helper.broadcast_page( - "/panel/server_detail", "remove_spinner", {} - ) + self.stats_helper.set_update(False) + if len(self.helper.websocket_helper.clients) > 0: + # There are clients + self.check_update() server_users = PermissionsServers.get_server_user_list(self.server_id) for user in server_users: self.helper.websocket_helper.broadcast_user( @@ -1181,29 +1170,52 @@ class ServerInstance: "notification", "Executable update finished for " + self.name, ) - - self.management_helper.add_to_audit_log_raw( - "Alert", - "-1", - self.server_id, - "Executable update finished for " + self.name, - self.settings["server_ip"], + time.sleep(3) + self.helper.websocket_helper.broadcast_page( + "/panel/server_detail", + "update_button_status", + { + "isUpdating": self.check_update(), + "server_id": self.server_id, + "wasRunning": was_started, + }, ) - if was_started: - self.start_server() - elif not downloaded and not self.is_backingup: - time.sleep(5) - server_users = PermissionsServers.get_server_user_list(self.server_id) - for user in server_users: - self.helper.websocket_helper.broadcast_user( - user, - "notification", - "Executable update failed for " - + self.name - + ". Check log file for details.", - ) - logger.error("Executable download failed.") - self.stats_helper.set_update(False) + self.helper.websocket_helper.broadcast_page( + "/panel/dashboard", "send_start_reload", {} + ) + self.helper.websocket_helper.broadcast_page( + "/panel/server_detail", "remove_spinner", {} + ) + server_users = PermissionsServers.get_server_user_list(self.server_id) + for user in server_users: + self.helper.websocket_helper.broadcast_user( + user, + "notification", + "Executable update finished for " + self.name, + ) + + self.management_helper.add_to_audit_log_raw( + "Alert", + "-1", + self.server_id, + "Executable update finished for " + self.name, + self.settings["server_ip"], + ) + if was_started: + self.start_server() + else: + time.sleep(5) + server_users = PermissionsServers.get_server_user_list(self.server_id) + for user in server_users: + self.helper.websocket_helper.broadcast_user( + user, + "notification", + "Executable update failed for " + + self.name + + ". Check log file for details.", + ) + logger.error("Executable download failed.") + self.stats_helper.set_update(False) # ********************************************************************************** # Minecraft Servers Statistics From 1f95ad600c9f2c751d1b1b1fc7976f6e64206ba8 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 3 Sep 2022 13:26:51 -0400 Subject: [PATCH 10/14] Add return --- app/classes/shared/server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 8d37e26c..5480f682 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1121,6 +1121,7 @@ class ServerInstance: "notification", "Backup failed for " + self.name + ". canceling update.", ) + return False # lets download the files if HelperServers.get_server_type_by_id(self.server_id) != "minecraft-bedrock": From dd56b4be3755862406bb942101294e6b65ff0ef1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 3 Sep 2022 13:42:30 -0400 Subject: [PATCH 11/14] update updates --- app/classes/shared/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 5480f682..a5c45b4f 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1171,6 +1171,7 @@ class ServerInstance: "notification", "Executable update finished for " + self.name, ) + # sleep so first notif can completely run time.sleep(3) self.helper.websocket_helper.broadcast_page( "/panel/server_detail", @@ -1205,7 +1206,6 @@ class ServerInstance: if was_started: self.start_server() else: - time.sleep(5) server_users = PermissionsServers.get_server_user_list(self.server_id) for user in server_users: self.helper.websocket_helper.broadcast_user( From dd6366cb63693e78333779b4578ea50118c7f7c7 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Sun, 4 Sep 2022 03:00:27 +0100 Subject: [PATCH 12/14] Retrieve updater artifact and include in package --- .gitlab/windows-build.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.gitlab/windows-build.yml b/.gitlab/windows-build.yml index dd8dc796..2dd6fb50 100644 --- a/.gitlab/windows-build.yml +++ b/.gitlab/windows-build.yml @@ -30,6 +30,11 @@ win-dev-build: --collect-all tzdata --collect-all pytz --collect-all six + - | + echo "Retrieving 'latest' updater from crafty-controller/crafty-4-windows-updater" + $src = 'https://gitlab.com/crafty-controller/crafty-4-windows-updater/-/jobs/artifacts/dev/raw/crafty_updater.exe?job=win-dev-build' + $dest = 'crafty_updater.exe' + Invoke-WebRequest -Uri $src -OutFile $dest # Download latest: # | https://gitlab.com/crafty-controller/crafty-4/-/jobs/artifacts/dev/download?job=win-dev-build @@ -38,6 +43,7 @@ win-dev-build: paths: - app\ - .\crafty.exe + - .\crafty_updater.exe exclude: - app\classes\**\* @@ -72,6 +78,11 @@ win-prod-build: --collect-all tzdata --collect-all pytz --collect-all six + - | + echo "Retrieving 'latest' updater from crafty-controller/crafty-4-windows-updater" + $src = 'https://gitlab.com/crafty-controller/crafty-4-windows-updater/-/jobs/artifacts/master/raw/crafty_updater.exe?job=win-prod-build' + $dest = 'crafty_updater.exe' + Invoke-WebRequest -Uri $src -OutFile $dest after_script: - Add-Content -Path job.env -Value "JOB_ID=$CI_JOB_ID" @@ -82,6 +93,7 @@ win-prod-build: paths: - app\ - .\crafty.exe + - .\crafty_updater.exe expire_in: never exclude: - app\classes\**\* From 3143a6c63770270727bfd9975c20bf14b74e9079 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Sun, 4 Sep 2022 03:10:23 +0100 Subject: [PATCH 13/14] Update changelog !446 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e89da07..2dc69fc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog ## --- [4.0.12] - 2022/09/04 ### New features -TBD +- Win Portable Updater will now be included in Windows Package ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/446)) ### Bug fixes - Fix performance issues on server metrics panels (Temporarily setting to 24hr query) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/440)) - Fix no id on import3 servers ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/442)) From 9a118def24d3d9ad8299ebff661d7526b29fcfe3 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Sun, 4 Sep 2022 21:05:02 +0100 Subject: [PATCH 14/14] Update changelog !441 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dc69fc9..0fcc9437 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Bug fixes - Fix performance issues on server metrics panels (Temporarily setting to 24hr query) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/440)) - Fix no id on import3 servers ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/442)) +- Fix functionality of bedrock update ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/441)) ### Tweaks TBD ### Lang