mongo/bazel/wrapper_hook/engflow_check.py

83 lines
2.2 KiB
Python

import os
import pathlib
import platform
import sys
import time
REPO_ROOT = str(pathlib.Path(__file__).parent.parent.parent)
sys.path.append(REPO_ROOT)
from bazel.wrapper_hook.wrapper_debug import wrapper_debug
def get_terminal_stream(fd_env_var: str):
"""Return a Python file object for the original terminal FD."""
fd_str = os.environ.get(fd_env_var)
if not fd_str:
return None
# Handle Windows CON device
if fd_str == "CON":
# On Windows, open CON device for console output
# Use the appropriate stream based on the variable name
if "STDOUT" in fd_env_var:
try:
return open("CON", "w", buffering=1)
except (OSError, IOError):
return None
elif "STDERR" in fd_env_var:
try:
return open("CON", "w", buffering=1)
except (OSError, IOError):
return None
return None
# Handle Unix file descriptors
if fd_str.isdigit():
fd = int(fd_str)
try:
return os.fdopen(fd, "w", buffering=1)
except (OSError, ValueError):
return None
return None
def setup_auth_wrapper():
from buildscripts.bazel_rules_mongo.engflow_auth.engflow_auth import setup_auth
term_out = get_terminal_stream("MONGO_WRAPPER_STDOUT_FD")
term_err = get_terminal_stream("MONGO_WRAPPER_STDERR_FD")
# Save current stdout/stderr
old_stdout = sys.stdout
old_stderr = sys.stderr
try:
if term_out:
sys.stdout = term_out
if term_err:
sys.stderr = term_err
setup_auth(verbose=False)
finally:
# Restore original stdout/stderr to whatever wrapper has
sys.stdout = old_stdout
sys.stderr = old_stderr
def engflow_auth(args):
start = time.time()
args_str = " ".join(args)
if (
"--config=local" not in args_str
and "--config=public-release" not in args_str
and "--config local" not in args_str
and "--config public-release" not in args_str
):
if os.environ.get("CI") is None and platform.machine().lower() not in {"ppc64le", "s390x"}:
setup_auth_wrapper()
wrapper_debug(f"engflow auth time: {time.time() - start}")