coukd work

This commit is contained in:
Aiden McClelland
2025-08-22 08:53:38 -06:00
parent 5bee2cef96
commit d6d91822cc

View File

@@ -164,7 +164,8 @@ impl DnsClient {
loop { loop {
if let Err::<(), Error>(e) = async { if let Err::<(), Error>(e) = async {
let mut stream = file_string_stream("/run/systemd/resolve/resolv.conf") let mut stream = file_string_stream("/run/systemd/resolve/resolv.conf")
.filter_map(|a| futures::future::ready(a.transpose())).boxed(); .filter_map(|a| futures::future::ready(a.transpose()))
.boxed();
let mut conf: String = stream let mut conf: String = stream
.next() .next()
.await .await
@@ -172,7 +173,7 @@ impl DnsClient {
let mut prev_nameservers = Vec::new(); let mut prev_nameservers = Vec::new();
let mut bg = BTreeMap::<SocketAddr, BoxFuture<_>>::new(); let mut bg = BTreeMap::<SocketAddr, BoxFuture<_>>::new();
loop { loop {
let nameservers = conf let nameservers = dbg!(&conf)
.lines() .lines()
.map(|l| l.trim()) .map(|l| l.trim())
.filter_map(|l| l.strip_prefix("nameserver ")) .filter_map(|l| l.strip_prefix("nameserver "))
@@ -234,10 +235,14 @@ impl DnsClient {
} }
bg.retain(|n, _| nameservers.iter().any(|a| a == n)); bg.retain(|n, _| nameservers.iter().any(|a| a == n));
prev_nameservers = nameservers; prev_nameservers = nameservers;
client.replace(new);
} }
tokio::select! { tokio::select! {
c = stream.next() => conf = c.or_not_found("/run/systemd/resolve/resolv.conf")??, c = stream.next() => conf = c.or_not_found("/run/systemd/resolve/resolv.conf")??,
_ = futures::future::join_all(bg.values_mut()) => (), _ = futures::future::join(
futures::future::join_all(bg.values_mut()),
futures::future::pending::<()>(),
) => (),
} }
} }
} }
@@ -258,6 +263,7 @@ impl DnsClient {
) -> Vec<hickory_client::proto::xfer::DnsExchangeSend> { ) -> Vec<hickory_client::proto::xfer::DnsExchangeSend> {
self.client.peek(|c| { self.client.peek(|c| {
c.iter() c.iter()
.map(|(k, v)| (dbg!(k), v))
.map(|(_, c)| c.lookup(query.clone(), options.clone())) .map(|(_, c)| c.lookup(query.clone(), options.clone()))
.collect() .collect()
}) })
@@ -332,7 +338,7 @@ impl RequestHandler for Resolver {
request: &Request, request: &Request,
mut response_handle: R, mut response_handle: R,
) -> ResponseInfo { ) -> ResponseInfo {
async { match async {
let req = request.request_info()?; let req = request.request_info()?;
let query = req.query; let query = req.query;
if let Some(ip) = self.resolve(query.name().borrow(), req.src.ip()) { if let Some(ip) = self.resolve(query.name().borrow(), req.src.ip()) {
@@ -415,10 +421,9 @@ impl RequestHandler for Resolver {
.lookup(dbg!(query), DnsRequestOptions::default()); .lookup(dbg!(query), DnsRequestOptions::default());
let mut err = None; let mut err = None;
for stream in streams.iter_mut() { for stream in streams.iter_mut() {
match dbg!(stream.next().await) { match dbg!(tokio::time::timeout(Duration::from_secs(5), stream.next()).await) {
None => (), Ok(Some(Err(e))) => err = Some(e),
Some(Err(e)) => err = Some(e), Ok(Some(Ok(msg))) => {
Some(Ok(msg)) => {
return response_handle return response_handle
.send_response( .send_response(
MessageResponseBuilder::from_message_request(&*request).build( MessageResponseBuilder::from_message_request(&*request).build(
@@ -431,6 +436,7 @@ impl RequestHandler for Resolver {
) )
.await; .await;
} }
_ => (),
} }
} }
if let Some(e) = err { if let Some(e) = err {
@@ -439,17 +445,41 @@ impl RequestHandler for Resolver {
} }
let mut res = Header::response_from_request(request.header()); let mut res = Header::response_from_request(request.header());
res.set_response_code(ResponseCode::ServFail); res.set_response_code(ResponseCode::ServFail);
Ok(res.into()) response_handle
.send_response(
MessageResponseBuilder::from_message_request(&*request).build(
res,
[],
[],
[],
[],
),
)
.await
} }
} }
.await .await
.unwrap_or_else(|e| { {
tracing::error!("{}", e); Ok(a) => a,
tracing::debug!("{:?}", e); Err(e) => {
let mut res = Header::response_from_request(request.header()); tracing::error!("{}", e);
res.set_response_code(ResponseCode::ServFail); tracing::debug!("{:?}", e);
res.into() let mut res = Header::response_from_request(request.header());
}) res.set_response_code(ResponseCode::ServFail);
response_handle
.send_response(
MessageResponseBuilder::from_message_request(&*request).build(
res,
[],
[],
[],
[],
),
)
.await
.unwrap_or(res.into())
}
}
} }
} }