Это тонко: вы видите проблему заказа. Обработчик события dns_query_reply
вызывается до события, которое фактически заполняет TTL (например, dns_A_reply
).
Указанные поля c$dns
заполняются в хуке DNS::do_reply
, поэтому вам лучше всего добавить в ловушку. Если вы используете приоритет по умолчанию, он будет запускаться после того, который заполняет поля. Попробуйте вместо обработчика dns_query_reply
:
hook DNS::do_reply(c: connection, msg: dns_msg, ans: dns_answer, reply: string) {
local rec_r: DnsFeatureExtractor::InfoReply = [$uid=c$uid, $id=c$id, $response_code=msg$rcode, $TTL=c$dns$TTLs, $resolved_IP=c$dns$answers, $timestamp=c$start_time];
Log::write(DnsFeatureExtractor::ReplyDNS, rec_r);
}
Обратите внимание, что вы по-прежнему имеете дело с необязательными значениями записи, поэтому возможно, что, несмотря на вышесказанное, вы все равно не увидите все значения полей. Чтобы избежать этого, вы можете проверить, действительно ли определены дополнительные значения, и скопировать их только в этом случае:
hook DNS::do_reply(c: connection, msg: dns_msg, ans: dns_answer, reply: string)
{
local rec_r: DnsFeatureExtractor::InfoReply = [$uid=c$uid, $id=c$id, $response_code=msg$rcode, $timestamp=c$start_time];
if ( c$dns?$TTLs )
rec_r$TTL = c$dns$TTLs;
if ( c$dns?$answers )
rec_r$resolved_IP = c$dns$answers;
Log::write(DnsFeatureExtractor::ReplyDNS, rec_r);
}