allow device matching by udev properties
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
use eyre::{Result, format_err};
|
||||
use eyre::{format_err, Result};
|
||||
use log::{error, info, warn};
|
||||
use std::collections::BTreeSet as Set;
|
||||
use std::process::Stdio;
|
||||
@ -6,7 +6,7 @@ use tokio::io::AsyncWriteExt;
|
||||
use tokio::process::Command;
|
||||
use tokio::sync::Mutex;
|
||||
|
||||
use super::{USED_DEVS, retry_or_ignore};
|
||||
use super::{retry_or_ignore, USED_DEVS};
|
||||
use crate::blockdev::{is_uninitialized, uninitialize};
|
||||
use crate::fs::walk_dir;
|
||||
use crate::input;
|
||||
@ -29,7 +29,7 @@ pub async fn setup(devs: &[CryptDev]) {
|
||||
let all_devs = walk_dir("/dev").await;
|
||||
|
||||
for dev in devs {
|
||||
let mut mappings = find_dev(dev, &all_devs);
|
||||
let mut mappings = find_dev(dev, &all_devs).await?;
|
||||
mappings.retain(|(_, dev_path)| !used_devs.contains(dev_path));
|
||||
|
||||
if mappings.is_empty() && !dev.optional() && !done.contains(&dev.name) {
|
||||
@ -134,18 +134,39 @@ async fn cryptsetup<const N: usize>(pw: &str, args: [&str; N]) -> Result<bool> {
|
||||
Ok(child.wait().await?.success())
|
||||
}
|
||||
|
||||
fn find_dev(dev: &CryptDev, all_devs: &[String]) -> Vec<(String, String)> {
|
||||
async fn find_dev(dev: &CryptDev, all_devs: &[String]) -> Result<Vec<(String, String)>> {
|
||||
let dev_name = &dev.name;
|
||||
match dev.filter {
|
||||
DevFilter::Dev(ref path) => (all_devs.iter())
|
||||
Ok(match dev.filter() {
|
||||
DevFilter::None => vec![],
|
||||
DevFilter::Dev(path) => (all_devs.iter())
|
||||
.filter(|dev_path| dev_path == &path)
|
||||
.map(|dev_path| (dev.name.clone(), dev_path.clone()))
|
||||
.collect(),
|
||||
DevFilter::Prefix(ref prefix) => (all_devs.iter())
|
||||
DevFilter::Prefix(prefix) => (all_devs.iter())
|
||||
.filter_map(|path| {
|
||||
let suffix = path.strip_prefix(prefix)?;
|
||||
Some((format!("{dev_name}{suffix}"), path.clone()))
|
||||
})
|
||||
.collect(),
|
||||
}
|
||||
DevFilter::Udev(filter) => {
|
||||
use crate::udev;
|
||||
let devs = udev::all().await?;
|
||||
|
||||
let filter: udev::Filter = filter.clone().into();
|
||||
|
||||
(devs.iter())
|
||||
.filter(|dev| dev.subsystem() == Some("block") && filter.matches(dev))
|
||||
.filter_map(|dev| {
|
||||
let path = dev.property("DEVNAME")?.to_string();
|
||||
|
||||
let mut name = dev_name.replace("${name}", dev.name()?);
|
||||
for (p, v) in dev.properties() {
|
||||
name = name.replace(&format!("${{{p}}}"), v);
|
||||
}
|
||||
|
||||
Some((name, path))
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user