main: Add "--monitor-fd" to write structured event data to

If supplied then structured JSON event data will be written to that file
descriptor.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2021-02-17 11:19:39 +00:00
parent ddbef7450d
commit 4822ed79e1
3 changed files with 25 additions and 0 deletions

1
Cargo.lock generated
View File

@ -222,6 +222,7 @@ dependencies = [
"credibility",
"dirs",
"epoll",
"event_monitor",
"hypervisor",
"lazy_static",
"libc",

View File

@ -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"] }

View File

@ -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::<i32>().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();