From 8bd7e7b1b40a5822412bb8e0b34ef6963388d538 Mon Sep 17 00:00:00 2001 From: notplants Date: Fri, 7 May 2021 12:20:22 +0200 Subject: [PATCH] Working on multiple insert --- src/dns.rs | 178 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 103 insertions(+), 75 deletions(-) diff --git a/src/dns.rs b/src/dns.rs index 549d3a1..cb63542 100644 --- a/src/dns.rs +++ b/src/dns.rs @@ -13,87 +13,115 @@ use trust_dns_server::store::in_memory::InMemoryAuthority; static DEFAULT_TCP_REQUEST_TIMEOUT: u64 = 5; + +struct DnsManager { + catalog: Catalog, +} + +impl DnsManager { + pub fn new() -> DnsManager { + + let catalog: Catalog = Catalog::new(); + + return DnsManager { + catalog, + }; + } + + pub fn upsert(&mut self, domain: String, ip: Ipv4Addr) { + + + let authority_name = Name::from_str("dyn.peach.cloud.").unwrap(); + + let soa_serial = 1; + let soa_name = Name::from_str("dyn.peach.cloud.").unwrap(); + let soa_rdata = RData::SOA(SOA::new( + Name::from_str("dyn.peach.cloud.").unwrap(), // mname + Name::from_str("root.dyn.peach.cloud.").unwrap(), // rname + soa_serial, // serial + 604800, // refresh + 86400, // retry + 2419200, // expire + 86400, // negtive cache ttl + )); + let mut soa_record_set = RecordSet::new(&soa_name, RecordType::SOA, soa_serial); + soa_record_set.add_rdata(soa_rdata); + let soa_rr_key = RrKey::new( + LowerName::new(&authority_name), + soa_record_set.record_type(), + ); + let mut authority_records = BTreeMap::new(); + authority_records.insert(soa_rr_key, soa_record_set); + + let authority_zone_type = ZoneType::Master; + let authority_allow_axfr = false; + + 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(&domain).unwrap(); + let dyn_ttl = 60; + let dyn_rdata = RData::A(ip); + let dyn_record = Record::from_rdata(dyn_name, dyn_ttl, dyn_rdata); + authority.upsert(dyn_record, authority.serial()); + + self.catalog.upsert( + LowerName::new(&authority_name), + Box::new(Arc::new(RwLock::new(authority))), + ); + } +} + + pub async fn server() -> ServerFuture { info!("Trust-DNS {} starting", trust_dns_server::version()); + let mut dns_manager = DnsManager::new(); + + // first insert + dns_manager.upsert( + "test.dyn.peachcloud.org".to_string(), + Ipv4Addr::new(1, 1, 1, 1), + ); + +// // second insert +// dns_manager.upsert( +// "test.dyn.peachcloud.org.".to_string(), +// Ipv4Addr::new(1, 1, 1, 3), +// ); +// +// // third insert +// dns_manager.upsert( +// "peach.dyn.peachcloud.org.".to_string(), +// Ipv4Addr::new(1, 1, 2, 3), +// ); + 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); + let listen_port: u16 = 12323; + let tcp_request_timeout = Duration::from_secs(DEFAULT_TCP_REQUEST_TIMEOUT); - let sock_addr = SocketAddr::new(ip_addr, listen_port); - let udp_socket = UdpSocket::bind(&sock_addr) - .await - .expect("could not bind udp socket"); - let tcp_listener = TcpListener::bind(&sock_addr) - .await - .expect("could not bind tcp listener"); + let sock_addr = SocketAddr::new(ip_addr, listen_port); + let udp_socket = UdpSocket::bind(&sock_addr) + .await + .expect("could not bind udp socket"); + let tcp_listener = TcpListener::bind(&sock_addr) + .await + .expect("could not bind tcp listener"); - 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 soa_serial = 1; - let soa_name = Name::from_str("dyn.peach.cloud.").unwrap(); - let soa_rdata = RData::SOA(SOA::new( - Name::from_str("dyn.peach.cloud.").unwrap(), // mname - Name::from_str("root.dyn.peach.cloud.").unwrap(), // rname - soa_serial, // serial - 604800, // refresh - 86400, // retry - 2419200, // expire - 86400, // negtive cache ttl - )); - let mut soa_record_set = RecordSet::new(&soa_name, RecordType::SOA, 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(Arc::new(RwLock::new(authority))), - ); - - // second insert - 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, 3)); - 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(Arc::new(RwLock::new(authority))), - ); - - let mut server = ServerFuture::new(catalog); + let mut server = ServerFuture::new(dns_manager.catalog); // load all the listeners info!("DNS server listening for UDP on {:?}", udp_socket);