diff --git a/src/bin/mdev-coldplug.rs b/src/bin/mdev-coldplug.rs new file mode 100644 index 0000000..3513106 --- /dev/null +++ b/src/bin/mdev-coldplug.rs @@ -0,0 +1,49 @@ +use std::path::PathBuf; + +use clap::Parser; +use mdev::setup_log; +use tracing::{debug, error}; +use walkdir::WalkDir; + +#[derive(Parser)] +struct Opt { + /// Verbose mode, logs to stderr + #[arg(short, long, action = clap::ArgAction::Count)] + verbose: u8, + + /// Path where the sysfs is mounted + #[arg(short, long, default_value = "/sys")] + sysfs_mount: PathBuf, +} + +impl Opt { + fn setup_log(&self) -> anyhow::Result<()> { + setup_log(self.verbose) + } +} + +fn main() -> anyhow::Result<()> { + let opt = Opt::parse(); + + opt.setup_log()?; + + let classdir = WalkDir::new(opt.sysfs_mount.join("class")) + .follow_links(true) + .max_depth(4) + .into_iter(); + let busdir = WalkDir::new(opt.sysfs_mount.join("bus")) + .follow_links(true) + .max_depth(3) + .into_iter(); + + for entry in classdir + .chain(busdir) + .filter_map(|e| e.ok().filter(|e| e.file_name().eq("uevent"))) + { + debug!("{entry:?}"); + let p = entry.path(); + std::fs::write(p, "add").unwrap_or_else(|e| error!("cannot write to {}: {e}", p.display())); + } + + Ok(()) +} diff --git a/src/bin/mdev.rs b/src/bin/mdev.rs index b46fb22..7d9a505 100644 --- a/src/bin/mdev.rs +++ b/src/bin/mdev.rs @@ -17,7 +17,7 @@ use tokio::{fs, join}; use tracing::{debug, info, warn}; use walkdir::WalkDir; -use mdev::{rule, RebroadcastMessage, Rebroadcaster}; +use mdev::{rule, setup_log, RebroadcastMessage, Rebroadcaster}; use mdev_parser::Conf; #[derive(Parser)] @@ -254,35 +254,15 @@ impl Opt { } fn setup_log(&self) -> anyhow::Result<()> { - use tracing_subscriber::prelude::*; - use tracing_subscriber::{fmt, EnvFilter}; - if self.daemon && !self.foreground && !self.syslog { return Ok(()); } - let fmt_layer = fmt::layer().with_target(false); - if self.syslog { todo!("Wire in syslog somehow"); } - let filter_layer = EnvFilter::try_from_default_env().unwrap_or_else(|_| { - if self.verbose < 1 { - EnvFilter::new("info") - } else if self.verbose < 2 { - EnvFilter::new("warn") - } else { - EnvFilter::new("debug") - } - }); - - tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer) - .init(); - - Ok(()) + setup_log(self.verbose) } } diff --git a/src/lib.rs b/src/lib.rs index 88117f4..fdf6d40 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -195,3 +195,27 @@ mod tests { ); } } + +pub fn setup_log(verbose: u8) -> anyhow::Result<()> { + use tracing_subscriber::prelude::*; + use tracing_subscriber::{fmt, EnvFilter}; + + let fmt_layer = fmt::layer().with_target(false); + + let filter_layer = EnvFilter::try_from_default_env().unwrap_or_else(|_| { + if verbose < 1 { + EnvFilter::new("info") + } else if verbose < 2 { + EnvFilter::new("warn") + } else { + EnvFilter::new("debug") + } + }); + + tracing_subscriber::registry() + .with(filter_layer) + .with(fmt_layer) + .init(); + + Ok(()) +}