hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

commit c89a8187e0046e1aafcd88e43b4738971dfe9dbd
parent 2a42015ff814340eff87a27569fe93c1c0f52a53
Author: triesap <tyson@radroots.org>
Date:   Wed,  8 Apr 2026 22:23:18 +0000

stdio: harden hyf internal diagnostics sink

Diffstat:
Asrc/hyf_stdio/diagnostics.mojo | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/hyf_stdio/server.mojo | 33++++++++++++---------------------
Mtests/test_hyf.mojo | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtests/test_stdio_contract.mojo | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 217 insertions(+), 21 deletions(-)

diff --git a/src/hyf_stdio/diagnostics.mojo b/src/hyf_stdio/diagnostics.mojo @@ -0,0 +1,65 @@ +from std.ffi import c_int, external_call +from std.os import getenv, makedirs +from std.pathlib import Path +from std.tempfile import gettempdir + + +comptime _HYF_DIAGNOSTICS_DIR_ENV = "HYF_DIAGNOSTICS_DIR" +comptime _HYF_DIAGNOSTICS_DIR_NAME = "hyf-diagnostics" +comptime _HYF_DIAGNOSTICS_FILE_PREFIX = "hyf-internal-error-pid-" +comptime _HYF_DIAGNOSTICS_FILE_SUFFIX = ".log" +comptime _HYF_DIAGNOSTICS_DIR_MODE = 0o700 +comptime _HYF_DIAGNOSTICS_FILE_MODE = 0o600 + + +def _current_process_id() -> Int: + return Int(external_call["getpid", c_int]()) + + +def _ensure_directory_mode(path: Path): + var path_str = path.__fspath__() + _ = external_call["chmod", c_int]( + path_str.as_c_string_slice().unsafe_ptr(), + c_int(_HYF_DIAGNOSTICS_DIR_MODE), + ) + + +def _ensure_file_mode(handle: Int): + _ = external_call["fchmod", c_int]( + c_int(handle), c_int(_HYF_DIAGNOSTICS_FILE_MODE) + ) + + +def _default_diagnostics_dir() raises -> Path: + var tmpdir = gettempdir() + if tmpdir: + return Path(tmpdir.value()) / _HYF_DIAGNOSTICS_DIR_NAME + return Path("/tmp") / _HYF_DIAGNOSTICS_DIR_NAME + + +def _diagnostics_dir() raises -> Path: + var configured = getenv(_HYF_DIAGNOSTICS_DIR_ENV, "") + if configured != "": + return Path(configured) + return _default_diagnostics_dir() + + +def _diagnostic_log_path() raises -> Path: + var diagnostics_dir = _diagnostics_dir() + makedirs(diagnostics_dir, mode=_HYF_DIAGNOSTICS_DIR_MODE, exist_ok=True) + _ensure_directory_mode(diagnostics_dir) + return diagnostics_dir / ( + _HYF_DIAGNOSTICS_FILE_PREFIX + + String(_current_process_id()) + + _HYF_DIAGNOSTICS_FILE_SUFFIX + ) + + +def append_internal_diagnostic(line: String): + try: + var log_path = _diagnostic_log_path() + with open(log_path, "a") as log_file: + _ensure_file_mode(log_file.handle) + log_file.write(line) + except: + pass diff --git a/src/hyf_stdio/server.mojo b/src/hyf_stdio/server.mojo @@ -1,7 +1,5 @@ from std.collections import Optional from std.io.io import _fdopen -from std.os import getenv -from std.pathlib import Path from std.sys import stdin from mojson import Value @@ -21,6 +19,7 @@ from hyf_stdio.codec import ( ) from hyf_stdio.control.capabilities import build_capabilities_output from hyf_stdio.control.status import build_status_output +from hyf_stdio.diagnostics import append_internal_diagnostic from hyf_stdio.envelope import ( WireErrorResponse, WireRequest, @@ -80,11 +79,6 @@ def _write_success(response: WireSuccessResponse) raises: def _diagnostic_value(value: String) -> String: return value.replace("\n", "\\n").replace("\r", "\\r") - -def _internal_diagnostic_path() -> Path: - return Path(getenv("TMPDIR", "/tmp")) / "hyf-internal-error.log" - - def _diagnostic_trace_id(trace_id: Optional[String]) -> String: if trace_id: return _diagnostic_value(String(trace_id.value())) @@ -97,20 +91,17 @@ def _emit_internal_diagnostic( capability: String, detail: String, ): - try: - _internal_diagnostic_path().write_text( - "hyf_internal_error request_id=\"" - + _diagnostic_value(request_id) - + "\" trace_id=\"" - + _diagnostic_trace_id(trace_id) - + "\" capability=\"" - + _diagnostic_value(capability) - + "\" detail=\"" - + _diagnostic_value(detail) - + "\"\n" - ) - except: - pass + append_internal_diagnostic( + "hyf_internal_error request_id=\"" + + _diagnostic_value(request_id) + + "\" trace_id=\"" + + _diagnostic_trace_id(trace_id) + + "\" capability=\"" + + _diagnostic_value(capability) + + "\" detail=\"" + + _diagnostic_value(detail) + + "\"\n" + ) def _wire_error_from_core_failure( diff --git a/tests/test_hyf.mojo b/tests/test_hyf.mojo @@ -1,3 +1,5 @@ +import std.os +from std.os.path import exists from std.pathlib import Path, _dir_of_current_file from std.testing import ( TestSuite, @@ -5,6 +7,7 @@ from std.testing import ( assert_raises, assert_true, ) +from std.tempfile import TemporaryDirectory from mojson import Value, loads @@ -27,6 +30,29 @@ from hyf_stdio.server import ( comptime _EXPECTED_INTERNAL_ERROR_MESSAGE = ( "internal hyf daemon error; inspect local diagnostics" ) +comptime _HYF_DIAGNOSTICS_DIR_ENV = "HYF_DIAGNOSTICS_DIR" + + +struct ScopedEnvVar: + var name: String + var value: String + var previous: String + var had_previous: Bool + + def __init__(out self, name: String, value: String): + self.name = String(name) + self.value = String(value) + self.previous = std.os.getenv(name) + self.had_previous = self.previous != "" + + def __enter__(mut self) raises: + _ = std.os.setenv(self.name, self.value, overwrite=True) + + def __exit__(mut self): + if self.had_previous: + _ = std.os.setenv(self.name, self.previous, overwrite=True) + else: + _ = std.os.unsetenv(self.name) def _dispatch(line: String) raises -> Value: @@ -716,5 +742,49 @@ def test_internal_error_is_bounded_on_wire() raises: ) +def test_internal_error_diagnostics_append_per_process() raises: + with TemporaryDirectory() as temp_dir: + var diagnostics_dir = Path(temp_dir) / "hyf-internal-diagnostics" + + with ScopedEnvVar( + _HYF_DIAGNOSTICS_DIR_ENV, diagnostics_dir.__fspath__() + ): + _ = loads( + handle_request_line_with_control_builders[ + _failing_status_output, build_capabilities_output + ]( + '{"version":1,"request_id":"status-internal-diag-1","trace_id":"trace-status-internal-diag-1","capability":"sys.status","input":{}}' + ) + ) + _ = loads( + handle_request_line_with_control_builders[ + _failing_status_output, build_capabilities_output + ]( + '{"version":1,"request_id":"status-internal-diag-2","trace_id":"trace-status-internal-diag-2","capability":"sys.status","input":{}}' + ) + ) + + assert_true(exists(diagnostics_dir)) + var entries = std.os.listdir(diagnostics_dir) + assert_equal(len(entries), 1) + assert_true(entries[0].startswith("hyf-internal-error-pid-")) + + var content = (diagnostics_dir / entries[0]).read_text() + var lines = content.splitlines() + assert_equal(len(lines), 2) + assert_true( + content.find('request_id="status-internal-diag-1"') >= 0 + ) + assert_true( + content.find('request_id="status-internal-diag-2"') >= 0 + ) + assert_true( + content.find( + 'detail="simulated test-only status builder failure"' + ) + >= 0 + ) + + def main() raises: TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/test_stdio_contract.mojo b/tests/test_stdio_contract.mojo @@ -1,7 +1,11 @@ +import std.os from std.os import Pipe, Process +from std.os.path import exists +from std.pathlib import Path from std.testing import assert_equal, assert_true, TestSuite from std.ffi import CStringSlice, c_int, external_call from std.sys._libc import close, exit, vfork +from std.tempfile import TemporaryDirectory from mojson import Value, loads @@ -9,6 +13,29 @@ from mojson import Value, loads comptime _EXPECTED_INTERNAL_ERROR_MESSAGE = ( "internal hyf daemon error; inspect local diagnostics" ) +comptime _HYF_DIAGNOSTICS_DIR_ENV = "HYF_DIAGNOSTICS_DIR" + + +struct ScopedEnvVar: + var name: String + var value: String + var previous: String + var had_previous: Bool + + def __init__(out self, name: String, value: String): + self.name = String(name) + self.value = String(value) + self.previous = std.os.getenv(name) + self.had_previous = self.previous != "" + + def __enter__(mut self) raises: + _ = std.os.setenv(self.name, self.value, overwrite=True) + + def __exit__(mut self): + if self.had_previous: + _ = std.os.setenv(self.name, self.previous, overwrite=True) + else: + _ = std.os.unsetenv(self.name) def _dup2(oldfd: c_int, newfd: c_int) -> c_int: @@ -222,5 +249,48 @@ def test_internal_error_is_bounded_on_wire() raises: ) +def test_internal_error_records_detail_in_explicit_diagnostics_dir() raises: + with TemporaryDirectory() as temp_dir: + var diagnostics_dir = Path(temp_dir) / "hyf-internal-diagnostics" + with ScopedEnvVar( + _HYF_DIAGNOSTICS_DIR_ENV, diagnostics_dir.__fspath__() + ): + var response = _run_entrypoint( + "tests/internal_error_stdio_main.mojo", + '{"version":1,"request_id":"status-internal-proc-diag-1","trace_id":"trace-status-internal-proc-diag-1","capability":"sys.status","input":{}}', + ) + + assert_true(not response["ok"].bool_value()) + assert_equal( + response["error"]["code"].string_value(), + "internal_error", + ) + assert_true(exists(diagnostics_dir)) + + var entries = std.os.listdir(diagnostics_dir) + assert_equal(len(entries), 1) + assert_true(entries[0].startswith("hyf-internal-error-pid-")) + + var content = (diagnostics_dir / entries[0]).read_text() + assert_true( + content.find( + 'request_id="status-internal-proc-diag-1"' + ) + >= 0 + ) + assert_true( + content.find( + 'trace_id="trace-status-internal-proc-diag-1"' + ) + >= 0 + ) + assert_true( + content.find( + 'detail="simulated test-only status builder failure"' + ) + >= 0 + ) + + def main() raises: TestSuite.discover_tests[__functions_in_module()]().run()