Расширение Resolv::DNS для получения ресурсов SPF

Я пытаюсь продлить Resolv::DNS чтобы иметь возможность получать ресурсы SPF. Для этого я просто добавил следующее:

class Resolv::DNS::Resource::IN::SPF < Resolv::DNS::Resource::IN::TXT
end

class Resolv::DNS::Resource::SPF < Resolv::DNS::Resource::TXT
end

Когда я сейчас использую SPFвместо TXT за запрос я получаю пустой хеш. Поэтому я попытался копать дальше.. В строке 516 resolv.rb класс типов предоставляется в качестве второго аргумента при создании Message Объект, который находится на линии 1257. Тем не менее, там останавливается мое понимание того, как все работает.

Кто-нибудь может просветить меня или дать мне руководство?

1 ответ

Опросив мой домен, я узнал, что Resolv кажется, автоматически генерировать классы для типов записей, которые он не распознает. Что вы можете сделать, это запросить все записи, а затем отфильтровать по коду типа. Записи SPF имеют код типа 99, так что вы получите что-то вроде этого:

require 'resolv'

resolver = Resolv::DNS.new
all_records = resolver.getresources('example.com', Resolv::DNS::Resource::IN::ANY)
spf_records = all_records.select { |r| r.class::TypeValue == 99 }
spf_records.each do |record|
  puts(record.data)
end

Это немного уродливо, как вы запрашиваете код типа (Resolv создает TypeValue константа для сгенерированных классов, но не добавляет способа получить это значение из экземпляров, насколько я вижу).

Другие вопросы по тегам