diff --git a/src/bin/dosh-client.rs b/src/bin/dosh-client.rs index 1a1fc1c..7cdf62e 100644 --- a/src/bin/dosh-client.rs +++ b/src/bin/dosh-client.rs @@ -486,22 +486,24 @@ async fn main() -> Result<()> { detach_once(&socket, &cred, 2).await?; return Ok(()); } - return run_terminal( - socket, - cred, - Some(target_udp_addr), - Some(frame), - predict, - predict_mode, - escape_key, - startup_command, - config.reconnect_timeout_secs, - Vec::new(), - Vec::new(), - false, - None, - ) - .await; + return trace_terminal_result( + run_terminal( + socket, + cred, + Some(target_udp_addr), + Some(frame), + predict, + predict_mode, + escape_key, + startup_command, + config.reconnect_timeout_secs, + Vec::new(), + Vec::new(), + false, + None, + ) + .await, + ); } Err(err) => { log_debug( @@ -525,22 +527,24 @@ async fn main() -> Result<()> { detach_once(&socket, &cred, 2).await?; return Ok(()); } - return run_terminal( - socket, - cred, - Some(target_udp_addr), - Some(frame), - predict, - predict_mode, - escape_key, - startup_command, - config.reconnect_timeout_secs, - Vec::new(), - Vec::new(), - false, - None, - ) - .await; + return trace_terminal_result( + run_terminal( + socket, + cred, + Some(target_udp_addr), + Some(frame), + predict, + predict_mode, + escape_key, + startup_command, + config.reconnect_timeout_secs, + Vec::new(), + Vec::new(), + false, + None, + ) + .await, + ); } Err(err) => { log_debug( @@ -601,22 +605,24 @@ async fn main() -> Result<()> { detach_once(&socket, &cred, 2).await?; return Ok(()); } - return run_terminal( - socket, - cred, - Some(addr), - Some(frame), - predict, - predict_mode, - escape_key, - startup_command, - config.reconnect_timeout_secs, - local_forwards, - dynamic_forwards, - args.forward_only, - agent_sock, - ) - .await; + return trace_terminal_result( + run_terminal( + socket, + cred, + Some(addr), + Some(frame), + predict, + predict_mode, + escape_key, + startup_command, + config.reconnect_timeout_secs, + local_forwards, + dynamic_forwards, + args.forward_only, + agent_sock, + ) + .await, + ); } Err(err) if !forwarding_requested && auth_allows(&auth_preference, "ssh") => { log_debug( @@ -680,22 +686,24 @@ async fn main() -> Result<()> { detach_once(&socket, &cred, 2).await?; return Ok(()); } - run_terminal( - socket, - cred, - Some(target_udp_addr), - Some(first), - predict, - predict_mode, - escape_key, - startup_command, - config.reconnect_timeout_secs, - Vec::new(), - Vec::new(), - false, - None, + trace_terminal_result( + run_terminal( + socket, + cred, + Some(target_udp_addr), + Some(first), + predict, + predict_mode, + escape_key, + startup_command, + config.reconnect_timeout_secs, + Vec::new(), + Vec::new(), + false, + None, + ) + .await, ) - .await } fn run_trust_command(config: &dosh::config::ClientConfig, args: &Args) -> Result<()> { @@ -6495,6 +6503,13 @@ fn terminal_input_channel() -> (mpsc::Sender>, mpsc::Receiver>) mpsc::channel(STDIN_QUEUE_CAPACITY) } +fn trace_terminal_result(result: Result<()>) -> Result<()> { + if let Err(err) = &result { + dosh::trace::event("client.terminal_error", &[("error", format!("{err:#}"))]); + } + result +} + #[allow(clippy::too_many_arguments)] async fn run_terminal( socket: UdpSocket,