pub fingerprint: Vec<u8>,
}
+#[derive(Debug,PartialEq)]
+pub struct DNSRDataSRV {
+ /// Priority
+ pub priority: u16,
+ /// Weight
+ pub weight: u16,
+ /// Port
+ pub port: u16,
+ /// Target
+ pub target: Vec<u8>,
+}
+
/// Represents RData of various formats
#[derive(Debug,PartialEq)]
pub enum DNSRData {
NULL(Vec<u8>),
// RData has several fields
SOA(DNSRDataSOA),
+ SRV(DNSRDataSRV),
SSHFP(DNSRDataSSHFP),
// RData for remaining types is sometimes ignored
Unknown(Vec<u8>),
return Ok(js);
}
+/// Log SRV section fields.
+fn dns_log_srv(srv: &DNSRDataSRV) -> Result<JsonBuilder, JsonError>
+{
+ let mut js = JsonBuilder::new_object();
+
+ js.set_uint("priority", srv.priority as u64)?;
+ js.set_uint("weight", srv.weight as u64)?;
+ js.set_uint("port", srv.port as u64)?;
+ js.set_string_from_bytes("name", &srv.target)?;
+
+ js.close()?;
+ return Ok(js);
+}
+
fn dns_log_json_answer_detail(answer: &DNSAnswerEntry) -> Result<JsonBuilder, JsonError>
{
let mut jsa = JsonBuilder::new_object();
DNSRData::SSHFP(sshfp) => {
jsa.set_object("sshfp", &dns_log_sshfp(&sshfp)?)?;
}
+ DNSRData::SRV(srv) => {
+ jsa.set_object("srv", &dns_log_srv(&srv)?)?;
+ }
_ => {}
}
a.append_object(&dns_log_sshfp(&sshfp)?)?;
}
},
+ DNSRData::SRV(srv) => {
+ if !answer_types.contains_key(&type_string) {
+ answer_types.insert(type_string.to_string(),
+ JsonBuilder::new_array());
+ }
+ if let Some(a) = answer_types.get_mut(&type_string) {
+ a.append_object(&dns_log_srv(&srv)?)?;
+ }
+ },
_ => {}
}
}
lua.pushstring(&String::from_utf8_lossy(&sshfp.fingerprint));
lua.settable(-3);
},
+ DNSRData::SRV(ref srv) => {
+ lua.pushstring("addr");
+ lua.pushstring(&String::from_utf8_lossy(&srv.target));
+ lua.settable(-3);
+ },
}
lua.settable(-3);
}
)
}
+fn dns_parse_rdata_srv<'a>(input: &'a [u8], message: &'a [u8])
+ -> IResult<&'a [u8], DNSRData> {
+ do_parse!(
+ input,
+ priority: be_u16 >>
+ weight: be_u16 >>
+ port: be_u16 >>
+ target: call!(dns_parse_name, message) >>
+ (DNSRData::SRV(DNSRDataSRV{
+ priority,
+ weight,
+ port,
+ target,
+ }))
+ )
+}
+
fn dns_parse_rdata_txt<'a>(input: &'a [u8])
-> IResult<&'a [u8], DNSRData> {
do_parse!(
DNS_RECORD_TYPE_TXT => dns_parse_rdata_txt(input),
DNS_RECORD_TYPE_NULL => dns_parse_rdata_null(input),
DNS_RECORD_TYPE_SSHFP => dns_parse_rdata_sshfp(input),
+ DNS_RECORD_TYPE_SRV => dns_parse_rdata_srv(input, message),
_ => dns_parse_rdata_unknown(input),
}
}