@@ -12,7 +12,6 @@ use crate::domain_name::DomainName;
12
12
use crate :: message:: rdata:: ptr_rdata:: PtrRdata ;
13
13
use crate :: message:: resource_record:: ResourceRecord ;
14
14
use crate :: message:: rclass:: Rclass ;
15
-
16
15
/*
17
16
The following entries are defined:
18
17
<blank>[<comment>]
@@ -169,12 +168,6 @@ impl DnsZone {
169
168
// Variable to check multiples zones
170
169
let mut origin_count = 0 ;
171
170
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
-
178
171
// Read the file line by line
179
172
for line in reader. lines ( ) {
180
173
let line = line?;
@@ -206,45 +199,57 @@ impl DnsZone {
206
199
// Process records
207
200
let parts: Vec < & str > = line. split_whitespace ( ) . collect ( ) ;
208
201
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
+ //));
213
207
}
214
208
215
209
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 ] ;
217
222
match record_type {
218
223
"SOA" => {
219
224
if parts. len ( ) >= 7 {
220
225
// Crear un SoaRdata vacío y completarlo con setters
221
226
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 ) ) ;
229
234
soa = Some ( soa_data) ;
230
235
}
231
236
}
232
237
"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) ;
234
243
}
235
- "A" | " AAAA" | "CNAME" | "MX" | "TXT" | "PTR" => {
244
+ "AAAA" | "CNAME" | "MX" | "TXT" | "PTR" => {
236
245
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
- } ,
241
246
"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" ) ) ?;
243
248
Rdata :: AAAA ( AAAARdata :: new_from_addr ( ip_addr) )
244
249
} ,
245
250
"CNAME" => Rdata :: CNAME ( CnameRdata :: new ( ) ) , // CNAME
246
251
"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( ) ] ) ) ,
248
253
"PTR" => Rdata :: PTR ( PtrRdata :: new ( ) ) ,
249
254
_ => continue ,
250
255
} ;
@@ -257,10 +262,11 @@ impl DnsZone {
257
262
resource_records. push ( resource_record) ;
258
263
}
259
264
_ => {
260
- return Err ( io:: Error :: new (
265
+ continue ;
266
+ /*return Err(io::Error::new(
261
267
io::ErrorKind::InvalidData,
262
268
format!("Registro de recurso desconocido: {}", record_type),
263
- ) ) ;
269
+ ));*/
264
270
} // Here is where ZONEMD and other unknow types should be entered.
265
271
}
266
272
}
0 commit comments