Search in sources :

Example 16 with Name

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);
}
Also used : Zone(org.xbill.DNS.Zone) Name(org.xbill.DNS.Name)

Example 17 with Name

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;
}
Also used : Zone(org.xbill.DNS.Zone) Name(org.xbill.DNS.Name)

Example 18 with Name

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));
    }
}
Also used : ExtendedResolver(org.xbill.DNS.ExtendedResolver) SimpleResolver(org.xbill.DNS.SimpleResolver) ExtendedResolver(org.xbill.DNS.ExtendedResolver) Resolver(org.xbill.DNS.Resolver) UnknownHostException(java.net.UnknownHostException) SimpleResolver(org.xbill.DNS.SimpleResolver) Name(org.xbill.DNS.Name) TextParseException(org.xbill.DNS.TextParseException)

Example 19 with Name

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);
}
Also used : InterruptedIOException(java.io.InterruptedIOException) PollStatus(org.opennms.netmgt.poller.PollStatus) Message(org.xbill.DNS.Message) InetSocketAddress(java.net.InetSocketAddress) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) SimpleResolver(org.xbill.DNS.SimpleResolver) NoRouteToHostException(java.net.NoRouteToHostException) Name(org.xbill.DNS.Name) Record(org.xbill.DNS.Record) ConnectException(java.net.ConnectException)

Example 20 with Name

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);
        }
    }
}
Also used : Update(org.xbill.DNS.Update) Name(org.xbill.DNS.Name)

Aggregations

Name (org.xbill.DNS.Name)35 Record (org.xbill.DNS.Record)16 Message (org.xbill.DNS.Message)8 ARecord (org.xbill.DNS.ARecord)7 SRVRecord (org.xbill.DNS.SRVRecord)7 UnknownHostException (java.net.UnknownHostException)6 ExtendedResolver (org.xbill.DNS.ExtendedResolver)6 IOException (java.io.IOException)5 CNAMERecord (org.xbill.DNS.CNAMERecord)5 Lookup (org.xbill.DNS.Lookup)5 NSRecord (org.xbill.DNS.NSRecord)5 TextParseException (org.xbill.DNS.TextParseException)5 Zone (org.xbill.DNS.Zone)5 ArrayList (java.util.ArrayList)4 JSONArray (org.json.JSONArray)4 JSONException (org.json.JSONException)4 JSONObject (org.json.JSONObject)4 Lookup (org.nhindirect.stagent.cert.impl.util.Lookup)4 File (java.io.File)3 InputStream (java.io.InputStream)3