def Recursor.set_hints(hints, resolver)
TheLog.debug(";; hints(#{hints.inspect})\n")
@resolver = resolver
if (resolver.single_resolvers.length == 0)
resolver = Resolver.new()
end
if (hints && hints.length > 0)
resolver.nameservers=hints
if (String === hints)
hints = [hints]
end
hints.each {|hint|
@@hints = Hash.new
@@hints[hint]=hint
}
end
if (!hints && @@nameservers)
@@hints=(@@nameservers)
else
@@nameservers=(hints)
@@hints = hints
end
TheLog.debug(";; verifying (root) zone...\n")
resolver.recurse=(1)
packet=resolver.query_no_validation_or_recursion(".", "NS", "IN")
hints = Hash.new
if (packet)
if (ans = packet.answer)
ans.each do |rr|
if (rr.name.to_s =~ /^\.?$/ and
rr.type == Types::NS)
server = rr.nsdname.to_s.downcase
server.sub!(/\.$/,"")
TheLog.debug(";; FOUND HINT: #{server}\n")
hints[server] = AddressCache.new
end
end
packet.additional.each do |rr|
TheLog.debug(";; ADDITIONAL: "+rr.inspect+"\n")
server = rr.name.to_s.downcase
server.sub!(/\.$/,"")
if (server)
if ( rr.type == Types::A)
if (hints[server]!=nil)
TheLog.debug(";; STORING IP: #{server} IN A "+rr.address.to_s+"\n")
hints[server].push([rr.address.to_s, rr.ttl])
end
end
if ( rr.type == Types::AAAA)
if (hints[server])
TheLog.debug(";; STORING IP6: #{server} IN AAAA "+rr.address.to_s+"\n")
hints[server].push([rr.address.to_s, rr.ttl])
end
end
end
end
end
hints.keys.each do |server|
if (!hints[server] || hints[server].length == 0)
hints.delete(server)
end
end
@@hints = hints
else
@@hints = {}
end
if (@@hints.size > 0)
TheLog.info(";; USING THE FOLLOWING HINT IPS:\n")
@@hints.values.each do |ips|
ips.each do |server|
TheLog.info(";; #{server}\n")
end
end
else
raise ResolvError.new( "Server ["+(@@nameservers)[0].to_s+".] did not give answers")
end
resolver.recurse=(0)
if (Array === @@hints)
temp = []
@@hints.each {|hint|
temp.push(hint)
}
@@hints = Hash.new
count = 0
temp.each {|hint|
print "Adding hint : #{temp[count]}\n"
@@hints[count] = temp[count]
count += 1
}
end
if (String === @@hints)
temp = @@hints
@@hints = Hash.new
@@hints[0] = temp
end
@@nameservers = @@hints.values
return @@nameservers
end