File size: 4,693 Bytes
2f3c093
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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)")