async Task<bool> GetHostEntry(string name, bool replicas)
{
HostName hostName = new HostName(name);
// Get initial Master server to do direct queries
HostName hostDomain = hostName.GetParent();
if (hostDomain == null)
{
throw new ArgumentException(string.Format("'{0}' is not a valid host name", name));
}
var soaRecords = localResolver.Query(hostDomain.Name, QType.SOA);
if (soaRecords != null && soaRecords.RecordsSOA.Length > 0)
{
// Some local servers provide truncated SOA list, so query authority
var hostDomainIps = await localResolver.ResolveAsync(soaRecords.RecordsSOA[0].MNAME);
var remoteResolver = new Resolver(GetIpV4Address(hostDomainIps));
var soaMessage = remoteResolver.Query(hostDomain.Name, QType.SOA);
if (soaMessage != null && soaRecords.RecordsSOA.Length > 0)
{
// Search each SOA record
bool foundInReplicas = true;
foreach (var server in soaMessage.RecordsSOA)
{
// Search each IP associated with NS Server
hostDomainIps = localResolver.GetHostByName(server.MNAME);
foreach (var ipEndpoint in GetIpV4Address(hostDomainIps))
{
remoteResolver = new Resolver(ipEndpoint);
remoteResolver.Recursion = true;
remoteResolver.UseCache = false;
var dnsMessage = remoteResolver.Query(hostName.Name, QType.A);
if (dnsMessage == null || !string.IsNullOrEmpty(dnsMessage.Error) || dnsMessage.Answers.Count == 0)
{
// Record not found
Console.WriteLine("Record not found in NS server '{0}'", server.MNAME);
foundInReplicas = false;
}
// If we aren't checking all replica's, return true from first result
if (!replicas)
{
return foundInReplicas;
}
}
}
// All SOA servers returned a record
return foundInReplicas;
}
}
// No SOA record found
return false;
}