From ab2fed3599743c860191743da45d043d8042f91d Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Fri, 19 Apr 2019 14:55:17 +1200 Subject: [PATCH] answer a query for test.dyn.peach.cloud! --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47a7cfd..e6093f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -528,6 +528,7 @@ dependencies = [ "tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "trust-dns-server 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/Cargo.toml b/Cargo.toml index a35ed1f..332eb94 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,4 +13,5 @@ serde = { version = "1.0.88", features = ["derive"] } tokio = "0.1.15" tokio-tcp = "0.1" tokio-udp = "0.1" +trust-dns = "0.16" trust-dns-server = "0.16" diff --git a/src/main.rs b/src/main.rs index b265eac..3e20629 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,8 +6,11 @@ extern crate tokio_tcp; extern crate trust_dns_server; use std::io; +use std::collections::BTreeMap; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::path::{Path, PathBuf}; +use std::str::FromStr; +use std::sync::Arc; use std::time::{Duration}; use futures::{future, Future}; @@ -16,7 +19,8 @@ use tokio::runtime::TaskExecutor; use tokio_tcp::TcpListener; use tokio_udp::UdpSocket; -use trust_dns_server::proto::rr::Name; +use trust_dns::rr::{LowerName, Name, Record, RecordSet, RecordType, RData, RrKey}; +use trust_dns::rr::rdata::soa::SOA; use trust_dns_server::authority::{AuthorityObject, Catalog, ZoneType}; use trust_dns_server::config::{Config, ZoneConfig}; use trust_dns_server::logger; @@ -34,8 +38,6 @@ fn main() { let mut io_loop = Runtime::new().expect("error when creating tokio Runtime"); let executor = io_loop.executor(); - let mut catalog: Catalog = Catalog::new(); - let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)); let listen_port: u16 = 12323; let tcp_request_timeout = Duration::from_secs(DEFAULT_TCP_REQUEST_TIMEOUT); @@ -44,6 +46,53 @@ fn main() { let udp_socket = UdpSocket::bind(&sock_addr).unwrap_or_else(|_| panic!("could not bind to udp: {}", sock_addr)); let tcp_listener = TcpListener::bind(&sock_addr).unwrap_or_else(|_| panic!("could not bind to tcp: {}", sock_addr)); + let mut catalog: Catalog = Catalog::new(); + + let authority_name = Name::from_str("dyn.peach.cloud.").unwrap(); + let mut authority_records = BTreeMap::new(); + let authority_zone_type = ZoneType::Master; + let authority_allow_axfr = false; + + let serial = 2; + let soa_name = Name::from_str("dyn.peach.cloud.").unwrap(); + let soa_ttl = 60; + let soa_rdata = RData::SOA(SOA::new( + Name::from_str("dyn.peach.cloud.").unwrap(), // mname + Name::from_str("root.dyn.peach.cloud.").unwrap(), // rname + serial, // serial + 604800, // refresh + 86400, // retry + 2419200, // expire + 86400 // negtive cache ttl + )); + let mut soa_record_set = RecordSet::new(&soa_name, RecordType::SOA, serial); + soa_record_set.add_rdata(soa_rdata); + let soa_rr_key = RrKey::new(LowerName::new(&authority_name), soa_record_set.record_type()); + authority_records.insert(soa_rr_key, soa_record_set); + + let mut authority = InMemoryAuthority::new( + authority_name.clone(), + authority_records, + authority_zone_type, + authority_allow_axfr + ).unwrap(); + + /* + let ns_name = Name::from_str("dyn.peach.cloud.").unwrap(); + let ns_ttl = 60; + let ns_rdata = RData::NS(Name::from_str("localhost.").unwrap()); + let ns_record = Record::from_rdata(ns_name, ns_ttl, ns_rdata); + authority.upsert(ns_record, authority.serial()); + */ + + let dyn_name = Name::from_str("test.dyn.peach.cloud.").unwrap(); + let dyn_ttl = 60; + let dyn_rdata = RData::A(Ipv4Addr::new(1, 1, 1, 1)); + let dyn_record = Record::from_rdata(dyn_name, dyn_ttl, dyn_rdata); + authority.upsert(dyn_record, authority.serial()); + + catalog.upsert(LowerName::new(&authority_name), Box::new(authority)); + let mut server = ServerFuture::new(catalog); let server_future: Box + Send> =