From 98c48af3314c0990f6e49ee7ff41404683cef3f1 Mon Sep 17 00:00:00 2001 From: Alexandr Bogomyakov Date: Wed, 23 Aug 2023 21:33:14 +0300 Subject: [PATCH] Fixed brace expansion --- PKGBUILD | 2 +- src/main.rs | 41 ++++++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/PKGBUILD b/PKGBUILD index 2fbab0e..f6d94e5 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: AB pkgname=rexec -pkgver=1.0.1.r9.g0d95364 +pkgver=1.0.4.r0.g3cf1e79 pkgrel=1 pkgdesc="Parallel SSH executor" url="https://github.com/house-of-vanity/rexec" diff --git a/src/main.rs b/src/main.rs index cf6daf8..0d3278a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,11 @@ struct Args { #[arg(short, long, default_value_t = whoami::username())] username: String, - #[arg(short, long, help = "Use known_hosts to build servers list instead of string expansion.")] + #[arg( + short, + long, + help = "Use known_hosts to build servers list instead of string expansion." + )] known_hosts: bool, #[arg( @@ -91,20 +95,26 @@ fn expand_string(s: &str) -> Vec { while let Some(r) = result.iter().find(|s| s.contains('[')) { let r = r.clone(); - let start = r.find(']').unwrap(); - let end = match r.find(']') { + let start = r.find('[').unwrap(); + let end = match r[start..].find(']') { None => { error!("Error parsing host expression. Wrong range expansion '[a:b]'"); process::exit(1); } - Some(s) => s + Some(s) => s + start, }; - let colon = r.find(':').unwrap(); - let low = r[start+1..colon].parse::().unwrap(); - let high = r[colon+1..end].parse::().unwrap(); + let colon = match r[start..end].find(':') { + None => { + error!("Error parsing host expression. Missing colon in range expansion '[a:b]'"); + process::exit(1); + } + Some(c) => c + start, + }; + let low = r[start + 1..colon].parse::().unwrap(); + let high = r[colon + 1..end].parse::().unwrap(); result.retain(|s| s != &r); for val in expand_range(low, high) { - let new_str = format!("{}{}{}", &r[..start], val, &r[end+1..]); + let new_str = format!("{}{}{}", &r[..start], val, &r[end + 1..]); result.push(new_str); } } @@ -117,12 +127,12 @@ fn expand_string(s: &str) -> Vec { error!("Error parsing host expression. Wrong range expansion '{{one,two}}'"); process::exit(1); } - Some(s) => s + Some(s) => s, }; - let list = &r[start+1..end]; + let list = &r[start + 1..end]; result.retain(|s| s != &r); for val in expand_list(list) { - let new_str = format!("{}{}{}", &r[..start], val, &r[end+1..]); + let new_str = format!("{}{}{}", &r[..start], val, &r[end + 1..]); result.push(new_str); } } @@ -136,7 +146,6 @@ fn expand_string(s: &str) -> Vec { hosts } - fn main() { env_logger::Builder::from_env(Env::default().default_filter_or("info")) .format_timestamp(None) @@ -172,7 +181,13 @@ fn main() { let mut massh_hosts: Vec = vec![]; let mut hosts_and_ips: HashMap = HashMap::new(); if args.parallel != 100 { - warn!("Parallelism: {} thread{}", &args.parallel, {if args.parallel != 1 {"s."} else {"."}}); + warn!("Parallelism: {} thread{}", &args.parallel, { + if args.parallel != 1 { + "s." + } else { + "." + } + }); } info!("Matched hosts:");