mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Merge branch 'bugfix/world-size-calc' into 'dev'
Optimize world size calculation See merge request crafty-controller/crafty-4!550
This commit is contained in:
commit
0e684a618d
@ -12,6 +12,7 @@
|
|||||||
- Fix backups failing by correctly using tz objects ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/556))
|
- Fix backups failing by correctly using tz objects ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/556))
|
||||||
- Bump Cryptography/pyOpenSSL for CVE-2023-23931 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/554))
|
- Bump Cryptography/pyOpenSSL for CVE-2023-23931 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/554))
|
||||||
- Fix debug logging to only display with the -v (verbose) flag ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/560))
|
- Fix debug logging to only display with the -v (verbose) flag ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/560))
|
||||||
|
- Optimize world size calculation ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/550))
|
||||||
### Tweaks
|
### Tweaks
|
||||||
- Cleanup authentication helpers ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/545))
|
- Cleanup authentication helpers ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/545))
|
||||||
- Optimize file upload progress WS ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/546))
|
- Optimize file upload progress WS ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/546))
|
||||||
|
@ -210,7 +210,7 @@ class Stats:
|
|||||||
return disk_data
|
return disk_data
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_world_size(server_path):
|
def get_server_dir_size(server_path):
|
||||||
total_size = 0
|
total_size = 0
|
||||||
|
|
||||||
total_size = Helpers.get_dir_size(server_path)
|
total_size = Helpers.get_dir_size(server_path)
|
||||||
|
@ -63,6 +63,7 @@ class Helpers:
|
|||||||
self.servers_dir = os.path.join(self.root_dir, "servers")
|
self.servers_dir = os.path.join(self.root_dir, "servers")
|
||||||
self.backup_path = os.path.join(self.root_dir, "backups")
|
self.backup_path = os.path.join(self.root_dir, "backups")
|
||||||
self.migration_dir = os.path.join(self.root_dir, "app", "migrations")
|
self.migration_dir = os.path.join(self.root_dir, "app", "migrations")
|
||||||
|
self.dir_migration = False
|
||||||
|
|
||||||
self.session_file = os.path.join(self.root_dir, "app", "config", "session.lock")
|
self.session_file = os.path.join(self.root_dir, "app", "config", "session.lock")
|
||||||
self.settings_file = os.path.join(self.root_dir, "app", "config", "config.json")
|
self.settings_file = os.path.join(self.root_dir, "app", "config", "config.json")
|
||||||
@ -422,7 +423,7 @@ class Helpers:
|
|||||||
"cookie_expire": 30,
|
"cookie_expire": 30,
|
||||||
"show_errors": True,
|
"show_errors": True,
|
||||||
"history_max_age": 7,
|
"history_max_age": 7,
|
||||||
"stats_update_frequency": 30,
|
"stats_update_frequency_seconds": 30,
|
||||||
"delete_default_json": False,
|
"delete_default_json": False,
|
||||||
"show_contribute_link": True,
|
"show_contribute_link": True,
|
||||||
"virtual_terminal_lines": 70,
|
"virtual_terminal_lines": 70,
|
||||||
@ -435,6 +436,7 @@ class Helpers:
|
|||||||
"enable_user_self_delete": False,
|
"enable_user_self_delete": False,
|
||||||
"reset_secrets_on_next_boot": False,
|
"reset_secrets_on_next_boot": False,
|
||||||
"monitored_mounts": Helpers.get_all_mounts(),
|
"monitored_mounts": Helpers.get_all_mounts(),
|
||||||
|
"dir_size_poll_freq_minutes": 5,
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_all_settings(self):
|
def get_all_settings(self):
|
||||||
|
@ -1010,6 +1010,7 @@ class Controller:
|
|||||||
HelpersManagement.set_master_server_dir(server_dir)
|
HelpersManagement.set_master_server_dir(server_dir)
|
||||||
|
|
||||||
def update_master_server_dir(self, server_dir, user_id):
|
def update_master_server_dir(self, server_dir, user_id):
|
||||||
|
self.helper.dir_migration = True
|
||||||
move_thread = threading.Thread(
|
move_thread = threading.Thread(
|
||||||
name="dir_move",
|
name="dir_move",
|
||||||
target=self.t_update_master_server_dir,
|
target=self.t_update_master_server_dir,
|
||||||
@ -1021,15 +1022,15 @@ class Controller:
|
|||||||
)
|
)
|
||||||
move_thread.start()
|
move_thread.start()
|
||||||
|
|
||||||
def t_update_master_server_dir(self, server_dir, user_id):
|
def t_update_master_server_dir(self, new_server_path, user_id):
|
||||||
server_dir = self.helper.wtol_path(server_dir)
|
new_server_path = self.helper.wtol_path(new_server_path)
|
||||||
self.helper.websocket_helper.broadcast_page(
|
self.helper.websocket_helper.broadcast_page(
|
||||||
"/panel/panel_config", "move_status", "Checking dir"
|
"/panel/panel_config", "move_status", "Checking dir"
|
||||||
)
|
)
|
||||||
current_master = self.helper.wtol_path(
|
current_master = self.helper.wtol_path(
|
||||||
HelpersManagement.get_master_server_dir()
|
HelpersManagement.get_master_server_dir()
|
||||||
)
|
)
|
||||||
if current_master == server_dir:
|
if current_master == new_server_path:
|
||||||
logger.info(
|
logger.info(
|
||||||
"Admin tried to change server dir to current server dir. Canceling..."
|
"Admin tried to change server dir to current server dir. Canceling..."
|
||||||
)
|
)
|
||||||
@ -1039,7 +1040,7 @@ class Controller:
|
|||||||
"done",
|
"done",
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
if self.helper.is_subdir(server_dir, current_master):
|
if self.helper.is_subdir(new_server_path, current_master):
|
||||||
logger.info(
|
logger.info(
|
||||||
"Admin tried to change server dir to be inside a sub directory of the"
|
"Admin tried to change server dir to be inside a sub directory of the"
|
||||||
" current server dir. This will result in a copy loop."
|
" current server dir. This will result in a copy loop."
|
||||||
@ -1054,7 +1055,7 @@ class Controller:
|
|||||||
self.helper.websocket_helper.broadcast_page(
|
self.helper.websocket_helper.broadcast_page(
|
||||||
"/panel/panel_config", "move_status", "Checking permissions"
|
"/panel/panel_config", "move_status", "Checking permissions"
|
||||||
)
|
)
|
||||||
if not self.helper.ensure_dir_exists(os.path.join(server_dir, "servers")):
|
if not self.helper.ensure_dir_exists(os.path.join(new_server_path, "servers")):
|
||||||
self.helper.websocket_helper.broadcast_user(
|
self.helper.websocket_helper.broadcast_user(
|
||||||
user_id,
|
user_id,
|
||||||
"send_start_error",
|
"send_start_error",
|
||||||
@ -1066,15 +1067,15 @@ class Controller:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
# set the cached serve dir
|
# set the cached serve dir
|
||||||
self.helper.servers_dir = server_dir
|
self.helper.servers_dir = new_server_path
|
||||||
# set DB server dir
|
# set DB server dir
|
||||||
HelpersManagement.set_master_server_dir(server_dir)
|
HelpersManagement.set_master_server_dir(new_server_path)
|
||||||
servers = self.servers.get_all_defined_servers()
|
servers = self.servers.get_all_defined_servers()
|
||||||
# move the servers
|
# move the servers
|
||||||
for server in servers:
|
for server in servers:
|
||||||
server_path = server.get("path")
|
server_path = server.get("path")
|
||||||
new_server_path = os.path.join(
|
new_server_path = os.path.join(
|
||||||
server_dir, "servers", server.get("server_uuid")
|
new_server_path, "servers", server.get("server_uuid")
|
||||||
)
|
)
|
||||||
if os.path.isdir(server_path):
|
if os.path.isdir(server_path):
|
||||||
self.helper.websocket_helper.broadcast_page(
|
self.helper.websocket_helper.broadcast_page(
|
||||||
@ -1095,17 +1096,17 @@ class Controller:
|
|||||||
# reset executable path
|
# reset executable path
|
||||||
if current_master in server["executable"]:
|
if current_master in server["executable"]:
|
||||||
server_obj.executable = str(server["executable"]).replace(
|
server_obj.executable = str(server["executable"]).replace(
|
||||||
current_master, server_dir
|
current_master, new_server_path
|
||||||
)
|
)
|
||||||
# reset run command path
|
# reset run command path
|
||||||
if current_master in server["execution_command"]:
|
if current_master in server["execution_command"]:
|
||||||
server_obj.execution_command = str(server["execution_command"]).replace(
|
server_obj.execution_command = str(server["execution_command"]).replace(
|
||||||
current_master, server_dir
|
current_master, new_server_path
|
||||||
)
|
)
|
||||||
# reset log path
|
# reset log path
|
||||||
if current_master in server["log_path"]:
|
if current_master in server["log_path"]:
|
||||||
server_obj.log_path = str(server["log_path"]).replace(
|
server_obj.log_path = str(server["log_path"]).replace(
|
||||||
current_master, server_dir
|
current_master, new_server_path
|
||||||
)
|
)
|
||||||
server_obj.path = new_server_path
|
server_obj.path = new_server_path
|
||||||
failed = False
|
failed = False
|
||||||
@ -1117,6 +1118,7 @@ class Controller:
|
|||||||
else:
|
else:
|
||||||
self.servers.update_unloaded_server(server_obj)
|
self.servers.update_unloaded_server(server_obj)
|
||||||
self.servers.init_all_servers()
|
self.servers.init_all_servers()
|
||||||
|
self.helper.dir_migration = False
|
||||||
self.helper.websocket_helper.broadcast_page(
|
self.helper.websocket_helper.broadcast_page(
|
||||||
"/panel/panel_config",
|
"/panel/panel_config",
|
||||||
"move_status",
|
"move_status",
|
||||||
|
@ -140,7 +140,10 @@ class ServerInstance:
|
|||||||
)
|
)
|
||||||
self.tz = ZoneInfo("Europe/London")
|
self.tz = ZoneInfo("Europe/London")
|
||||||
self.server_scheduler = BackgroundScheduler(timezone=str(self.tz))
|
self.server_scheduler = BackgroundScheduler(timezone=str(self.tz))
|
||||||
|
self.dir_scheduler = BackgroundScheduler(timezone=str(self.tz))
|
||||||
self.server_scheduler.start()
|
self.server_scheduler.start()
|
||||||
|
self.dir_scheduler.start()
|
||||||
|
self.start_dir_calc_task()
|
||||||
self.backup_thread = threading.Thread(
|
self.backup_thread = threading.Thread(
|
||||||
target=self.a_backup_server, daemon=True, name=f"backup_{self.name}"
|
target=self.a_backup_server, daemon=True, name=f"backup_{self.name}"
|
||||||
)
|
)
|
||||||
@ -305,6 +308,22 @@ class ServerInstance:
|
|||||||
else:
|
else:
|
||||||
user_lang = HelperUsers.get_user_lang_by_id(user_id)
|
user_lang = HelperUsers.get_user_lang_by_id(user_id)
|
||||||
|
|
||||||
|
# Checks if user is currently attempting to move global server
|
||||||
|
# dir
|
||||||
|
if self.helper.dir_migration:
|
||||||
|
self.helper.websocket_helper.broadcast_user(
|
||||||
|
user_id,
|
||||||
|
"send_start_error",
|
||||||
|
{
|
||||||
|
"error": self.helper.translation.translate(
|
||||||
|
"error",
|
||||||
|
"migration",
|
||||||
|
user_lang,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
if self.stats_helper.get_import_status() and not forge_install:
|
if self.stats_helper.get_import_status() and not forge_install:
|
||||||
if user_id:
|
if user_id:
|
||||||
self.helper.websocket_helper.broadcast_user(
|
self.helper.websocket_helper.broadcast_user(
|
||||||
@ -1374,6 +1393,20 @@ class ServerInstance:
|
|||||||
for user in server_users:
|
for user in server_users:
|
||||||
self.helper.websocket_helper.broadcast_user(user, "remove_spinner", {})
|
self.helper.websocket_helper.broadcast_user(user, "remove_spinner", {})
|
||||||
|
|
||||||
|
def start_dir_calc_task(self):
|
||||||
|
server_dt = HelperServers.get_server_data_by_id(self.server_id)
|
||||||
|
self.server_size = self.stats.get_server_dir_size(server_dt["path"])
|
||||||
|
self.dir_scheduler.add_job(
|
||||||
|
self.calc_dir_size,
|
||||||
|
"interval",
|
||||||
|
minutes=self.helper.get_setting("dir_size_poll_freq_minutes"),
|
||||||
|
id=str(self.server_id) + "_dir_poll",
|
||||||
|
)
|
||||||
|
|
||||||
|
def calc_dir_size(self):
|
||||||
|
server_dt = HelperServers.get_server_data_by_id(self.server_id)
|
||||||
|
self.server_size = self.stats.get_server_dir_size(server_dt["path"])
|
||||||
|
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
# Minecraft Servers Statistics
|
# Minecraft Servers Statistics
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
@ -1471,9 +1504,6 @@ class ServerInstance:
|
|||||||
# get our server object, settings and data dictionaries
|
# get our server object, settings and data dictionaries
|
||||||
self.reload_server_settings()
|
self.reload_server_settings()
|
||||||
|
|
||||||
# world data
|
|
||||||
server_path = server["path"]
|
|
||||||
|
|
||||||
# process stats
|
# process stats
|
||||||
p_stats = Stats._try_get_process_stats(self.process, self.check_running())
|
p_stats = Stats._try_get_process_stats(self.process, self.check_running())
|
||||||
|
|
||||||
@ -1514,7 +1544,7 @@ class ServerInstance:
|
|||||||
"mem": p_stats.get("memory_usage", 0),
|
"mem": p_stats.get("memory_usage", 0),
|
||||||
"mem_percent": p_stats.get("mem_percentage", 0),
|
"mem_percent": p_stats.get("mem_percentage", 0),
|
||||||
"world_name": server_name,
|
"world_name": server_name,
|
||||||
"world_size": Stats.get_world_size(server_path),
|
"world_size": self.server_size,
|
||||||
"server_port": server_port,
|
"server_port": server_port,
|
||||||
"int_ping_results": int_data,
|
"int_ping_results": int_data,
|
||||||
"online": ping_data.get("online", False),
|
"online": ping_data.get("online", False),
|
||||||
@ -1532,7 +1562,7 @@ class ServerInstance:
|
|||||||
"mem": p_stats.get("memory_usage", 0),
|
"mem": p_stats.get("memory_usage", 0),
|
||||||
"mem_percent": p_stats.get("mem_percentage", 0),
|
"mem_percent": p_stats.get("mem_percentage", 0),
|
||||||
"world_name": server_name,
|
"world_name": server_name,
|
||||||
"world_size": Stats.get_world_size(server_path),
|
"world_size": self.server_size,
|
||||||
"server_port": server_port,
|
"server_port": server_port,
|
||||||
"int_ping_results": int_data,
|
"int_ping_results": int_data,
|
||||||
"online": False,
|
"online": False,
|
||||||
@ -1600,7 +1630,6 @@ class ServerInstance:
|
|||||||
|
|
||||||
# world data
|
# world data
|
||||||
server_name = server_dt["server_name"]
|
server_name = server_dt["server_name"]
|
||||||
server_path = server_dt["path"]
|
|
||||||
|
|
||||||
# process stats
|
# process stats
|
||||||
p_stats = Stats._try_get_process_stats(self.process, self.check_running())
|
p_stats = Stats._try_get_process_stats(self.process, self.check_running())
|
||||||
@ -1633,7 +1662,7 @@ class ServerInstance:
|
|||||||
"mem": p_stats.get("memory_usage", 0),
|
"mem": p_stats.get("memory_usage", 0),
|
||||||
"mem_percent": p_stats.get("mem_percentage", 0),
|
"mem_percent": p_stats.get("mem_percentage", 0),
|
||||||
"world_name": server_name,
|
"world_name": server_name,
|
||||||
"world_size": Stats.get_world_size(server_path),
|
"world_size": self.server_size,
|
||||||
"server_port": server_port,
|
"server_port": server_port,
|
||||||
"int_ping_results": int_data,
|
"int_ping_results": int_data,
|
||||||
"online": ping_data.get("online", False),
|
"online": ping_data.get("online", False),
|
||||||
@ -1662,7 +1691,7 @@ class ServerInstance:
|
|||||||
"mem": p_stats.get("memory_usage", 0),
|
"mem": p_stats.get("memory_usage", 0),
|
||||||
"mem_percent": p_stats.get("mem_percentage", 0),
|
"mem_percent": p_stats.get("mem_percentage", 0),
|
||||||
"world_name": server_name,
|
"world_name": server_name,
|
||||||
"world_size": Stats.get_world_size(server_path),
|
"world_size": self.server_size,
|
||||||
"server_port": server_port,
|
"server_port": server_port,
|
||||||
"int_ping_results": int_data,
|
"int_ping_results": int_data,
|
||||||
"online": ping_data["online"],
|
"online": ping_data["online"],
|
||||||
@ -1681,7 +1710,7 @@ class ServerInstance:
|
|||||||
"mem": p_stats.get("memory_usage", 0),
|
"mem": p_stats.get("memory_usage", 0),
|
||||||
"mem_percent": p_stats.get("mem_percentage", 0),
|
"mem_percent": p_stats.get("mem_percentage", 0),
|
||||||
"world_name": server_name,
|
"world_name": server_name,
|
||||||
"world_size": Stats.get_world_size(server_path),
|
"world_size": self.server_size,
|
||||||
"server_port": server_port,
|
"server_port": server_port,
|
||||||
"int_ping_results": int_data,
|
"int_ping_results": int_data,
|
||||||
"online": False,
|
"online": False,
|
||||||
@ -1700,7 +1729,7 @@ class ServerInstance:
|
|||||||
"mem": p_stats.get("memory_usage", 0),
|
"mem": p_stats.get("memory_usage", 0),
|
||||||
"mem_percent": p_stats.get("mem_percentage", 0),
|
"mem_percent": p_stats.get("mem_percentage", 0),
|
||||||
"world_name": server_name,
|
"world_name": server_name,
|
||||||
"world_size": Stats.get_world_size(server_path),
|
"world_size": self.server_size,
|
||||||
"server_port": server_port,
|
"server_port": server_port,
|
||||||
"int_ping_results": int_data,
|
"int_ping_results": int_data,
|
||||||
"online": False,
|
"online": False,
|
||||||
|
@ -636,7 +636,9 @@ class TasksManager:
|
|||||||
logger.error(f"Task failed with error: {event.exception}")
|
logger.error(f"Task failed with error: {event.exception}")
|
||||||
|
|
||||||
def start_stats_recording(self):
|
def start_stats_recording(self):
|
||||||
stats_update_frequency = self.helper.get_setting("stats_update_frequency")
|
stats_update_frequency = self.helper.get_setting(
|
||||||
|
"stats_update_frequency_seconds"
|
||||||
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Stats collection frequency set to {stats_update_frequency} seconds"
|
f"Stats collection frequency set to {stats_update_frequency} seconds"
|
||||||
)
|
)
|
||||||
|
@ -576,6 +576,8 @@ class AjaxHandler(BaseHandler):
|
|||||||
return
|
return
|
||||||
|
|
||||||
elif page == "update_server_dir":
|
elif page == "update_server_dir":
|
||||||
|
if self.helper.dir_migration:
|
||||||
|
return
|
||||||
for server in self.controller.servers.get_all_servers_stats():
|
for server in self.controller.servers.get_all_servers_stats():
|
||||||
if server["stats"]["running"]:
|
if server["stats"]["running"]:
|
||||||
self.helper.websocket_helper.broadcast_user(
|
self.helper.websocket_helper.broadcast_user(
|
||||||
|
@ -185,7 +185,8 @@
|
|||||||
"start-error": "Server {} failed to start with error code: {}",
|
"start-error": "Server {} failed to start with error code: {}",
|
||||||
"terribleFailure": "What a Terrible Failure!",
|
"terribleFailure": "What a Terrible Failure!",
|
||||||
"superError": "You must be a super user to complete this action.",
|
"superError": "You must be a super user to complete this action.",
|
||||||
"fileError": "File type must be an image."
|
"fileError": "File type must be an image.",
|
||||||
|
"migration": "Crafty's main server storage is being mirgated to a new location. All server starts have been suspended during this time. Please wait while we finish this migration"
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"allRightsReserved": "All rights reserved",
|
"allRightsReserved": "All rights reserved",
|
||||||
|
Loading…
Reference in New Issue
Block a user