Implemented hosts-file support. You can resolve local names or block ads on DNS level!
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::env;
|
||||
|
||||
use crate::{Context, Settings};
|
||||
use crate::blockchain::filter::BlockchainFilter;
|
||||
@@ -6,6 +7,7 @@ use crate::dns::server::{DnsServer, DnsUdpServer, DnsTcpServer};
|
||||
use crate::dns::context::{ServerContext, ResolveStrategy};
|
||||
#[allow(unused_imports)]
|
||||
use log::{debug, error, info, LevelFilter, trace, warn};
|
||||
use crate::dns::hosts::HostsFilter;
|
||||
|
||||
/// Starts UDP and TCP DNS-servers
|
||||
pub fn start_dns_server(context: &Arc<Mutex<Context>>, settings: &Settings) {
|
||||
@@ -35,6 +37,25 @@ fn create_server_context(context: Arc<Mutex<Context>>, settings: &Settings) -> A
|
||||
true => { ResolveStrategy::Recursive }
|
||||
false => { ResolveStrategy::Forward { upstreams: settings.dns.forwarders.clone() } }
|
||||
};
|
||||
// Add host filters
|
||||
for host in &settings.dns.hosts {
|
||||
if host == "system" {
|
||||
if cfg!(target_os = "windows") {
|
||||
if let Ok(root) = env::var("SYSTEMROOT") {
|
||||
let filename = format!("{}{}", &root, "\\System32\\drivers\\etc\\hosts");
|
||||
info!("Loading hosts from '{}'", &filename);
|
||||
server_context.filters.push(Box::new(HostsFilter::new(&filename)));
|
||||
}
|
||||
} else {
|
||||
let filename = "/etc/hosts";
|
||||
info!("Loading hosts from '{}'", filename);
|
||||
server_context.filters.push(Box::new(HostsFilter::new(filename)));
|
||||
}
|
||||
} else {
|
||||
info!("Loading hosts from '{}'", &host);
|
||||
server_context.filters.push(Box::new(HostsFilter::new(host)));
|
||||
}
|
||||
}
|
||||
server_context.filters.push(Box::new(BlockchainFilter::new(context)));
|
||||
match server_context.initialize() {
|
||||
Ok(_) => {}
|
||||
|
||||
Reference in New Issue
Block a user