diff --git a/.gitlab/merge_request_templates/Default.md b/.gitlab/merge_request_templates/Default.md index 2acf3b1e..a82cb3f8 100644 --- a/.gitlab/merge_request_templates/Default.md +++ b/.gitlab/merge_request_templates/Default.md @@ -27,4 +27,3 @@ This checklist encourages us to confirm any changes have been analyzed to reduce * [ ] Have you resolved any lint issues? * [ ] Have you assigned a reviewer? * [ ] Have you applied correct labels? -* [ ] Have you updated CHANGELOG.md? diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b4ffba8..1f7af3bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,22 @@ # Changelog -## --- [4.0.6] - 2022/07/06 +## --- [4.0.7] - 2022/07/18 ### New features -- Task toggle (!398+) -- Basic API for modifying tasks (!398+) +- Task toggle ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/398)) +- Basic API for modifying tasks ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/398)) +- Toggle Visible servers on status page ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/399)) +### Bug fixes +- Fixes stats recording for Oracle hosts ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/397)) +- Improve the use of the object oriented architecture ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/400)) +- Fix issue with API Server Instance is not serializable ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/401)) +- Fix an issue where the motd were not displayed properly one small screens ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/402)) +### Tweaks +- Remove server.props requirement ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/403)) +### Lang +None +

+ +## --- [4.0.6] - 2022/07/06 ### Bug fixes - Remove redundant path check on backup restore ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/390)) - Fix issue with stats pinging on slow starting servers ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/391)) diff --git a/app/classes/controllers/servers_controller.py b/app/classes/controllers/servers_controller.py index ca59fbdc..5168695a 100644 --- a/app/classes/controllers/servers_controller.py +++ b/app/classes/controllers/servers_controller.py @@ -13,7 +13,6 @@ from app.classes.shared.console import Console from app.classes.shared.helpers import Helpers from app.classes.shared.main_models import DatabaseShortcuts -from app.classes.minecraft.server_props import ServerProps from app.classes.minecraft.stats import Stats from app.classes.models.servers import HelperServers @@ -171,18 +170,6 @@ class ServersController(metaclass=Singleton): ) continue - settings_file = os.path.join( - Helpers.get_os_understandable_path(server["path"]), "server.properties" - ) - - # if the properties file isn't there, let's warn - if not Helpers.check_file_exists(settings_file): - logger.error(f"Unable to find {settings_file}. Skipping this server.") - Console.error(f"Unable to find {settings_file}. Skipping this server.") - continue - - settings = ServerProps(settings_file) - temp_server_dict = { "server_id": server.get("server_id"), "server_data_obj": server, @@ -193,7 +180,6 @@ class ServersController(metaclass=Singleton): self.stats, self.file_helper, ), - "server_settings": settings.props, } # setup the server, do the auto start and all that jazz @@ -350,14 +336,6 @@ class ServersController(metaclass=Singleton): def get_server_friendly_name(server_id): return HelperServers.get_server_friendly_name(server_id) - def get_server_settings(self, server_id): - for server in self.servers_list: - if int(server["server_id"]) == int(server_id): - return server["server_settings"] - - logger.warning(f"Unable to find server object for server id {server_id}") - return False - def crash_detection(self, server_obj): svr = self.get_server_instance_by_id(server_obj.server_id) # start or stop crash detection depending upon user preference diff --git a/app/classes/minecraft/server_props.py b/app/classes/minecraft/server_props.py deleted file mode 100644 index cc54a148..00000000 --- a/app/classes/minecraft/server_props.py +++ /dev/null @@ -1,66 +0,0 @@ -import pprint -import os - - -class ServerProps: - def __init__(self, filepath): - self.filepath = filepath - self.props = self._parse() - - def _parse(self): - # Loads and parses the file specified in self.filepath - with open(self.filepath, encoding="utf-8") as full_path: - line = full_path.readline() - dictionary = {} - if os.path.exists(".header"): - os.remove(".header") - while line: - if "#" != line[0]: - string = line - string1 = string[: string.find("=")] - if "\n" in string: - string2 = string[string.find("=") + 1 : string.find("\n")] - else: - string2 = string[string.find("=") + 1 :] - dictionary[string1] = string2 - else: - with open(".header", "a+", encoding="utf-8") as header: - header.write(line) - line = full_path.readline() - return dictionary - - def print(self): - # Prints the properties dictionary (using pprint) - pprint.pprint(self.props) - - def get(self): - # Returns the properties dictionary - return self.props - - def update(self, key, val): - # Updates property in the properties dictionary [ update("pvp", "true") ] - # and returns boolean condition - if key in self.props.keys(): - self.props[key] = val - return True - return False - - def save(self): - # Writes to the new file - with open(self.filepath, "a+", encoding="utf-8") as f: - f.truncate(0) - with open(".header", encoding="utf-8") as header: - line = header.readline() - while line: - f.write(line) - line = header.readline() - header.close() - for key, value in self.props.items(): - f.write(key + "=" + value + "\n") - if os.path.exists(".header"): - os.remove(".header") - - @staticmethod - def cleanup(): - if os.path.exists(".header"): - os.remove(".header") diff --git a/app/classes/minecraft/stats.py b/app/classes/minecraft/stats.py index 64cbf894..5ef9550d 100644 --- a/app/classes/minecraft/stats.py +++ b/app/classes/minecraft/stats.py @@ -6,10 +6,10 @@ import datetime import base64 import typing as t -from app.classes.shared.null_writer import NullWriter from app.classes.minecraft.mc_ping import ping from app.classes.models.management import HostStats from app.classes.models.servers import HelperServers +from app.classes.shared.null_writer import NullWriter from app.classes.shared.helpers import Helpers with redirect_stderr(NullWriter()): @@ -87,7 +87,9 @@ class Stats: try: cpu_freq = psutil.cpu_freq() except NotImplementedError: - cpu_freq = psutil._common.scpufreq(current=0, min=0, max=0) + cpu_freq = None + if cpu_freq is None: + cpu_freq = psutil._common.scpufreq(current=-1, min=-1, max=-1) memory = psutil.virtual_memory() try: node_stats: NodeStatsDict = { @@ -224,11 +226,6 @@ class Stats: logger.info(f"Getting players for server {server}") - # get our settings and data dictionaries - # server_settings = server.get('server_settings', {}) - # server_data = server.get('server_data_obj', {}) - - # TODO: search server properties file for possible override of 127.0.0.1 internal_ip = server["server_ip"] server_port = server["server_port"] diff --git a/app/classes/models/servers.py b/app/classes/models/servers.py index 5a9bb268..71ca4851 100644 --- a/app/classes/models/servers.py +++ b/app/classes/models/servers.py @@ -37,6 +37,7 @@ class Servers(BaseModel): server_port = IntegerField(default=25565) logs_delete_after = IntegerField(default=0) type = CharField(default="minecraft-java") + show_status = BooleanField(default=1) class Meta: table_name = "servers" @@ -80,6 +81,7 @@ class HelperServers: server_type: This is the type of server you're creating. server_port: The port the server will be monitored on, defaults to 25565 server_host: The host the server will be monitored on, defaults to 127.0.0.1 + show_status: Should Crafty show this server on the public status page Returns: int: The new server's id diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index d1ae524c..2391b827 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -1244,7 +1244,6 @@ class ServerInstance: # process stats p_stats = Stats._try_get_process_stats(self.process, self.check_running()) - # TODO: search server properties file for possible override of 127.0.0.1 internal_ip = server["server_ip"] server_port = server["server_port"] server_name = server.get("server_name", f"ID#{server_id}") @@ -1253,7 +1252,10 @@ class ServerInstance: if HelperServers.get_server_type_by_id(server_id) == "minecraft-bedrock": int_mc_ping = ping_bedrock(internal_ip, int(server_port)) else: - int_mc_ping = ping(internal_ip, int(server_port)) + try: + int_mc_ping = ping(internal_ip, int(server_port)) + except: + int_mc_ping = False int_data = False ping_data = {} @@ -1315,11 +1317,6 @@ class ServerInstance: logger.info(f"Getting players for server {server}") - # get our settings and data dictionaries - # server_settings = server.get('server_settings', {}) - # server_data = server.get('server_data_obj', {}) - - # TODO: search server properties file for possible override of 127.0.0.1 internal_ip = server["server_ip"] server_port = server["server_port"] @@ -1377,9 +1374,6 @@ class ServerInstance: # process stats p_stats = Stats._try_get_process_stats(self.process, self.check_running()) - # TODO: search server properties file for possible override of 127.0.0.1 - # internal_ip = server['server_ip'] - # server_port = server['server_port'] internal_ip = server_dt["server_ip"] server_port = server_dt["server_port"] diff --git a/app/classes/web/base_handler.py b/app/classes/web/base_handler.py index fd3ee638..b9a69c48 100644 --- a/app/classes/web/base_handler.py +++ b/app/classes/web/base_handler.py @@ -10,6 +10,7 @@ from app.classes.models.users import ApiKeys from app.classes.shared.helpers import Helpers from app.classes.shared.main_controller import Controller from app.classes.shared.translation import Translation +from app.classes.models.management import DatabaseShortcuts logger = logging.getLogger(__name__) @@ -204,6 +205,10 @@ class BaseHandler(tornado.web.RequestHandler): authorized_servers = self.controller.servers.get_authorized_servers( user["user_id"] # TODO: API key authorized servers? ) + authorized_servers = [ + DatabaseShortcuts.get_data_obj(x.server_object) + for x in authorized_servers + ] logger.debug("Checking results") if user: diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index 53c45986..f161ab47 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -192,9 +192,9 @@ class PanelHandler(BaseHandler): total_players = 0 for server in page_data["servers"]: total_players += len( - self.controller.servers.stats.get_server_players( + self.controller.servers.get_server_instance_by_id( server["server_data"]["server_id"] - ) + ).get_server_players() ) page_data["num_players"] = total_players @@ -539,9 +539,7 @@ class PanelHandler(BaseHandler): except Exception as e: logger.error(f"Failed to get server waiting to start: {e}") page_data["waiting_start"] = False - page_data[ - "get_players" - ] = lambda: self.controller.servers.stats.get_server_players(server_id) + page_data["get_players"] = server.get_server_players() page_data["active_link"] = subpage page_data["permissions"] = { "Commands": EnumPermissionsServer.COMMANDS, @@ -877,9 +875,6 @@ class PanelHandler(BaseHandler): page_data["schedules"] = HelpersManagement.get_schedules_by_server( server_id ) - page_data[ - "get_players" - ] = lambda: self.controller.servers.stats.get_server_players(server_id) page_data["active_link"] = "schedules" page_data["permissions"] = { "Commands": EnumPermissionsServer.COMMANDS, @@ -945,9 +940,6 @@ class PanelHandler(BaseHandler): self.redirect("/panel/error?error=Invalid Schedule ID") return schedule = self.controller.management.get_scheduled_task_model(sch_id) - page_data[ - "get_players" - ] = lambda: self.controller.servers.stats.get_server_players(server_id) page_data["active_link"] = "schedules" page_data["permissions"] = { "Commands": EnumPermissionsServer.COMMANDS, @@ -1384,6 +1376,7 @@ class PanelHandler(BaseHandler): server_ip = self.get_argument("server_ip", None) server_port = self.get_argument("server_port", None) executable_update_url = self.get_argument("executable_update_url", None) + show_status = int(float(self.get_argument("show_status", "0"))) else: execution_command = server_obj.execution_command executable = server_obj.executable @@ -1461,6 +1454,7 @@ class PanelHandler(BaseHandler): server_obj.server_ip = server_ip server_obj.server_port = server_port server_obj.executable_update_url = executable_update_url + server_obj.show_status = show_status else: server_obj.path = server_obj.path server_obj.log_path = server_obj.log_path diff --git a/app/frontend/static/assets/css/crafty.css b/app/frontend/static/assets/css/crafty.css index a4bfe57c..7c533ee2 100644 --- a/app/frontend/static/assets/css/crafty.css +++ b/app/frontend/static/assets/css/crafty.css @@ -21,6 +21,18 @@ display: block; } +.toggle-handle { + background-color: white !important; +} + +.toggle-on { + color: black !important; +} + +.toggle { + height: 0px !important; +} + .sidebar>.nav>.nav-item:not(.nav-profile)>.nav-link:before { content: none; position: absolute; diff --git a/app/frontend/templates/panel/server_admin_controls.html b/app/frontend/templates/panel/server_admin_controls.html index 7149bb85..542f2ce7 100644 --- a/app/frontend/templates/panel/server_admin_controls.html +++ b/app/frontend/templates/panel/server_admin_controls.html @@ -73,7 +73,7 @@

{{ translate('serverPlayerManagement', 'players', data['lang']) }}: