mirror of
https://github.com/house-of-vanity/rexec.git
synced 2025-07-08 09:14:08 +00:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
10345fbce6 | |||
ad2d36bb35 | |||
4f1657c37c | |||
a28d1a3a38 |
21
Cargo.lock
generated
21
Cargo.lock
generated
@ -1043,19 +1043,20 @@ checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rexec"
|
name = "rexec"
|
||||||
version = "1.0.2"
|
version = "1.0.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"brace-expand",
|
"brace-expand",
|
||||||
"clap 4.3.4",
|
"clap 4.3.4",
|
||||||
"colored",
|
"colored",
|
||||||
"dialoguer",
|
"dialoguer",
|
||||||
"dns-lookup",
|
"dns-lookup",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"itertools",
|
"itertools",
|
||||||
"lazy-st",
|
"lazy-st",
|
||||||
"log",
|
"log",
|
||||||
"massh",
|
"massh",
|
||||||
"regex",
|
"regex",
|
||||||
|
"tokio",
|
||||||
"whoami",
|
"whoami",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "rexec"
|
name = "rexec"
|
||||||
version = "1.0.2"
|
version = "1.0.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Parallel SSH executor"
|
description = "Parallel SSH executor"
|
||||||
repository = "https://github.com/house-of-vanity/rexec"
|
repository = "https://github.com/house-of-vanity/rexec"
|
||||||
@ -12,6 +12,7 @@ authors = ["AB <gh@hexor.ru>"]
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
dns-lookup = "2.0.2"
|
dns-lookup = "2.0.2"
|
||||||
log = "0.4.0"
|
log = "0.4.0"
|
||||||
env_logger = "0.10.0"
|
env_logger = "0.10.0"
|
||||||
|
73
src/main.rs
73
src/main.rs
@ -77,48 +77,41 @@ fn read_known_hosts() -> Vec<Host> {
|
|||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expand_string(string: String) -> Vec<Host> {
|
fn expand_range(start: i32, end: i32) -> Vec<String> {
|
||||||
let mut result: Vec<String> = Vec::new();
|
(start..=end).map(|i| i.to_string()).collect()
|
||||||
let mut _result: Vec<String> = Vec::new();
|
}
|
||||||
|
|
||||||
|
fn expand_list(list: &str) -> Vec<String> {
|
||||||
|
list.split(',').map(|s| s.to_string()).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn expand_string(s: &str) -> Vec<Host> {
|
||||||
let mut hosts: Vec<Host> = Vec::new();
|
let mut hosts: Vec<Host> = Vec::new();
|
||||||
|
let mut result = vec![s.to_string()];
|
||||||
|
|
||||||
if let Some(open_bracket_index) = string.find('[') {
|
while let Some(r) = result.iter().find(|s| s.contains('[')) {
|
||||||
if let Some(close_bracket_index) = string.find(']') {
|
let r = r.clone();
|
||||||
let prefix = &string[..open_bracket_index];
|
let start = r.find('[').unwrap();
|
||||||
let range = &string[open_bracket_index + 1..close_bracket_index];
|
let end = r.find(']').unwrap();
|
||||||
let postfix = &string[close_bracket_index + 1..];
|
let colon = r.find(':').unwrap();
|
||||||
|
let low = r[start+1..colon].parse::<i32>().unwrap();
|
||||||
let parts: Vec<&str> = range.split(':').collect();
|
let high = r[colon+1..end].parse::<i32>().unwrap();
|
||||||
|
result.retain(|s| s != &r);
|
||||||
if parts.len() == 2 {
|
for val in expand_range(low, high) {
|
||||||
if let Ok(start) = parts[0].parse::<u32>() {
|
let new_str = format!("{}{}{}", &r[..start], val, &r[end+1..]);
|
||||||
if let Ok(end) = parts[1].parse::<u32>() {
|
result.push(new_str);
|
||||||
for num in start..=end {
|
|
||||||
_result.push(format!("{}{}{}", prefix, num, postfix));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
_result.push(String::from(string));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for string in _result {
|
while let Some(r) = result.iter().find(|s| s.contains('{')) {
|
||||||
if let Some(open_brace_index) = string.find('{') {
|
let r = r.clone();
|
||||||
if let Some(close_brace_index) = string.find('}') {
|
let start = r.find('{').unwrap();
|
||||||
let prefix = &string[..open_brace_index];
|
let end = r.find('}').unwrap();
|
||||||
let list = &string[open_brace_index + 1..close_brace_index];
|
let list = &r[start+1..end];
|
||||||
let postfix = &string[close_brace_index + 1..];
|
result.retain(|s| s != &r);
|
||||||
|
for val in expand_list(list) {
|
||||||
let items: Vec<&str> = list.split(',').collect();
|
let new_str = format!("{}{}{}", &r[..start], val, &r[end+1..]);
|
||||||
|
result.push(new_str);
|
||||||
for item in items {
|
|
||||||
result.push(format!("{}{}{}", prefix, item, postfix));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.push(String::from(string));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +124,8 @@ fn expand_string(string: String) -> Vec<Host> {
|
|||||||
hosts
|
hosts
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
env_logger::Builder::from_env(Env::default().default_filter_or("info"))
|
env_logger::Builder::from_env(Env::default().default_filter_or("info"))
|
||||||
.format_timestamp(None)
|
.format_timestamp(None)
|
||||||
.format_target(false)
|
.format_target(false)
|
||||||
@ -156,7 +150,7 @@ fn main() {
|
|||||||
.collect()
|
.collect()
|
||||||
} else {
|
} else {
|
||||||
info!("Using string expansion to build server list.");
|
info!("Using string expansion to build server list.");
|
||||||
expand_string(args.expression)
|
expand_string(&args.expression)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Dedup hosts from known_hosts file
|
// Dedup hosts from known_hosts file
|
||||||
@ -248,4 +242,5 @@ fn main() {
|
|||||||
} else {
|
} else {
|
||||||
warn!("Stopped");
|
warn!("Stopped");
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user