diff --git a/src/main.rs b/src/main.rs
index 05cafb6..0583842 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -63,10 +63,13 @@ fn handle_request(
fn perform_request(
_req: Request
,
- _options: &Options,
+ options: &Options,
) -> impl Future- , Error = ExporterError> {
trace!("perform_request");
+ // this is needed to satisfy the borrow checker
+ let options = options.clone();
+
done(
Command::new("wg")
.arg("show")
@@ -76,14 +79,29 @@ fn perform_request(
)
.from_err()
.and_then(|output| {
- done(String::from_utf8(output.stdout))
- .from_err()
- .and_then(|output_str| {
- trace!("{}", output_str);
- done(WireGuard::try_from(&output_str as &str))
+ if let Some(extract_names_config_file) = options.extract_names_config_file {
+ Either::A(
+ done(String::from_utf8(output.stdout))
.from_err()
- .and_then(|wg| ok(Response::new(Body::from(wg.render()))))
- })
+ .and_then(|output_str| {
+ trace!("{}", output_str);
+ done(WireGuard::try_from(&output_str as &str))
+ .from_err()
+ .and_then(|wg| ok(Response::new(Body::from(wg.render()))))
+ }),
+ )
+ } else {
+ Either::B(
+ done(String::from_utf8(output.stdout))
+ .from_err()
+ .and_then(|output_str| {
+ trace!("{}", output_str);
+ done(WireGuard::try_from(&output_str as &str))
+ .from_err()
+ .and_then(|wg| ok(Response::new(Body::from(wg.render()))))
+ }),
+ )
+ }
})
}
@@ -94,7 +112,7 @@ fn main() {
.arg(
Arg::with_name("port")
.short("p")
- .help("exporter port (default 9576)")
+ .help("exporter port")
.default_value("9576")
.takes_value(true),
)
@@ -104,6 +122,11 @@ fn main() {
.help("verbose logging")
.takes_value(false),
)
+ .arg(
+ Arg::with_name("extract_names_config_file")
+ .short("n")
+ .help("If set, the exporter will look in the specified WireGuard config file for peer names (must be in [Peer] definition and be a comment)")
+ .takes_value(true))
.get_matches();
let options = Options::from_claps(&matches);
diff --git a/src/options.rs b/src/options.rs
index b24488e..4c39713 100644
--- a/src/options.rs
+++ b/src/options.rs
@@ -1,12 +1,21 @@
#[derive(Debug, Clone)]
pub(crate) struct Options {
pub verbose: bool,
+ pub extract_names_config_file: Option,
}
impl Options {
pub fn from_claps(matches: &clap::ArgMatches<'_>) -> Options {
- Options {
- verbose: matches.is_present("verbose"),
+ if let Some(e) = matches.value_of("extract_names_config_file") {
+ Options {
+ verbose: matches.is_present("verbose"),
+ extract_names_config_file: Some(e.to_owned()),
+ }
+ } else {
+ Options {
+ verbose: matches.is_present("verbose"),
+ extract_names_config_file: None,
+ }
}
}
}