From 899b75f2de5d08011a0484c664352771fa32f493 Mon Sep 17 00:00:00 2001 From: "fupan.lfp" Date: Mon, 29 Jun 2020 16:15:52 +0800 Subject: [PATCH] agent: fix the issue of missing found right shell It should iter the shells to find the existing shell command instead of return an error directly when it meet an absent shell command. Fixes: #354 Signed-off-by: fupan.lfp --- src/agent/src/main.rs | 91 +++++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/src/agent/src/main.rs b/src/agent/src/main.rs index e925e6a1b..5196b9b61 100644 --- a/src/agent/src/main.rs +++ b/src/agent/src/main.rs @@ -382,50 +382,54 @@ use std::path::PathBuf; use std::process::{exit, Command, Stdio}; fn setup_debug_console(shells: Vec, port: u32) -> Result<()> { - for shell in shells.iter() { - let binary = PathBuf::from(shell); + let mut shell: &str = ""; + for sh in shells.iter() { + let binary = PathBuf::from(sh); if binary.exists() { - let f: RawFd = if port > 0 { - let listenfd = socket::socket( - AddressFamily::Vsock, - SockType::Stream, - SockFlag::SOCK_CLOEXEC, - None, - )?; - let addr = SockAddr::new_vsock(libc::VMADDR_CID_ANY, port); - socket::bind(listenfd, &addr)?; - socket::listen(listenfd, 1)?; - socket::accept4(listenfd, SockFlag::SOCK_CLOEXEC)? - } else { - let mut flags = OFlag::empty(); - flags.insert(OFlag::O_RDWR); - flags.insert(OFlag::O_CLOEXEC); - fcntl::open(CONSOLE_PATH, flags, Mode::empty())? - }; - - let cmd = Command::new(shell) - .arg("-i") - .stdin(unsafe { Stdio::from_raw_fd(f) }) - .stdout(unsafe { Stdio::from_raw_fd(f) }) - .stderr(unsafe { Stdio::from_raw_fd(f) }) - .spawn(); - - let mut cmd = match cmd { - Ok(c) => c, - Err(_) => { - return Err(ErrorKind::ErrorCode("failed to spawn shell".to_string()).into()) - } - }; - - cmd.wait()?; - - return Ok(()); - } else { - return Err(ErrorKind::ErrorCode("invalid shell".to_string()).into()); + shell = sh; + break; } } - Err(ErrorKind::ErrorCode("no shell".to_string()).into()) + if shell == "" { + return Err( + ErrorKind::ErrorCode("no shell found to launch debug console".to_string()).into(), + ); + } + + let f: RawFd = if port > 0 { + let listenfd = socket::socket( + AddressFamily::Vsock, + SockType::Stream, + SockFlag::SOCK_CLOEXEC, + None, + )?; + let addr = SockAddr::new_vsock(libc::VMADDR_CID_ANY, port); + socket::bind(listenfd, &addr)?; + socket::listen(listenfd, 1)?; + socket::accept4(listenfd, SockFlag::SOCK_CLOEXEC)? + } else { + let mut flags = OFlag::empty(); + flags.insert(OFlag::O_RDWR); + flags.insert(OFlag::O_CLOEXEC); + fcntl::open(CONSOLE_PATH, flags, Mode::empty())? + }; + + let cmd = Command::new(shell) + .arg("-i") + .stdin(unsafe { Stdio::from_raw_fd(f) }) + .stdout(unsafe { Stdio::from_raw_fd(f) }) + .stderr(unsafe { Stdio::from_raw_fd(f) }) + .spawn(); + + let mut cmd = match cmd { + Ok(c) => c, + Err(_) => return Err(ErrorKind::ErrorCode("failed to spawn shell".to_string()).into()), + }; + + cmd.wait()?; + + return Ok(()); } #[cfg(test)] @@ -447,7 +451,10 @@ mod tests { let result = setup_debug_console(shells.to_vec(), 0); assert!(result.is_err()); - assert_eq!(result.unwrap_err().to_string(), "Error Code: 'no shell'"); + assert_eq!( + result.unwrap_err().to_string(), + "Error Code: 'no shell found to launch debug console'" + ); } #[test] @@ -472,7 +479,7 @@ mod tests { assert!(result.is_err()); assert_eq!( result.unwrap_err().to_string(), - "Error Code: 'invalid shell'" + "Error Code: 'no shell found to launch debug console'" ); } }