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)")