From d608b3aa69a4c559853598e8f2fa89c3777ab543 Mon Sep 17 00:00:00 2001 From: Zarithas Date: Mon, 20 Oct 2025 10:12:09 -0400 Subject: [PATCH] Pushing to save temp changes while i fix the bug found in RC --- AirlockTools_Client.py | 8 ++--- IRT_icon_32-512.ico | Bin 0 -> 21181 bytes flows/otp.py | 2 +- flows/prepPolicy.py | 2 +- flows/quietAgent.py | 4 +-- models/execution.py | 2 +- services/agenthandler.py | 2 +- utils/menus.py | 4 +-- utils/setup.py | 72 ++++++++++++++++++++++++++------------- 9 files changed, 61 insertions(+), 35 deletions(-) create mode 100644 IRT_icon_32-512.ico diff --git a/AirlockTools_Client.py b/AirlockTools_Client.py index e881a2d..e1bf1cb 100644 --- a/AirlockTools_Client.py +++ b/AirlockTools_Client.py @@ -36,7 +36,7 @@ import utils.menus as menus from services.API import AirlockAPIWrapper from services.security import getAPI from services.TaskQueue import AsyncTaskQueue -from utils.setup import setup +from utils.setup import setup, get_base_directory urllib3.disable_warnings( urllib3.exceptions.InsecureRequestWarning @@ -46,10 +46,10 @@ urllib3.disable_warnings( async def main(): #Determine working directory, setup directory, configure logging, sent env, get API and URL if not already stored - working_dir = await setup() + await setup() + base_dir = get_base_directory() logger = logging.getLogger(__name__) - logger.debug("🔍 Logging test: this should appear in both console and file.") - dotenv.load_dotenv(dotenv_path=working_dir / ".env") + dotenv.load_dotenv(dotenv_path=base_dir / ".env") queue = AsyncTaskQueue(worker_count = 3) await queue.start_workers() diff --git a/IRT_icon_32-512.ico b/IRT_icon_32-512.ico new file mode 100644 index 0000000000000000000000000000000000000000..103b72ef73c7c58a81ad42b075aad1a626c2402f GIT binary patch literal 21181 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 a82 Path: else: return home / '.local' / 'share' / "AirlockTools" + + + +def get_system_config_path() -> Path: + base_path = Path(getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))) + return base_path.parent / "system_config.json" + + def configure_logging(log_dir: Path, log_level: str = "DEBUG"): log_file = log_dir / "airlocktools.log" logger = logging.getLogger() - logger.setLevel(getattr(logging, log_level.upper(), logging.DEBUG)) - + # Always allow all messages to propagate to handlers + logger.setLevel(logging.DEBUG) + + # Set httpx logger to DEBUG as well httpx_logger = logging.getLogger("httpx") - httpx_logger.setLevel(getattr(logging, log_level.upper(), logging.DEBUG)) - + httpx_logger.setLevel(logging.DEBUG) + # Remove existing handlers for handler in logger.handlers[:]: logger.removeHandler(handler) + # File handler always logs DEBUG and above file_handler = logging.handlers.RotatingFileHandler( log_file, maxBytes=5_000_000, backupCount=5, encoding='utf-8' ) - file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + file_handler.setLevel(logging.DEBUG) + file_handler.setFormatter(logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + )) logger.addHandler(file_handler) + # Console handler respects the configured log level console_handler = logging.StreamHandler() + console_handler.setLevel(getattr(logging, log_level.upper(), logging.INFO)) console_handler.setFormatter(logging.Formatter('%(levelname)s - %(message)s')) logger.addHandler(console_handler) + # Optional Windows Event Log handler if platform.system() == "Windows": try: event_handler = logging.handlers.NTEventLogHandler("AirlockTools") @@ -56,40 +73,50 @@ def configure_logging(log_dir: Path, log_level: str = "DEBUG"): logger.debug("✅ Logging configured.") -def get_system_config_path() -> Path: - base_path = Path(getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))) - return base_path.parent / "system_config.json" def load_system_config() -> dict: + default_config = { + "APPNAME": "AirlockTools", + "LOG_LEVEL": "DEBUG", + "PATH_EXCLUSION_CONST": 4, + "MIN_FILES_FOR_PATH": 4, + "VT_THREAT_TOLERANCE": 4, + "EXTRAS": "NOTTODAY", + "POLICY_MAP_ENF_AUD": { + "enforced_id": "audit_id" + } + } + try: config_path = get_system_config_path() with open(config_path, "r") as f: return json.load(f) except FileNotFoundError: logging.warning("⚠️ system_config.json not found. Using built-in defaults.") - return { - "APPNAME": "AirlockTools", - "LOG_LEVEL": "DEBUG", - "PATH_EXCLUSION_CONST": 4, - "MIN_FILES_FOR_PATH": 4, - "VT_THREAT_TOLERANCE": 4, - "POLICY_MAP_ENF_AUD": { - "enforced_id": "audit_id" - } - } + except json.JSONDecodeError as e: + logging.error(f"❌ Failed to parse system_config.json: {e}") + + return default_config + def load_user_config(config_dir: Path) -> dict: user_config_path = config_dir / "user_config.json" if not user_config_path.exists(): default_user_config = { "URL": "", - "LOG_LEVEL": "INFO" + "LOG_LEVEL": "INFO", + "EXTRAS" : "NOTTODAY" } with open(user_config_path, "w") as f: json.dump(default_user_config, f, indent=4) logging.debug(f"Created user config at {user_config_path}") - with open(user_config_path, "r") as f: - return json.load(f) + try: + with open(user_config_path, "r") as f: + return json.load(f) + except json.JSONDecodeError as e: + logging.error(f"❌ Failed to parse user_config.json: {e}") + return {} + def write_config_to_env(config: dict, env_path: Path): for key, value in config.items(): @@ -101,7 +128,7 @@ def write_config_to_env(config: dict, env_path: Path): except Exception as e: logging.warning(f"Failed to write {key} to .env: {e}") -async def setup() -> Path: +async def setup(): base_dir = get_base_directory() dirs = { 'config': base_dir / 'config', @@ -158,4 +185,3 @@ async def setup() -> Path: logging.debug(f"Service URL set to: {url}") write_config_to_env(merged_config, env_path) - return working_dir \ No newline at end of file