Skip to content

Commit 5eecffd

Browse files
committed
feat(zones.rs): now considers ttl global and ttl per rr. test_from_master_file fail.
1 parent 3921a0e commit 5eecffd

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

src/zones.rs

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use crate::domain_name::DomainName;
1212
use crate::message::rdata::ptr_rdata::PtrRdata;
1313
use crate::message::resource_record::ResourceRecord;
1414
use crate::message::rclass::Rclass;
15-
1615
/*
1716
The following entries are defined:
1817
<blank>[<comment>]
@@ -169,12 +168,6 @@ impl DnsZone {
169168
// Variable to check multiples zones
170169
let mut origin_count = 0;
171170

172-
// Variable to check multiples SOA records
173-
let mut soa_count = 0;
174-
175-
// Variable to check thesame class
176-
let mut class = Rclass::IN;
177-
178171
// Read the file line by line
179172
for line in reader.lines() {
180173
let line = line?;
@@ -206,45 +199,57 @@ impl DnsZone {
206199
// Process records
207200
let parts: Vec<&str> = line.split_whitespace().collect();
208201
if parts.len() < 4 {
209-
return Err(io::Error::new(
210-
io::ErrorKind::InvalidData,
211-
"Registro de recurso incompleto",
212-
));
202+
continue;
203+
//return Err(io::Error::new(
204+
// io::ErrorKind::InvalidData,
205+
// "Registro de recurso incompleto",
206+
//));
213207
}
214208

215209
let record_name = parts[0];
216-
let record_type = parts[2];
210+
211+
let record_ttl_or_type = parts[1];
212+
213+
let rr_type_index = if record_ttl_or_type.parse::<u32>().is_ok() {
214+
ttl = record_ttl_or_type.parse().unwrap_or(3600);
215+
2
216+
} else {
217+
1
218+
};
219+
220+
let record_type = parts[rr_type_index];
221+
let record_class = parts[rr_type_index+1];
217222
match record_type {
218223
"SOA" => {
219224
if parts.len() >= 7 {
220225
// Crear un SoaRdata vacío y completarlo con setters
221226
let mut soa_data = SoaRdata::new();
222-
soa_data.set_mname(DomainName::new_from_str(parts[3]));
223-
soa_data.set_rname(DomainName::new_from_str(parts[4]));
224-
soa_data.set_serial(parts[5].parse().unwrap_or(0));
225-
soa_data.set_refresh(parts[6].parse().unwrap_or(3600));
226-
soa_data.set_retry(parts.get(7).unwrap_or(&"1800").parse().unwrap_or(1800));
227-
soa_data.set_expire(parts.get(8).unwrap_or(&"1209600").parse().unwrap_or(1209600));
228-
soa_data.set_minimum(parts.get(9).unwrap_or(&"3600").parse().unwrap_or(3600));
227+
soa_data.set_mname(DomainName::new_from_str(parts[rr_type_index+2]));
228+
soa_data.set_rname(DomainName::new_from_str(parts[rr_type_index+3]));
229+
soa_data.set_serial(parts[rr_type_index+4].parse().unwrap_or(0));
230+
soa_data.set_refresh(parts[rr_type_index+5].parse().unwrap_or(3600));
231+
soa_data.set_retry(parts.get(rr_type_index+6).unwrap_or(&"1800").parse().unwrap_or(1800));
232+
soa_data.set_expire(parts.get(rr_type_index+7).unwrap_or(&"1209600").parse().unwrap_or(1209600));
233+
soa_data.set_minimum(parts.get(rr_type_index+8).unwrap_or(&"3600").parse().unwrap_or(3600));
229234
soa = Some(soa_data);
230235
}
231236
}
232237
"NS" => {
233-
ns_records.push(parts[3].to_string());
238+
ns_records.push(parts[rr_type_index+1].to_string());
239+
}
240+
"A" => {
241+
let resource_record = ARdata::rr_from_master_file(parts[rr_type_index+1].split_whitespace(), ttl, record_class, record_name.to_string());
242+
resource_records.push(resource_record);
234243
}
235-
"A" | "AAAA" | "CNAME" | "MX" | "TXT" | "PTR" => {
244+
"AAAA" | "CNAME" | "MX" | "TXT" | "PTR" => {
236245
let rdata = match record_type {
237-
"A" => {
238-
let ip_addr: std::net::IpAddr = parts[3].parse().map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid IP address"))?;
239-
Rdata::A(ARdata::new_from_addr(ip_addr))
240-
},
241246
"AAAA" => {
242-
let ip_addr: std::net::IpAddr = parts[3].parse().map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid IP address"))?;
247+
let ip_addr: std::net::IpAddr = parts[rr_type_index+1].parse().map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid IP address"))?;
243248
Rdata::AAAA(AAAARdata::new_from_addr(ip_addr))
244249
},
245250
"CNAME" => Rdata::CNAME(CnameRdata::new()), // CNAME
246251
"MX" => Rdata::MX(MxRdata::new()),
247-
"TXT" => Rdata::TXT(TxtRdata::new(vec![parts[3].to_string()])),
252+
"TXT" => Rdata::TXT(TxtRdata::new(vec![parts[rr_type_index+1].to_string()])),
248253
"PTR" => Rdata::PTR(PtrRdata::new()),
249254
_ => continue,
250255
};
@@ -257,10 +262,11 @@ impl DnsZone {
257262
resource_records.push(resource_record);
258263
}
259264
_ => {
260-
return Err(io::Error::new(
265+
continue;
266+
/*return Err(io::Error::new(
261267
io::ErrorKind::InvalidData,
262268
format!("Registro de recurso desconocido: {}", record_type),
263-
));
269+
));*/
264270
} // Here is where ZONEMD and other unknow types should be entered.
265271
}
266272
}

0 commit comments

Comments
 (0)