From 8cbcb2d39bb3a7a12f19e240a6f801621fe67e71 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 16 May 2021 16:18:50 -0500 Subject: [PATCH 01/38] Bump version. --- Cargo.lock | 5 +++-- Cargo.toml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36050e8..783f5d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -668,7 +668,7 @@ dependencies = [ [[package]] name = "trust-dns-proto" version = "0.20.1" -source = "git+https://github.com/Edu4rdSHL/trust-dns?branch=main#3047d95f76d26f5debd8d76e94542db4e47f68b4" +source = "git+https://github.com/Edu4rdSHL/trust-dns?branch=main#451a00fbe3c0972adb4cdbd9d2e2f2a39a44da0e" dependencies = [ "async-trait", "cfg-if", @@ -692,7 +692,7 @@ dependencies = [ [[package]] name = "trust-dns-resolver" version = "0.20.1" -source = "git+https://github.com/Edu4rdSHL/trust-dns?branch=main#3047d95f76d26f5debd8d76e94542db4e47f68b4" +source = "git+https://github.com/Edu4rdSHL/trust-dns?branch=main#451a00fbe3c0972adb4cdbd9d2e2f2a39a44da0e" dependencies = [ "cfg-if", "futures-util", @@ -701,6 +701,7 @@ dependencies = [ "log", "lru-cache", "parking_lot", + "rand", "resolv-conf", "smallvec", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index 6e0a326..b9203be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,8 +12,8 @@ readme = "README.md" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = { version = "1.5.0", features = ["full"] } -futures = "0.3.14" +tokio = { version = "1.6.0", features = ["full"] } +futures = "0.3.15" trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } clap = "2.33.3" rand = "0.8.3" From 9de7ab225c46e44a9b28d44aaeda49e841be2914 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 19 May 2021 18:57:01 -0500 Subject: [PATCH 02/38] Add double verification step. If no `--no-verify` is provided, every resolved host is double-checked against a list of trustable DNS resolvers, ensuring that only **real** alive hosts are given to the user. Signed-off-by: Edu4rdSHL --- src/main.rs | 86 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 33 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3060b7b..6d34caa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,6 +68,12 @@ async fn main() -> Result<(), Box> { .takes_value(false) .help("Show the discovered IP addresses. Default: false"), ) + .arg( + Arg::with_name("no-verify") + .long("no-verify") + .takes_value(false) + .help("Disables the double verification algorithm for valid subdomains -NOT RECOMMENDED-. Default: false"), + ) .arg( Arg::with_name("quiet") .short("q") @@ -83,6 +89,8 @@ async fn main() -> Result<(), Box> { let timeout = value_t!(matches.value_of("timeout"), u64).unwrap_or_else(|_| 1); let retries = value_t!(matches.value_of("retries"), usize).unwrap_or_else(|_| 0); let quiet_flag = matches.is_present("quiet"); + let custom_resolvers = matches.is_present("resolvers"); + let disable_double_check = matches.is_present("no-verify") && custom_resolvers; // Resolver opts let options = ResolverOpts { @@ -93,41 +101,44 @@ async fn main() -> Result<(), Box> { ..Default::default() }; - // Create resolvers - let mut nameserver_ips = HashSet::new(); + let built_in_nameservers: HashSet = vec![ + // Cloudflare + "1.1.1.1:53", + "1.0.0.1:53", + // Google + "8.8.8.8:53", + "8.8.4.4:53", + // Quad9 + "9.9.9.9:53", + "149.112.112.112:53", + // OpenDNS + "208.67.222.222:53", + "208.67.220.220:53", + // Verisign + "64.6.64.6:53", + "64.6.65.6:53", + // UncensoredDNS + "91.239.100.100:53", + "89.233.43.71:53", + // dns.watch + "84.200.69.80:53", + "84.200.70.40:53", + ] + .iter() + .map(|x| x.to_string()) + .collect(); - if matches.is_present("resolvers") { + // Create resolvers + let nameserver_ips; + + if custom_resolvers { nameserver_ips = return_file_lines(value_t!(matches.value_of("resolvers"), String).unwrap()).await; } else { - let built_in_nameservers = vec![ - // Cloudflare - "1.1.1.1:53", - "1.0.0.1:53", - // Google - "8.8.8.8:53", - "8.8.4.4:53", - // Quad9 - "9.9.9.9:53", - "149.112.112.112:53", - // OpenDNS - "208.67.222.222:53", - "208.67.220.220:53", - // Verisign - "64.6.64.6:53", - "64.6.65.6:53", - // UncensoredDNS - "91.239.100.100:53", - "89.233.43.71:53", - // dns.watch - "84.200.69.80:53", - "84.200.70.40:53", - ]; - for ip in built_in_nameservers { - nameserver_ips.insert(ip.to_string()); - } + nameserver_ips = built_in_nameservers.clone(); } let resolvers = return_tokio_asyncresolver(nameserver_ips, options); + let trustable_resolver = return_tokio_asyncresolver(built_in_nameservers, options); let mut wildcard_ips = HashSet::new(); // Read stdin @@ -148,13 +159,22 @@ async fn main() -> Result<(), Box> { futures::stream::iter(hosts.into_iter().map(|host| { let resolver_fut = resolvers.ipv4_lookup(host.clone()); + let trustable_resolver_fut = trustable_resolver.ipv4_lookup(host.clone()); let wildcard_ips = wildcard_ips.clone(); async move { if let Ok(ip) = resolver_fut.await { - let ips = ip - .into_iter() - .map(|x| x.to_string()) - .collect::>(); + let mut ips = HashSet::new(); + if disable_double_check { + ips = ip + .into_iter() + .map(|x| x.to_string()) + .collect::>(); + } else if let Ok(ip) = trustable_resolver_fut.await { + ips = ip + .into_iter() + .map(|x| x.to_string()) + .collect::>(); + } if show_ip_adress && !ips.iter().all(|ip| wildcard_ips.contains(ip)) { println!("{};{:?}", host, ips) } else if !ips.iter().all(|ip| wildcard_ips.contains(ip)) { From d1bb538e171f98985b38be3e488e9da67a7d596f Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 19 May 2021 18:57:37 -0500 Subject: [PATCH 03/38] Bump version. --- Cargo.lock | 2 +- Cargo.toml | 2 +- rusolver.1 | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 783f5d0..944e361 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -526,7 +526,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.5.1" +version = "0.6.0" dependencies = [ "clap", "futures", diff --git a/Cargo.toml b/Cargo.toml index b9203be..7a05991 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.5.1" +version = "0.6.0" authors = ["Eduard Tolosa "] edition = "2018" description = "Fast DNS resolver written in Rust." diff --git a/rusolver.1 b/rusolver.1 index 41c6d21..28bbded 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. -.TH RUSOLVER "1" "May 2021" "Rusolver 0.5.1" "User Commands" +.TH RUSOLVER "1" "May 2021" "Rusolver 0.6.0" "User Commands" .SH NAME -Rusolver \- manual page for Rusolver 0.5.1 +Rusolver \- manual page for Rusolver 0.6.0 .SH DESCRIPTION -Rusolver 0.5.1 +Rusolver 0.6.0 Eduard Tolosa Fast DNS resolver written in Rust. .SS "USAGE:" @@ -17,6 +17,9 @@ Prints help information \fB\-i\fR, \fB\-\-ip\fR Show the discovered IP addresses. Default: false .TP +\fB\-\-no\-verify\fR +Disables the double verification algorithm for valid subdomains \fB\-NOT\fR RECOMMENDED\-. Default: false +.TP \fB\-q\fR, \fB\-\-quiet\fR Enables quiet mode. .TP From 8057fbc9cf26178a76859754fc83e8991c3d78b4 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Thu, 20 May 2021 00:46:54 -0500 Subject: [PATCH 04/38] Improve wildcard handling. Signed-off-by: Edu4rdSHL --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6d34caa..c5cb0f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -148,7 +148,7 @@ async fn main() -> Result<(), Box> { let hosts: Vec = if matches.is_present("domain") { let domain = value_t!(matches, "domain", String).unwrap(); - wildcard_ips = detect_wildcards(&domain, &resolvers, quiet_flag).await; + wildcard_ips = detect_wildcards(&domain, &trustable_resolver, quiet_flag).await; buffer .lines() .map(|word| format!("{}.{}", word, domain)) @@ -253,9 +253,9 @@ async fn detect_wildcards( println!("Running wildcards detection for {}...\n", target) } let mut generated_wilcards: HashSet = HashSet::new(); - for _ in 1..10 { + for _ in 1..20 { generated_wilcards.insert(format!( - "{}.{}", + "{}.{}.", rng() .sample_iter(Alphanumeric) .take(15) From 8022a48bccaf076608ce6e2b43d8a51ef85c8757 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Thu, 20 May 2021 00:48:47 -0500 Subject: [PATCH 05/38] Bump version. --- Cargo.lock | 2 +- Cargo.toml | 2 +- rusolver.1 | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 944e361..58fab0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -526,7 +526,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.6.0" +version = "0.6.1" dependencies = [ "clap", "futures", diff --git a/Cargo.toml b/Cargo.toml index 7a05991..44df7b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.6.0" +version = "0.6.1" authors = ["Eduard Tolosa "] edition = "2018" description = "Fast DNS resolver written in Rust." diff --git a/rusolver.1 b/rusolver.1 index 28bbded..98f3246 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. -.TH RUSOLVER "1" "May 2021" "Rusolver 0.6.0" "User Commands" +.TH RUSOLVER "1" "May 2021" "Rusolver 0.6.1" "User Commands" .SH NAME -Rusolver \- manual page for Rusolver 0.6.0 +Rusolver \- manual page for Rusolver 0.6.1 .SH DESCRIPTION -Rusolver 0.6.0 +Rusolver 0.6.1 Eduard Tolosa Fast DNS resolver written in Rust. .SS "USAGE:" From 14f3bfbccca5478abc41068bb01a17b21eb1f112 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Thu, 20 May 2021 01:39:13 -0500 Subject: [PATCH 06/38] Remove empty lines from file. Signed-off-by: Edu4rdSHL --- src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index c5cb0f7..c2361b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -129,11 +129,12 @@ async fn main() -> Result<(), Box> { .collect(); // Create resolvers - let nameserver_ips; + let mut nameserver_ips; if custom_resolvers { nameserver_ips = return_file_lines(value_t!(matches.value_of("resolvers"), String).unwrap()).await; + nameserver_ips.retain(|ip| !ip.is_empty()); } else { nameserver_ips = built_in_nameservers.clone(); } From 986dfbe37f877755ffa2db94a42e89ac146440dc Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Mon, 26 Jul 2021 09:10:49 +0000 Subject: [PATCH 07/38] Update FUNDING.yml --- .github/FUNDING.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 223641e..ff19fdb 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1 @@ -patreon: edu4rdshl -open_collective: findomain -custom: ["https://paypal.me/sechacklabs"] +github: [edu4rdshl] From 41e80a944b9b0ca9dacfa78c14f1da4683a6e88a Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Thu, 12 Aug 2021 16:30:37 -0500 Subject: [PATCH 08/38] README: add accuraccy info. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fe38270..3bb3077 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ Fast DNS resolver written in Rust. Works on Linux, Windows, macOS, Android, Aarc # Goal Offer the community an efficient host resolution tool. -# Performance & speed -Rusolver is **very** resource friendly, you can use up to 1000 threads in an single core machine and this will work without any problem, the bottleneck for this tool is your network speed. By default, Rusolver is able to perform resolution for ~1532 hosts per second in good network conditions (tested in an AWS machine). +# Performance, speed and accuracy +Rusolver is **very** resource friendly, you can use up to 1000 threads in an single core machine and this will work without any problem, the bottleneck for this tool is your network speed. By default, Rusolver is able to perform resolution for ~1532 hosts per second in good network conditions (tested in an AWS machine). Additionally the tool does a double-check by default for resolved hosts against Cloudflare, Google, Quad9, OpenDNS, Verisign, UncensoredDNS and dns.watch DNS, with that algoritm the possibility to get an false-positive is null. ## Demo From 5d0443a678735141003ad1e106f11f2d92bbc11d Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 20 Oct 2021 05:51:47 -0500 Subject: [PATCH 09/38] Performance improvement. DNS queries with a dot [.] at the end of the domain are cheaper, this small but significant change results in an important performance improvement. Signed-off-by: Edu4rdSHL --- src/main.rs | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main.rs b/src/main.rs index c2361b0..1666e61 100644 --- a/src/main.rs +++ b/src/main.rs @@ -158,23 +158,26 @@ async fn main() -> Result<(), Box> { buffer.lines().map(str::to_owned).collect() }; - futures::stream::iter(hosts.into_iter().map(|host| { - let resolver_fut = resolvers.ipv4_lookup(host.clone()); - let trustable_resolver_fut = trustable_resolver.ipv4_lookup(host.clone()); - let wildcard_ips = wildcard_ips.clone(); - async move { - if let Ok(ip) = resolver_fut.await { + stream::iter(hosts) + .map(|host| { + let resolver_fut = resolvers.ipv4_lookup(host.clone() + "."); + let trustable_resolver_fut = trustable_resolver.ipv4_lookup(host.clone() + "."); + let wildcard_ips = wildcard_ips.clone(); + + async move { let mut ips = HashSet::new(); - if disable_double_check { - ips = ip - .into_iter() - .map(|x| x.to_string()) - .collect::>(); - } else if let Ok(ip) = trustable_resolver_fut.await { - ips = ip - .into_iter() - .map(|x| x.to_string()) - .collect::>(); + if let Ok(ip) = resolver_fut.await { + if disable_double_check { + ips = ip + .into_iter() + .map(|x| x.to_string()) + .collect::>(); + } else if let Ok(ip) = trustable_resolver_fut.await { + ips = ip + .into_iter() + .map(|x| x.to_string()) + .collect::>(); + } } if show_ip_adress && !ips.iter().all(|ip| wildcard_ips.contains(ip)) { println!("{};{:?}", host, ips) @@ -182,11 +185,11 @@ async fn main() -> Result<(), Box> { println!("{}", host) } } - } - })) - .buffer_unordered(threads) - .collect::>() - .await; + }) + .buffer_unordered(threads) + .collect::>() + .await; + Ok(()) } From 50b0e6bcdc11bead1c5230dbb21ca29055eb8aba Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 20 Oct 2021 05:56:21 -0500 Subject: [PATCH 10/38] Bump version. --- Cargo.lock | 195 ++++++++++++++++++++++++++--------------------------- Cargo.toml | 4 +- rusolver.1 | 8 +-- 3 files changed, 103 insertions(+), 104 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58fab0c..42da95f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "ansi_term" version = "0.11.0" @@ -11,9 +13,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.50" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" +checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" dependencies = [ "proc-macro2", "quote", @@ -39,15 +41,15 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bytes" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cfg-if" @@ -100,9 +102,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" dependencies = [ "futures-channel", "futures-core", @@ -115,9 +117,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", "futures-sink", @@ -125,15 +127,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" [[package]] name = "futures-executor" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" dependencies = [ "futures-core", "futures-task", @@ -142,15 +144,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" [[package]] name = "futures-macro" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ "autocfg", "proc-macro-hack", @@ -161,21 +163,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" [[package]] name = "futures-task" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" [[package]] name = "futures-util" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ "autocfg", "futures-channel", @@ -194,9 +196,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if", "libc", @@ -205,18 +207,18 @@ dependencies = [ [[package]] name = "heck" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -245,9 +247,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", ] @@ -266,9 +268,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] name = "lazy_static" @@ -278,9 +280,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.94" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" +checksum = "7b2f96d100e1cf1929e7719b7edb3b90ab5298072638fccd77be9ce942ecdfce" [[package]] name = "linked-hash-map" @@ -290,9 +292,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "lock_api" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] @@ -323,21 +325,21 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "mio" -version = "0.7.11" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" dependencies = [ "libc", "log", @@ -376,15 +378,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", @@ -393,9 +395,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if", "instant", @@ -413,9 +415,9 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -425,9 +427,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "c3ca011bd0129ff4ae15cd04c4eef202cadf6c51c21e47aba319b4e0501db741" [[package]] name = "proc-macro-hack" @@ -443,9 +445,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.26" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70" dependencies = [ "unicode-xid", ] @@ -458,18 +460,18 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" dependencies = [ "proc-macro2", ] [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", "rand_chacha", @@ -479,9 +481,9 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", @@ -489,27 +491,27 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ "getrandom", ] [[package]] name = "rand_hc" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ "rand_core", ] [[package]] name = "redox_syscall" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] @@ -526,7 +528,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.6.1" +version = "0.7.0" dependencies = [ "clap", "futures", @@ -543,24 +545,24 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "signal-hook-registry" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" [[package]] name = "smallvec" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" [[package]] name = "socket2" @@ -581,9 +583,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.72" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" +checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194" dependencies = [ "proc-macro2", "quote", @@ -601,18 +603,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.24" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.24" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ "proc-macro2", "quote", @@ -621,9 +623,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" dependencies = [ "tinyvec_macros", ] @@ -636,9 +638,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.6.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd3076b5c8cc18138b8f8814895c11eb4de37114a5d127bafdc5e55798ceef37" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" dependencies = [ "autocfg", "bytes", @@ -656,9 +658,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c49e3df43841dafb86046472506755d8501c5615673955f6aa17181125d13c37" +checksum = "b2dd85aeaba7b68df939bd357c6afb36c87951be9e80bf9c859f2fc3e9fca0fd" dependencies = [ "proc-macro2", "quote", @@ -711,33 +713,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" [[package]] name = "unicode-normalization" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" diff --git a/Cargo.toml b/Cargo.toml index 44df7b4..5940c26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.6.1" +version = "0.7.0" authors = ["Eduard Tolosa "] edition = "2018" description = "Fast DNS resolver written in Rust." @@ -12,7 +12,7 @@ readme = "README.md" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = { version = "1.6.0", features = ["full"] } +tokio = { version = "1.6.1", features = ["full"] } futures = "0.3.15" trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } clap = "2.33.3" diff --git a/rusolver.1 b/rusolver.1 index 98f3246..0998a38 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. -.TH RUSOLVER "1" "May 2021" "Rusolver 0.6.1" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5. +.TH RUSOLVER "1" "October 2021" "Rusolver 0.7.0" "User Commands" .SH NAME -Rusolver \- manual page for Rusolver 0.6.1 +Rusolver \- manual page for Rusolver 0.7.0 .SH DESCRIPTION -Rusolver 0.6.1 +Rusolver 0.7.0 Eduard Tolosa Fast DNS resolver written in Rust. .SS "USAGE:" From ddd055757bd9a085c8d43e370c0260798024bb32 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 15 Dec 2021 04:58:15 -0500 Subject: [PATCH 11/38] Support for fully-qualified domain names Fixes #10 Signed-off-by: Edu4rdSHL --- src/main.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1666e61..811effe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -160,8 +160,9 @@ async fn main() -> Result<(), Box> { stream::iter(hosts) .map(|host| { - let resolver_fut = resolvers.ipv4_lookup(host.clone() + "."); - let trustable_resolver_fut = trustable_resolver.ipv4_lookup(host.clone() + "."); + let resolver_fut = resolvers.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); + let trustable_resolver_fut = + trustable_resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); let wildcard_ips = wildcard_ips.clone(); async move { From 6a63f8519970741683e88280260a80d6bb9888b1 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Tue, 25 Jan 2022 10:45:44 -0500 Subject: [PATCH 12/38] Update dependencies. Signed-off-by: Edu4rdSHL --- Cargo.lock | 11 ++++++----- Cargo.toml | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42da95f..70609b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -669,8 +669,9 @@ dependencies = [ [[package]] name = "trust-dns-proto" -version = "0.20.1" -source = "git+https://github.com/Edu4rdSHL/trust-dns?branch=main#451a00fbe3c0972adb4cdbd9d2e2f2a39a44da0e" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0d7f5db438199a6e2609debe3f69f808d074e0a2888ee0bccb45fe234d03f4" dependencies = [ "async-trait", "cfg-if", @@ -693,8 +694,9 @@ dependencies = [ [[package]] name = "trust-dns-resolver" -version = "0.20.1" -source = "git+https://github.com/Edu4rdSHL/trust-dns?branch=main#451a00fbe3c0972adb4cdbd9d2e2f2a39a44da0e" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ad17b608a64bd0735e67bde16b0636f8aa8591f831a25d18443ed00a699770" dependencies = [ "cfg-if", "futures-util", @@ -703,7 +705,6 @@ dependencies = [ "log", "lru-cache", "parking_lot", - "rand", "resolv-conf", "smallvec", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index 5940c26..ffcb951 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ readme = "README.md" [dependencies] tokio = { version = "1.6.1", features = ["full"] } futures = "0.3.15" -trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } +trust-dns-resolver = { version = "0.20.3" } +# trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } clap = "2.33.3" rand = "0.8.3" From ccd7bfc646931dea3fc84a138a165acc227cfab2 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Tue, 25 Jan 2022 10:46:05 -0500 Subject: [PATCH 13/38] Bump version. Signed-off-by: Edu4rdSHL --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 70609b1..462dcee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -528,7 +528,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.7.0" +version = "0.8.0" dependencies = [ "clap", "futures", diff --git a/Cargo.toml b/Cargo.toml index ffcb951..cad2f99 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.7.0" +version = "0.8.0" authors = ["Eduard Tolosa "] edition = "2018" description = "Fast DNS resolver written in Rust." From dfdc0ee0beda9154709c1eee691539ec54bdf7b4 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Tue, 25 Jan 2022 10:47:33 -0500 Subject: [PATCH 14/38] Bump version. --- rusolver.1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rusolver.1 b/rusolver.1 index 0998a38..b034390 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5. -.TH RUSOLVER "1" "October 2021" "Rusolver 0.7.0" "User Commands" +.TH RUSOLVER "1" "January 2022" "Rusolver 0.8.0" "User Commands" .SH NAME -Rusolver \- manual page for Rusolver 0.7.0 +Rusolver \- manual page for Rusolver 0.8.0 .SH DESCRIPTION -Rusolver 0.7.0 +Rusolver 0.8.0 Eduard Tolosa Fast DNS resolver written in Rust. .SS "USAGE:" From e7b2bc205024991bf912b52163804b8a305c7e4d Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 2 Feb 2022 14:41:44 -0500 Subject: [PATCH 15/38] Bump version. --- Cargo.lock | 124 ++++++++++++++++++------------------------- Cargo.toml | 8 +-- rusolver.1 | 2 +- src/args.rs | 0 src/lib.rs | 4 ++ src/main.rs | 137 +++++------------------------------------------- src/resolver.rs | 44 ++++++++++++++++ src/structs.rs | 0 src/utils.rs | 81 ++++++++++++++++++++++++++++ 9 files changed, 196 insertions(+), 204 deletions(-) create mode 100644 src/args.rs create mode 100644 src/lib.rs create mode 100644 src/resolver.rs create mode 100644 src/structs.rs create mode 100644 src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 462dcee..a216954 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "ansi_term" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ "winapi", ] [[package]] name = "async-trait" -version = "0.1.51" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" +checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" dependencies = [ "proc-macro2", "quote", @@ -33,12 +33,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - [[package]] name = "bitflags" version = "1.3.2" @@ -59,9 +53,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "2.33.3" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", @@ -102,9 +96,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" +checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" dependencies = [ "futures-channel", "futures-core", @@ -117,9 +111,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" dependencies = [ "futures-core", "futures-sink", @@ -127,15 +121,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" +checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" [[package]] name = "futures-executor" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" +checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" dependencies = [ "futures-core", "futures-task", @@ -144,18 +138,16 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" +checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" [[package]] name = "futures-macro" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" +checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" dependencies = [ - "autocfg", - "proc-macro-hack", "proc-macro2", "quote", "syn", @@ -163,23 +155,22 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" +checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" [[package]] name = "futures-task" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" +checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" [[package]] name = "futures-util" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" +checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" dependencies = [ - "autocfg", "futures-channel", "futures-core", "futures-io", @@ -189,16 +180,14 @@ dependencies = [ "memchr", "pin-project-lite", "pin-utils", - "proc-macro-hack", - "proc-macro-nested", "slab", ] [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if", "libc", @@ -280,9 +269,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.104" +version = "0.2.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f96d100e1cf1929e7719b7edb3b90ab5298072638fccd77be9ce942ecdfce" +checksum = "0a8d982fa7a96a000f6ec4cfe966de9703eccde29750df2bb8949da91b0e818d" [[package]] name = "linked-hash-map" @@ -368,9 +357,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -378,9 +367,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" [[package]] name = "parking_lot" @@ -415,9 +404,9 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" [[package]] name = "pin-utils" @@ -427,27 +416,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "ppv-lite86" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ca011bd0129ff4ae15cd04c4eef202cadf6c51c21e47aba319b4e0501db741" - -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro2" -version = "1.0.30" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" dependencies = [ "unicode-xid", ] @@ -460,9 +437,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.10" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" dependencies = [ "proc-macro2", ] @@ -560,9 +537,9 @@ checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "socket2" @@ -583,9 +560,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.80" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" dependencies = [ "proc-macro2", "quote", @@ -623,9 +600,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" dependencies = [ "tinyvec_macros", ] @@ -638,11 +615,10 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.12.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" dependencies = [ - "autocfg", "bytes", "libc", "memchr", @@ -658,9 +634,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dd85aeaba7b68df939bd357c6afb36c87951be9e80bf9c859f2fc3e9fca0fd" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index cad2f99..0b47865 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,9 +12,9 @@ readme = "README.md" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = { version = "1.6.1", features = ["full"] } -futures = "0.3.15" -trust-dns-resolver = { version = "0.20.3" } +tokio = { version = "1.16.1", features = ["full"] } +futures = "0.3.19" +trust-dns-resolver = "0.20.3" # trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } clap = "2.33.3" -rand = "0.8.3" +rand = "0.8.4" diff --git a/rusolver.1 b/rusolver.1 index b034390..1fa2e01 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5. -.TH RUSOLVER "1" "January 2022" "Rusolver 0.8.0" "User Commands" +.TH RUSOLVER "1" "February 2022" "Rusolver 0.8.0" "User Commands" .SH NAME Rusolver \- manual page for Rusolver 0.8.0 .SH DESCRIPTION diff --git a/src/args.rs b/src/args.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..cdacf92 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,4 @@ +pub mod resolver; +pub mod utils; + +mod structs; diff --git a/src/main.rs b/src/main.rs index 811effe..fb83357 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,26 +1,19 @@ use { clap::{value_t, App, Arg}, futures::stream::{self, StreamExt}, - rand::{distributions::Alphanumeric, thread_rng as rng, Rng}, - std::{ - collections::HashSet, - net::{Ipv4Addr, SocketAddr}, - }, + rusolver::{resolver, utils}, + std::collections::HashSet, tokio::{ self, - fs::File, io::{self, AsyncReadExt}, }, - trust_dns_resolver::{ - config::{ - LookupIpStrategy, NameServerConfig, NameServerConfigGroup, Protocol, ResolverConfig, - ResolverOpts, - }, - name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, - AsyncResolver, TokioAsyncResolver, - }, + trust_dns_resolver::config::{LookupIpStrategy, ResolverOpts}, }; +// Please add support for AAAA, TXT, SRV, NAPTR, PTR, CNAME, DNAME, MX, NS, SOA, LOC, SVCB, HTTPS, SPF, CAA and AVC resource records. +// This could use a new command line option such as -t, e.g. echo www.example.com | rusolver -i -t AAAA. It might also make sense +// to change -i/--ip to -d/--data with the text Display the record data. + #[tokio::main] async fn main() -> Result<(), Box> { // Eval args @@ -133,13 +126,14 @@ async fn main() -> Result<(), Box> { if custom_resolvers { nameserver_ips = - return_file_lines(value_t!(matches.value_of("resolvers"), String).unwrap()).await; + utils::return_file_lines(value_t!(matches.value_of("resolvers"), String).unwrap()) + .await; nameserver_ips.retain(|ip| !ip.is_empty()); } else { nameserver_ips = built_in_nameservers.clone(); } - let resolvers = return_tokio_asyncresolver(nameserver_ips, options); - let trustable_resolver = return_tokio_asyncresolver(built_in_nameservers, options); + let resolvers = resolver::return_tokio_asyncresolver(nameserver_ips, options); + let trustable_resolver = resolver::return_tokio_asyncresolver(built_in_nameservers, options); let mut wildcard_ips = HashSet::new(); // Read stdin @@ -149,7 +143,7 @@ async fn main() -> Result<(), Box> { let hosts: Vec = if matches.is_present("domain") { let domain = value_t!(matches, "domain", String).unwrap(); - wildcard_ips = detect_wildcards(&domain, &trustable_resolver, quiet_flag).await; + wildcard_ips = utils::detect_wildcards(&domain, &trustable_resolver, quiet_flag).await; buffer .lines() .map(|word| format!("{}.{}", word, domain)) @@ -193,110 +187,3 @@ async fn main() -> Result<(), Box> { Ok(()) } - -// In the future I may need to implement error propagation, but for now it's fine -// to deal with matches -async fn return_file_lines(file: String) -> HashSet { - let mut f = match File::open(&file).await { - Ok(file) => file, - Err(e) => { - eprintln!("Error opening resolvers file. Error: {}", e); - std::process::exit(1) - } - }; - let mut buffer = String::new(); - - match f.read_to_string(&mut buffer).await { - Ok(a) => a, - _ => unreachable!("Error reading to string."), - }; - buffer.lines().map(|f| format!("{}:53", f)).collect() -} - -fn return_tokio_asyncresolver( - nameserver_ips: HashSet, - options: ResolverOpts, -) -> AsyncResolver> { - let mut name_servers = NameServerConfigGroup::with_capacity(nameserver_ips.len() * 2); - - name_servers.extend(nameserver_ips.into_iter().flat_map(|server| { - let socket_addr = SocketAddr::V4(match server.parse() { - Ok(a) => a, - Err(e) => unreachable!( - "Error parsing the server {}, only IPv4 are allowed. Error: {}", - server, e - ), - }); - - std::iter::once(NameServerConfig { - socket_addr, - protocol: Protocol::Udp, - tls_dns_name: None, - trust_nx_responses: false, - }) - .chain(std::iter::once(NameServerConfig { - socket_addr, - protocol: Protocol::Tcp, - tls_dns_name: None, - trust_nx_responses: false, - })) - })); - - TokioAsyncResolver::tokio( - ResolverConfig::from_parts(None, vec![], name_servers), - options, - ) - .unwrap() -} - -async fn detect_wildcards( - target: &str, - resolvers: &AsyncResolver>, - quiet_flag: bool, -) -> HashSet { - if !quiet_flag { - println!("Running wildcards detection for {}...\n", target) - } - let mut generated_wilcards: HashSet = HashSet::new(); - for _ in 1..20 { - generated_wilcards.insert(format!( - "{}.{}.", - rng() - .sample_iter(Alphanumeric) - .take(15) - .map(char::from) - .collect::(), - target - )); - } - - generated_wilcards = stream::iter(generated_wilcards.clone().into_iter().map( - |host| async move { - if let Ok(ips) = resolvers.ipv4_lookup(host.clone()).await { - ips.into_iter() - .map(|x| x.to_string()) - .collect::>() - } else { - Vec::new() - } - }, - )) - .buffer_unordered(10) - .map(stream::iter) - .flatten() - .collect() - .await; - - generated_wilcards.retain(|ip| ip.parse::().is_ok()); - - if !generated_wilcards.is_empty() && !quiet_flag { - println!( - "Wilcards detected for {} and wildcard's IP saved for furter work.", - target - ); - println!("Wilcard IPs: {:?}\n", generated_wilcards) - } else if !quiet_flag { - println!("No wilcards detected for {}, nice!\n", target) - } - generated_wilcards -} diff --git a/src/resolver.rs b/src/resolver.rs new file mode 100644 index 0000000..582ed07 --- /dev/null +++ b/src/resolver.rs @@ -0,0 +1,44 @@ +use { + std::{collections::HashSet, net::SocketAddr}, + trust_dns_resolver::{ + config::{NameServerConfig, NameServerConfigGroup, Protocol, ResolverConfig, ResolverOpts}, + name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, + AsyncResolver, TokioAsyncResolver, + }, +}; + +pub fn return_tokio_asyncresolver( + nameserver_ips: HashSet, + options: ResolverOpts, +) -> AsyncResolver> { + let mut name_servers = NameServerConfigGroup::with_capacity(nameserver_ips.len() * 2); + + name_servers.extend(nameserver_ips.into_iter().flat_map(|server| { + let socket_addr = SocketAddr::V4(match server.parse() { + Ok(a) => a, + Err(e) => unreachable!( + "Error parsing the server {}, only IPv4 are allowed. Error: {}", + server, e + ), + }); + + std::iter::once(NameServerConfig { + socket_addr, + protocol: Protocol::Udp, + tls_dns_name: None, + trust_nx_responses: false, + }) + .chain(std::iter::once(NameServerConfig { + socket_addr, + protocol: Protocol::Tcp, + tls_dns_name: None, + trust_nx_responses: false, + })) + })); + + TokioAsyncResolver::tokio( + ResolverConfig::from_parts(None, vec![], name_servers), + options, + ) + .unwrap() +} diff --git a/src/structs.rs b/src/structs.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..1e9df99 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,81 @@ +use { + futures::stream::{self, StreamExt}, + rand::{distributions::Alphanumeric, thread_rng as rng, Rng}, + std::{collections::HashSet, net::Ipv4Addr}, + tokio::{self, fs::File, io::AsyncReadExt}, + trust_dns_resolver::{ + name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, + AsyncResolver, + }, +}; + +// In the future I may need to implement error propagation, but for now it's fine +// to deal with matches +pub async fn return_file_lines(file: String) -> HashSet { + let mut f = match File::open(&file).await { + Ok(file) => file, + Err(e) => { + eprintln!("Error opening resolvers file. Error: {}", e); + std::process::exit(1) + } + }; + let mut buffer = String::new(); + + match f.read_to_string(&mut buffer).await { + Ok(a) => a, + _ => unreachable!("Error reading to string."), + }; + buffer.lines().map(|f| format!("{}:53", f)).collect() +} + +pub async fn detect_wildcards( + target: &str, + resolvers: &AsyncResolver>, + quiet_flag: bool, +) -> HashSet { + if !quiet_flag { + println!("Running wildcards detection for {}...\n", target) + } + let mut generated_wilcards: HashSet = HashSet::new(); + for _ in 1..20 { + generated_wilcards.insert(format!( + "{}.{}.", + rng() + .sample_iter(Alphanumeric) + .take(15) + .map(char::from) + .collect::(), + target + )); + } + + generated_wilcards = stream::iter(generated_wilcards.clone().into_iter().map( + |host| async move { + if let Ok(ips) = resolvers.ipv4_lookup(host.clone()).await { + ips.into_iter() + .map(|x| x.to_string()) + .collect::>() + } else { + Vec::new() + } + }, + )) + .buffer_unordered(10) + .map(stream::iter) + .flatten() + .collect() + .await; + + generated_wilcards.retain(|ip| ip.parse::().is_ok()); + + if !generated_wilcards.is_empty() && !quiet_flag { + println!( + "Wilcards detected for {} and wildcard's IP saved for furter work.", + target + ); + println!("Wilcard IPs: {:?}\n", generated_wilcards) + } else if !quiet_flag { + println!("No wilcards detected for {}, nice!\n", target) + } + generated_wilcards +} From 7f974c84147e91c56fab3023d0d1949e1fc25d72 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 2 Feb 2022 14:42:24 -0500 Subject: [PATCH 16/38] Don't auto-commit. Signed-off-by: Edu4rdSHL --- builder.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/builder.sh b/builder.sh index 8e73f76..6e30be0 100755 --- a/builder.sh +++ b/builder.sh @@ -65,11 +65,11 @@ else echo "Please install the help2man package." fi -if command -v git >/dev/null; then - git add . - git commit -m "Bump version." - git push -fi +#if command -v git >/dev/null; then +# git add . +# git commit -m "Bump version." +# git push +#fi #echo "Uploading crate to crates.io..." #if cargo publish --no-verify > /dev/null; then From 17776e7b88ca9c8a31c5f3b7e50a962b8e5b6f70 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 13 Feb 2022 05:32:25 -0500 Subject: [PATCH 17/38] Split functions across modules. Improve performance. Signed-off-by: Edu4rdSHL --- Cargo.lock | 44 +++++++++---------- Cargo.toml | 6 +-- src/dnslib.rs | 110 ++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 5 +-- src/main.rs | 56 ++++++++---------------- src/resolver.rs | 44 ------------------- src/structs.rs | 20 +++++++++ 7 files changed, 174 insertions(+), 111 deletions(-) create mode 100644 src/dnslib.rs delete mode 100644 src/resolver.rs diff --git a/Cargo.lock b/Cargo.lock index a216954..201f80e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,9 +96,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -111,9 +111,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -121,15 +121,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -138,15 +138,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-macro" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", "quote", @@ -155,21 +155,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", @@ -645,9 +645,9 @@ dependencies = [ [[package]] name = "trust-dns-proto" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0d7f5db438199a6e2609debe3f69f808d074e0a2888ee0bccb45fe234d03f4" +checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31" dependencies = [ "async-trait", "cfg-if", @@ -670,9 +670,9 @@ dependencies = [ [[package]] name = "trust-dns-resolver" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ad17b608a64bd0735e67bde16b0636f8aa8591f831a25d18443ed00a699770" +checksum = "ecae383baad9995efaa34ce8e57d12c3f305e545887472a492b838f4b5cfb77a" dependencies = [ "cfg-if", "futures-util", diff --git a/Cargo.toml b/Cargo.toml index 0b47865..e714d97 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,8 +13,8 @@ readme = "README.md" [dependencies] tokio = { version = "1.16.1", features = ["full"] } -futures = "0.3.19" -trust-dns-resolver = "0.20.3" +futures = "0.3.21" +trust-dns-resolver = "0.20.4" # trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } -clap = "2.33.3" +clap = "2.33.4" rand = "0.8.4" diff --git a/src/dnslib.rs b/src/dnslib.rs new file mode 100644 index 0000000..899c883 --- /dev/null +++ b/src/dnslib.rs @@ -0,0 +1,110 @@ +use { + crate::structs::DomainData, + futures::stream::{self, StreamExt}, + std::collections::{HashMap, HashSet}, + trust_dns_resolver::config::ResolverOpts, +}; + +use { + std::net::SocketAddr, + trust_dns_resolver::{ + config::{NameServerConfig, NameServerConfigGroup, Protocol, ResolverConfig}, + name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, + AsyncResolver, TokioAsyncResolver, + }, +}; + +pub fn return_tokio_asyncresolver( + nameserver_ips: HashSet, + options: ResolverOpts, +) -> AsyncResolver> { + let mut name_servers = NameServerConfigGroup::with_capacity(nameserver_ips.len() * 2); + + name_servers.extend(nameserver_ips.into_iter().flat_map(|server| { + let socket_addr = SocketAddr::V4(match server.parse() { + Ok(a) => a, + Err(e) => unreachable!( + "Error parsing the server {}, only IPv4 are allowed. Error: {}", + server, e + ), + }); + + std::iter::once(NameServerConfig { + socket_addr, + protocol: Protocol::Udp, + tls_dns_name: None, + trust_nx_responses: false, + }) + .chain(std::iter::once(NameServerConfig { + socket_addr, + protocol: Protocol::Tcp, + tls_dns_name: None, + trust_nx_responses: false, + })) + })); + + TokioAsyncResolver::tokio( + ResolverConfig::from_parts(None, vec![], name_servers), + options, + ) + .unwrap() +} + +#[allow(clippy::too_many_arguments)] +pub async fn return_hosts_data( + hosts: HashSet, + resolvers: AsyncResolver>, + trustable_resolver: AsyncResolver>, + wildcard_ips: HashSet, + disable_double_check: bool, + mut threads: usize, + show_ip_addresses: bool, + quiet_flag: bool, +) -> HashMap { + if hosts.len() < threads { + threads = hosts.len(); + } + + stream::iter(hosts) + .map(|host| { + let resolver_fut = resolvers.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); + let trustable_resolver_fut = + trustable_resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); + let wildcard_ips = wildcard_ips.clone(); + + async move { + let mut domain_data = DomainData::default(); + + if let Ok(ip) = resolver_fut.await { + if disable_double_check { + domain_data.ipv4_addresses = ip + .into_iter() + .map(|x| x.to_string()) + .collect::>(); + } else if let Ok(ip) = trustable_resolver_fut.await { + domain_data.ipv4_addresses = ip + .into_iter() + .map(|x| x.to_string()) + .collect::>(); + } + } + domain_data.is_wildcard = domain_data + .ipv4_addresses + .iter() + .all(|ip| wildcard_ips.contains(ip)); + + if !quiet_flag { + if show_ip_addresses && !domain_data.is_wildcard { + println!("{};{:?}", host, domain_data.ipv4_addresses); + } else if !domain_data.is_wildcard { + println!("{}", host) + } + } + + (host, domain_data) + } + }) + .buffer_unordered(threads) + .collect::>() + .await +} diff --git a/src/lib.rs b/src/lib.rs index cdacf92..de23ad6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,3 @@ -pub mod resolver; +pub mod dnslib; +pub mod structs; pub mod utils; - -mod structs; diff --git a/src/main.rs b/src/main.rs index fb83357..53ca1ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,6 @@ use { clap::{value_t, App, Arg}, - futures::stream::{self, StreamExt}, - rusolver::{resolver, utils}, + rusolver::{dnslib, utils}, std::collections::HashSet, tokio::{ self, @@ -52,7 +51,7 @@ async fn main() -> Result<(), Box> { Arg::with_name("timeout") .long("timeout") .takes_value(true) - .help("Timeout in seconds. Default: 1"), + .help("Timeout in seconds. Default: 3"), ) .arg( Arg::with_name("ip") @@ -79,7 +78,7 @@ async fn main() -> Result<(), Box> { // Assign values or use defaults let show_ip_adress = matches.is_present("ip"); let threads = value_t!(matches.value_of("threads"), usize).unwrap_or_else(|_| 100); - let timeout = value_t!(matches.value_of("timeout"), u64).unwrap_or_else(|_| 1); + let timeout = value_t!(matches.value_of("timeout"), u64).unwrap_or_else(|_| 3); let retries = value_t!(matches.value_of("retries"), usize).unwrap_or_else(|_| 0); let quiet_flag = matches.is_present("quiet"); let custom_resolvers = matches.is_present("resolvers"); @@ -132,8 +131,8 @@ async fn main() -> Result<(), Box> { } else { nameserver_ips = built_in_nameservers.clone(); } - let resolvers = resolver::return_tokio_asyncresolver(nameserver_ips, options); - let trustable_resolver = resolver::return_tokio_asyncresolver(built_in_nameservers, options); + let resolvers = dnslib::return_tokio_asyncresolver(nameserver_ips, options); + let trustable_resolver = dnslib::return_tokio_asyncresolver(built_in_nameservers, options); let mut wildcard_ips = HashSet::new(); // Read stdin @@ -141,7 +140,7 @@ async fn main() -> Result<(), Box> { let mut stdin = io::stdin(); stdin.read_to_string(&mut buffer).await?; - let hosts: Vec = if matches.is_present("domain") { + let hosts: HashSet = if matches.is_present("domain") { let domain = value_t!(matches, "domain", String).unwrap(); wildcard_ips = utils::detect_wildcards(&domain, &trustable_resolver, quiet_flag).await; buffer @@ -152,38 +151,17 @@ async fn main() -> Result<(), Box> { buffer.lines().map(str::to_owned).collect() }; - stream::iter(hosts) - .map(|host| { - let resolver_fut = resolvers.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); - let trustable_resolver_fut = - trustable_resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); - let wildcard_ips = wildcard_ips.clone(); - - async move { - let mut ips = HashSet::new(); - if let Ok(ip) = resolver_fut.await { - if disable_double_check { - ips = ip - .into_iter() - .map(|x| x.to_string()) - .collect::>(); - } else if let Ok(ip) = trustable_resolver_fut.await { - ips = ip - .into_iter() - .map(|x| x.to_string()) - .collect::>(); - } - } - if show_ip_adress && !ips.iter().all(|ip| wildcard_ips.contains(ip)) { - println!("{};{:?}", host, ips) - } else if !ips.iter().all(|ip| wildcard_ips.contains(ip)) { - println!("{}", host) - } - } - }) - .buffer_unordered(threads) - .collect::>() - .await; + dnslib::return_hosts_data( + hosts, + resolvers, + trustable_resolver, + wildcard_ips, + disable_double_check, + threads, + show_ip_adress, + false, + ) + .await; Ok(()) } diff --git a/src/resolver.rs b/src/resolver.rs deleted file mode 100644 index 582ed07..0000000 --- a/src/resolver.rs +++ /dev/null @@ -1,44 +0,0 @@ -use { - std::{collections::HashSet, net::SocketAddr}, - trust_dns_resolver::{ - config::{NameServerConfig, NameServerConfigGroup, Protocol, ResolverConfig, ResolverOpts}, - name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, - AsyncResolver, TokioAsyncResolver, - }, -}; - -pub fn return_tokio_asyncresolver( - nameserver_ips: HashSet, - options: ResolverOpts, -) -> AsyncResolver> { - let mut name_servers = NameServerConfigGroup::with_capacity(nameserver_ips.len() * 2); - - name_servers.extend(nameserver_ips.into_iter().flat_map(|server| { - let socket_addr = SocketAddr::V4(match server.parse() { - Ok(a) => a, - Err(e) => unreachable!( - "Error parsing the server {}, only IPv4 are allowed. Error: {}", - server, e - ), - }); - - std::iter::once(NameServerConfig { - socket_addr, - protocol: Protocol::Udp, - tls_dns_name: None, - trust_nx_responses: false, - }) - .chain(std::iter::once(NameServerConfig { - socket_addr, - protocol: Protocol::Tcp, - tls_dns_name: None, - trust_nx_responses: false, - })) - })); - - TokioAsyncResolver::tokio( - ResolverConfig::from_parts(None, vec![], name_servers), - options, - ) - .unwrap() -} diff --git a/src/structs.rs b/src/structs.rs index e69de29..f281670 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -0,0 +1,20 @@ +use std::collections::HashSet; + +#[derive(Clone, Debug)] +pub struct DomainData { + pub ipv4_addresses: HashSet, + pub ipv6_addresses: HashSet, + pub cname: String, + pub is_wildcard: bool, +} + +impl Default for DomainData { + fn default() -> Self { + DomainData { + ipv4_addresses: HashSet::new(), + ipv6_addresses: HashSet::new(), + cname: String::from(""), + is_wildcard: false, + } + } +} From d60cc8b150e81726fe3da50001be4953938b178b Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 13 Feb 2022 05:48:14 -0500 Subject: [PATCH 18/38] Update builder.sh Cargo.toml: Add [profile.release] Signed-off-by: Edu4rdSHL --- Cargo.lock | 2 +- Cargo.toml | 10 +++++++++- builder.sh | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 201f80e..3266483 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -505,7 +505,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.8.0" +version = "0.9.0" dependencies = [ "clap", "futures", diff --git a/Cargo.toml b/Cargo.toml index e714d97..237a7af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.8.0" +version = "0.9.0" authors = ["Eduard Tolosa "] edition = "2018" description = "Fast DNS resolver written in Rust." @@ -18,3 +18,11 @@ trust-dns-resolver = "0.20.4" # trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } clap = "2.33.4" rand = "0.8.4" + + +[profile.release] +lto = true +codegen-units = 1 +panic = 'abort' +incremental = false +opt-level = "s" \ No newline at end of file diff --git a/builder.sh b/builder.sh index 6e30be0..f3030bc 100755 --- a/builder.sh +++ b/builder.sh @@ -3,6 +3,7 @@ NAME="rusolver" LINUX_TARGET="x86_64-unknown-linux-musl" +LINUX_X86_TARGET="i686-unknown-linux-musl" WIN_TARGET="x86_64-pc-windows-gnu" ARMV7_TARGET="armv7-unknown-linux-gnueabihf" AARCH_TARGET="aarch64-unknown-linux-gnu" @@ -14,15 +15,30 @@ echo "Building Linux artifact." if cargo build -q --release --target="$LINUX_TARGET"; then echo "Linux artifact build: SUCCESS" cp "target/$LINUX_TARGET/release/$NAME" "target/$LINUX_TARGET/release/$NAME-linux" + strip "target/$LINUX_TARGET/release/$NAME-linux" + sha512sum "target/$LINUX_TARGET/release/$NAME-linux" >"target/$LINUX_TARGET/release/$NAME-linux.sha512" else echo "Linux artifact build: FAILED" fi +# Linux x86 build +echo "Building Linux x86 artifact." +if cross build -q --release --target="$LINUX_X86_TARGET"; then + echo "Linux x86 artifact build: SUCCESS" + cp "target/$LINUX_X86_TARGET/release/$NAME" "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" + strip "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" + sha512sum "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" >"target/$LINUX_X86_TARGET/release/$NAME-linux-i386.sha512" +else + echo "Linux x86 artifact build: FAILED" +fi + # Windows build echo "Building Windows artifact." if cross build -q --release --target="$WIN_TARGET"; then echo "Windows artifact build: SUCCESS" cp "target/$WIN_TARGET/release/$NAME.exe" "target/$WIN_TARGET/release/$NAME-windows.exe" + strip "target/$WIN_TARGET/release/$NAME-windows.exe" + sha512sum "target/$WIN_TARGET/release/$NAME-windows.exe" >"target/$WIN_TARGET/release/$NAME-windows.exe.sha512" else echo "Windows artifact build: FAILED" fi @@ -32,6 +48,8 @@ echo "Building ARMv7 artifact." if cross build -q --release --target="$ARMV7_TARGET"; then echo "ARMv7 artifact build: SUCCESS" cp "target/$ARMV7_TARGET/release/$NAME" "target/$ARMV7_TARGET/release/$NAME-armv7" + strip "target/$ARMV7_TARGET/release/$NAME-armv7" + sha512sum "target/$ARMV7_TARGET/release/$NAME-armv7" >"target/$ARMV7_TARGET/release/$NAME-armv7.sha512" else echo "ARMv7 artifact build: FAILED" fi @@ -41,6 +59,8 @@ echo "Building Aarch64 artifact." if cross build -q --release --target="$AARCH_TARGET"; then echo "Aarch64 artifact build: SUCCESS" cp "target/$AARCH_TARGET/release/$NAME" "target/$AARCH_TARGET/release/$NAME-aarch64" + strip "target/$AARCH_TARGET/release/$NAME-aarch64" + sha512sum "target/$AARCH_TARGET/release/$NAME-aarch64" >"target/$AARCH_TARGET/release/$NAME-aarch64.sha512" else echo "Aarch64 artifact build: FAILED" fi @@ -50,6 +70,8 @@ echo "Building OSX artifact." if CC=o64-clang CXX=o64-clang++ LIBZ_SYS_STATIC=1 cargo build -q --release --target="$OSX_TARGET"; then echo "OSX artifact build: SUCCESS" cp "target/$OSX_TARGET/release/$NAME" "target/$OSX_TARGET/release/$NAME-osx" + strip "target/$OSX_TARGET/release/$NAME-osx" + sha512sum "target/$OSX_TARGET/release/$NAME-osx" >"target/$OSX_TARGET/release/$NAME-osx.sha512" else echo "OSX artifact build: FAILED" fi From ba828758d99da12b6ee5a902c226d18213088ecb Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 13 Feb 2022 05:53:51 -0500 Subject: [PATCH 19/38] Bump dependencies. Signed-off-by: Edu4rdSHL --- Cargo.lock | 16 ++++++++-------- Cargo.toml | 2 +- rusolver.1 | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3266483..6f7d347 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -269,9 +269,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.115" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a8d982fa7a96a000f6ec4cfe966de9703eccde29750df2bb8949da91b0e818d" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" [[package]] name = "linked-hash-map" @@ -281,9 +281,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "ntapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" dependencies = [ "winapi", ] @@ -705,9 +705,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" diff --git a/Cargo.toml b/Cargo.toml index 237a7af..2f0dba9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,4 +25,4 @@ lto = true codegen-units = 1 panic = 'abort' incremental = false -opt-level = "s" \ No newline at end of file +opt-level = "s" diff --git a/rusolver.1 b/rusolver.1 index 1fa2e01..955d0a3 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5. -.TH RUSOLVER "1" "February 2022" "Rusolver 0.8.0" "User Commands" +.TH RUSOLVER "1" "February 2022" "Rusolver 0.9.0" "User Commands" .SH NAME -Rusolver \- manual page for Rusolver 0.8.0 +Rusolver \- manual page for Rusolver 0.9.0 .SH DESCRIPTION -Rusolver 0.8.0 +Rusolver 0.9.0 Eduard Tolosa Fast DNS resolver written in Rust. .SS "USAGE:" @@ -41,7 +41,7 @@ Number of retries after lookup failure before giving up. Defaults to 0 Number of threads. Default: 100 .TP \fB\-\-timeout\fR -Timeout in seconds. Default: 1 +Timeout in seconds. Default: 3 .SH "SEE ALSO" The full documentation for .B Rusolver From e26ae062d6c7c8c65dfc43726d16963f7c80237f Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 13 Feb 2022 07:31:06 -0500 Subject: [PATCH 20/38] Avoid allocating domain_data everytime as it has the Clone trait. Signed-off-by: Edu4rdSHL --- src/dnslib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dnslib.rs b/src/dnslib.rs index 899c883..292f9cd 100644 --- a/src/dnslib.rs +++ b/src/dnslib.rs @@ -72,9 +72,9 @@ pub async fn return_hosts_data( trustable_resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); let wildcard_ips = wildcard_ips.clone(); - async move { - let mut domain_data = DomainData::default(); + let mut domain_data = DomainData::default(); + async move { if let Ok(ip) = resolver_fut.await { if disable_double_check { domain_data.ipv4_addresses = ip From 8620eded169ffe9ccee650f68cc7ee2d0969fd64 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 13 Feb 2022 12:10:12 -0500 Subject: [PATCH 21/38] Use our custom trust-dns implementation until https://github.com/bluejekyll/trust-dns/pull/1632 is decided. Signed-off-by: Edu4rdSHL --- Cargo.lock | 9 ++++----- Cargo.toml | 5 ++++- src/main.rs | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f7d347..726c640 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -505,7 +505,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.9.0" +version = "0.9.1" dependencies = [ "clap", "futures", @@ -646,8 +646,7 @@ dependencies = [ [[package]] name = "trust-dns-proto" version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31" +source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f05c9a33b59a932b0b2aea115cedd14cc3958b5f" dependencies = [ "async-trait", "cfg-if", @@ -671,8 +670,7 @@ dependencies = [ [[package]] name = "trust-dns-resolver" version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecae383baad9995efaa34ce8e57d12c3f305e545887472a492b838f4b5cfb77a" +source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f05c9a33b59a932b0b2aea115cedd14cc3958b5f" dependencies = [ "cfg-if", "futures-util", @@ -681,6 +679,7 @@ dependencies = [ "log", "lru-cache", "parking_lot", + "rand", "resolv-conf", "smallvec", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index 2f0dba9..5bedbd5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.9.0" +version = "0.9.1" authors = ["Eduard Tolosa "] edition = "2018" description = "Fast DNS resolver written in Rust." @@ -19,6 +19,9 @@ trust-dns-resolver = "0.20.4" clap = "2.33.4" rand = "0.8.4" +# https://github.com/bluejekyll/trust-dns/pull/1632 +[patch.crates-io] +trust-dns-resolver = { git = "https://github.com/Findomain/trust-dns", package = "trust-dns-resolver", branch = "custombranch" } [profile.release] lto = true diff --git a/src/main.rs b/src/main.rs index 53ca1ec..c948c0c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -90,6 +90,7 @@ async fn main() -> Result<(), Box> { attempts: retries, ip_strategy: LookupIpStrategy::Ipv4Only, num_concurrent_reqs: 1, + shuffle_dns_servers: true, ..Default::default() }; From 42dbf01d763b4a66a687f56d5869cc7ea92a5b07 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 13 Feb 2022 12:14:04 -0500 Subject: [PATCH 22/38] Bump manpage. Signed-off-by: Edu4rdSHL --- rusolver.1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rusolver.1 b/rusolver.1 index 955d0a3..7cbc764 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,9 +1,9 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5. -.TH RUSOLVER "1" "February 2022" "Rusolver 0.9.0" "User Commands" +.TH RUSOLVER "1" "February 2022" "Rusolver 0.9.1" "User Commands" .SH NAME -Rusolver \- manual page for Rusolver 0.9.0 +Rusolver \- manual page for Rusolver 0.9.1 .SH DESCRIPTION -Rusolver 0.9.0 +Rusolver 0.9.1 Eduard Tolosa Fast DNS resolver written in Rust. .SS "USAGE:" From 06ea060de914b5d1f6c236c3e8c636f1faa95244 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Sun, 13 Feb 2022 14:27:25 -0500 Subject: [PATCH 23/38] Update custom trust-dns-resolver branch. Signed-off-by: Edu4rdSHL --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 726c640..b5858c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -646,7 +646,7 @@ dependencies = [ [[package]] name = "trust-dns-proto" version = "0.20.4" -source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f05c9a33b59a932b0b2aea115cedd14cc3958b5f" +source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f339a5e806bed9109ad205d2143d8b18701d2ab0" dependencies = [ "async-trait", "cfg-if", @@ -670,7 +670,7 @@ dependencies = [ [[package]] name = "trust-dns-resolver" version = "0.20.4" -source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f05c9a33b59a932b0b2aea115cedd14cc3958b5f" +source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f339a5e806bed9109ad205d2143d8b18701d2ab0" dependencies = [ "cfg-if", "futures-util", From 624a3febb9544627ad11d553714438e8e77544cf Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Wed, 9 Mar 2022 22:52:06 -0500 Subject: [PATCH 24/38] Add function to return CNAME data. Signed-off-by: Edu4rdSHL --- src/dnslib.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/src/dnslib.rs b/src/dnslib.rs index 292f9cd..b2ea2dc 100644 --- a/src/dnslib.rs +++ b/src/dnslib.rs @@ -1,3 +1,5 @@ +use trust_dns_resolver::proto::{rr::RecordType, xfer::DnsRequestOptions}; + use { crate::structs::DomainData, futures::stream::{self, StreamExt}, @@ -53,7 +55,7 @@ pub fn return_tokio_asyncresolver( #[allow(clippy::too_many_arguments)] pub async fn return_hosts_data( hosts: HashSet, - resolvers: AsyncResolver>, + resolver: AsyncResolver>, trustable_resolver: AsyncResolver>, wildcard_ips: HashSet, disable_double_check: bool, @@ -67,7 +69,7 @@ pub async fn return_hosts_data( stream::iter(hosts) .map(|host| { - let resolver_fut = resolvers.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); + let resolver_fut = resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); let trustable_resolver_fut = trustable_resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); let wildcard_ips = wildcard_ips.clone(); @@ -108,3 +110,63 @@ pub async fn return_hosts_data( .collect::>() .await } + +// Used internally for now +pub async fn return_cname_data( + hosts: HashSet, + resolver: AsyncResolver>, + trustable_resolver: AsyncResolver>, + disable_double_check: bool, + mut threads: usize, +) -> HashMap { + if hosts.len() < threads { + threads = hosts.len(); + } + + let request_options = DnsRequestOptions::default(); + let record_type = RecordType::CNAME; + + stream::iter(hosts) + .map(|host| { + let resolver_fut = resolver.lookup( + host.trim_end_matches('.').to_owned() + ".", + record_type, + request_options, + ); + let trustable_resolver_fut = trustable_resolver.lookup( + host.trim_end_matches('.').to_owned() + ".", + record_type, + request_options, + ); + + let mut domain_data = DomainData::default(); + + async move { + if let Ok(lookup) = resolver_fut.await { + if disable_double_check { + domain_data.cname = lookup + .iter() + .filter_map(|rdata| rdata.as_cname()) + .map(|name| { + let name = name.to_string(); + name[..name.len() - 1].to_owned() + }) + .collect(); + } else if let Ok(lookup) = trustable_resolver_fut.await { + domain_data.cname = lookup + .iter() + .filter_map(|rdata| rdata.as_cname()) + .map(|name| { + let name = name.to_string(); + name[..name.len() - 1].to_owned() + }) + .collect(); + } + } + (host, domain_data) + } + }) + .buffer_unordered(threads) + .collect::>() + .await +} From 88ee0f9b58ea89e6affb02f81c11b75983f1a497 Mon Sep 17 00:00:00 2001 From: Edu4rdSHL Date: Fri, 11 Mar 2022 15:32:21 -0500 Subject: [PATCH 25/38] Update builder.sh Signed-off-by: Edu4rdSHL --- builder.sh | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/builder.sh b/builder.sh index f3030bc..91c0f70 100755 --- a/builder.sh +++ b/builder.sh @@ -10,6 +10,14 @@ AARCH_TARGET="aarch64-unknown-linux-gnu" OSX_TARGET="x86_64-apple-darwin" MANPAGE_DIR="./$NAME.1" +if ! systemctl is-active docker >/dev/null 2>&1; then + echo "Docker is not running. Starting docker." + if ! sudo systemctl start docker; then + echo "Failed to start docker." + exit 1 + fi +fi + # Linux build echo "Building Linux artifact." if cargo build -q --release --target="$LINUX_TARGET"; then @@ -87,18 +95,9 @@ else echo "Please install the help2man package." fi -#if command -v git >/dev/null; then -# git add . -# git commit -m "Bump version." -# git push -#fi - -#echo "Uploading crate to crates.io..." -#if cargo publish --no-verify > /dev/null; then -# echo "Crate uploaded." -#else -# echo "An error has occurred while uploading the crate to crates.io." -# exit -#fi - -echo "All builds have passed!" +# Stop docker +echo "Stopping docker." +if ! sudo systemctl stop docker; then + echo "Failed to stop docker." + exit 1 +fi From 7755533e1efec0e12a98f7fcf8a7494d3062d032 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Tue, 12 Apr 2022 05:46:39 -0500 Subject: [PATCH 26/38] Create make-release.yml --- .github/workflows/make-release.yml | 128 +++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 .github/workflows/make-release.yml diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml new file mode 100644 index 0000000..f1e0877 --- /dev/null +++ b/.github/workflows/make-release.yml @@ -0,0 +1,128 @@ +name: Create and upload artifacts + +on: + workflow_dispatch: + +jobs: + build-nix: + env: + IN_PIPELINE: true + runs-on: ${{ matrix.os }} + strategy: + matrix: + type: [ubuntu-x64, ubuntu-x86, armv7, aarch64] + include: + - type: ubuntu-x64 + os: ubuntu-latest + target: x86_64-unknown-linux-musl + name: rusolver-linux + path: target/x86_64-unknown-linux-musl/release/rusolver + pkg_config_path: /usr/lib/x86_64-linux-gnu/pkgconfig + - type: ubuntu-x86 + os: ubuntu-latest + target: i686-unknown-linux-musl + name: rusolver-linux-i386 + path: target/i686-unknown-linux-musl/release/rusolver + pkg_config_path: /usr/lib/i686-linux-gnu/pkgconfig + - type: armv7 + os: ubuntu-latest + target: armv7-unknown-linux-gnueabihf + name: rusolver-armv7 + path: target/armv7-unknown-linux-gnueabihf/release/rusolver + pkg_config_path: /usr/lib/x86_64-linux-gnu/pkgconfig + - type: aarch64 + os: ubuntu-latest + target: aarch64-unknown-linux-gnu + name: rusolver-aarch64 + path: target/aarch64-unknown-linux-gnu/release/rusolver + pkg_config_path: /usr/lib/x86_64-linux-gnu/pkgconfig + steps: + - uses: actions/checkout@v2 + - name: Install System Dependencies + run: | + env + sudo apt-get update + sudo apt-get install -y --no-install-recommends libssl-dev pkg-config gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: ${{ matrix.target }} + override: true + - uses: actions-rs/cargo@v1 + env: + PKG_CONFIG_PATH: ${{ matrix.pkg_config_path }} + OPENSSL_DIR: /usr/lib/ssl + with: + use-cross: true + command: build + args: --release --target=${{ matrix.target }} + - name: Strip symbols from binary + run: | + strip -s ${{ matrix.path }} || arm-linux-gnueabihf-strip -s ${{ matrix.path }} || aarch64-linux-gnu-strip -s ${{ matrix.path }} + - uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.name }} + path: ${{ matrix.path }} + + build-macos: + env: + IN_PIPELINE: true + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: x86_64-apple-darwin + override: true + - uses: actions-rs/cargo@v1 + with: + use-cross: true + command: build + args: --release --target=x86_64-apple-darwin + - name: Strip symbols from binary + run: | + strip -u -r target/x86_64-apple-darwin/release/rusolver + - uses: actions/upload-artifact@v2 + with: + name: rusolver-osx + path: target/x86_64-apple-darwin/release/rusolver + - uses: actions/upload-artifact@v2 + with: + name: rusolver-osx + path: rusolver-osx + + build-windows: + env: + IN_PIPELINE: true + runs-on: ${{ matrix.os }} + strategy: + matrix: + type: [windows-x64, windows-x86] + include: + - type: windows-x64 + os: windows-latest + target: x86_64-pc-windows-msvc + name: rusolver-windows.exe + path: target\x86_64-pc-windows-msvc\release\rusolver.exe + - type: windows-x86 + os: windows-latest + target: i686-pc-windows-msvc + name: rusolver-windows-i686.exe + path: target\i686-pc-windows-msvc\release\rusolver.exe + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: ${{ matrix.target }} + override: true + - uses: actions-rs/cargo@v1 + with: + use-cross: true + command: build + args: --release --target=${{ matrix.target }} + - uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.name }} + path: ${{ matrix.path }} From cf75cafee7c9d0c257c0b5a361441efc4e247e9c Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Fri, 29 Apr 2022 12:08:48 -0500 Subject: [PATCH 27/38] Use LibOptions for library options. Signed-off-by: Eduard Tolosa --- src/dnslib.rs | 160 ++++++++++++++++++++++--------------------------- src/main.rs | 19 +++--- src/structs.rs | 21 ++++++- 3 files changed, 102 insertions(+), 98 deletions(-) diff --git a/src/dnslib.rs b/src/dnslib.rs index b2ea2dc..93345c8 100644 --- a/src/dnslib.rs +++ b/src/dnslib.rs @@ -1,17 +1,15 @@ -use trust_dns_resolver::proto::{rr::RecordType, xfer::DnsRequestOptions}; - use { - crate::structs::DomainData, + crate::structs::{DomainData, LibOptions}, futures::stream::{self, StreamExt}, - std::collections::{HashMap, HashSet}, - trust_dns_resolver::config::ResolverOpts, -}; - -use { - std::net::SocketAddr, + std::{ + collections::{HashMap, HashSet}, + net::SocketAddr, + }, trust_dns_resolver::{ - config::{NameServerConfig, NameServerConfigGroup, Protocol, ResolverConfig}, + config::{NameServerConfig, NameServerConfigGroup, Protocol, ResolverConfig, ResolverOpts}, + lookup::{Ipv4Lookup, Lookup}, name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, + proto::{rr::RecordType, xfer::DnsRequestOptions}, AsyncResolver, TokioAsyncResolver, }, }; @@ -52,63 +50,58 @@ pub fn return_tokio_asyncresolver( .unwrap() } -#[allow(clippy::too_many_arguments)] -pub async fn return_hosts_data( - hosts: HashSet, - resolver: AsyncResolver>, - trustable_resolver: AsyncResolver>, - wildcard_ips: HashSet, - disable_double_check: bool, - mut threads: usize, - show_ip_addresses: bool, - quiet_flag: bool, -) -> HashMap { - if hosts.len() < threads { - threads = hosts.len(); - } +pub async fn return_hosts_data(options: &LibOptions) -> HashMap { + let threads = if options.hosts.len() < options.threads { + options.hosts.len() + } else { + options.threads + }; - stream::iter(hosts) - .map(|host| { - let resolver_fut = resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); - let trustable_resolver_fut = - trustable_resolver.ipv4_lookup(host.trim_end_matches('.').to_owned() + "."); - let wildcard_ips = wildcard_ips.clone(); + stream::iter(options.hosts.clone().into_iter().map(|host| { + let lookup_host = host.trim_end_matches('.').to_owned() + "."; - let mut domain_data = DomainData::default(); + let resolver_fut = options.resolvers.ipv4_lookup(lookup_host.clone()); + let trustable_resolver_fut = options.trustable_resolver.ipv4_lookup(lookup_host); + let wildcard_ips = options.wildcard_ips.clone(); - async move { - if let Ok(ip) = resolver_fut.await { - if disable_double_check { - domain_data.ipv4_addresses = ip - .into_iter() - .map(|x| x.to_string()) - .collect::>(); - } else if let Ok(ip) = trustable_resolver_fut.await { - domain_data.ipv4_addresses = ip - .into_iter() - .map(|x| x.to_string()) - .collect::>(); - } + let mut domain_data = DomainData::default(); + + let mut ip_lookup = Option::::None; + + async move { + if let Ok(ip) = resolver_fut.await { + if options.disable_double_check { + ip_lookup = Some(ip); + } else if let Ok(ip) = trustable_resolver_fut.await { + ip_lookup = Some(ip); } - domain_data.is_wildcard = domain_data - .ipv4_addresses - .iter() - .all(|ip| wildcard_ips.contains(ip)); - - if !quiet_flag { - if show_ip_addresses && !domain_data.is_wildcard { - println!("{};{:?}", host, domain_data.ipv4_addresses); - } else if !domain_data.is_wildcard { - println!("{}", host) - } - } - - (host, domain_data) } - }) - .buffer_unordered(threads) - .collect::>() - .await + + if let Some(ip_lookup) = ip_lookup { + for ip in ip_lookup.iter() { + domain_data.ipv4_addresses.insert(ip.to_string()); + } + } + + domain_data.is_wildcard = domain_data + .ipv4_addresses + .iter() + .all(|ip| wildcard_ips.contains(ip)); + + if !options.quiet_flag { + if options.show_ip_address && !domain_data.is_wildcard { + println!("{};{:?}", host, domain_data.ipv4_addresses); + } else if !domain_data.is_wildcard { + println!("{}", host) + } + } + + (host, domain_data) + } + })) + .buffer_unordered(threads) + .collect::>() + .await } // Used internally for now @@ -128,41 +121,32 @@ pub async fn return_cname_data( stream::iter(hosts) .map(|host| { - let resolver_fut = resolver.lookup( - host.trim_end_matches('.').to_owned() + ".", - record_type, - request_options, - ); - let trustable_resolver_fut = trustable_resolver.lookup( - host.trim_end_matches('.').to_owned() + ".", - record_type, - request_options, - ); + let lookup_host = host.trim_end_matches('.').to_owned() + "."; + let resolver_fut = resolver.lookup(lookup_host.clone(), record_type, request_options); + let trustable_resolver_fut = + trustable_resolver.lookup(lookup_host, record_type, request_options); let mut domain_data = DomainData::default(); + let mut cname_lookup = Option::::None; + async move { if let Ok(lookup) = resolver_fut.await { if disable_double_check { - domain_data.cname = lookup - .iter() - .filter_map(|rdata| rdata.as_cname()) - .map(|name| { - let name = name.to_string(); - name[..name.len() - 1].to_owned() - }) - .collect(); + cname_lookup = Some(lookup); } else if let Ok(lookup) = trustable_resolver_fut.await { - domain_data.cname = lookup - .iter() - .filter_map(|rdata| rdata.as_cname()) - .map(|name| { - let name = name.to_string(); - name[..name.len() - 1].to_owned() - }) - .collect(); + cname_lookup = Some(lookup); } } + + if let Some(lookup) = cname_lookup { + for record in lookup.iter() { + if let Some(cname) = record.as_cname() { + domain_data.cname = cname.to_string(); + } + } + } + (host, domain_data) } }) diff --git a/src/main.rs b/src/main.rs index c948c0c..e785040 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use { clap::{value_t, App, Arg}, - rusolver::{dnslib, utils}, + rusolver::{dnslib, structs, utils}, std::collections::HashSet, tokio::{ self, @@ -9,7 +9,7 @@ use { trust_dns_resolver::config::{LookupIpStrategy, ResolverOpts}, }; -// Please add support for AAAA, TXT, SRV, NAPTR, PTR, CNAME, DNAME, MX, NS, SOA, LOC, SVCB, HTTPS, SPF, CAA and AVC resource records. +// WIP: add support for AAAA, TXT, SRV, NAPTR, PTR, CNAME, DNAME, MX, NS, SOA, LOC, SVCB, HTTPS, SPF, CAA and AVC resource records. // This could use a new command line option such as -t, e.g. echo www.example.com | rusolver -i -t AAAA. It might also make sense // to change -i/--ip to -d/--data with the text Display the record data. @@ -76,7 +76,7 @@ async fn main() -> Result<(), Box> { .get_matches(); // Assign values or use defaults - let show_ip_adress = matches.is_present("ip"); + let show_ip_address = matches.is_present("ip"); let threads = value_t!(matches.value_of("threads"), usize).unwrap_or_else(|_| 100); let timeout = value_t!(matches.value_of("timeout"), u64).unwrap_or_else(|_| 3); let retries = value_t!(matches.value_of("retries"), usize).unwrap_or_else(|_| 0); @@ -118,7 +118,7 @@ async fn main() -> Result<(), Box> { "84.200.70.40:53", ] .iter() - .map(|x| x.to_string()) + .map(ToString::to_string) .collect(); // Create resolvers @@ -152,17 +152,18 @@ async fn main() -> Result<(), Box> { buffer.lines().map(str::to_owned).collect() }; - dnslib::return_hosts_data( + let options = structs::LibOptions { hosts, resolvers, trustable_resolver, wildcard_ips, disable_double_check, threads, - show_ip_adress, - false, - ) - .await; + show_ip_address, + quiet_flag, + }; + + dnslib::return_hosts_data(&options).await; Ok(()) } diff --git a/src/structs.rs b/src/structs.rs index f281670..f408081 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -1,4 +1,10 @@ -use std::collections::HashSet; +use { + std::collections::HashSet, + trust_dns_resolver::{ + name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, + AsyncResolver, + }, +}; #[derive(Clone, Debug)] pub struct DomainData { @@ -18,3 +24,16 @@ impl Default for DomainData { } } } + +#[derive(Clone, Debug)] +pub struct LibOptions { + pub hosts: HashSet, + pub resolvers: AsyncResolver>, + pub trustable_resolver: + AsyncResolver>, + pub wildcard_ips: HashSet, + pub disable_double_check: bool, + pub threads: usize, + pub show_ip_address: bool, + pub quiet_flag: bool, +} From 7e683bd1aec0a0f57da68211bf71e8bc41e9cadf Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sun, 20 Apr 2025 14:48:57 -0500 Subject: [PATCH 28/38] Clippy fixes. --- src/dnslib.rs | 3 ++- src/main.rs | 2 +- src/structs.rs | 13 +------------ src/utils.rs | 15 ++++++--------- 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/dnslib.rs b/src/dnslib.rs index 93345c8..8e4dd9f 100644 --- a/src/dnslib.rs +++ b/src/dnslib.rs @@ -14,6 +14,7 @@ use { }, }; +#[must_use] pub fn return_tokio_asyncresolver( nameserver_ips: HashSet, options: ResolverOpts, @@ -92,7 +93,7 @@ pub async fn return_hosts_data(options: &LibOptions) -> HashMap Result<(), Box> { wildcard_ips = utils::detect_wildcards(&domain, &trustable_resolver, quiet_flag).await; buffer .lines() - .map(|word| format!("{}.{}", word, domain)) + .map(|word| format!("{word}.{domain}")) .collect() } else { buffer.lines().map(str::to_owned).collect() diff --git a/src/structs.rs b/src/structs.rs index f408081..3da267b 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -6,7 +6,7 @@ use { }, }; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Default)] pub struct DomainData { pub ipv4_addresses: HashSet, pub ipv6_addresses: HashSet, @@ -14,17 +14,6 @@ pub struct DomainData { pub is_wildcard: bool, } -impl Default for DomainData { - fn default() -> Self { - DomainData { - ipv4_addresses: HashSet::new(), - ipv6_addresses: HashSet::new(), - cname: String::from(""), - is_wildcard: false, - } - } -} - #[derive(Clone, Debug)] pub struct LibOptions { pub hosts: HashSet, diff --git a/src/utils.rs b/src/utils.rs index 1e9df99..e6b3a31 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -15,7 +15,7 @@ pub async fn return_file_lines(file: String) -> HashSet { let mut f = match File::open(&file).await { Ok(file) => file, Err(e) => { - eprintln!("Error opening resolvers file. Error: {}", e); + eprintln!("Error opening resolvers file. Error: {e}"); std::process::exit(1) } }; @@ -25,7 +25,7 @@ pub async fn return_file_lines(file: String) -> HashSet { Ok(a) => a, _ => unreachable!("Error reading to string."), }; - buffer.lines().map(|f| format!("{}:53", f)).collect() + buffer.lines().map(|f| format!("{f}:53")).collect() } pub async fn detect_wildcards( @@ -34,7 +34,7 @@ pub async fn detect_wildcards( quiet_flag: bool, ) -> HashSet { if !quiet_flag { - println!("Running wildcards detection for {}...\n", target) + println!("Running wildcards detection for {target}...\n"); } let mut generated_wilcards: HashSet = HashSet::new(); for _ in 1..20 { @@ -69,13 +69,10 @@ pub async fn detect_wildcards( generated_wilcards.retain(|ip| ip.parse::().is_ok()); if !generated_wilcards.is_empty() && !quiet_flag { - println!( - "Wilcards detected for {} and wildcard's IP saved for furter work.", - target - ); - println!("Wilcard IPs: {:?}\n", generated_wilcards) + println!("Wilcards detected for {target} and wildcard's IP saved for furter work."); + println!("Wilcard IPs: {generated_wilcards:?}\n"); } else if !quiet_flag { - println!("No wilcards detected for {}, nice!\n", target) + println!("No wilcards detected for {target}, nice!\n"); } generated_wilcards } From e06eeffb48f243a41d93ba14e435d0a89e46947d Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sun, 20 Apr 2025 14:49:02 -0500 Subject: [PATCH 29/38] Update deps --- Cargo.lock | 863 ++++++++++++++++++++++++++++++++++++++++------------- Cargo.toml | 8 +- 2 files changed, 661 insertions(+), 210 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b5858c2..21b29b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ansi_term" @@ -13,13 +28,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.52" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -33,6 +48,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -40,10 +76,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bytes" -version = "1.1.0" +name = "bitflags" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cfg-if" @@ -59,7 +101,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim", "textwrap", "unicode-width", @@ -68,37 +110,47 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.3.2" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] [[package]] name = "enum-as-inner" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" +checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "futures" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -111,9 +163,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -121,15 +173,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -138,38 +190,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -185,9 +237,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.4" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -195,13 +247,16 @@ dependencies = [ ] [[package]] -name = "heck" -version = "0.3.3" +name = "gimli" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -214,13 +269,131 @@ dependencies = [ [[package]] name = "hostname" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" dependencies = [ + "cfg-if", "libc", - "match_cfg", - "winapi", + "windows-link", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] @@ -235,10 +408,31 @@ dependencies = [ ] [[package]] -name = "instant" -version = "0.1.12" +name = "idna" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -249,7 +443,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" dependencies = [ - "socket2", + "socket2 0.3.19", "widestring", "winapi", "winreg", @@ -257,45 +451,49 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.117" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if", -] +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru-cache" @@ -306,71 +504,47 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.4.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] [[package]] name = "mio" -version = "0.7.14" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "log", - "miow", - "ntapi", - "winapi", + "wasi", + "windows-sys", ] [[package]] -name = "miow" -version = "0.3.7" +name = "object" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ - "winapi", + "memchr", ] -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi", -] - -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" - [[package]] name = "parking_lot" version = "0.11.2" @@ -379,34 +553,57 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.10", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "winapi", ] [[package]] -name = "percent-encoding" -version = "2.1.0" +name = "parking_lot_core" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.11", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -416,44 +613,40 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - -[[package]] -name = "proc-macro2" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "unicode-xid", + "zerocopy", ] [[package]] -name = "quick-error" -version = "1.2.3" +name = "proc-macro2" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] [[package]] name = "quote" -version = "1.0.15" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -468,39 +661,38 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] -name = "rand_hc" -version = "0.3.1" +name = "redox_syscall" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "rand_core", + "bitflags 1.3.2", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" dependencies = [ "hostname", - "quick-error", ] [[package]] @@ -515,31 +707,60 @@ dependencies = [ ] [[package]] -name = "scopeguard" -version = "1.1.0" +name = "rustc-demangle" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.5" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" -version = "1.8.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "socket2" @@ -552,6 +773,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.8.0" @@ -560,13 +797,35 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] @@ -580,67 +839,76 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", ] [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.16.1" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ + "backtrace", "bytes", "libc", - "memchr", "mio", - "num_cpus", - "once_cell", - "parking_lot", + "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", + "socket2 0.5.9", "tokio-macros", - "winapi", + "windows-sys", ] [[package]] name = "tokio-macros" -version = "1.7.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -655,7 +923,7 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 0.2.3", "ipnet", "lazy_static", "log", @@ -678,7 +946,7 @@ dependencies = [ "lazy_static", "log", "lru-cache", - "parking_lot", + "parking_lot 0.11.2", "rand", "resolv-conf", "smallvec", @@ -689,49 +957,54 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" - [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "url" -version = "2.2.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna", - "matches", + "idna 1.0.3", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "vec_map" version = "0.8.2" @@ -740,9 +1013,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "widestring" @@ -772,6 +1045,85 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winreg" version = "0.6.2" @@ -780,3 +1132,102 @@ checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" dependencies = [ "winapi", ] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] diff --git a/Cargo.toml b/Cargo.toml index 5bedbd5..ea5d112 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,12 +12,12 @@ readme = "README.md" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = { version = "1.16.1", features = ["full"] } -futures = "0.3.21" +tokio = { version = "1.44.2", features = ["full"] } +futures = "0.3.31" trust-dns-resolver = "0.20.4" # trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } -clap = "2.33.4" -rand = "0.8.4" +clap = "2.34.0" +rand = "0.8.5" # https://github.com/bluejekyll/trust-dns/pull/1632 [patch.crates-io] From 37020360c2045ea4e36e95f5cf698ff93534a18c Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sun, 27 Jul 2025 16:19:33 -0500 Subject: [PATCH 30/38] (feat): refactor code This refactor is aimed to provide better readability for future maintenance, at the same time that provides several performance improvements reducing the number of calls that we do to resolvers. --- Cargo.lock | 1285 ++++++++++++++++++++++++++++++++++-------------- Cargo.toml | 19 +- src/args.rs | 46 ++ src/dnslib.rs | 131 +++-- src/lib.rs | 1 + src/main.rs | 116 +---- src/structs.rs | 15 +- src/utils.rs | 127 +++-- 8 files changed, 1130 insertions(+), 610 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 21b29b2..5eba665 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,17 +13,67 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] -name = "ansi_term" -version = "0.12.1" +name = "aho-corasick" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ - "winapi", + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", ] [[package]] @@ -34,31 +84,20 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", + "syn", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -66,20 +105,20 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] name = "bitflags" -version = "1.3.2" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] -name = "bitflags" -version = "2.9.0" +name = "bumpalo" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes" @@ -88,26 +127,96 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] -name = "cfg-if" -version = "1.0.0" +name = "cc" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "clap" -version = "2.34.0" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim", - "textwrap", - "unicode-width", - "vec_map", + "clap_builder", + "clap_derive", ] +[[package]] +name = "clap_builder" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "data-encoding" version = "2.9.0" @@ -122,19 +231,19 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] name = "enum-as-inner" -version = "0.3.4" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -202,7 +311,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] @@ -236,14 +345,40 @@ dependencies = [ ] [[package]] -name = "getrandom" -version = "0.2.15" +name = "generator" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -254,47 +389,74 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "hickory-proto" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" dependencies = [ - "libc", + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand", + "ring", + "thiserror 2.0.12", + "tinyvec", + "tokio", + "tracing", + "url", ] [[package]] -name = "hostname" -version = "0.4.1" +name = "hickory-resolver" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" dependencies = [ "cfg-if", - "libc", - "windows-link", + "futures-util", + "hickory-proto", + "ipconfig", + "moka", + "once_cell", + "parking_lot", + "rand", + "resolv-conf", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tracing", ] [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -303,31 +465,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -335,78 +477,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "1.0.3" @@ -420,32 +538,34 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", ] [[package]] -name = "instant" -version = "0.1.13" +name = "io-uring" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" dependencies = [ + "bitflags", "cfg-if", + "libc", ] [[package]] name = "ipconfig" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.3.19", + "socket2 0.5.10", "widestring", - "winapi", + "windows-sys 0.48.0", "winreg", ] @@ -455,6 +575,22 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -463,27 +599,21 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -496,44 +626,80 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] -name = "lru-cache" -version = "0.1.2" +name = "loom" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" dependencies = [ - "linked-hash-map", + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", ] [[package]] -name = "matches" -version = "0.1.10" +name = "matchers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi", - "windows-sys", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "moka" +version = "0.12.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "loom", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", ] [[package]] @@ -546,51 +712,48 @@ dependencies = [ ] [[package]] -name = "parking_lot" -version = "0.11.2" +name = "once_cell" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", + "critical-section", + "portable-atomic", ] [[package]] -name = "parking_lot" -version = "0.12.3" +name = "once_cell_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", + "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.6" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.11", + "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -611,6 +774,21 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -639,21 +817,26 @@ dependencies = [ ] [[package]] -name = "rand" -version = "0.8.5" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -661,56 +844,123 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom", + "getrandom 0.3.3", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "de3a5d9f0aba1dbcec1cc47f0ff94a4b778fe55bca98a6dfa92e4e094e57b1c4" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] -name = "redox_syscall" -version = "0.5.11" +name = "regex" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ - "bitflags 2.9.0", + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "resolv-conf" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" +checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "hostname", + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] name = "rusolver" -version = "0.9.1" +version = "0.10.0" dependencies = [ "clap", "futures", + "hickory-resolver", "rand", "tokio", - "trust-dns-resolver", ] [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" @@ -718,6 +968,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + [[package]] name = "serde" version = "1.0.219" @@ -735,9 +991,24 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.5" @@ -749,38 +1020,34 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.3.19" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "cfg-if", "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "socket2" -version = "0.5.9" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -791,26 +1058,15 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" -version = "0.8.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -819,23 +1075,20 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] -name = "textwrap" -version = "0.11.0" +name = "tagptr" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "thiserror" @@ -843,7 +1096,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -854,14 +1116,34 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -884,20 +1166,22 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", - "parking_lot 0.12.3", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.9", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -908,58 +1192,57 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] -name = "trust-dns-proto" -version = "0.20.4" -source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f339a5e806bed9109ad205d2143d8b18701d2ab0" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "log", - "rand", - "smallvec", - "thiserror", - "tinyvec", - "tokio", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.20.4" -source = "git+https://github.com/Findomain/trust-dns?branch=custombranch#f339a5e806bed9109ad205d2143d8b18701d2ab0" -dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "parking_lot 0.11.2", - "rand", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "trust-dns-proto", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.18" +name = "tracing" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] [[package]] name = "unicode-ident" @@ -968,19 +1251,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] -name = "unicode-normalization" -version = "0.1.24" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" @@ -989,16 +1263,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 1.0.3", + "idna", "percent-encoding", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -1006,22 +1274,106 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "vec_map" -version = "0.8.2" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "widestring" -version = "0.4.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -1046,10 +1398,115 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-link" -version = "0.1.1" +name = "windows" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] [[package]] name = "windows-sys" @@ -1057,7 +1514,31 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -1066,28 +1547,55 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -1100,24 +1608,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -1126,30 +1658,34 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" -version = "0.6.2" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -1159,34 +1695,34 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] [[package]] @@ -1206,15 +1742,26 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", "synstructure", ] [[package]] -name = "zerovec" -version = "0.10.4" +name = "zerotrie" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -1223,11 +1770,11 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn", ] diff --git a/Cargo.toml b/Cargo.toml index ea5d112..8f16233 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rusolver" -version = "0.9.1" +version = "0.10.0" authors = ["Eduard Tolosa "] -edition = "2018" +edition = "2021" description = "Fast DNS resolver written in Rust." repository = "https://github.com/edu4rdshl/rusolver" license = "GPL-3.0-or-later" @@ -12,20 +12,13 @@ readme = "README.md" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = { version = "1.44.2", features = ["full"] } +tokio = { version = "1.47.0", features = ["full"] } futures = "0.3.31" -trust-dns-resolver = "0.20.4" -# trust-dns-resolver = { git = "https://github.com/Edu4rdSHL/trust-dns", branch = "main" } -clap = "2.34.0" -rand = "0.8.5" - -# https://github.com/bluejekyll/trust-dns/pull/1632 -[patch.crates-io] -trust-dns-resolver = { git = "https://github.com/Findomain/trust-dns", package = "trust-dns-resolver", branch = "custombranch" } +hickory-resolver = "0.25.2" +clap = { version = "4.5.41", features = ["derive"] } +rand = "0.9.2" [profile.release] lto = true codegen-units = 1 panic = 'abort' -incremental = false -opt-level = "s" diff --git a/src/args.rs b/src/args.rs index e69de29..861bc3f 100644 --- a/src/args.rs +++ b/src/args.rs @@ -0,0 +1,46 @@ +use clap::{arg, Parser}; + +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +pub struct Args { + #[arg( + short, + long, + default_value_t = 100, + help = "Number of threads. Default: 100" + )] + pub threads: usize, + + #[arg( + long, + default_value_t = 0, + help = "Number of retries after lookup failure before giving up. Defaults to 0" + )] + pub retries: usize, + + #[arg( + short, + long, + help = "Target domain. When it's specified, a wordlist can be used from stdin for bruteforcing." + )] + pub domain: Option, + + #[arg(short, long, help = "File with DNS ips.")] + pub resolvers: Option, + + #[arg(long, default_value_t = 3, help = "Timeout in seconds. Default: 3")] + pub timeout: u64, + + #[arg(short, long, help = "Display the record data.")] + pub ip: bool, + + #[arg( + short, + long, + help = "Enable the double verification algorithm for subdomains. Default: false" + )] + pub enable_double_check: bool, + + #[arg(short, long, help = "Quiet mode, no output except errors.")] + pub quiet_flag: bool, +} diff --git a/src/dnslib.rs b/src/dnslib.rs index 8e4dd9f..38e35b6 100644 --- a/src/dnslib.rs +++ b/src/dnslib.rs @@ -1,54 +1,52 @@ use { - crate::structs::{DomainData, LibOptions}, + crate::{ + structs::{DomainData, LibOptions}, + utils::print_domain_data, + }, futures::stream::{self, StreamExt}, + hickory_resolver::{ + config::{NameServerConfig, NameServerConfigGroup, ResolverConfig, ResolverOpts}, + name_server::TokioConnectionProvider, + proto::{rr::RecordType, xfer::Protocol}, + TokioResolver, + }, std::{ collections::{HashMap, HashSet}, net::SocketAddr, }, - trust_dns_resolver::{ - config::{NameServerConfig, NameServerConfigGroup, Protocol, ResolverConfig, ResolverOpts}, - lookup::{Ipv4Lookup, Lookup}, - name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, - proto::{rr::RecordType, xfer::DnsRequestOptions}, - AsyncResolver, TokioAsyncResolver, - }, }; #[must_use] -pub fn return_tokio_asyncresolver( - nameserver_ips: HashSet, +pub fn return_tokio_asyncresolver( + nameserver_ips: &HashSet, options: ResolverOpts, -) -> AsyncResolver> { - let mut name_servers = NameServerConfigGroup::with_capacity(nameserver_ips.len() * 2); +) -> TokioResolver { + let mut name_servers = NameServerConfigGroup::with_capacity(nameserver_ips.len()); - name_servers.extend(nameserver_ips.into_iter().flat_map(|server| { - let socket_addr = SocketAddr::V4(match server.parse() { - Ok(a) => a, - Err(e) => unreachable!( + name_servers.extend(nameserver_ips.iter().map(|server| { + let socket_addr = SocketAddr::V4(server.parse().unwrap_or_else(|e| { + panic!( "Error parsing the server {}, only IPv4 are allowed. Error: {}", server, e - ), - }); + ) + })); - std::iter::once(NameServerConfig { + NameServerConfig { socket_addr, protocol: Protocol::Udp, tls_dns_name: None, - trust_nx_responses: false, - }) - .chain(std::iter::once(NameServerConfig { - socket_addr, - protocol: Protocol::Tcp, - tls_dns_name: None, - trust_nx_responses: false, - })) + http_endpoint: None, + trust_negative_responses: false, + bind_addr: None, + } })); - TokioAsyncResolver::tokio( + TokioResolver::builder_with_config( ResolverConfig::from_parts(None, vec![], name_servers), - options, + TokioConnectionProvider::default(), ) - .unwrap() + .with_options(options) + .build() } pub async fn return_hosts_data(options: &LibOptions) -> HashMap { @@ -59,24 +57,22 @@ pub async fn return_hosts_data(options: &LibOptions) -> HashMap::None; - async move { - if let Ok(ip) = resolver_fut.await { - if options.disable_double_check { - ip_lookup = Some(ip); - } else if let Ok(ip) = trustable_resolver_fut.await { - ip_lookup = Some(ip); + let ip_lookup = if options.enable_double_check { + match ( + options.resolvers.ipv4_lookup(lookup_host.clone()).await, + options.trustable_resolvers.ipv4_lookup(lookup_host).await, + ) { + (Ok(_), Ok(ip)) => Some(ip), + _ => None, } - } + } else { + options.resolvers.ipv4_lookup(lookup_host).await.ok() + }; if let Some(ip_lookup) = ip_lookup { for ip in ip_lookup.iter() { @@ -89,13 +85,7 @@ pub async fn return_hosts_data(options: &LibOptions) -> HashMap HashMap, - resolver: AsyncResolver>, - trustable_resolver: AsyncResolver>, +pub async fn return_cname_data( + hosts: HashSet, + resolver: TokioResolver, + trustable_resolver: TokioResolver, disable_double_check: bool, mut threads: usize, ) -> HashMap { @@ -117,33 +107,34 @@ pub async fn return_cname_data( threads = hosts.len(); } - let request_options = DnsRequestOptions::default(); - let record_type = RecordType::CNAME; - stream::iter(hosts) .map(|host| { - let lookup_host = host.trim_end_matches('.').to_owned() + "."; - let resolver_fut = resolver.lookup(lookup_host.clone(), record_type, request_options); - let trustable_resolver_fut = - trustable_resolver.lookup(lookup_host, record_type, request_options); + let host = host.trim_end_matches('.').to_owned(); + let fqdn = format!("{host}."); - let mut domain_data = DomainData::default(); - - let mut cname_lookup = Option::::None; + let resolver = resolver.clone(); + let trustable_resolver = trustable_resolver.clone(); async move { - if let Ok(lookup) = resolver_fut.await { - if disable_double_check { - cname_lookup = Some(lookup); - } else if let Ok(lookup) = trustable_resolver_fut.await { - cname_lookup = Some(lookup); + let cname_lookup = if disable_double_check { + resolver.lookup(fqdn.clone(), RecordType::CNAME).await.ok() + } else { + match ( + resolver.lookup(fqdn.clone(), RecordType::CNAME).await, + trustable_resolver.lookup(fqdn, RecordType::CNAME).await, + ) { + (Ok(_), Ok(lookup)) => Some(lookup), + _ => None, } - } + }; + + let mut domain_data = DomainData::default(); if let Some(lookup) = cname_lookup { for record in lookup.iter() { if let Some(cname) = record.as_cname() { domain_data.cname = cname.to_string(); + break; } } } diff --git a/src/lib.rs b/src/lib.rs index de23ad6..df347f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +pub mod args; pub mod dnslib; pub mod structs; pub mod utils; diff --git a/src/main.rs b/src/main.rs index 980a492..1722b76 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,11 @@ use { - clap::{value_t, App, Arg}, - rusolver::{dnslib, structs, utils}, + clap::Parser, + rusolver::{args::Args, dnslib, structs, utils}, std::collections::HashSet, tokio::{ self, io::{self, AsyncReadExt}, }, - trust_dns_resolver::config::{LookupIpStrategy, ResolverOpts}, }; // WIP: add support for AAAA, TXT, SRV, NAPTR, PTR, CNAME, DNAME, MX, NS, SOA, LOC, SVCB, HTTPS, SPF, CAA and AVC resource records. @@ -16,83 +15,10 @@ use { #[tokio::main] async fn main() -> Result<(), Box> { // Eval args - let matches = App::new("Rusolver") - .version(clap::crate_version!()) - .author("Eduard Tolosa ") - .about("Fast DNS resolver written in Rust.") - .arg( - Arg::with_name("threads") - .short("t") - .long("threads") - .takes_value(true) - .help("Number of threads. Default: 100"), - ) - .arg( - Arg::with_name("retries") - .long("retries") - .takes_value(true) - .help("Number of retries after lookup failure before giving up. Defaults to 0"), - ) - .arg( - Arg::with_name("domain") - .short("d") - .long("domain") - .takes_value(true) - .help("Target domain. When it's specified, a wordlist can be used from stdin for bruteforcing."), - ) - .arg( - Arg::with_name("resolvers") - .short("r") - .long("resolvers") - .takes_value(true) - .help("File with DNS ips."), - ) - .arg( - Arg::with_name("timeout") - .long("timeout") - .takes_value(true) - .help("Timeout in seconds. Default: 3"), - ) - .arg( - Arg::with_name("ip") - .short("i") - .long("ip") - .takes_value(false) - .help("Show the discovered IP addresses. Default: false"), - ) - .arg( - Arg::with_name("no-verify") - .long("no-verify") - .takes_value(false) - .help("Disables the double verification algorithm for valid subdomains -NOT RECOMMENDED-. Default: false"), - ) - .arg( - Arg::with_name("quiet") - .short("q") - .long("quiet") - .takes_value(false) - .help("Enables quiet mode."), - ) - .get_matches(); - - // Assign values or use defaults - let show_ip_address = matches.is_present("ip"); - let threads = value_t!(matches.value_of("threads"), usize).unwrap_or_else(|_| 100); - let timeout = value_t!(matches.value_of("timeout"), u64).unwrap_or_else(|_| 3); - let retries = value_t!(matches.value_of("retries"), usize).unwrap_or_else(|_| 0); - let quiet_flag = matches.is_present("quiet"); - let custom_resolvers = matches.is_present("resolvers"); - let disable_double_check = matches.is_present("no-verify") && custom_resolvers; + let args = Args::parse(); // Resolver opts - let options = ResolverOpts { - timeout: std::time::Duration::from_secs(timeout), - attempts: retries, - ip_strategy: LookupIpStrategy::Ipv4Only, - num_concurrent_reqs: 1, - shuffle_dns_servers: true, - ..Default::default() - }; + let options = utils::return_resolver_opts(args.timeout, args.retries); let built_in_nameservers: HashSet = vec![ // Cloudflare @@ -110,12 +36,6 @@ async fn main() -> Result<(), Box> { // Verisign "64.6.64.6:53", "64.6.65.6:53", - // UncensoredDNS - "91.239.100.100:53", - "89.233.43.71:53", - // dns.watch - "84.200.69.80:53", - "84.200.70.40:53", ] .iter() .map(ToString::to_string) @@ -124,16 +44,15 @@ async fn main() -> Result<(), Box> { // Create resolvers let mut nameserver_ips; - if custom_resolvers { - nameserver_ips = - utils::return_file_lines(value_t!(matches.value_of("resolvers"), String).unwrap()) - .await; + if args.resolvers.is_some() { + nameserver_ips = utils::return_file_lines(&args.resolvers.unwrap()).await; nameserver_ips.retain(|ip| !ip.is_empty()); } else { nameserver_ips = built_in_nameservers.clone(); } - let resolvers = dnslib::return_tokio_asyncresolver(nameserver_ips, options); - let trustable_resolver = dnslib::return_tokio_asyncresolver(built_in_nameservers, options); + + let resolvers = dnslib::return_tokio_asyncresolver(&nameserver_ips, options.clone()); + let trustable_resolvers = dnslib::return_tokio_asyncresolver(&built_in_nameservers, options); let mut wildcard_ips = HashSet::new(); // Read stdin @@ -141,9 +60,10 @@ async fn main() -> Result<(), Box> { let mut stdin = io::stdin(); stdin.read_to_string(&mut buffer).await?; - let hosts: HashSet = if matches.is_present("domain") { - let domain = value_t!(matches, "domain", String).unwrap(); - wildcard_ips = utils::detect_wildcards(&domain, &trustable_resolver, quiet_flag).await; + let hosts: HashSet = if args.domain.is_some() { + let domain = args.domain.unwrap(); + wildcard_ips = + utils::detect_wildcards(&domain, &trustable_resolvers, args.quiet_flag).await; buffer .lines() .map(|word| format!("{word}.{domain}")) @@ -155,12 +75,12 @@ async fn main() -> Result<(), Box> { let options = structs::LibOptions { hosts, resolvers, - trustable_resolver, + trustable_resolvers, wildcard_ips, - disable_double_check, - threads, - show_ip_address, - quiet_flag, + enable_double_check: args.enable_double_check, + threads: args.threads, + show_ip_address: args.ip, + quiet_flag: args.quiet_flag, }; dnslib::return_hosts_data(&options).await; diff --git a/src/structs.rs b/src/structs.rs index 3da267b..8afd26f 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -1,10 +1,4 @@ -use { - std::collections::HashSet, - trust_dns_resolver::{ - name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, - AsyncResolver, - }, -}; +use {hickory_resolver::TokioResolver, std::collections::HashSet}; #[derive(Clone, Debug, Default)] pub struct DomainData { @@ -17,11 +11,10 @@ pub struct DomainData { #[derive(Clone, Debug)] pub struct LibOptions { pub hosts: HashSet, - pub resolvers: AsyncResolver>, - pub trustable_resolver: - AsyncResolver>, + pub resolvers: TokioResolver, + pub trustable_resolvers: TokioResolver, pub wildcard_ips: HashSet, - pub disable_double_check: bool, + pub enable_double_check: bool, pub threads: usize, pub show_ip_address: bool, pub quiet_flag: bool, diff --git a/src/utils.rs b/src/utils.rs index e6b3a31..078d736 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,18 +1,17 @@ use { + crate::structs::{DomainData, LibOptions}, futures::stream::{self, StreamExt}, - rand::{distributions::Alphanumeric, thread_rng as rng, Rng}, - std::{collections::HashSet, net::Ipv4Addr}, - tokio::{self, fs::File, io::AsyncReadExt}, - trust_dns_resolver::{ - name_server::{GenericConnection, GenericConnectionProvider, TokioRuntime}, - AsyncResolver, + hickory_resolver::{ + config::{LookupIpStrategy, ResolverOpts, ServerOrderingStrategy}, + TokioResolver, }, + rand::{distr::Alphanumeric, rng, Rng}, + std::{collections::HashSet, net::Ipv4Addr}, + tokio::{fs::File, io::AsyncReadExt}, }; -// In the future I may need to implement error propagation, but for now it's fine -// to deal with matches -pub async fn return_file_lines(file: String) -> HashSet { - let mut f = match File::open(&file).await { +pub async fn return_file_lines(file: &str) -> HashSet { + let mut f = match File::open(file).await { Ok(file) => file, Err(e) => { eprintln!("Error opening resolvers file. Error: {e}"); @@ -21,58 +20,88 @@ pub async fn return_file_lines(file: String) -> HashSet { }; let mut buffer = String::new(); - match f.read_to_string(&mut buffer).await { - Ok(a) => a, - _ => unreachable!("Error reading to string."), - }; - buffer.lines().map(|f| format!("{f}:53")).collect() + (f.read_to_string(&mut buffer).await) + .unwrap_or_else(|_| unreachable!("Error reading to string.")); + + let estimated_lines = buffer.matches('\n').count() + 1; + let mut result = HashSet::with_capacity(estimated_lines); + + for line in buffer.lines() { + if !line.is_empty() { + result.insert(format!("{line}:53")); + } + } + result } pub async fn detect_wildcards( target: &str, - resolvers: &AsyncResolver>, + resolvers: &TokioResolver, quiet_flag: bool, ) -> HashSet { if !quiet_flag { println!("Running wildcards detection for {target}...\n"); } - let mut generated_wilcards: HashSet = HashSet::new(); + + let mut generated_wildcards = HashSet::with_capacity(19); + + // Generate random subdomains for wildcard detection for _ in 1..20 { - generated_wilcards.insert(format!( - "{}.{}.", - rng() - .sample_iter(Alphanumeric) - .take(15) - .map(char::from) - .collect::(), - target - )); + let random_subdomain: String = rng() + .sample_iter(Alphanumeric) + .take(15) + .map(char::from) + .collect(); + generated_wildcards.insert(format!("{random_subdomain}.{target}.")); } - generated_wilcards = stream::iter(generated_wilcards.clone().into_iter().map( - |host| async move { - if let Ok(ips) = resolvers.ipv4_lookup(host.clone()).await { - ips.into_iter() - .map(|x| x.to_string()) - .collect::>() - } else { - Vec::new() - } - }, - )) - .buffer_unordered(10) - .map(stream::iter) - .flatten() - .collect() - .await; + let wildcard_ips: HashSet = stream::iter(generated_wildcards.into_iter()) + .map(|host| async move { + resolvers.ipv4_lookup(host).await.map_or_else( + |_| Vec::new(), + |ips| { + ips.into_iter() + .filter_map(|ip| { + let ip_str = ip.to_string(); + if ip_str.parse::().is_ok() { + Some(ip_str) + } else { + None + } + }) + .collect::>() + }, + ) + }) + .buffer_unordered(10) + .map(stream::iter) + .flatten() + .collect() + .await; - generated_wilcards.retain(|ip| ip.parse::().is_ok()); - - if !generated_wilcards.is_empty() && !quiet_flag { - println!("Wilcards detected for {target} and wildcard's IP saved for furter work."); - println!("Wilcard IPs: {generated_wilcards:?}\n"); + if !wildcard_ips.is_empty() && !quiet_flag { + println!("Wildcards detected for {target} and wildcard's IP saved for further work."); + println!("Wildcard IPs: {wildcard_ips:?}\n"); } else if !quiet_flag { - println!("No wilcards detected for {target}, nice!\n"); + println!("No wildcards detected for {target}, nice!\n"); } - generated_wilcards + wildcard_ips +} + +pub fn print_domain_data(host: &str, domain_data: &DomainData, options: &LibOptions) { + if options.show_ip_address { + println!("{}: {:?}", host, domain_data.ipv4_addresses); + } else { + println!("{}", host); + } +} + +pub fn return_resolver_opts(timeout: u64, retries: usize) -> ResolverOpts { + let mut options = ResolverOpts::default(); + options.timeout = std::time::Duration::from_secs(timeout); + options.attempts = retries; + options.ip_strategy = LookupIpStrategy::Ipv4Only; + options.num_concurrent_reqs = 1; + options.server_ordering_strategy = ServerOrderingStrategy::RoundRobin; + options } From 55fd2cb2beeff8d2d582feaef04957c7a8dfef37 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sun, 27 Jul 2025 16:52:51 -0500 Subject: [PATCH 31/38] (chore): update profile.release --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index 8f16233..a36c00c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,4 @@ rand = "0.9.2" lto = true codegen-units = 1 panic = 'abort' +strip = true From 3bb0ac4b35b6432926c3e4ec63ef23cb4c90b767 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sun, 27 Jul 2025 17:00:24 -0500 Subject: [PATCH 32/38] (chore): update manpage --- builder.sh | 8 ------- rusolver.1 | 68 +++++++++++++++++++++++++----------------------------- 2 files changed, 32 insertions(+), 44 deletions(-) diff --git a/builder.sh b/builder.sh index 91c0f70..e0caf7c 100755 --- a/builder.sh +++ b/builder.sh @@ -10,14 +10,6 @@ AARCH_TARGET="aarch64-unknown-linux-gnu" OSX_TARGET="x86_64-apple-darwin" MANPAGE_DIR="./$NAME.1" -if ! systemctl is-active docker >/dev/null 2>&1; then - echo "Docker is not running. Starting docker." - if ! sudo systemctl start docker; then - echo "Failed to start docker." - exit 1 - fi -fi - # Linux build echo "Building Linux artifact." if cargo build -q --release --target="$LINUX_TARGET"; then diff --git a/rusolver.1 b/rusolver.1 index 7cbc764..0084772 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,56 +1,52 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5. -.TH RUSOLVER "1" "February 2022" "Rusolver 0.9.1" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. +.TH RUSOLVER "1" "July 2025" "rusolver 0.10.0" "User Commands" .SH NAME -Rusolver \- manual page for Rusolver 0.9.1 +rusolver \- manual page for rusolver 0.10.0 +.SH SYNOPSIS +.B rusolver +[\fI\,OPTIONS\/\fR] .SH DESCRIPTION -Rusolver 0.9.1 -Eduard Tolosa Fast DNS resolver written in Rust. -.SS "USAGE:" -.IP -rusolver [FLAGS] [OPTIONS] -.SS "FLAGS:" +.SH OPTIONS .TP -\fB\-h\fR, \fB\-\-help\fR -Prints help information +\fB\-t\fR, \fB\-\-threads\fR +Number of threads. Default: 100 [default: 100] .TP -\fB\-i\fR, \fB\-\-ip\fR -Show the discovered IP addresses. Default: false +\fB\-\-retries\fR +Number of retries after lookup failure before giving up. Defaults to 0 [default: 0] .TP -\fB\-\-no\-verify\fR -Disables the double verification algorithm for valid subdomains \fB\-NOT\fR RECOMMENDED\-. Default: false +\fB\-d\fR, \fB\-\-domain\fR +Target domain. When it's specified, a wordlist can be used from stdin for bruteforcing. .TP -\fB\-q\fR, \fB\-\-quiet\fR -Enables quiet mode. -.TP -\fB\-V\fR, \fB\-\-version\fR -Prints version information -.SS "OPTIONS:" -.TP -\fB\-d\fR, \fB\-\-domain\fR -Target domain. When it's specified, a wordlist can be used from stdin for -bruteforcing. -.TP -\fB\-r\fR, \fB\-\-resolvers\fR +\fB\-r\fR, \fB\-\-resolvers\fR File with DNS ips. .TP -\fB\-\-retries\fR -Number of retries after lookup failure before giving up. Defaults to 0 +\fB\-\-timeout\fR +Timeout in seconds. Default: 3 [default: 3] .TP -\fB\-t\fR, \fB\-\-threads\fR -Number of threads. Default: 100 +\fB\-i\fR, \fB\-\-ip\fR +Display the record data. .TP -\fB\-\-timeout\fR -Timeout in seconds. Default: 3 +\fB\-e\fR, \fB\-\-enable\-double\-check\fR +Enable the double verification algorithm for subdomains. Default: false +.TP +\fB\-q\fR, \fB\-\-quiet\-flag\fR +Quiet mode, no output except errors. +.TP +\fB\-h\fR, \fB\-\-help\fR +Print help +.TP +\fB\-V\fR, \fB\-\-version\fR +Print version .SH "SEE ALSO" The full documentation for -.B Rusolver +.B rusolver is maintained as a Texinfo manual. If the .B info and -.B Rusolver +.B rusolver programs are properly installed at your site, the command .IP -.B info Rusolver +.B info rusolver .PP should give you access to the complete manual. From 28b29ca515ab299938df8e14b1424d2f5f118a51 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sun, 27 Jul 2025 17:43:22 -0500 Subject: [PATCH 33/38] (fix): only print data if quiet_mode is not set. Also do not print wildcards --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/dnslib.rs | 4 +++- src/utils.rs | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5eba665..22581e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -926,7 +926,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.10.0" +version = "0.10.1" dependencies = [ "clap", "futures", diff --git a/Cargo.toml b/Cargo.toml index a36c00c..c688426 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.10.0" +version = "0.10.1" authors = ["Eduard Tolosa "] edition = "2021" description = "Fast DNS resolver written in Rust." diff --git a/src/dnslib.rs b/src/dnslib.rs index 38e35b6..a94a5f1 100644 --- a/src/dnslib.rs +++ b/src/dnslib.rs @@ -85,7 +85,9 @@ pub async fn return_hosts_data(options: &LibOptions) -> HashMap Date: Sun, 27 Jul 2025 23:45:27 -0500 Subject: [PATCH 34/38] (fix): only print valid data to stdout A regression was introduced during the refactoring that makes rusolver print all the domains, even if they were invalid, this fixes that Fixes #14 --- src/utils.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/utils.rs b/src/utils.rs index e45a39c..c9c65e5 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -89,10 +89,12 @@ pub async fn detect_wildcards( } pub fn print_domain_data(host: &str, domain_data: &DomainData, options: &LibOptions) { - if options.show_ip_address && !domain_data.is_wildcard { - println!("{}: {:?}", host, domain_data.ipv4_addresses); - } else { - println!("{}", host); + if !domain_data.is_wildcard && !domain_data.ipv4_addresses.is_empty() { + if options.show_ip_address { + println!("{}:{:?}", host, domain_data.ipv4_addresses); + } else { + println!("{}", host); + } } } From 9b329daa6ad0ebee7ba9a20caa129863ef71d8ea Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sun, 27 Jul 2025 23:46:01 -0500 Subject: [PATCH 35/38] (chore): bump version. --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22581e2..36e2793 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -926,7 +926,7 @@ dependencies = [ [[package]] name = "rusolver" -version = "0.10.1" +version = "0.10.2" dependencies = [ "clap", "futures", diff --git a/Cargo.toml b/Cargo.toml index c688426..32d49cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rusolver" -version = "0.10.1" +version = "0.10.2" authors = ["Eduard Tolosa "] edition = "2021" description = "Fast DNS resolver written in Rust." From c372db9eab92cf6eaaf069bbf0734adfd20db815 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sat, 2 Aug 2025 13:00:51 -0500 Subject: [PATCH 36/38] (chore): update builder.sh - Disable docker checks, we now use podman - Use cross for all builds, otherwise the build ends up in glibc versions mismatch --- builder.sh | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/builder.sh b/builder.sh index e0caf7c..f994261 100755 --- a/builder.sh +++ b/builder.sh @@ -7,12 +7,12 @@ LINUX_X86_TARGET="i686-unknown-linux-musl" WIN_TARGET="x86_64-pc-windows-gnu" ARMV7_TARGET="armv7-unknown-linux-gnueabihf" AARCH_TARGET="aarch64-unknown-linux-gnu" -OSX_TARGET="x86_64-apple-darwin" +# OSX_TARGET="x86_64-apple-darwin" MANPAGE_DIR="./$NAME.1" # Linux build echo "Building Linux artifact." -if cargo build -q --release --target="$LINUX_TARGET"; then +if cross build -q --release --target="$LINUX_TARGET"; then echo "Linux artifact build: SUCCESS" cp "target/$LINUX_TARGET/release/$NAME" "target/$LINUX_TARGET/release/$NAME-linux" strip "target/$LINUX_TARGET/release/$NAME-linux" @@ -66,15 +66,15 @@ else fi # Mac OS build -echo "Building OSX artifact." -if CC=o64-clang CXX=o64-clang++ LIBZ_SYS_STATIC=1 cargo build -q --release --target="$OSX_TARGET"; then - echo "OSX artifact build: SUCCESS" - cp "target/$OSX_TARGET/release/$NAME" "target/$OSX_TARGET/release/$NAME-osx" - strip "target/$OSX_TARGET/release/$NAME-osx" - sha512sum "target/$OSX_TARGET/release/$NAME-osx" >"target/$OSX_TARGET/release/$NAME-osx.sha512" -else - echo "OSX artifact build: FAILED" -fi +# echo "Building OSX artifact." +# if CC=o64-clang CXX=o64-clang++ LIBZ_SYS_STATIC=1 cargo build -q --release --target="$OSX_TARGET"; then +# echo "OSX artifact build: SUCCESS" +# cp "target/$OSX_TARGET/release/$NAME" "target/$OSX_TARGET/release/$NAME-osx" +# strip "target/$OSX_TARGET/release/$NAME-osx" +# sha512sum "target/$OSX_TARGET/release/$NAME-osx" >"target/$OSX_TARGET/release/$NAME-osx.sha512" +# else +# echo "OSX artifact build: FAILED" +# fi echo "Creating manpage..." if command -v help2man >/dev/null; then @@ -86,10 +86,3 @@ if command -v help2man >/dev/null; then else echo "Please install the help2man package." fi - -# Stop docker -echo "Stopping docker." -if ! sudo systemctl stop docker; then - echo "Failed to stop docker." - exit 1 -fi From 12318ce9c023ef94da738bc9a649e93eae24edc0 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sat, 2 Aug 2025 13:55:38 -0500 Subject: [PATCH 37/38] Update builder.sh --- builder.sh | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/builder.sh b/builder.sh index f994261..568d94f 100755 --- a/builder.sh +++ b/builder.sh @@ -1,5 +1,4 @@ #!/usr/bin/env bash -# Rusolver releaser NAME="rusolver" LINUX_TARGET="x86_64-unknown-linux-musl" @@ -9,6 +8,10 @@ ARMV7_TARGET="armv7-unknown-linux-gnueabihf" AARCH_TARGET="aarch64-unknown-linux-gnu" # OSX_TARGET="x86_64-apple-darwin" MANPAGE_DIR="./$NAME.1" +BIN_OUTPUT_DIR="./ghbinaries" + +rm -rf "$BIN_OUTPUT_DIR" +mkdir -p "$BIN_OUTPUT_DIR" # Linux build echo "Building Linux artifact." @@ -16,7 +19,8 @@ if cross build -q --release --target="$LINUX_TARGET"; then echo "Linux artifact build: SUCCESS" cp "target/$LINUX_TARGET/release/$NAME" "target/$LINUX_TARGET/release/$NAME-linux" strip "target/$LINUX_TARGET/release/$NAME-linux" - sha512sum "target/$LINUX_TARGET/release/$NAME-linux" >"target/$LINUX_TARGET/release/$NAME-linux.sha512" + sha512sum "target/$LINUX_TARGET/release/$NAME-linux" >"$BIN_OUTPUT_DIR/$NAME-linux.sha512" + zip -q -j "$BIN_OUTPUT_DIR/$NAME-linux-x64.zip" "target/$LINUX_TARGET/release/$NAME-linux" else echo "Linux artifact build: FAILED" fi @@ -27,7 +31,8 @@ if cross build -q --release --target="$LINUX_X86_TARGET"; then echo "Linux x86 artifact build: SUCCESS" cp "target/$LINUX_X86_TARGET/release/$NAME" "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" strip "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" - sha512sum "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" >"target/$LINUX_X86_TARGET/release/$NAME-linux-i386.sha512" + sha512sum "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" >"$BIN_OUTPUT_DIR/$NAME-linux-i386.sha512" + zip -q -j "$BIN_OUTPUT_DIR/$NAME-linux-i386.zip" "target/$LINUX_X86_TARGET/release/$NAME-linux-i386" else echo "Linux x86 artifact build: FAILED" fi @@ -38,7 +43,8 @@ if cross build -q --release --target="$WIN_TARGET"; then echo "Windows artifact build: SUCCESS" cp "target/$WIN_TARGET/release/$NAME.exe" "target/$WIN_TARGET/release/$NAME-windows.exe" strip "target/$WIN_TARGET/release/$NAME-windows.exe" - sha512sum "target/$WIN_TARGET/release/$NAME-windows.exe" >"target/$WIN_TARGET/release/$NAME-windows.exe.sha512" + sha512sum "target/$WIN_TARGET/release/$NAME-windows.exe" >"$BIN_OUTPUT_DIR/$NAME-windows.exe.sha512" + zip -q -j "$BIN_OUTPUT_DIR/$NAME-windows.zip" "target/$WIN_TARGET/release/$NAME-windows.exe" else echo "Windows artifact build: FAILED" fi @@ -49,7 +55,8 @@ if cross build -q --release --target="$ARMV7_TARGET"; then echo "ARMv7 artifact build: SUCCESS" cp "target/$ARMV7_TARGET/release/$NAME" "target/$ARMV7_TARGET/release/$NAME-armv7" strip "target/$ARMV7_TARGET/release/$NAME-armv7" - sha512sum "target/$ARMV7_TARGET/release/$NAME-armv7" >"target/$ARMV7_TARGET/release/$NAME-armv7.sha512" + sha512sum "target/$ARMV7_TARGET/release/$NAME-armv7" >"$BIN_OUTPUT_DIR/$NAME-armv7.sha512" + zip -q -j "$BIN_OUTPUT_DIR/$NAME-armv7.zip" "target/$ARMV7_TARGET/release/$NAME-armv7" else echo "ARMv7 artifact build: FAILED" fi @@ -60,18 +67,20 @@ if cross build -q --release --target="$AARCH_TARGET"; then echo "Aarch64 artifact build: SUCCESS" cp "target/$AARCH_TARGET/release/$NAME" "target/$AARCH_TARGET/release/$NAME-aarch64" strip "target/$AARCH_TARGET/release/$NAME-aarch64" - sha512sum "target/$AARCH_TARGET/release/$NAME-aarch64" >"target/$AARCH_TARGET/release/$NAME-aarch64.sha512" + sha512sum "target/$AARCH_TARGET/release/$NAME-aarch64" >"$BIN_OUTPUT_DIR/$NAME-aarch64.sha512" + zip -q -j "$BIN_OUTPUT_DIR/$NAME-aarch64.zip" "target/$AARCH_TARGET/release/$NAME-aarch64" else echo "Aarch64 artifact build: FAILED" fi -# Mac OS build +# # Mac OS build # echo "Building OSX artifact." # if CC=o64-clang CXX=o64-clang++ LIBZ_SYS_STATIC=1 cargo build -q --release --target="$OSX_TARGET"; then # echo "OSX artifact build: SUCCESS" # cp "target/$OSX_TARGET/release/$NAME" "target/$OSX_TARGET/release/$NAME-osx" # strip "target/$OSX_TARGET/release/$NAME-osx" # sha512sum "target/$OSX_TARGET/release/$NAME-osx" >"target/$OSX_TARGET/release/$NAME-osx.sha512" +# zip -q "$BIN_OUTPUT_DIR/$NAME-osx.zip" "target/$OSX_TARGET/release/$NAME-osx" # else # echo "OSX artifact build: FAILED" # fi From 87f9336cc2b773904b8c6fb23e47a2da71b95097 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Sat, 2 Aug 2025 14:02:25 -0500 Subject: [PATCH 38/38] Update manpage and exclude binaries folder --- .gitignore | 1 + rusolver.1 | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index aaa3d0d..999c5cd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ resolvers .gitignore wordlist +/ghbinaries \ No newline at end of file diff --git a/rusolver.1 b/rusolver.1 index 0084772..77de385 100644 --- a/rusolver.1 +++ b/rusolver.1 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3. -.TH RUSOLVER "1" "July 2025" "rusolver 0.10.0" "User Commands" +.TH RUSOLVER "1" "August 2025" "rusolver 0.10.2" "User Commands" .SH NAME -rusolver \- manual page for rusolver 0.10.0 +rusolver \- manual page for rusolver 0.10.2 .SH SYNOPSIS .B rusolver [\fI\,OPTIONS\/\fR]