如何使用Resolv :: DNS :: Resource :: Generic

时间:2015-03-05 00:09:51

标签: ruby resolv

我想更好地了解Resolv :: DNS如何处理不直接支持的记录。这些记录由Resolv :: DNS :: Resource :: Generic类表示,但我找不到有关如何从该记录中获取数据的文档。

具体来说,我的区域将包含SSHFP和TLSA记录,我需要一种方法来获取该数据。

1 个答案:

答案 0 :(得分:3)

通过逆向工程,我找到了答案 - 在这里记录下来供其他人查看。

请注意,这涉及Resolv :: DNS模块的未记录功能,实施可能会随着时间而改变。

Resolv :: DNS模块不理解的资源记录不是通过Generic类表示,而是通过一个子类表示,其名称表示DNS响应的类型和类 - 例如,SSHFP记录(类型44)将表示为Resolv :: DNS :: Resource :: Generic :: Type44_Class1

该对象将包含一个方法" data"这使您可以以纯二进制格式访问记录的RDATA。

因此,要访问SSHFP记录,以下是如何获取它:

def handle_sshfp(rr) do
   # the RDATA is a string but contains binary data
   data = rr.data.bytes
   algo = data[0].to_s
   fptype = data[1].to_s
   fp = data[2..-1].to_s
   hex = fp.map{|b| b.to_s(16).rr.rjust(2,'0') }.join(':')
   puts "The SSHFP record is: #{fptype} #{algo} #{hex}"
end

Resolv::DNS.open do |dns|
   all_records = dns.getresources('myfqdn.example.com', Resolv::DNS::Resource::IN::ANY ) rescue nil
   all_records.each do |rr|
      if rr.is_a? Resolv::DNS::Resource::Generic then
         classname = rr.class.name.split('::').last
         handle_sshfp(rr) if classname == "Type44_Class1"
      end
   end
end