diff --git a/snow-scanner/Cargo.toml b/snow-scanner/Cargo.toml index b0b9335..4ad8df7 100644 --- a/snow-scanner/Cargo.toml +++ b/snow-scanner/Cargo.toml @@ -40,8 +40,8 @@ hex = "0.4.3" # mariadb-dev on Alpine # "mysqlclient-src" "mysql_backend" diesel = { version = "2.2.0", default-features = false, features = ["mysql", "chrono", "uuid", "r2d2"] } -dns-ptr-resolver = "1.2.0" -hickory-client = { version = "0.24.1", default-features = false } +dns-ptr-resolver = {git = "https://github.com/wdes/dns-ptr-resolver.git"} +hickory-resolver = { version = "0.24.1", default-features = false, features = ["tokio-runtime", "dns-over-h3", "dns-over-https", "dns-over-quic"]} chrono = "0.4.38" uuid = { version = "1.10.0", default-features = false, features = ["v7", "serde", "std"] } cidr = "0.2.2" diff --git a/snow-scanner/src/main.rs b/snow-scanner/src/main.rs index 115b5d8..c5bff0d 100644 --- a/snow-scanner/src/main.rs +++ b/snow-scanner/src/main.rs @@ -19,9 +19,10 @@ use uuid::Uuid; use serde::{Deserialize, Deserializer, Serialize}; -use hickory_client::client::SyncClient; -use hickory_client::rr::Name; -use hickory_client::tcp::TcpClientConnection; +use hickory_resolver::{Name, Resolver}; +use hickory_resolver::config::{NameServerConfigGroup, ResolverOpts, ResolverConfig}; +use std::time::Duration; +use std::net::IpAddr; use diesel::serialize::IsNull; use diesel::{serialize, MysqlConnection}; @@ -439,17 +440,28 @@ fn get_connection(database_url: &str) -> DbPool { // Refer to the `r2d2` documentation for more methods to use // when building a connection pool Pool::builder() - .max_size(30) + .max_size(5) .test_on_check_out(true) .build(manager) .expect("Could not build connection pool") } -fn get_dns_client() -> SyncClient { - let server = "1.1.1.1:53".parse().expect("To parse"); - let dns_conn = - TcpClientConnection::with_timeout(server, std::time::Duration::new(5, 0)).unwrap(); - SyncClient::new(dns_conn) +fn get_dns_client() -> Resolver { + + let server_ip = "1.1.1.1"; + + let server = NameServerConfigGroup::from_ips_clear( + &[IpAddr::from_str(server_ip).unwrap()], + 53,// Port 53 + true, + ); + + let config = ResolverConfig::from_parts(None, vec![], server); + let mut options = ResolverOpts::default(); + options.timeout = Duration::from_secs(5); + options.attempts = 1; // One try + + Resolver::new(config, options).unwrap() } fn plain_contents(data: String) -> HttpResponse { @@ -493,13 +505,22 @@ async fn main() -> std::io::Result<()> { "mysql://localhost".to_string() }; + let pool = get_connection(db_url.as_str()); + + // note that obtaining a connection from the pool is also potentially blocking + let conn = &mut pool.get().unwrap(); + let names = Scanner::list_names(Scanners::Stretchoid, conn); + match names { + Ok(names) => println!("Found {} Stretchoid scanners", names.len()), + Err(err) => eprintln!("Unable to get names: {}", err), + }; + let server = HttpServer::new(move || { let static_data_dir: String = match env::var("STATIC_DATA_DIR") { Ok(val) => val, Err(_) => "../data/".to_string(), }; - let pool = get_connection(db_url.as_str()); App::new() .app_data(web::Data::new(pool.clone())) .app_data(actix_web::web::Data::new(static_data_dir))