Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 *
Expand Down Expand Up @@ -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.

Expand All @@ -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(
Expand Down