10 个版本 (6 个重大更改)
使用旧 Rust 2015
0.7.0 | 2020年11月11日 |
---|---|
0.6.3 | 2020年3月5日 |
0.6.2 | 2019年1月8日 |
0.6.1 | 2018年5月26日 |
0.4.0 | 2016年3月3日 |
#321 在 解析器实现 中
1,145,251 每月下载量
在 721 个crate中 使用 (12 个直接使用)
34KB
573 行
Resolv-conf
状态:测试版
Rust 的 /etc/resolv.conf
解析器 crate。
为什么?
- 目前 crates.io 上没有裸文件解析器
- 我需要一个来为 rotor 创建 DNS 解析器
许可
根据您选择以下任一许可
- Apache License, Version 2.0, (./LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (./LICENSE-MIT 或 http://opensource.org/licenses/MIT)
供您选择。
贡献
除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,应按照上述方式双重许可,不附加任何其他条款或条件。
lib.rs
:
该 crate 仅解析 /etc/resolv.conf
文件并创建一个配置对象
示例
从字符串解析配置
extern crate resolv_conf;
use std::net::{Ipv4Addr, Ipv6Addr};
use resolv_conf::{ScopedIp, Config, Network};
fn main() {
let config_str = "
options ndots:8 timeout:8 attempts:8
domain example.com
search example.com sub.example.com
nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844
nameserver 8.8.8.8
nameserver 8.8.4.4
options rotate
options inet6 no-tld-query
sortlist 130.155.160.0/255.255.240.0 130.155.0.0";
// Parse the config.
let parsed_config = Config::parse(&config_str).expect("Failed to parse config");
// We can build configs manually as well, either directly or with Config::new()
let mut expected_config = Config::new();
expected_config.nameservers = vec![
ScopedIp::V6(Ipv6Addr::new(0x2001, 0x4860, 0x4860, 0, 0, 0, 0, 0x8888), None),
ScopedIp::V6(Ipv6Addr::new(0x2001, 0x4860, 0x4860, 0, 0, 0, 0, 0x8844), None),
ScopedIp::V4(Ipv4Addr::new(8, 8, 8, 8)),
ScopedIp::V4(Ipv4Addr::new(8, 8, 4, 4)),
];
expected_config.sortlist = vec![
Network::V4(Ipv4Addr::new(130, 155, 160, 0), Ipv4Addr::new(255, 255, 240, 0)),
Network::V4(Ipv4Addr::new(130, 155, 0, 0), Ipv4Addr::new(255, 255, 0, 0)),
];
expected_config.debug = false;
expected_config.ndots = 8;
expected_config.timeout = 8;
expected_config.attempts = 8;
expected_config.rotate = true;
expected_config.no_check_names = false;
expected_config.inet6 = true;
expected_config.ip6_bytestring = false;
expected_config.ip6_dotint = false;
expected_config.edns0 = false;
expected_config.single_request = false;
expected_config.single_request_reopen = false;
expected_config.no_tld_query = true;
expected_config.use_vc = false;
expected_config.set_domain(String::from("example.com"));
expected_config.set_search(vec![
String::from("example.com"),
String::from("sub.example.com")
]);
// We can compare configurations, since resolv_conf::Config implements Eq
assert_eq!(parsed_config, expected_config);
}
解析文件
use std::io::Read;
use std::fs::File;
extern crate resolv_conf;
fn main() {
// Read the file
let mut buf = Vec::with_capacity(4096);
let mut f = File::open("/etc/resolv.conf").unwrap();
f.read_to_end(&mut buf).unwrap();
// Parse the buffer
let cfg = resolv_conf::Config::parse(&buf).unwrap();
// Print the config
println!("---- Parsed /etc/resolv.conf -----\n{:#?}\n", cfg);
}
依赖
~225KB