Search in sources :

Example 26 with Name

use of org.xbill.DNS.Name in project opennms by OpenNMS.

the class DNSServer method generateReply.

/*
     * Note: a null return value means that the caller doesn't need to do
     * anything. Currently this only happens if this is an AXFR request over
     * TCP.
     */
byte[] generateReply(final Message query, final byte[] in, final int length, final Socket s) throws IOException {
    final Header header = query.getHeader();
    int maxLength;
    int flags = 0;
    if (header.getFlag(Flags.QR))
        return null;
    if (header.getRcode() != Rcode.NOERROR)
        return errorMessage(query, Rcode.FORMERR);
    if (header.getOpcode() != Opcode.QUERY)
        return errorMessage(query, Rcode.NOTIMP);
    final Record queryRecord = query.getQuestion();
    final TSIGRecord queryTSIG = query.getTSIG();
    TSIG tsig = null;
    if (queryTSIG != null) {
        tsig = m_TSIGs.get(queryTSIG.getName());
        if (tsig == null || tsig.verify(query, in, length, null) != Rcode.NOERROR)
            return formerrMessage(in);
    }
    final OPTRecord queryOPT = query.getOPT();
    if (s != null)
        maxLength = 65535;
    else if (queryOPT != null)
        maxLength = Math.max(queryOPT.getPayloadSize(), 512);
    else
        maxLength = 512;
    if (queryOPT != null && (queryOPT.getFlags() & ExtendedFlags.DO) != 0)
        flags = FLAG_DNSSECOK;
    final Message response = new Message(query.getHeader().getID());
    response.getHeader().setFlag(Flags.QR);
    if (query.getHeader().getFlag(Flags.RD)) {
        response.getHeader().setFlag(Flags.RD);
    }
    response.addRecord(queryRecord, Section.QUESTION);
    final Name name = queryRecord.getName();
    final int type = queryRecord.getType();
    final int dclass = queryRecord.getDClass();
    if ((type == Type.AXFR || type == Type.IXFR) && s != null)
        return doAXFR(name, query, tsig, queryTSIG, s);
    if (!Type.isRR(type) && type != Type.ANY)
        return errorMessage(query, Rcode.NOTIMP);
    final byte rcode = addAnswer(response, name, type, dclass, 0, flags);
    if (rcode != Rcode.NOERROR && rcode != Rcode.NXDOMAIN)
        return errorMessage(query, rcode);
    addAdditional(response, flags);
    if (queryOPT != null) {
        final int optflags = (flags == FLAG_DNSSECOK) ? ExtendedFlags.DO : 0;
        final OPTRecord opt = new OPTRecord((short) 4096, rcode, (byte) 0, optflags);
        response.addRecord(opt, Section.ADDITIONAL);
    }
    response.setTSIG(tsig, Rcode.NOERROR, queryTSIG);
    return response.toWire(maxLength);
}
Also used : Header(org.xbill.DNS.Header) Message(org.xbill.DNS.Message) OPTRecord(org.xbill.DNS.OPTRecord) CNAMERecord(org.xbill.DNS.CNAMERecord) TSIGRecord(org.xbill.DNS.TSIGRecord) OPTRecord(org.xbill.DNS.OPTRecord) Record(org.xbill.DNS.Record) DNAMERecord(org.xbill.DNS.DNAMERecord) TSIGRecord(org.xbill.DNS.TSIGRecord) TSIG(org.xbill.DNS.TSIG) Name(org.xbill.DNS.Name)

Example 27 with Name

use of org.xbill.DNS.Name in project opennms by OpenNMS.

the class DNSServer method addPrimaryZone.

public void addPrimaryZone(final String zname, final String zonefile) throws IOException {
    Name origin = null;
    if (zname != null)
        origin = Name.fromString(zname, Name.root);
    final Zone newzone = new Zone(origin, zonefile);
    m_znames.put(newzone.getOrigin(), newzone);
}
Also used : Zone(org.xbill.DNS.Zone) Name(org.xbill.DNS.Name)

Example 28 with Name

use of org.xbill.DNS.Name in project opennms by OpenNMS.

the class DNSServer method addAnswer.

byte addAnswer(final Message response, final Name name, int type, int dclass, int iterations, int flags) {
    SetResponse sr;
    byte rcode = Rcode.NOERROR;
    if (iterations > 6)
        return Rcode.NOERROR;
    if (type == Type.SIG || type == Type.RRSIG) {
        type = Type.ANY;
        flags |= FLAG_SIGONLY;
    }
    final Zone zone = findBestZone(name);
    if (zone != null)
        sr = zone.findRecords(name, type);
    else {
        sr = getCache(dclass).lookupRecords(name, type, Credibility.NORMAL);
    }
    if (sr.isUnknown()) {
        addCacheNS(response, getCache(dclass), name);
    }
    if (sr.isNXDOMAIN()) {
        response.getHeader().setRcode(Rcode.NXDOMAIN);
        if (zone != null) {
            addSOA(response, zone);
            if (iterations == 0)
                response.getHeader().setFlag(Flags.AA);
        }
        rcode = Rcode.NXDOMAIN;
    } else if (sr.isNXRRSET()) {
        if (zone != null) {
            addSOA(response, zone);
            if (iterations == 0)
                response.getHeader().setFlag(Flags.AA);
        }
    } else if (sr.isDelegation()) {
        final RRset nsRecords = sr.getNS();
        addRRset(nsRecords.getName(), response, nsRecords, Section.AUTHORITY, flags);
    } else if (sr.isCNAME()) {
        final CNAMERecord cname = sr.getCNAME();
        addRRset(name, response, new RRset(cname), Section.ANSWER, flags);
        if (zone != null && iterations == 0)
            response.getHeader().setFlag(Flags.AA);
        rcode = addAnswer(response, cname.getTarget(), type, dclass, iterations + 1, flags);
    } else if (sr.isDNAME()) {
        final DNAMERecord dname = sr.getDNAME();
        RRset rrset = new RRset(dname);
        addRRset(name, response, rrset, Section.ANSWER, flags);
        final Name newname;
        try {
            newname = name.fromDNAME(dname);
        } catch (final NameTooLongException e) {
            return Rcode.YXDOMAIN;
        }
        rrset = new RRset(new CNAMERecord(name, dclass, 0, newname));
        addRRset(name, response, rrset, Section.ANSWER, flags);
        if (zone != null && iterations == 0)
            response.getHeader().setFlag(Flags.AA);
        rcode = addAnswer(response, newname, type, dclass, iterations + 1, flags);
    } else if (sr.isSuccessful()) {
        final RRset[] rrsets = sr.answers();
        for (int i = 0; i < rrsets.length; i++) addRRset(name, response, rrsets[i], Section.ANSWER, flags);
        if (zone != null) {
            addNS(response, zone, flags);
            if (iterations == 0)
                response.getHeader().setFlag(Flags.AA);
        } else
            addCacheNS(response, getCache(dclass), name);
    }
    return rcode;
}
Also used : SetResponse(org.xbill.DNS.SetResponse) CNAMERecord(org.xbill.DNS.CNAMERecord) NameTooLongException(org.xbill.DNS.NameTooLongException) DNAMERecord(org.xbill.DNS.DNAMERecord) Zone(org.xbill.DNS.Zone) RRset(org.xbill.DNS.RRset) Name(org.xbill.DNS.Name)

Example 29 with Name

use of org.xbill.DNS.Name in project opennms by OpenNMS.

the class DnsRequisitionProvider method getRequisitionFor.

@Override
public Requisition getRequisitionFor(DnsRequisitionRequest request) {
    ZoneTransferIn xfer = null;
    List<Record> records = null;
    LOG.debug("connecting to host {}:{}", request.getHost(), request.getPort());
    try {
        try {
            xfer = ZoneTransferIn.newIXFR(new Name(request.getZone()), request.getSerial(), request.getFallback(), request.getHost(), request.getPort(), null);
            records = getRecords(xfer);
        } catch (ZoneTransferException e) {
            // Fallback to AXFR
            String message = "IXFR not supported trying AXFR: " + e;
            LOG.warn(message, e);
            xfer = ZoneTransferIn.newAXFR(new Name(request.getZone()), request.getHost(), null);
            records = getRecords(xfer);
        }
    } catch (IOException | ZoneTransferException e) {
        throw new RuntimeException(e);
    }
    if (records.size() > 0) {
        // for now, set the foreign source to the specified dns zone
        final Requisition r = new Requisition(request.getForeignSource());
        for (Record rec : records) {
            if (matchingRecord(request, rec)) {
                r.insertNode(createRequisitionNode(request, rec));
            }
        }
        return r;
    }
    return null;
}
Also used : ZoneTransferException(org.xbill.DNS.ZoneTransferException) ZoneTransferIn(org.xbill.DNS.ZoneTransferIn) ARecord(org.xbill.DNS.ARecord) AAAARecord(org.xbill.DNS.AAAARecord) Record(org.xbill.DNS.Record) IOException(java.io.IOException) Requisition(org.opennms.netmgt.provision.persist.requisition.Requisition) Name(org.xbill.DNS.Name)

Example 30 with Name

use of org.xbill.DNS.Name in project nhin-d by DirectProject.

the class DNSConnectionTest method testDNSSocketConnectionUDPWithProxyStore.

public void testDNSSocketConnectionUDPWithProxyStore() throws Exception {
    DNSServerSettings settings = new DNSServerSettings();
    settings.setPort(AvailablePortFinder.getNextAvailable(1024));
    DNSServer server = new DNSServer(new ProxyDNSStore(), settings);
    server.start();
    // give the server a couple seconds to start
    Thread.sleep(2000);
    // turn on debug settings for the DNS client
    Options.set("verbose", "true");
    Lookup lu = new Lookup(new Name("google.com"), Type.A);
    ExtendedResolver resolver = new ExtendedResolver(IPUtils.getDNSLocalIps());
    resolver.setTCP(false);
    resolver.setPort(settings.getPort());
    // default retries is 3, limite to 2
    lu.setResolver(resolver);
    Record[] retRecords = lu.run();
    assertNotNull(retRecords);
    server.stop();
    Thread.sleep(2000);
}
Also used : ExtendedResolver(org.xbill.DNS.ExtendedResolver) Lookup(org.xbill.DNS.Lookup) Record(org.xbill.DNS.Record) 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