This commit is contained in:
Benjamyn Love 2024-03-22 15:51:19 +11:00
parent 48db8e9add
commit 329cb28342

View File

@ -2,6 +2,8 @@ use hickory_resolver::proto::rr::rdata::*;
use hickory_resolver::Resolver; use hickory_resolver::Resolver;
use hickory_resolver::config::*; use hickory_resolver::config::*;
use core::fmt;
// #[derive(Debug)] // #[derive(Debug)]
struct Domain { struct Domain {
domain_name: String, domain_name: String,
@ -10,9 +12,44 @@ struct Domain {
aaaa_records: Vec<AAAA>, aaaa_records: Vec<AAAA>,
txt_records: Vec<TXT>, txt_records: Vec<TXT>,
mx_records: Vec<MX>, mx_records: Vec<MX>,
ns_records: Vec<NS>,
soa_records: Vec<SOA>, // Subdomains CAN have there own SOA records if their zones point elsewhere
resolver: Resolver resolver: Resolver
} }
impl fmt::Display for Domain {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Domain name: {}\n", self.domain_name)?;
write!(f, "DNS Records\n\n")?;
for rec in &self.a_records {
write!(f, "A: {}\n", rec)?;
}
for rec in &self.aaaa_records {
write!(f, "AAAA: {}\n", rec)?;
}
for rec in &self.mx_records {
write!(f, "MX: {}\n", rec)?;
}
for rec in &self.txt_records {
write!(f, "TXT: {}\n", rec)?;
}
for rec in &self.ns_records {
write!(f, "NS: {}\n", rec)?;
}
for rec in &self.soa_records {
write!(f, "SOA: {}\n", rec)?;
}
write!(f, "\n\nSubdomains:\n")?;
for subdomain in &self.subdomains {
write!(f, "{}\n", subdomain.domain_name)?;
for rec in &subdomain.a_records {
write!(f, "A: {}\n", rec)?;
}
}
write!(f, "\n")
}
}
impl Domain { impl Domain {
fn new(domain: String) -> Domain { fn new(domain: String) -> Domain {
Domain { Domain {
@ -22,6 +59,8 @@ impl Domain {
aaaa_records: vec![], aaaa_records: vec![],
txt_records: vec![], txt_records: vec![],
mx_records: vec![], mx_records: vec![],
ns_records: vec![],
soa_records: vec![],
resolver: Resolver::new(ResolverConfig::default(), ResolverOpts::default()).unwrap(), resolver: Resolver::new(ResolverConfig::default(), ResolverOpts::default()).unwrap(),
} }
} }
@ -48,6 +87,12 @@ impl Domain {
// Lookup TXT records // Lookup TXT records
self.lookup_txt(); self.lookup_txt();
// Lookup TXT records
self.lookup_ns();
// Lookup TXT records
self.lookup_soa();
// Do subdomains? // Do subdomains?
for subdomain in &mut self.subdomains { for subdomain in &mut self.subdomains {
// println!("Looking up subdomain: {}", subdomain.domain_name); // println!("Looking up subdomain: {}", subdomain.domain_name);
@ -102,6 +147,30 @@ impl Domain {
Err(_err) => {}, Err(_err) => {},
} }
} }
fn lookup_ns(&mut self) {
let response = self.resolver.ns_lookup(&self.domain_name);
match response {
Ok(rec) => {
for entry in rec {
self.ns_records.push(entry);
}
},
Err(_err) => {},
}
}
fn lookup_soa(&mut self) {
let response = self.resolver.soa_lookup(&self.domain_name);
match response {
Ok(rec) => {
for entry in rec {
self.soa_records.push(entry);
}
},
Err(_err) => {},
}
}
} }
fn main() { fn main() {
@ -111,17 +180,7 @@ fn main() {
test.append_subdomain("mail".to_string()); test.append_subdomain("mail".to_string());
test.append_subdomain("ftp".to_string()); test.append_subdomain("ftp".to_string());
test.lookup_all_records(); test.lookup_all_records();
println!("A Records: {:?}", test.a_records);
println!("AAAA Records: {:?}", test.aaaa_records);
println!("MX Records: {:?}", test.mx_records);
for rec in test.txt_records.iter() {
println!("TXT Records: {}", rec);
}
println!("\n\nSubdomains"); println!("{}", test);
for subdom in test.subdomains {
println!("{}", subdom.domain_name);
println!("{:?}", subdom.a_records);
}
// println!("TXT Records: {:#?}", test.txt_records);
} }