diff --git a/Cargo.lock b/Cargo.lock index ff4ac951d..edebcb0ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -222,6 +222,7 @@ dependencies = [ "credibility", "dirs", "epoll", + "event_monitor", "hypervisor", "lazy_static", "libc", diff --git a/Cargo.toml b/Cargo.toml index 1d899f98f..c3dd62a03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ anyhow = "1.0" api_client = { path = "api_client" } clap = { version = "2.33.3", features = ["wrap_help"] } epoll = ">=4.0.1" +event_monitor = { path = "event_monitor" } hypervisor = { path = "hypervisor" } libc = "0.2.86" log = { version = "0.4.14", features = ["std"] } diff --git a/src/main.rs b/src/main.rs index 028aad9de..f6d198bbe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,9 @@ extern crate vmm_sys_util; #[macro_use(crate_authors)] extern crate clap; +#[macro_use] +extern crate event_monitor; + use clap::{App, Arg, ArgGroup, ArgMatches}; use libc::EFD_NONBLOCK; use log::LevelFilter; @@ -20,6 +23,8 @@ use signal_hook::{ iterator::{exfiltrator::WithRawSiginfo, SignalsInfo}, }; use std::env; +use std::fs::File; +use std::os::unix::io::FromRawFd; use std::sync::mpsc::channel; use std::sync::{Arc, Mutex}; use std::thread; @@ -315,6 +320,14 @@ fn create_app<'a, 'b>( .default_value(&api_server_path) .group("vmm-config"), ) + .arg( + Arg::with_name("monitor-fd") + .long("monitor-fd") + .help("File descriptor to report events on") + .takes_value(true) + .min_values(1) + .group("vmm-config"), + ) .arg( Arg::with_name("restore") .long("restore") @@ -389,6 +402,8 @@ fn start_vmm(cmd_arguments: ArgMatches, api_socket_path: &str) -> Result<(), Err .unwrap(); } + event!("vmm", "starting"); + let hypervisor = hypervisor::new().map_err(Error::CreateHypervisor)?; let vmm_thread = vmm::start_vmm_thread( env!("CARGO_PKG_VERSION").to_string(), @@ -501,6 +516,14 @@ fn main() { .expect("Missing argument: api-socket") .to_string(); + if let Some(fd) = cmd_arguments + .value_of("monitor-fd") + .map(|s| s.parse::().expect("Expect integral file descriptor")) + { + let file = unsafe { File::from_raw_fd(fd) }; + event_monitor::set_monitor(file).expect("Expected setting monitor to succeed"); + } + if let Err(e) = start_vmm(cmd_arguments, &api_socket_path) { eprintln!("{}", e); std::fs::remove_file(api_socket_path).ok();