Skip to content

Commit 5f48a87

Browse files
committed
Add settings validation at startup
Added validation to check mandatory settings are set and verify the Palworld server executable exists before the application starts. This prevents runtime errors from missing configuration. The validation checks for required settings like server executable path and admin password, and conditionally validates web password when the web server is enabled. It also verifies that the server executable file actually exists at the specified path. Refactored test code to use a reusable utility method for creating temporary server executable files, making the tests cleaner and more maintainable.
1 parent 12fe44f commit 5f48a87

3 files changed

Lines changed: 220 additions & 67 deletions

File tree

src/main.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,15 @@
3737
# read settings if settings.json exists
3838
settings_path = os.path.join(os.path.dirname(__file__), "settings.json")
3939
settings.readSettings(settings_path)
40-
40+
41+
# Validate settings at startup
42+
try:
43+
settings.validate_settings()
44+
except ValueError as e:
45+
logging.error(f"Settings validation failed: {e}")
46+
logging.error("Please fix the settings and try again.")
47+
exit(1)
48+
4149
# Create instances of managers
4250
auto_start_manager = None
4351

@@ -53,18 +61,18 @@
5361
exit()
5462

5563
palworld_controller = PalWorldController(client)
56-
64+
5765
# Start the background server info update thread only if server is running
5866
server_running = palworld_controller.is_palworld_process_running()
5967
if server_running:
6068
palworld_controller.start_server_info_update_thread()
6169

6270
if not server_running and settings.autoStart:
6371
auto_start_manager = AutoStartManager(palworld_controller)
64-
72+
6573
palworld_controller.set_on_server_started_callback(auto_start_manager.stop_listen_thread)
6674
palworld_controller.set_on_server_stopped_callback(auto_start_manager.listen_palworld_access)
67-
75+
6876
auto_start_manager.listen_palworld_access()
6977

7078
if settings.useWebServer:

src/settings.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ def __setitem__(self, key, value):
9292

9393
def readSettings(self, file_path):
9494
file_data = None
95-
file_loaded = False
96-
95+
9796
try:
9897
with open(file_path, 'r') as file:
9998
file_data = json.load(file)
@@ -114,7 +113,7 @@ def readSettings(self, file_path):
114113
if not self.settings.get('sessionSecretKey'):
115114
self.settings['sessionSecretKey'] = secrets.token_hex(32)
116115
setattr(self, 'sessionSecretKey', self.settings['sessionSecretKey'])
117-
116+
118117
# Save the generated key back to the settings file
119118
try:
120119
with open(file_path, 'r') as file:
@@ -126,10 +125,36 @@ def readSettings(self, file_path):
126125
except Exception as e:
127126
logging.warning(f"Could not save auto-generated sessionSecretKey to file: {e}")
128127

129-
# Validation: ensure no setting is None (excluding sessionSecretKey which is auto-generated)
130-
missing = [k for k, v in self.settings.items() if v is None]
131-
if missing:
132-
raise ValueError(f"The following settings areq REQUIRED: {missing}")
128+
def validate_settings(self):
129+
"""Validate that mandatory settings are set and server executable exists.
130+
131+
Raises:
132+
ValueError: If mandatory settings are missing or server executable doesn't exist.
133+
"""
134+
errors = []
135+
136+
# Check mandatory settings
137+
if not self.settings.get('palworldServerExePath'):
138+
errors.append("palworldServerExePath is required")
139+
140+
if not self.settings.get('palworldServerAdminPassword'):
141+
errors.append("palworldServerAdminPassword is required")
142+
143+
# Check webPassword only if web server is enabled
144+
if self.settings.get('useWebServer', True) and not self.settings.get('webPassword'):
145+
errors.append("webPassword is required when useWebServer is enabled")
146+
147+
# Check that server executable exists
148+
server_exe_path = self.settings.get('palworldServerExePath')
149+
if server_exe_path:
150+
if not os.path.exists(server_exe_path):
151+
errors.append(f"Palworld server executable does not exist at: {server_exe_path}")
152+
elif not os.path.isfile(server_exe_path):
153+
errors.append(f"Palworld server path is not a file: {server_exe_path}")
154+
155+
if errors:
156+
error_message = "Settings validation failed:\n" + "\n".join(f" - {error}" for error in errors)
157+
raise ValueError(error_message)
133158

134159
def get_git_hash(self):
135160
"""Return the current git commit hash.

0 commit comments

Comments
 (0)