mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-20 12:38:43 +00:00
* feat: logging for dns resolver * refactor: fix clippy warnings * refactor: actually fix clippy warnings * refactor: apply requested changes
This commit is contained in:
parent
59963c712f
commit
af04e45b5a
1 changed files with 46 additions and 26 deletions
|
@ -3,10 +3,13 @@ use std::{net::SocketAddr, sync::Arc};
|
|||
use hyper::client::connect::dns::Name;
|
||||
use once_cell::sync::OnceCell;
|
||||
use reqwest::dns::{Addrs, Resolve};
|
||||
use tracing::{debug, info, instrument, trace, warn};
|
||||
#[cfg(windows)]
|
||||
use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts};
|
||||
use trust_dns_resolver::TokioAsyncResolver;
|
||||
|
||||
type BoxError = Box<dyn std::error::Error + Send + Sync>;
|
||||
|
||||
#[derive(Debug, Default, Clone)]
|
||||
pub struct TrustDnsResolver(Arc<OnceCell<TokioAsyncResolver>>);
|
||||
|
||||
|
@ -23,28 +26,21 @@ impl Resolve for TrustDnsResolver {
|
|||
}
|
||||
}
|
||||
|
||||
fn new_resolver() -> Result<TokioAsyncResolver, Box<dyn std::error::Error + Send + Sync>> {
|
||||
#[instrument(level = "trace")]
|
||||
fn new_resolver() -> Result<TokioAsyncResolver, BoxError> {
|
||||
#[cfg(unix)]
|
||||
{
|
||||
info!("Using system DNS resolver configuration");
|
||||
Ok(TokioAsyncResolver::tokio_from_system_conf()?)
|
||||
}
|
||||
#[cfg(windows)]
|
||||
{
|
||||
info!("Using custom DNS resolver configuration");
|
||||
let mut config = ResolverConfig::new();
|
||||
let opts = ResolverOpts::default();
|
||||
|
||||
let current_interface = default_net::get_default_interface()?;
|
||||
ipconfig::get_adapters()?
|
||||
.iter()
|
||||
.filter_map(|adapter| {
|
||||
if adapter.adapter_name() == current_interface.name {
|
||||
Some(adapter.dns_servers())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.flatten()
|
||||
.for_each(|addr| {
|
||||
get_adapter()?.dns_servers().iter().for_each(|addr| {
|
||||
trace!("Adding DNS server: {}", addr);
|
||||
let socket_addr = SocketAddr::new(*addr, 53);
|
||||
for protocol in [Protocol::Udp, Protocol::Tcp] {
|
||||
config.add_name_server(NameServerConfig {
|
||||
|
@ -59,6 +55,30 @@ fn new_resolver() -> Result<TokioAsyncResolver, Box<dyn std::error::Error + Send
|
|||
}
|
||||
});
|
||||
|
||||
debug!("Resolver configuration complete");
|
||||
Ok(TokioAsyncResolver::tokio(config, opts))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
#[instrument(level = "trace")]
|
||||
fn get_adapter() -> Result<ipconfig::Adapter, BoxError> {
|
||||
debug!("Retrieving local IP address");
|
||||
let local_ip =
|
||||
default_net::interface::get_local_ipaddr().ok_or("Local IP address not found")?;
|
||||
debug!("Local IP address: {local_ip}");
|
||||
debug!("Retrieving network adapters");
|
||||
let adapters = ipconfig::get_adapters()?;
|
||||
debug!("Found {} network adapters", adapters.len());
|
||||
debug!("Searching for adapter with IP address {local_ip}");
|
||||
let adapter = adapters
|
||||
.into_iter()
|
||||
.find(|adapter| adapter.ip_addresses().contains(&local_ip))
|
||||
.ok_or("Adapter not found")?;
|
||||
debug!(
|
||||
"Using adapter {} with {} DNS servers",
|
||||
adapter.friendly_name(),
|
||||
adapter.dns_servers().len()
|
||||
);
|
||||
Ok(adapter)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue