From 8996fc54fe4596368a1677821b1a390a70c56ab0 Mon Sep 17 00:00:00 2001 From: JJ Liebig Date: Tue, 8 Sep 2026 23:08:42 +0200 Subject: fix: support preinstalled windows remote hosts (#3661) * fix: support windows hosts in saved ssh machines refs #3651 * fix: keep windows ssh bridge writes blocking refs #3651 * fix: close saved windows ssh bootstrap input refs #3651 * refactor: simplify remote bridge helpers refs #3651 * refactor: isolate remote bridge platform behavior refs #3651 * fix: close captured ssh input under windows consoles refs #3651 * test: remove redundant remote command assertions refs #3651 refs #3701 * test: handle framed ssh commands in machine setup refs #3651 --------- Co-authored-by: Ogulcan Celik --- src/remote/host.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/remote/host.rs (limited to 'src/remote/host.rs') diff --git a/src/remote/host.rs b/src/remote/host.rs new file mode 100644 index 00000000..1ff6d1e5 --- /dev/null +++ b/src/remote/host.rs @@ -0,0 +1,46 @@ +//! Remote-host side of the SSH stdio bridge. + +use std::io; +use std::time::Duration; + +pub(crate) fn run_remote_client_bridge() -> io::Result<()> { + ensure_remote_server_running()?; + + let socket_path = crate::server::socket_paths::client_socket_path(); + let stream = crate::ipc::connect_local_stream(&socket_path).map_err(|err| { + io::Error::new( + err.kind(), + format!( + "failed to connect to remote Herdr client socket {}: {err}", + socket_path.display() + ), + ) + })?; + + crate::platform::forward_remote_bridge_stdio(stream) +} + +fn ensure_remote_server_running() -> io::Result<()> { + let socket_path = crate::server::socket_paths::client_socket_path(); + if crate::server::autodetect::is_server_listening() { + let status = crate::api::read_runtime_status_at( + &crate::api::socket_path(), + Duration::from_millis(500), + )? + .ok_or_else(|| io::Error::other("remote server status API is unavailable"))?; + if status + .capabilities + .as_ref() + .and_then(|capabilities| capabilities.endpoint_protocol_generation) + == Some(crate::protocol::endpoint::ENDPOINT_PROTOCOL_GENERATION) + { + return Ok(()); + } + return Err(io::Error::other( + "remote herdr server needs one final update before this bridge can attach; rerun `herdr --remote` from an interactive terminal to approve it", + )); + } + + crate::server::autodetect::spawn_server_daemon()?; + crate::server::autodetect::wait_for_server_socket(&socket_path, Duration::from_secs(5)) +} -- cgit v1.2.3