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
if ((packet.additional.length == 0) ||
((packet.additional.length == 1) && (packet.additional()[0].type == Types.OPT)))
q = Queue.new
hints.keys.each {|server|
['A', 'AAAA'].each {|type|
msg = Message.new
msg.do_caching = @do_caching
msg.header.rd = false
msg.do_validation = false
msg.add_question(server, type, 'IN')
if (@dnssec)
msg.header.cd = true
end
resolver.send_async(msg, q)
}
}
(hints.length * 2).times {
id, result, error = q.pop
if (result)
result.answer.each {|rr|
TheLog.debug(";; NS address: " + rr.inspect+"\n")
add_to_hints(hints, rr)
}
end
}
else
packet.additional.each do |rr|
TheLog.debug(";; ADDITIONAL: "+rr.inspect+"\n")
add_to_hints(hints, rr)
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