use of org.xbill.DNS.Name in project opennms by OpenNMS.
the class DNSServer method addSecondaryZone.
public void addSecondaryZone(final String zone, final String remote) throws IOException, ZoneTransferException {
final Name zname = Name.fromString(zone, Name.root);
final Zone newzone = new Zone(zname, DClass.IN, remote);
m_znames.put(zname, newzone);
}
use of org.xbill.DNS.Name in project opennms by OpenNMS.
the class DNSServer method findBestZone.
public Zone findBestZone(final Name name) {
Zone foundzone = m_znames.get(name);
if (foundzone != null) {
return foundzone;
}
final int labels = name.labels();
for (int i = 1; i < labels; i++) {
final Name tname = new Name(name, i);
foundzone = m_znames.get(tname);
if (foundzone != null) {
return foundzone;
}
}
return null;
}
use of org.xbill.DNS.Name in project opennms by OpenNMS.
the class DNSResolutionMonitor method poll.
@Override
public PollStatus poll(MonitoredService svc, Map<String, Object> parameters) {
// Get the name to query for
final Name name;
try {
name = new Name(svc.getNodeLabel());
} catch (final TextParseException e) {
return PollStatus.unavailable("Invalid record name '" + svc.getNodeLabel() + "': " + e.getMessage());
}
// Determine if records for IPv4 and/or IPv6 re required
final String resolutionType = ParameterMap.getKeyedString(parameters, PARM_RESOLUTION_TYPE, PARM_RESOLUTION_TYPE_DEFAULT);
final boolean ipv4Required = PARM_RESOLUTION_TYPE_V4.equalsIgnoreCase(resolutionType) || PARM_RESOLUTION_TYPE_BOTH.equals(resolutionType);
final boolean ipv6Required = PARM_RESOLUTION_TYPE_V6.equalsIgnoreCase(resolutionType) || PARM_RESOLUTION_TYPE_BOTH.equals(resolutionType);
// Build a resolver object used for lookups
final String nameserver = ParameterMap.getKeyedString(parameters, PARM_NAMESERVER, null);
final Resolver resolver;
try {
if (nameserver == null) {
// Use system-defined resolvers
resolver = new ExtendedResolver();
} else {
resolver = new SimpleResolver(nameserver);
}
} catch (final UnknownHostException e) {
return PollStatus.unavailable("Unable to resolve nameserver '" + nameserver + "': " + e.getMessage());
}
// Start resolving the records
final long start = System.currentTimeMillis();
// Resolve the name
final boolean ipv4Found = resolve(name, resolver, Type.A);
final boolean ipv6Found = resolve(name, resolver, Type.AAAA);
// Resolving succeeded - checking results
final long end = System.currentTimeMillis();
// Check if result is valid
if (!ipv4Found && !ipv6Found) {
return PollStatus.unavailable("Unable to resolve host '" + name + "'");
} else if (ipv4Required && !ipv4Found) {
return PollStatus.unavailable("'" + name + "' could be resolved to an IPv6 address (AAAA record) but not an IPv4 address (A record)");
} else if (ipv6Required && !ipv6Found) {
return PollStatus.unavailable("'" + name + "' could be resolved to an IPv4 address (A record) but not an IPv6 address (AAAA record)");
} else {
return PollStatus.available((double) (end - start));
}
}
use of org.xbill.DNS.Name in project opennms by OpenNMS.
the class DnsMonitor method pollDNS.
private PollStatus pollDNS(final TimeoutTracker timeoutTracker, final int port, final InetAddress address, final String lookup, final List<Integer> fatalCodes, int minAnswers, int maxAnswers) {
final String addr = InetAddressUtils.str(address);
for (timeoutTracker.reset(); timeoutTracker.shouldRetry(); timeoutTracker.nextAttempt()) {
try {
final Name name = Name.fromString(lookup, Name.root);
final SimpleResolver resolver = new SimpleResolver();
resolver.setAddress(new InetSocketAddress(addr, port));
resolver.setLocalAddress((InetSocketAddress) null);
double timeout = timeoutTracker.getSoTimeout() / 1000;
resolver.setTimeout((timeout < 1 ? 1 : (int) timeout));
final Record question = Record.newRecord(name, Type.A, DClass.IN);
final Message query = Message.newQuery(question);
PollStatus status;
timeoutTracker.startAttempt();
final Message response = resolver.send(query);
double responseTime = timeoutTracker.elapsedTimeInMillis();
final Integer rcode = response.getHeader().getRcode();
LOG.debug("received response code: {}", rcode);
if (fatalCodes.contains(rcode)) {
status = PollStatus.unavailable("Received an invalid DNS response for address: " + addr);
LOG.debug(status.getReason());
return status;
} else if (minAnswers != DEFAULT_MIN_ANSWERS || maxAnswers != DEFAULT_MAX_ANSWERS) {
int numAnswers = response.getSectionArray(Section.ANSWER).length;
boolean tooFewAnswers = numAnswers < minAnswers;
boolean tooManyAnswers = numAnswers > maxAnswers;
if (tooFewAnswers) {
status = PollStatus.unavailable("Response contained only " + numAnswers + " answer(s), but at least " + minAnswers + " answers(s) are needed.");
LOG.warn(status.getReason());
return status;
}
if (tooManyAnswers) {
status = PollStatus.unavailable("Response contained " + numAnswers + " answer(s), but " + maxAnswers + " or fewer answers(s) are needed.");
LOG.warn(status.getReason());
return status;
}
status = PollStatus.up(responseTime);
LOG.debug("valid DNS response received with {} answer(s), responseTime = {}ms", numAnswers, responseTime);
return status;
} else {
status = PollStatus.up(responseTime);
LOG.debug("valid DNS response received, responseTime = {}ms", responseTime);
return status;
}
} catch (final InterruptedIOException e) {
// No response received, retry without marking the poll failed. If we get this condition over and over until
// the retries are exhausted, it will leave serviceStatus null and we'll get the log message at the bottom
} catch (final NoRouteToHostException e) {
String reason1 = "No route to host exception for address: " + addr;
LOG.debug(reason1, e);
return PollStatus.unavailable(reason1);
} catch (final ConnectException e) {
String reason1 = "Connection exception for address: " + addr;
LOG.debug(reason1, e);
return PollStatus.unavailable(reason1);
} catch (final IOException e) {
String reason1 = "IOException while polling address: " + addr + " " + e.getMessage();
LOG.debug(reason1, e);
return PollStatus.unavailable(reason1);
}
}
String reason = "Never received valid DNS response for address: " + addr;
LOG.debug(reason);
return PollStatus.unavailable(reason);
}
use of org.xbill.DNS.Name in project opennms by OpenNMS.
the class ReverseDnsProvisioningAdapter method doUpdate.
private void doUpdate(AdapterOperation op) {
LOG.debug("doUpdate: operation: {}", op.getType().name());
for (ReverseDnsRecord record : m_reverseDnsProvisioningAdapterService.get(op.getNodeId())) {
LOG.debug("doUpdate: ReverseDnsRecord: hostname: {} zone: {} ip address: {}", record.getIp().getHostAddress(), record.getHostname(), record.getZone());
try {
Update update = new Update(Name.fromString(record.getZone()));
Name ptrRecord = ReverseMap.fromAddress(record.getIp());
update.replace(ptrRecord, Type.PTR, 3600, record.getHostname());
m_resolver.send(update);
m_reverseDnsProvisioningAdapterService.update(op.getNodeId(), record);
} catch (Exception e) {
LOG.error("updateNode: Error handling updated event.", e);
sendAndThrow(op.getNodeId(), e);
}
}
}
Aggregations