diff --git a/src/software/thunderscope/binary_context_managers/full_system.py b/src/software/thunderscope/binary_context_managers/full_system.py index 8e8abc4e48..a42d13fb81 100644 --- a/src/software/thunderscope/binary_context_managers/full_system.py +++ b/src/software/thunderscope/binary_context_managers/full_system.py @@ -2,9 +2,11 @@ import logging import os +import subprocess import threading import time from subprocess import Popen, TimeoutExpired +import re from software.py_constants import * from software.python_bindings import * @@ -53,6 +55,21 @@ def __init__( self.log_level = log_level self.thread = threading.Thread(target=self.__restart__, daemon=True) + def discover_supported_flags(self, path_to_binary: str) -> set[str]: + """Discover what binary flags are supported by provided binary + + :param path_to_binary path to specific binary + :return a set of supported flags + """ + try: + result = subprocess.run( + [path_to_binary, "--help"], capture_output=True, text=True, timeout=3 + ) + flags = re.findall(r"--(\w+)", result.stdout) + return set(flags) + except (subprocess.TimeoutExpired, FileNotFoundError, PermissionError): + return set() + def __enter__(self) -> FullSystem: """Enter the full_system context manager. @@ -69,13 +86,31 @@ def __enter__(self) -> FullSystem: except: pass - self.full_system = "{} --runtime_dir={} {} {} --log_level={}".format( - self.path_to_binary, - self.full_system_runtime_dir, - "--friendly_colour_yellow" if self.friendly_colour_yellow else "", - "--ci" if not self.running_in_realtime else "", - self.log_level.value, - ) + supported_flags = self.discover_supported_flags(self.path_to_binary) + + cmd_parts = [self.path_to_binary] + # runtime_dir is always required (core functionality) + cmd_parts.append("--runtime_dir={}".format(self.full_system_runtime_dir)) + + # Optional flags - only add if supported + if self.friendly_colour_yellow and "friendly_colour_yellow" in supported_flags: + cmd_parts.append("--friendly_colour_yellow") + if not self.running_in_realtime and "ci" in supported_flags: + cmd_parts.append("--ci") + if "log_level" in supported_flags: + cmd_parts.append("--log_level={}".format(self.log_level.value)) + + # Log supported flags info based on importance level + if supported_flags: + logging.debug("Binary support flags: {}".format(supported_flags)) + else: + logging.warning( + "Could not discover flags for path: '{}'. Continuing...".format( + self.path_to_binary + ) + ) + + self.full_system = " ".join(cmd_parts) if self.should_run_under_sudo: if not is_cmd_running(