agent: Make debug console async

Fixes: #1209

Signed-off-by: Maksym Pavlenko <pavlenko.maksym@gmail.com>
This commit is contained in:
Maksym Pavlenko 2020-12-23 15:10:52 -08:00 committed by Tim Zhang
parent f3bd439465
commit 37e285bf7b
2 changed files with 18 additions and 27 deletions

View File

@ -23,7 +23,7 @@ scopeguard = "1.0.0"
regex = "1" regex = "1"
async-trait = "0.1.42" async-trait = "0.1.42"
tokio = { version = "0.2", features = ["rt-core", "sync", "uds", "stream", "macros", "io-util", "time", "signal", "io-std", "process",] } tokio = { version = "0.2", features = ["rt-core", "sync", "uds", "stream", "macros", "io-util", "time", "signal", "io-std", "process", "blocking"] }
futures = "0.3" futures = "0.3"
netlink-sys = { version = "0.4.0", features = ["tokio_socket",]} netlink-sys = { version = "0.4.0", features = ["tokio_socket",]}
tokio-vsock = "0.2.2" tokio-vsock = "0.2.2"

View File

@ -257,25 +257,23 @@ async fn start_sandbox(logger: &Logger, config: &agentConfig, init_mode: bool) -
let shells = SHELLS.clone(); let shells = SHELLS.clone();
let debug_console_vport = config.debug_console_vport as u32; let debug_console_vport = config.debug_console_vport as u32;
// TODO: async the debug console let shell_handle = if config.debug_console {
let mut _shell_handle: Option<std::thread::JoinHandle<()>> = None;
if config.debug_console {
let thread_logger = logger.clone(); let thread_logger = logger.clone();
let shells = shells.lock().unwrap().to_vec();
let builder = std::thread::Builder::new(); let handle = tokio::task::spawn_blocking(move || {
let result = setup_debug_console(&thread_logger, shells, debug_console_vport);
let handle = builder.spawn(move || {
let shells = shells.lock().unwrap();
let result = setup_debug_console(&thread_logger, shells.to_vec(), debug_console_vport);
if result.is_err() { if result.is_err() {
// Report error, but don't fail // Report error, but don't fail
warn!(thread_logger, "failed to setup debug console"; warn!(thread_logger, "failed to setup debug console";
"error" => format!("{}", result.unwrap_err())); "error" => format!("{}", result.unwrap_err()));
} }
})?; });
_shell_handle = Some(handle); Some(handle)
} } else {
None
};
// Initialize unique sandbox structure. // Initialize unique sandbox structure.
let mut s = Sandbox::new(&logger).context("Failed to create sandbox")?; let mut s = Sandbox::new(&logger).context("Failed to create sandbox")?;
@ -304,6 +302,10 @@ async fn start_sandbox(logger: &Logger, config: &agentConfig, init_mode: bool) -
let _ = rx.await?; let _ = rx.await?;
server.shutdown().await?; server.shutdown().await?;
if let Some(handle) = shell_handle {
handle.await.map_err(|e| anyhow!("{:?}", e))?;
}
Ok(()) Ok(())
} }
@ -454,9 +456,6 @@ lazy_static! {
}; };
} }
// pub static mut LOG_LEVEL: ;
// pub static mut TRACE_MODE: ;
use crate::config::agentConfig; use crate::config::agentConfig;
use nix::sys::stat::Mode; use nix::sys::stat::Mode;
use std::os::unix::io::{FromRawFd, RawFd}; use std::os::unix::io::{FromRawFd, RawFd};
@ -464,18 +463,10 @@ use std::path::PathBuf;
use std::process::exit; use std::process::exit;
fn setup_debug_console(logger: &Logger, shells: Vec<String>, port: u32) -> Result<()> { fn setup_debug_console(logger: &Logger, shells: Vec<String>, port: u32) -> Result<()> {
let mut shell: &str = ""; let shell = shells
for sh in shells.iter() { .iter()
let binary = PathBuf::from(sh); .find(|sh| PathBuf::from(sh).exists())
if binary.exists() { .ok_or_else(|| anyhow!("no shell found to launch debug console"))?;
shell = sh;
break;
}
}
if shell == "" {
return Err(anyhow!("no shell found to launch debug console"));
}
if port > 0 { if port > 0 {
let listenfd = socket::socket( let listenfd = socket::socket(