mod auth;
mod cache;
mod config;
mod control;
mod fasthash;
mod dnssec;
mod listener;
mod metrics;
mod rpz;
mod security;
mod protocol;
mod resolver;
mod server;
#[cfg(unix)]
mod single_instance;
use clap::Parser;
use std::path::PathBuf;
use tracing::info;
#[derive(Parser, Debug)]
#[command(name = "rdns", about = "High-performance DNS server")]
struct Args {
#[arg(short, long, default_value = "/etc/rdns/rdns.toml")]
config: PathBuf,
#[arg(long)]
check_config: bool,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let args = Args::parse();
let cfg = config::Config::load(&args.config)?;
if args.check_config {
println!("Configuration OK");
return Ok(());
}
#[cfg(unix)]
let _instance_lock = match single_instance::acquire("rdns") {
Ok(lock) => Some(lock),
Err(single_instance::InstanceLockError::AlreadyRunning(pid)) => {
eprintln!("rdns: another instance is already running (pid {pid})");
std::process::exit(1);
}
Err(e) => {
eprintln!("rdns: warning: singleton lock unavailable: {e} (continuing)");
None
}
};
let _log_guard = config::init_logging(&cfg.logging);
listener::set_query_log_enabled(cfg.logging.query_log);
listener::set_query_timeout_ms(cfg.resolver.query_timeout_ms);
info!(
version = env!("CARGO_PKG_VERSION"),
mode = ?cfg.server.mode,
"rDNS starting"
);
server::run(cfg).await
}