aboutsummaryrefslogtreecommitdiff
path: root/src/remote/host.rs
diff options
context:
space:
mode:
authorJJ Liebig <jonathan.liebig@gmail.com>2026-09-08 23:08:42 +0200
committerGitHub <noreply@github.com>2026-09-09 00:08:42 +0300
commit8996fc54fe4596368a1677821b1a390a70c56ab0 (patch)
tree65ff0293a3ee17b4acc50539bff382388abaf927 /src/remote/host.rs
parent68c7b78ec237034cbb0e21c8666842ed7991641d (diff)
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 <ogulcancelik@gmail.com>
Diffstat (limited to 'src/remote/host.rs')
-rw-r--r--src/remote/host.rs46
1 files changed, 46 insertions, 0 deletions
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))
+}