From 7c14178b950aa4973527b10bfaf0e7042f74d886 Mon Sep 17 00:00:00 2001 From: Severin Buhler Date: Tue, 6 Feb 2024 19:10:19 +0100 Subject: [PATCH] updated to async any-dns --- Cargo.lock | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 4 +- src/main.rs | 39 +++++---------- 3 files changed, 156 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1970b20..eca969b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -100,14 +109,16 @@ dependencies = [ [[package]] name = "any-dns" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6efda8204383c5499a12d7ec5e0b3fefb4322f4fcafa7ab3bf54804e68346d67" +checksum = "db292195c7900321fa452c5601d9bf3ec41763f18647ebcf968902445e1fe589" dependencies = [ + "async-trait", "ctrlc", "dyn-clone", "simple-dns", "thiserror", + "tokio", ] [[package]] @@ -133,6 +144,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64ct" version = "1.6.0" @@ -747,6 +773,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "half" version = "2.3.1" @@ -933,6 +965,17 @@ dependencies = [ "adler", ] +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "nanorand" version = "0.7.0" @@ -1016,6 +1059,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -1034,6 +1086,29 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + [[package]] name = "paste" version = "1.0.14" @@ -1046,6 +1121,12 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + [[package]] name = "pkarr" version = "1.0.4" @@ -1078,12 +1159,14 @@ name = "pkdns" version = "0.2.2" dependencies = [ "any-dns", + "async-trait", "chrono", "clap", "ctrlc", "pkarr", "pknames_core", "simple-dns", + "tokio", "ttl_cache", "zbase32", ] @@ -1277,6 +1360,12 @@ dependencies = [ "serde", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1424,6 +1513,15 @@ dependencies = [ "dirs", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -1448,6 +1546,16 @@ version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -1616,6 +1724,36 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "tracing-appender" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index 758301b..266fddd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,5 +13,7 @@ pkarr = "1.0.4" zbase32 = "0.1.2" ttl_cache = "0.5.1" clap = "4.4.18" -any-dns = "0.1.2" +any-dns = "0.2.0" chrono = "0.4.33" +tokio = { version = "1.36.0", features = ["full"] } +async-trait = "0.1.77" diff --git a/src/main.rs b/src/main.rs index c3546df..7035c61 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ -use any_dns::{Builder, CustomHandler}; +use any_dns::{Builder, CustomHandler, CustomHandlerError, DnsSocket}; +use async_trait::async_trait; use ctrlc; use pkarr::dns::Packet; use pknames_resolver::PknamesResolver; @@ -21,32 +22,19 @@ impl MyHandler { } } } - +#[async_trait] impl CustomHandler for MyHandler { - fn lookup(&mut self, query: &Vec) -> std::prelude::v1::Result, Box> { - let start = Instant::now(); - let result = self.pkarr.resolve(query); - if result.is_ok() { - let query = Packet::parse(&query).unwrap(); - println!( - "Resolved {:?} within {}ms", - query.questions.first().unwrap(), - start.elapsed().as_millis() - ); - }; - - result + async fn lookup(&mut self, query: &Vec, _socket: DnsSocket) -> std::prelude::v1::Result, CustomHandlerError> { + match self.pkarr.resolve(query) { + Ok(reply) => Ok(reply), + Err(_) => Err(CustomHandlerError::Unhandled) + } } } -fn wait_on_ctrl_c() { - let (tx, rx) = channel(); - ctrlc::set_handler(move || tx.send(()).expect("Could not send signal on channel.")) - .expect("Error setting Ctrl-C handler"); - rx.recv().expect("Could not receive from channel."); -} -fn main() -> Result<(), Box> { +#[tokio::main] +async fn main() -> Result<(), Box> { const VERSION: &str = env!("CARGO_PKG_VERSION"); let cmd = clap::Command::new("pkdns") @@ -142,16 +130,15 @@ fn main() -> Result<(), Box> { let anydns = Builder::new() .handler(MyHandler::new(cache_ttl, directory)) - .threads(threads) .verbose(verbose) .icann_resolver(forward) .listen(socket) - .build(); + .build().await?; println!("Listening on {}. Waiting for Ctrl-C...", socket); - wait_on_ctrl_c(); + anydns.wait_on_ctrl_c(); println!("Got it! Exiting..."); - anydns.join(); + anydns.stop(); Ok(()) }