| import logging | |
| import json | |
| from enum import Enum | |
| class SettingType(Enum): | |
| STRING = "string" | |
| INTEGER = "integer" | |
| BOOLEAN = "boolean" | |
| FLOAT = "float" | |
| LIST = "list" | |
| DICT = "dict" | |
| class SettingsManager: | |
| def __init__(self, logger: logging.Logger, default_source: str = None): | |
| self.logger = logger | |
| self.settings = self._load_default_settings(default_source) | |
| def _load_default_settings(self, source: str = None) -> dict: | |
| if source is None: | |
| self.logger.info("Loading built-in default settings.") | |
| return { | |
| "general": { | |
| "log_level": {"value": "INFO", "description": "Logging level", "type": SettingType.STRING, "category": "General", "read_only": False, "placeholder": "INFO, DEBUG, WARNING, ERROR, CRITICAL"}, | |
| "api_key": {"value": "", "description": "API Key", "type": SettingType.STRING, "category": "General", "read_only": False, "placeholder": "API Key"}, | |
| "timeout": {"value": 10, "description": "Default timeout for requests", "type": SettingType.INTEGER, "category": "General", "read_only": False, "placeholder": "Timeout in seconds"}, | |
| }, | |
| "network": { | |
| "default_interface": {"value": "eth0", "description": "Default network interface", "type": SettingType.STRING, "category": "Network", "read_only": False, "placeholder": "Interface Name"}, | |
| "dns_resolver": {"value": "8.8.8.8", "description": "Default DNS resolver", "type": SettingType.STRING, "category": "Network", "read_only": False, "placeholder": "DNS IP Address"}, | |
| "proxy_rotation_interval": {"value": 60, "description": "Proxy rotation interval", "type": SettingType.INTEGER, "category": "Network", "read_only": False, "placeholder": "Seconds"}, | |
| }, | |
| "file_binding": { | |
| "file_binding_output": {"value": "", "description": "File binding output", "type": SettingType.STRING, "category": "File Binding", "read_only": False, "placeholder": "Output File"}, | |
| "file_binding_icon": {"value": "", "description": "File binding icon", "type": SettingType.STRING, "category": "File Binding", "read_only": False, "placeholder": "Icon File"}, | |
| "file_binding_payload": {"value": "", "description": "File binding payload", "type": SettingType.STRING, "category": "File Binding", "read_only": False, "placeholder": "Payload File"}, | |
| } | |
| } | |
| elif isinstance(source, str): | |
| try: | |
| with open(source, "r") as f: | |
| return json.load(f) | |
| except (FileNotFoundError, json.JSONDecodeError) as e: | |
| self.logger.error(f"Error loading default settings from {source}: {e}, using built-in defaults") | |
| return self._load_default_settings(None) | |
| else: | |
| self.logger.error(f"Invalid default settings source: {source}, using built-in defaults") | |
| return self._load_default_settings(None) | |
| def get_settings(self) -> dict: | |
| return self.settings | |
| def get_setting(self, category: str, key: str) -> Any: | |
| if category in self.settings and key in self.settings[category]: | |
| return self.settings[category][key]["value"] | |
| else: | |
| self.logger.warning(f"Setting not found: {category}.{key}") | |
| return None | |
| def set_setting(self, category: str, key: str, value: Any): | |
| if category in self.settings and key in self.settings[category]: | |
| self.settings[category][key]["value"] = value | |
| self.logger.info(f"Set setting {category}.{key} to {value}") | |
| else: | |
| self.logger.warning(f"Setting not found: {category}.{key}") | |
| def save_settings(self, filepath: str): | |
| try: | |
| with open(filepath, "w") as f: | |
| json.dump(self.settings, f, indent=4) | |
| self.logger.info(f"Settings saved to {filepath}") | |
| except Exception as e: | |
| self.logger.error(f"Error saving settings to {filepath}: {e}") | |
| def display_settings(self): | |
| for category, settings in self.settings.items(): | |
| self.logger.info(f"--- {category} ---") | |
| for key, setting_data in settings.items(): | |
| self.logger.info(f" {key}: {setting_data}") | |
| def sanitize_local_logs(self): | |
| self.logger.info("Sanitizing local logs (implementation pending)") | |
| def sanitize_remote_logs(self): | |
| self.logger.info("Sanitizing remote logs (implementation pending)") | |