diff --git a/src/initrd/mod.rs b/src/initrd/mod.rs index 4f2fdc70..7b4963c8 100644 --- a/src/initrd/mod.rs +++ b/src/initrd/mod.rs @@ -1,10 +1,12 @@ -/// Agent logic running at early boot. -/// -/// This is run early-on in initrd, possibly before networking and other -/// services are configured, so it may not be able to use all usual metadata -/// fetcher. -use crate::errors::*; +//! Agent logic running at early boot. +//! +//! This is run early-on in initrd, possibly before networking and other +//! services are configured, so it may not be able to use all usual metadata +//! fetcher. +use crate::errors::*; +use crate::providers::vmware::VmwareProvider; +use crate::providers::MetadataProvider; use std::fs::File; use std::io::Write; @@ -14,8 +16,7 @@ static KARGS_PATH: &str = "/etc/cmdline.d/50-afterburn-network-kargs.conf"; /// Fetch network kargs for the given provider. pub(crate) fn fetch_network_kargs(provider: &str) -> Result> { match provider { - // TODO(lucab): wire-in vmware guestinfo logic. - "vmware" => Ok(None), + "vmware" => VmwareProvider::try_new()?.rd_network_kargs(), _ => Ok(None), } } diff --git a/src/providers/vmware/amd64.rs b/src/providers/vmware/amd64.rs index 12768eca..ed69898b 100644 --- a/src/providers/vmware/amd64.rs +++ b/src/providers/vmware/amd64.rs @@ -2,12 +2,15 @@ //! //! This uses the guest->host backdoor protocol for introspection. -use error_chain::bail; - use super::VmwareProvider; use crate::errors::*; +use error_chain::bail; + +/// Guestinfo key for network kargs. +static INITRD_NET_KARGS: &str = "guestinfo.afterburn.initrd.network-kargs"; impl VmwareProvider { + /// Build the VMware provider, fetching and caching guestinfo entries. pub fn try_new() -> Result { if !vmw_backdoor::is_vmware_cpu() { bail!("not running on VMWare CPU"); @@ -15,16 +18,22 @@ impl VmwareProvider { let mut backdoor = vmw_backdoor::probe_backdoor()?; let mut erpc = backdoor.open_enhanced_chan()?; - let guestinfo_net_kargs = Self::get_net_kargs(&mut erpc)?; + let guestinfo_net_kargs = Self::fetch_guestinfo(&mut erpc, INITRD_NET_KARGS)?; let provider = Self { guestinfo_net_kargs, }; + + slog_scope::trace!("cached vmware provider: {:?}", provider); Ok(provider) } - fn get_net_kargs(_erpc: &mut vmw_backdoor::EnhancedChan) -> Result> { - // TODO(lucab): pick a stable key name and implement this logic. - Ok(None) + /// Retrieve the value of a guestinfo string property, by key. + fn fetch_guestinfo(erpc: &mut vmw_backdoor::EnhancedChan, key: &str) -> Result> { + let guestinfo = erpc + .get_guestinfo(key.as_bytes()) + .chain_err(|| "failed to retrieve network kargs")? + .map(|bytes| String::from_utf8_lossy(&bytes).into_owned()); + Ok(guestinfo) } }