fix: wait for ssh opened before broker stdin
This commit is contained in:
@@ -6,6 +6,7 @@ use base64::Engine;
|
|||||||
use futures_util::{SinkExt, StreamExt};
|
use futures_util::{SinkExt, StreamExt};
|
||||||
use serde_json::{json, Value};
|
use serde_json::{json, Value};
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
|
use tokio::sync::watch;
|
||||||
use tokio_tungstenite::connect_async;
|
use tokio_tungstenite::connect_async;
|
||||||
use tokio_tungstenite::tungstenite::Message;
|
use tokio_tungstenite::tungstenite::Message;
|
||||||
|
|
||||||
@@ -124,11 +125,21 @@ async fn ssh_broker_cli(args: Vec<String>) -> anyhow::Result<()> {
|
|||||||
});
|
});
|
||||||
ws_write.send(Message::Text(open.to_string())).await?;
|
ws_write.send(Message::Text(open.to_string())).await?;
|
||||||
|
|
||||||
|
let (opened_tx, mut opened_rx) = watch::channel(false);
|
||||||
let stdin_eot_on_end = payload
|
let stdin_eot_on_end = payload
|
||||||
.get("stdinEotOnEnd")
|
.get("stdinEotOnEnd")
|
||||||
.and_then(Value::as_bool)
|
.and_then(Value::as_bool)
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
let write_task = tokio::spawn(async move {
|
let write_task = tokio::spawn(async move {
|
||||||
|
// tcp-pool input frames sent before provider-gateway starts the host
|
||||||
|
// SSH process are dropped because the provider has no session yet.
|
||||||
|
if opened_rx
|
||||||
|
.wait_for(|opened| *opened)
|
||||||
|
.await
|
||||||
|
.is_err()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
let mut stdin = tokio::io::stdin();
|
let mut stdin = tokio::io::stdin();
|
||||||
let mut buffer = vec![0_u8; 8192];
|
let mut buffer = vec![0_u8; 8192];
|
||||||
loop {
|
loop {
|
||||||
@@ -207,6 +218,9 @@ async fn ssh_broker_cli(args: Vec<String>) -> anyhow::Result<()> {
|
|||||||
match parsed.get("type").and_then(Value::as_str).unwrap_or("") {
|
match parsed.get("type").and_then(Value::as_str).unwrap_or("") {
|
||||||
"ssh.opened" | "ssh.dispatched" => {
|
"ssh.opened" | "ssh.dispatched" => {
|
||||||
opened = true;
|
opened = true;
|
||||||
|
if parsed.get("type").and_then(Value::as_str) == Some("ssh.opened") {
|
||||||
|
let _ = opened_tx.send(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
"ssh.data" => {
|
"ssh.data" => {
|
||||||
opened = true;
|
opened = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user