use std::env;
use futures::TryStreamExt;
use log::{error, info, trace};
use rtnetlink::{new_connection, Handle};
use eyre::{Error, eyre};
#[inline(always)]
pub async fn get_index_by_name(
handle: &mut Handle,
ifname: Option<String>,
) -> Result<u32, Error> {
match ifname {
None => Ok(0),
Some(name) => {
let mut links = handle.link().get().match_name(name.clone()).execute();
if let Some(link) = links.try_next().await? {
let idx = link.header.index;
info!("interface {} found, index: {}", name, idx);
Ok(idx)
} else {
Err(eyre!("Cannot find interface {}", name))
}
}
}
}
#[inline(always)]
pub fn find_env(key: &str) -> Result<String, env::VarError> {
env::var(key)
.map(|value| {
info!("Environment variable {} found: {}", key, value);
value
}).map_err(|e| {
error!("Environment variable {} not found: {}", key, e);
e
})
}
#[inline(always)]
pub fn netlink_handle() -> Result<Handle, std::io::Error> {
trace!("get netlink handle");
let (connection, handle, _) = new_connection()?;
tokio::spawn(connection);
Ok(handle)
}
#[inline(always)]
pub fn synthesize(if_prefix: &str, if_id: u32) -> String {
format!("{}{}", if_prefix, hex::encode(if_id.to_be_bytes()))
}