1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use std::net::SocketAddr;
use std::str::FromStr;
use ipconfig::computer::{get_domain, get_search_list, is_round_robin_enabled};
use ipconfig::get_adapters;
use proto::rr::Name;
use config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts};
use error::*;
fn get_name_servers() -> ResolveResult<Vec<NameServerConfig>> {
let adapters = get_adapters()?;
let mut name_servers = vec![];
for dns_server in adapters
.iter()
.flat_map(|adapter| adapter.dns_servers().iter())
{
let socket_addr = SocketAddr::new(*dns_server, 53);
name_servers.push(NameServerConfig {
socket_addr,
protocol: Protocol::Udp,
tls_dns_name: None,
});
name_servers.push(NameServerConfig {
socket_addr,
protocol: Protocol::Tcp,
tls_dns_name: None,
});
}
Ok(name_servers)
}
pub fn read_system_conf() -> ResolveResult<(ResolverConfig, ResolverOpts)> {
let name_servers = get_name_servers()?;
let search_list: Vec<Name> = get_search_list()?
.iter()
.map(|x| Name::from_str(x))
.collect::<Result<Vec<_>, _>>()?;
let domain = match get_domain()? {
Some(domain) => Name::from_str(&domain)?,
None => Name::root(),
};
let config = ResolverConfig::from_parts(Some(domain), search_list, name_servers);
let rotate = is_round_robin_enabled()?;
let opts = ResolverOpts {
rotate,
..Default::default()
};
Ok((config, opts))
}