diff --git a/src/agent/src/main.rs b/src/agent/src/main.rs index e925e6a1b..9b0c0405f 100644 --- a/src/agent/src/main.rs +++ b/src/agent/src/main.rs @@ -37,7 +37,9 @@ use rustjail::errors::*; use signal_hook::{iterator::Signals, SIGCHLD}; use std::collections::HashMap; use std::env; +use std::ffi::OsStr; use std::fs::{self, File}; +use std::os::unix::ffi::OsStrExt; use std::os::unix::fs as unixfs; use std::os::unix::io::AsRawFd; use std::path::Path; @@ -356,9 +358,30 @@ fn init_agent_as_init(logger: &Logger) -> Result<()> { env::set_var("PATH", "/bin:/sbin/:/usr/bin/:/usr/sbin/"); + let contents = std::fs::read_to_string("/etc/hostname").unwrap_or(String::from("localhost")); + let contents_array: Vec<&str> = contents.split(' ').collect(); + let hostname = contents_array[0].trim(); + + if sethostname(OsStr::new(hostname)).is_err() { + warn!(logger, "failed to set hostname"); + } + Ok(()) } +fn sethostname(hostname: &OsStr) -> Result<()> { + let size = hostname.len() as usize; + + let result = + unsafe { libc::sethostname(hostname.as_bytes().as_ptr() as *const libc::c_char, size) }; + + if result != 0 { + Err(ErrorKind::ErrorCode("failed to set hostname".to_string()).into()) + } else { + Ok(()) + } +} + lazy_static! { static ref SHELLS: Arc>> = { let mut v = Vec::new(); @@ -382,50 +405,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 +474,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 +502,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'" ); } }