From 9f62f6d0ca80b10bbabbc442597f684581fd264f Mon Sep 17 00:00:00 2001 From: Zedifus Date: Sun, 28 Aug 2022 01:17:55 +0100 Subject: [PATCH 01/41] Prepare 4.0.12 release base --- CHANGELOG.md | 11 +++++++++++ README.md | 4 ++-- app/config/version.json | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08219366..c295a456 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,15 @@ # Changelog +## --- [4.0.12] - 2022/TBD +### New features +TBD +### Bug fixes +TBD +### Tweaks +TBD +### Lang +TBD +

+ ## --- [4.0.11] - 2022/08/28 ### New features - Add server import status indicators ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/433)) diff --git a/README.md b/README.md index 25dc3ed7..76114129 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Supported Python Versions](https://shields.io/badge/python-3.8%20%7C%203.9%20%7C%203.10%20-blue)](https://www.python.org) -[![Version(temp-hardcoded)](https://img.shields.io/badge/release-v4.0.11--beta-orange)](https://gitlab.com/crafty-controller/crafty-4/-/releases) +[![Version(temp-hardcoded)](https://img.shields.io/badge/release-v4.0.12--beta-orange)](https://gitlab.com/crafty-controller/crafty-4/-/releases) [![Code Quality(temp-hardcoded)](https://img.shields.io/badge/code%20quality-10-brightgreen)](https://gitlab.com/crafty-controller/crafty-4) [![Build Status](https://gitlab.com/crafty-controller/crafty-4/badges/master/pipeline.svg)](https://gitlab.com/crafty-controller/crafty-4/-/commits/master) -# Crafty Controller 4.0.11-beta +# Crafty Controller 4.0.12-beta > Python based Control Panel for your Minecraft Server ## What is Crafty Controller? diff --git a/app/config/version.json b/app/config/version.json index f795fa3e..2229b476 100644 --- a/app/config/version.json +++ b/app/config/version.json @@ -1,6 +1,6 @@ { "major": 4, "minor": 0, - "sub": 11, + "sub": 12, "meta": "beta" } From 7f412954d717f7f4678c37d95820926651139adb Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 30 Aug 2022 17:27:19 -0400 Subject: [PATCH 02/41] 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 266e5403745730d964300197cfaca7d40a4ccabe Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 31 Aug 2022 11:59:33 -0400 Subject: [PATCH 03/41] Add bedrock update support --- app/classes/shared/file_helpers.py | 7 ++++++- app/classes/shared/server.py | 32 ++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/classes/shared/file_helpers.py b/app/classes/shared/file_helpers.py index 04ec3305..28edbef7 100644 --- a/app/classes/shared/file_helpers.py +++ b/app/classes/shared/file_helpers.py @@ -64,6 +64,11 @@ class FileHelpers: FileHelpers.copy_dir(src_path, dest_path) FileHelpers.del_dirs(src_path) + @staticmethod + def move_dir_exist(src_path, dest_path): + FileHelpers.copy_dir(src_path, dest_path, True) + FileHelpers.del_dirs(src_path) + @staticmethod def move_file(src_path, dest_path): FileHelpers.copy_file(src_path, dest_path) @@ -290,7 +295,7 @@ class FileHelpers: for item in os.listdir(full_root_path): if os.path.isdir(os.path.join(full_root_path, item)): try: - FileHelpers.move_dir( + FileHelpers.move_dir_exist( os.path.join(full_root_path, item), os.path.join(new_dir, item), ) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 0b2c5b96..cee0a8e9 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -9,6 +9,7 @@ import threading import logging.config import subprocess import html +import urllib.request # TZLocal is set as a hidden import on win pipeline from tzlocal import get_localzone @@ -1100,13 +1101,32 @@ class ServerInstance: self.settings["executable"], ) - # copies to backup dir - FileHelpers.copy_file(current_executable, backup_executable) + try: + # copies to backup dir + FileHelpers.copy_file(current_executable, backup_executable) + except FileNotFoundError: + logger.error("Could not create backup of jarfile. File not found.") - # boolean returns true for false for success - downloaded = Helpers.download_file( - self.settings["executable_update_url"], current_executable - ) + if HelperServers.get_server_type_by_id(self.server_id) != "minecraft-bedrock": + # boolean returns true for false for success + downloaded = Helpers.download_file( + self.settings["executable_update_url"], current_executable + ) + else: + print("in download") + # downloads zip from remote url + urllib.request.urlretrieve( + self.settings["executable_update_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"), 0o0775) + downloaded = True while self.stats_helper.get_server_stats()["updating"]: if downloaded and not self.is_backingup: From 600de2be0c93afdf2c5298c84ec3a664afb2bcc0 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 31 Aug 2022 12:18:52 -0400 Subject: [PATCH 04/41] Fix executable backups Cleanup after ourselves --- app/classes/shared/server.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index cee0a8e9..8866b09a 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1079,22 +1079,23 @@ class ServerInstance: ) # checks if backup directory already exists if os.path.isdir(backup_dir): - backup_executable = os.path.join(backup_dir, "old_server.jar") + backup_executable = os.path.join(backup_dir, self.settings["executable"]) else: logger.info( f"Executable backup directory not found for Server: {self.name}." f" Creating one." ) os.mkdir(backup_dir) - backup_executable = os.path.join(backup_dir, "old_server.jar") + backup_executable = os.path.join(backup_dir, self.settings["executable"]) - if os.path.isfile(backup_executable): - # removes old backup - logger.info(f"Old backup found for server: {self.name}. Removing...") - os.remove(backup_executable) - logger.info(f"Old backup removed for server: {self.name}.") - else: - logger.info(f"No old backups found for server: {self.name}") + if len(os.listdir(backup_dir)) > 0: + # removes old backup + logger.info(f"Old backups found for server: {self.name}. Removing...") + for item in os.listdir(backup_dir): + os.remove(os.path.join(backup_dir, item)) + logger.info(f"Old backups removed for server: {self.name}.") + else: + logger.info(f"No old backups found for server: {self.name}") current_executable = os.path.join( Helpers.get_os_understandable_path(self.settings["path"]), @@ -1113,7 +1114,6 @@ class ServerInstance: self.settings["executable_update_url"], current_executable ) else: - print("in download") # downloads zip from remote url urllib.request.urlretrieve( self.settings["executable_update_url"], @@ -1126,6 +1126,10 @@ class ServerInstance: # 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"), 0o0775) + + # we'll delete the zip we downloaded now + + os.remove(os.path.join(self.settings["path"], "bedrock_server.zip")) downloaded = True while self.stats_helper.get_server_stats()["updating"]: From 0f820433f137bcd0aaf248ad824734eabfa517f0 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 31 Aug 2022 12:39:52 -0400 Subject: [PATCH 05/41] Remove log path from config for bedrock --- app/classes/web/panel_handler.py | 13 +++++++------ app/frontend/templates/panel/server_config.html | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index a8bac6e2..7fa42d77 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -1500,12 +1500,13 @@ class PanelHandler(BaseHandler): if Helpers.is_os_windows(): server_path.replace(" ", "^ ") server_path = Helpers.wtol_path(server_path) - log_path = self.get_argument("log_path", None) - if Helpers.is_os_windows(): - log_path.replace(" ", "^ ") - log_path = Helpers.wtol_path(log_path) - if not self.helper.validate_traversal(server_obj.path, log_path): - log_path = "" + log_path = self.get_argument("log_path", "") + if log_path: + if Helpers.is_os_windows(): + log_path.replace(" ", "^ ") + log_path = Helpers.wtol_path(log_path) + if not self.helper.validate_traversal(server_obj.path, log_path): + log_path = "" executable = self.get_argument("executable", None) execution_command = self.get_argument("execution_command", None) server_ip = self.get_argument("server_ip", None) diff --git a/app/frontend/templates/panel/server_config.html b/app/frontend/templates/panel/server_config.html index e1c38e1e..d19b482d 100644 --- a/app/frontend/templates/panel/server_config.html +++ b/app/frontend/templates/panel/server_config.html @@ -67,7 +67,7 @@ placeholder="{{ translate('serverConfig', 'serverPath', data['lang']) }}" required> - + {% if data['server_stats']['server_type'] != "minecraft-bedrock" %}
+ {% end %}
{% if data['super_user'] %} + {% if data['server_stats']['server_type'] != "minecraft-bedrock" %}
+ {% end %}