69 lines
2.0 KiB
Rust
69 lines
2.0 KiB
Rust
//! NX9 DNS Server
|
|
//!
|
|
//! A DNS server implementation that supports various record types and can forward
|
|
//! queries to upstream DNS servers.
|
|
//!
|
|
//! Author: Sunil Purushottam Thakare
|
|
#![allow(dead_code)]
|
|
#[allow(unused_variables)]
|
|
|
|
use log::info;
|
|
use tokio::{signal, task};
|
|
|
|
use nx9_dns_server::{
|
|
cache::{CACHE, CACHE_CLEANUP_INTERVAL},
|
|
config::ServerConfig,
|
|
db::init_db,
|
|
errors::DnsError,
|
|
handlers::{run_tcp_server, run_udp_server},
|
|
};
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), DnsError> {
|
|
// Initialize the logger
|
|
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"))
|
|
.format_timestamp_micros()
|
|
.init();
|
|
|
|
// Load configuration from environment variables
|
|
let config = ServerConfig::from_env()?;
|
|
|
|
// Initialize cache with NS records from config
|
|
let cache = CACHE.get_or_init(|| nx9_dns_server::cache::DnsCache::new(config.ns_records.clone()));
|
|
|
|
// Initialize the database
|
|
init_db(&config.db_path, &config.default_domain, &config.default_ip)?;
|
|
|
|
// Set up cache cleanup task
|
|
let cache_cleanup = task::spawn({
|
|
let cache = cache.clone();
|
|
async move {
|
|
let mut interval = tokio::time::interval(CACHE_CLEANUP_INTERVAL);
|
|
loop {
|
|
interval.tick().await;
|
|
cache.cleanup();
|
|
}
|
|
}
|
|
});
|
|
|
|
// Set up shutdown signal handler
|
|
let shutdown_signal = async {
|
|
signal::ctrl_c().await.expect("Failed to listen for shutdown signal");
|
|
info!("Shutdown signal received");
|
|
};
|
|
|
|
// Start UDP and TCP servers
|
|
let udp_server = run_udp_server(config.clone());
|
|
let tcp_server = run_tcp_server(config.clone());
|
|
|
|
// Wait for either a shutdown signal or server error
|
|
tokio::select! {
|
|
_ = shutdown_signal => {
|
|
info!("Initiating graceful shutdown...");
|
|
cache_cleanup.abort();
|
|
Ok(())
|
|
},
|
|
res = udp_server => res,
|
|
res = tcp_server => res,
|
|
}
|
|
} |