Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4a8893214 | ||
|
|
d979cd9505 | ||
|
|
8c421b9fa3 | ||
|
|
ad7884f2f6 |
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -1143,7 +1143,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "numa"
|
||||
version = "0.9.0"
|
||||
version = "0.9.1"
|
||||
dependencies = [
|
||||
"arc-swap",
|
||||
"axum",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "numa"
|
||||
version = "0.9.0"
|
||||
version = "0.9.1"
|
||||
authors = ["razvandimescu <razvan@dimescu.com>"]
|
||||
edition = "2021"
|
||||
description = "Portable DNS resolver in Rust — .numa local domains, ad blocking, developer overrides, DNS-over-HTTPS"
|
||||
|
||||
23
src/ctx.rs
23
src/ctx.rs
@@ -162,6 +162,29 @@ pub async fn handle_query(
|
||||
resp.header.authed_data = true;
|
||||
}
|
||||
(resp, QueryPath::Cached, cached_dnssec)
|
||||
} else if let Some(fwd_addr) =
|
||||
crate::system_dns::match_forwarding_rule(&qname, &ctx.forwarding_rules)
|
||||
{
|
||||
// Conditional forwarding takes priority over recursive mode
|
||||
// (e.g. Tailscale .ts.net, VPC private zones)
|
||||
let upstream = Upstream::Udp(fwd_addr);
|
||||
match forward_query(&query, &upstream, ctx.timeout).await {
|
||||
Ok(resp) => {
|
||||
ctx.cache.write().unwrap().insert(&qname, qtype, &resp);
|
||||
(resp, QueryPath::Forwarded, DnssecStatus::Indeterminate)
|
||||
}
|
||||
Err(e) => {
|
||||
error!(
|
||||
"{} | {:?} {} | FORWARD ERROR | {}",
|
||||
src_addr, qtype, qname, e
|
||||
);
|
||||
(
|
||||
DnsPacket::response_from(&query, ResultCode::SERVFAIL),
|
||||
QueryPath::UpstreamError,
|
||||
DnssecStatus::Indeterminate,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if ctx.upstream_mode == UpstreamMode::Recursive {
|
||||
let key = (qname.clone(), qtype);
|
||||
let (resp, path, err) = resolve_coalesced(&ctx.inflight, key, &query, || {
|
||||
|
||||
@@ -776,7 +776,7 @@ fn install_macos() -> Result<(), String> {
|
||||
.map_err(|e| format!("failed to serialize backup: {}", e))?;
|
||||
std::fs::write(backup_path(), json).map_err(|e| format!("failed to write backup: {}", e))?;
|
||||
|
||||
// Set DNS to 127.0.0.1 for each service
|
||||
// Set DNS to 127.0.0.1 and add "numa" search domain for each service
|
||||
for service in &services {
|
||||
let status = std::process::Command::new("networksetup")
|
||||
.args(["-setdnsservers", service, "127.0.0.1"])
|
||||
@@ -788,6 +788,11 @@ fn install_macos() -> Result<(), String> {
|
||||
} else {
|
||||
eprintln!(" warning: failed to set DNS for \"{}\"", service);
|
||||
}
|
||||
|
||||
// Add "numa" as search domain so browsers resolve .numa without trailing slash
|
||||
let _ = std::process::Command::new("networksetup")
|
||||
.args(["-setsearchdomains", service, "numa"])
|
||||
.status();
|
||||
}
|
||||
|
||||
eprintln!("\n Original DNS saved to {}", backup_path().display());
|
||||
@@ -832,6 +837,11 @@ fn uninstall_macos() -> Result<(), String> {
|
||||
} else {
|
||||
eprintln!(" warning: failed to restore DNS for \"{}\"", service);
|
||||
}
|
||||
|
||||
// Clear the "numa" search domain
|
||||
let _ = std::process::Command::new("networksetup")
|
||||
.args(["-setsearchdomains", service, "Empty"])
|
||||
.status();
|
||||
}
|
||||
|
||||
std::fs::remove_file(&path).ok();
|
||||
@@ -1092,7 +1102,7 @@ fn install_linux() -> Result<(), String> {
|
||||
let drop_in = resolved_dir.join("numa.conf");
|
||||
std::fs::write(
|
||||
&drop_in,
|
||||
"[Resolve]\nDNS=127.0.0.1\nDomains=~.\nDNSStubListener=no\n",
|
||||
"[Resolve]\nDNS=127.0.0.1\nDomains=~. numa\nDNSStubListener=no\n",
|
||||
)
|
||||
.map_err(|e| format!("failed to write {}: {}", drop_in.display(), e))?;
|
||||
|
||||
@@ -1130,7 +1140,7 @@ fn install_linux() -> Result<(), String> {
|
||||
}
|
||||
|
||||
let content =
|
||||
"# Generated by Numa — run 'sudo numa uninstall' to restore\nnameserver 127.0.0.1\n";
|
||||
"# Generated by Numa — run 'sudo numa uninstall' to restore\nnameserver 127.0.0.1\nsearch numa\n";
|
||||
std::fs::write(resolv, content)
|
||||
.map_err(|e| format!("failed to write /etc/resolv.conf: {}", e))?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user