From bfad69f99dffc5b0fecab794d0b9ec17e0e9236c Mon Sep 17 00:00:00 2001 From: Nate Harris Date: Tue, 30 Apr 2024 14:51:32 -0600 Subject: [PATCH 1/2] - Print pre-parsed config (input file) on boot - Print post-parsed config (in-memory settings) on boot --- modules/settings/config_parser.py | 9 +++++---- modules/utils.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/modules/settings/config_parser.py b/modules/settings/config_parser.py index 3eb359a..0f81c48 100644 --- a/modules/settings/config_parser.py +++ b/modules/settings/config_parser.py @@ -458,6 +458,8 @@ def __init__(self, config_path: str, **docker_kwargs): self.yaml_data = yaml.load(open(config_path), Loader=yaml.FullLoader) self.json_data = json.loads(json.dumps(self.yaml_data, indent=4)) + logging.debug(f"Parsing config data:\n{utils.pretty_print_json(json_data=self.json_data)}") + start = ConfigSection(data=self.json_data) self.tautulli = TautulliConfig(data=start.get_subsection_data(key="Tautulli")).to_model() @@ -467,6 +469,8 @@ def __init__(self, config_path: str, **docker_kwargs): self.stats = StatsConfig(data=start.get_subsection_data(key="Stats")).to_model() self.run_args = RunArgsConfig(data=docker_kwargs).to_model() + logging.debug(f"Config loaded. Using the following settings:\n{self.__repr__()}") + def as_json(self) -> dict: return { "Tautulli": self.tautulli.as_dict(), @@ -481,7 +485,4 @@ def as_yaml(self) -> str: return yaml.dump(self.as_json(), default_flow_style=False, sort_keys=False) def __repr__(self) -> str: - return self.as_yaml() - - def print(self) -> str: - return self.as_yaml() + return utils.pretty_print_json(self.as_json(), sort=True) diff --git a/modules/utils.py b/modules/utils.py index a69113a..8052619 100644 --- a/modules/utils.py +++ b/modules/utils.py @@ -1,3 +1,4 @@ +import json from datetime import datetime, timedelta from typing import Optional, Any from urllib.parse import quote_plus @@ -5,6 +6,20 @@ from pytz import timezone +def pretty_print_json(json_data: dict, sort: bool = False) -> str: + """ + Return a pretty printed JSON string + + :param json_data: JSON data to pretty print + :type json_data: dict + :param sort: (Optional) sort the keys in the JSON data + :type sort: bool, optional + :return: pretty printed JSON string + :rtype: str + """ + return json.dumps(json_data, indent=4, sort_keys=sort) + + def make_plural(word, count: int, suffix_override: str = 's') -> str: if count > 1: return f"{word}{suffix_override}" From 1017de09901ca3e9913e812964cbefd229d87f01 Mon Sep 17 00:00:00 2001 From: Nate Harris Date: Tue, 30 Apr 2024 15:14:50 -0600 Subject: [PATCH 2/2] - Reroute Pydantic validation errors during config parsing to avoid endless rebooting --- run.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/run.py b/run.py index c131ca9..e7d0f4f 100644 --- a/run.py +++ b/run.py @@ -1,6 +1,8 @@ import argparse import os +from pydantic import ValidationError as PydanticValidationError + import modules.logs as logging import modules.tautulli.tautulli_connector as tautulli from consts import ( @@ -21,7 +23,7 @@ from modules.discord.services.slash_commands import SlashCommandManager from modules.discord.services.tagged_message import TaggedMessagesManager from modules.emojis import EmojiManager -from modules.errors import determine_exit_code, TauticordMigrationFailure +from modules.errors import determine_exit_code, TauticordMigrationFailure, TauticordSetupFailure from modules.settings.config_parser import Config from modules.statics import ( splash_logo, @@ -88,7 +90,10 @@ def set_up_configuration() -> Config: KEY_RUN_ARGS_CONFIG_PATH: config_directory, KEY_RUN_ARGS_LOG_PATH: args.log, } - return Config(config_path=f"{args.config}", **kwargs) + try: + return Config(config_path=f"{args.config}", **kwargs) + except PydanticValidationError as e: # Redirect Pydantic validation errors during config parsing + raise TauticordSetupFailure(f"Configuration error: {e}") @run_with_potential_exit_on_error