allow device matching by udev properties
This commit is contained in:
@ -3,10 +3,10 @@ use log::{info, warn};
|
||||
use std::collections::BTreeSet as Set;
|
||||
use tokio::process::Command;
|
||||
|
||||
use super::{Result, format_err, retry_or_ignore};
|
||||
use super::{format_err, retry_or_ignore, Result};
|
||||
use crate::{
|
||||
udev,
|
||||
utils::{NameAliases, select_n_by_regex},
|
||||
utils::{select_n_by_regex, select_n_by_udev, NameAliases},
|
||||
};
|
||||
use dkl::bootstrap::{Config, Network};
|
||||
|
||||
@ -26,16 +26,13 @@ pub async fn setup(cfg: &Config) {
|
||||
async fn setup_network(net: &Network, assigned: &mut Set<String>) -> Result<()> {
|
||||
info!("setting up network {}", net.name);
|
||||
|
||||
let netdevs = get_interfaces()?
|
||||
let netdevs = (get_interfaces().await?)
|
||||
.filter(|dev| !assigned.contains(dev.name()))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
for dev in &netdevs {
|
||||
info!(
|
||||
"- available network device: {}, aliases [{}]",
|
||||
dev.name(),
|
||||
dev.aliases().join(", ")
|
||||
);
|
||||
let names = [dev.name()].into_iter().chain(dev.aliases()).join(", ");
|
||||
info!("- available network device: {}", names);
|
||||
}
|
||||
|
||||
let mut cmd = Command::new("ash");
|
||||
@ -47,8 +44,19 @@ async fn setup_network(net: &Network, assigned: &mut Set<String>) -> Result<()>
|
||||
for iface in &net.interfaces {
|
||||
let var = &iface.var;
|
||||
|
||||
let netdevs = netdevs.iter().filter(|na| !assigned.contains(na.name()));
|
||||
let if_names = select_n_by_regex(iface.n, &iface.regexps, netdevs);
|
||||
let if_names = if let Some(ref udev_filter) = iface.udev {
|
||||
select_n_by_udev(
|
||||
iface.n,
|
||||
"net",
|
||||
"INTERFACE",
|
||||
&udev_filter.clone().into(),
|
||||
&assigned,
|
||||
)
|
||||
.await?
|
||||
} else {
|
||||
let netdevs = netdevs.iter().filter(|na| !assigned.contains(na.name()));
|
||||
select_n_by_regex(iface.n, &iface.regexps, netdevs)
|
||||
};
|
||||
|
||||
if if_names.is_empty() {
|
||||
return Err(format_err!("- no interface match for {var:?}"));
|
||||
@ -71,24 +79,20 @@ async fn setup_network(net: &Network, assigned: &mut Set<String>) -> Result<()>
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_interfaces() -> Result<impl Iterator<Item = NameAliases>> {
|
||||
Ok(udev::get_devices("net")?.into_iter().map(|dev| {
|
||||
let mut na = NameAliases::new(dev.sysname().to_string());
|
||||
async fn get_interfaces() -> Result<impl Iterator<Item = NameAliases>> {
|
||||
let nas: Vec<_> = (udev::all().await?.of_subsystem("net"))
|
||||
.filter_map(|dev| {
|
||||
let name = dev.property("INTERFACE")?;
|
||||
let mut na = NameAliases::new(name.to_string());
|
||||
|
||||
for (property, value) in dev.properties() {
|
||||
if [
|
||||
"INTERFACE",
|
||||
"ID_NET_NAME",
|
||||
"ID_NET_NAME_PATH",
|
||||
"ID_NET_NAME_MAC",
|
||||
"ID_NET_NAME_SLOT",
|
||||
]
|
||||
.contains(&property)
|
||||
{
|
||||
na.push(value.to_string());
|
||||
for (p, v) in dev.properties() {
|
||||
if p.starts_with("ID_NET_NAME") {
|
||||
na.push(v.to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
na
|
||||
}))
|
||||
Some(na)
|
||||
})
|
||||
.collect();
|
||||
Ok(nas.into_iter())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user