You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ey...@apache.org on 2018/10/20 00:00:28 UTC
[05/18] hadoop git commit: HADOOP-15821. Move YARN Registry to Hadoop Registry. Contributed by Íñigo Goiri
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e2a9fa84/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java
deleted file mode 100644
index 52e49a3..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNS.java
+++ /dev/null
@@ -1,1800 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.registry.server.dns;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.net.util.Base64;
-import org.apache.commons.net.util.SubnetUtils;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.io.IOUtils;
-import org.apache.hadoop.net.NetUtils;
-import org.apache.hadoop.registry.client.api.DNSOperations;
-import org.apache.hadoop.registry.client.types.ServiceRecord;
-import org.apache.hadoop.registry.client.types.yarn.YarnRegistryAttributes;
-import org.apache.hadoop.service.AbstractService;
-import org.apache.hadoop.util.concurrent.HadoopExecutors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xbill.DNS.CNAMERecord;
-import org.xbill.DNS.DClass;
-import org.xbill.DNS.DNSKEYRecord;
-import org.xbill.DNS.DNSSEC;
-import org.xbill.DNS.DSRecord;
-import org.xbill.DNS.ExtendedFlags;
-import org.xbill.DNS.ExtendedResolver;
-import org.xbill.DNS.Flags;
-import org.xbill.DNS.Header;
-import org.xbill.DNS.Lookup;
-import org.xbill.DNS.Message;
-import org.xbill.DNS.NSRecord;
-import org.xbill.DNS.Name;
-import org.xbill.DNS.NameTooLongException;
-import org.xbill.DNS.OPTRecord;
-import org.xbill.DNS.Opcode;
-import org.xbill.DNS.RRSIGRecord;
-import org.xbill.DNS.RRset;
-import org.xbill.DNS.Rcode;
-import org.xbill.DNS.Record;
-import org.xbill.DNS.Resolver;
-import org.xbill.DNS.ResolverConfig;
-import org.xbill.DNS.SOARecord;
-import org.xbill.DNS.Section;
-import org.xbill.DNS.SetResponse;
-import org.xbill.DNS.SimpleResolver;
-import org.xbill.DNS.TSIG;
-import org.xbill.DNS.TSIGRecord;
-import org.xbill.DNS.TextParseException;
-import org.xbill.DNS.Type;
-import org.xbill.DNS.Zone;
-
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.NetworkInterface;
-import java.net.Socket;
-import java.net.SocketAddress;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.nio.BufferUnderflowException;
-import java.nio.ByteBuffer;
-import java.nio.channels.DatagramChannel;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.RSAPrivateKeySpec;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static org.apache.hadoop.registry.client.api.RegistryConstants.*;
-
-/**
- * A DNS service reflecting the state of the YARN registry. Records are created
- * based on service records available in the YARN ZK-based registry.
- */
-public class RegistryDNS extends AbstractService implements DNSOperations,
- ZoneSelector {
-
- public static final String CONTAINER = "container";
-
- static final int FLAG_DNSSECOK = 1;
- static final int FLAG_SIGONLY = 2;
-
- private static final Logger LOG =
- LoggerFactory.getLogger(RegistryDNS.class);
- public static final String IN_ADDR_ARPA = "in-addr.arpa.";
- public static final String ZONE_SUFFIX = ".zone";
-
- private ExecutorService executor;
- private ReentrantReadWriteLock zoneLock = new ReentrantReadWriteLock();
- private CloseableLock readLock = new CloseableLock(zoneLock.readLock());
- private CloseableLock writeLock = new CloseableLock(zoneLock.writeLock());
- private String domainName;
- private long ttl = 0L;
-
- private static final Pattern USER_NAME = Pattern.compile("/users/(\\w*)/?");
- private Boolean dnssecEnabled;
- private PrivateKey privateKey;
-
- private ConcurrentMap<Name, DNSKEYRecord> dnsKeyRecs =
- new ConcurrentHashMap<>();
- private ConcurrentMap<Name, Zone> zones = new ConcurrentHashMap<>();
- private Name bindHost;
-
- private boolean channelsInitialized = false;
-
- /**
- * Lock to update resolver only once per request.
- */
- private final Object resolverUpdateLock = new Object();
-
- /**
- * Whether resolver update has been requested.
- */
- private boolean resolverUpdateRequested = true;
-
- /**
- * Construct the service.
- *
- * @param name service name
- */
- public RegistryDNS(String name) {
- super(name);
- executor = HadoopExecutors.newCachedThreadPool(
- new ThreadFactory() {
- private AtomicInteger counter = new AtomicInteger(1);
-
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r,
- "RegistryDNS "
- + counter.getAndIncrement());
- }
- });
- }
-
- public void initializeChannels(Configuration conf) throws Exception {
- if (channelsInitialized) {
- return;
- }
- channelsInitialized = true;
- int port = conf.getInt(KEY_DNS_PORT, DEFAULT_DNS_PORT);
- InetAddress addr = InetAddress.getLocalHost();
-
- String bindAddress = conf.get(KEY_DNS_BIND_ADDRESS);
- if (bindAddress != null) {
- addr = InetAddress.getByName(bindAddress);
- }
-
- LOG.info("Opening TCP and UDP channels on {} port {}", addr, port);
- addNIOUDP(addr, port);
- addNIOTCP(addr, port);
- }
-
- /**
- * Initialize registryDNS to use /etc/resolv.conf values
- * as default resolvers.
- */
- private void updateDNSServer(Configuration conf) {
- synchronized (resolverUpdateLock) {
- if (!resolverUpdateRequested) {
- return;
- }
- int port = conf.getInt(KEY_DNS_PORT, DEFAULT_DNS_PORT);
- resolverUpdateRequested = false;
- List<InetAddress> list = new ArrayList<InetAddress>();
- try {
- // If resolv.conf contains the server's own IP address,
- // and RegistryDNS handles the lookup. Local IP address
- // must be filter out from default resolvers to prevent
- // self recursive loop.
- if (port != 53) {
- // When registryDNS is not running on default port,
- // registryDNS can utilize local DNS server as upstream lookup.
- throw new SocketException("Bypass filtering local DNS server.");
- }
- Enumeration<NetworkInterface> net =
- NetworkInterface.getNetworkInterfaces();
- while(net.hasMoreElements()) {
- NetworkInterface n = (NetworkInterface) net.nextElement();
- Enumeration<InetAddress> ee = n.getInetAddresses();
- while (ee.hasMoreElements()) {
- InetAddress i = (InetAddress) ee.nextElement();
- list.add(i);
- }
- }
- } catch (SocketException e) {
- }
- ResolverConfig.refresh();
- ExtendedResolver resolver;
- try {
- resolver = new ExtendedResolver();
- } catch (UnknownHostException e) {
- LOG.error("Can not resolve DNS servers: ", e);
- return;
- }
- for (Resolver check : resolver.getResolvers()) {
- if (check instanceof SimpleResolver) {
- InetAddress address = ((SimpleResolver) check).getAddress()
- .getAddress();
- if (list.contains(address)) {
- resolver.deleteResolver(check);
- continue;
- } else {
- check.setTimeout(30);
- }
- } else {
- LOG.error("Not simple resolver!!!?" + check);
- }
- }
- synchronized (Lookup.class) {
- Lookup.setDefaultResolver(resolver);
- Lookup.setDefaultSearchPath(ResolverConfig.getCurrentConfig()
- .searchPath());
- }
- StringBuilder message = new StringBuilder();
- message.append("DNS servers: ");
- if (ResolverConfig.getCurrentConfig().servers() != null) {
- for (String server : ResolverConfig.getCurrentConfig()
- .servers()) {
- message.append(server);
- message.append(" ");
- }
- }
- LOG.info(message.toString());
- }
- }
- /**
- * Initializes the registry.
- *
- * @param conf the hadoop configuration
- * @throws Exception if there are tcp/udp issues
- */
- @Override
- protected void serviceInit(Configuration conf) throws Exception {
- super.serviceInit(conf);
-
- // create the zone. for now create a "dummy" SOA record
- try {
- updateDNSServer(conf);
- setDomainName(conf);
-
- initializeZones(conf);
-
- initializeChannels(conf);
- } catch (IOException e) {
- LOG.error("Error initializing Registry DNS Server", e);
- throw e;
- }
- }
-
- /**
- * Initializes the registry based on available parameters in the hadoop
- * configuration.
- *
- * @param conf the hadoop configuration
- * @return the listener port
- * @throws IOException
- */
- void initializeZones(Configuration conf) throws IOException {
- ttl = conf.getTimeDuration(KEY_DNS_TTL, 1L, TimeUnit.SECONDS);
- RecordCreatorFactory.setTtl(ttl);
-
- setDNSSECEnabled(conf);
-
- initializeZonesFromFiles(conf);
-
- Zone registryZone = configureZone(Name.fromString(domainName), conf);
- zones.put(registryZone.getOrigin(), registryZone);
-
- initializeReverseLookupZone(conf);
-
- StringBuilder builder = new StringBuilder();
- builder.append("DNS zones: ").append(System.lineSeparator());
- for (Map.Entry<Name, Zone> entry : zones.entrySet()) {
- builder.append(System.lineSeparator()).append(entry.getValue());
- }
- LOG.info(builder.toString());
- }
-
- /**
- * Signs zone records if necessary (DNSSEC enabled). Zones may not have
- * their NS and SOA records signed if they were initialized from master files.
- */
- private void signZones() throws IOException {
- if (isDNSSECEnabled()) {
- Collection<Zone> zoneCollection = zones.values();
- for (Zone zone : zoneCollection) {
- Iterator itor = zone.iterator();
- while (itor.hasNext()) {
- RRset rRset = (RRset) itor.next();
- Iterator sigs = rRset.sigs();
- if (!sigs.hasNext()) {
- try {
- signSiteRecord(zone, rRset.first());
- } catch (DNSSEC.DNSSECException e) {
- throw new IOException(e);
- }
- }
- }
- }
- }
- }
-
- /**
- * Initializes a zone by reading any zone file by the same name in the
- * designated zone file directory.
- *
- * @param conf the Hadoop configuration object.
- * @throws IOException
- */
- private void initializeZonesFromFiles(Configuration conf) throws IOException {
- // should this be in HDFS?
- String zonesDir = conf.get(KEY_DNS_ZONES_DIR);
- if (zonesDir != null) {
- Iterator<File> iterator = FileUtils.iterateFiles(new File(zonesDir),
- new IOFileFilter() {
- @Override
- public boolean accept(
- File file) {
- return file.getName().endsWith(
- ZONE_SUFFIX);
- }
-
- @Override
- public boolean accept(
- File file,
- String s) {
- return s.endsWith(
- ZONE_SUFFIX);
- }
- }, null);
- while (iterator.hasNext()) {
- File file = iterator.next();
- String name = file.getName();
- name = name.substring(0, name.indexOf(ZONE_SUFFIX) + 1);
- Zone zone = new SecureableZone(Name.fromString(name),
- file.getAbsolutePath());
- zones.putIfAbsent(zone.getOrigin(), zone);
- }
- }
- }
-
- /**
- * Return the number of zones in the map.
- *
- * @return number of zones in the map
- */
- @VisibleForTesting
- protected int getZoneCount() {
- return zones.size();
- }
-
- /**
- * Initializes the reverse lookup zone (mapping IP to name).
- *
- * @param conf the Hadoop configuration.
- * @throws IOException if the DNSSEC key can not be read.
- */
- private void initializeReverseLookupZone(Configuration conf)
- throws IOException {
- // Determine if the subnet should be split into
- // multiple reverse zones, this can be necessary in
- // network configurations where the hosts and containers
- // are part of the same subnet (i.e. the containers only use
- // part of the subnet).
- Boolean shouldSplitReverseZone = conf.getBoolean(KEY_DNS_SPLIT_REVERSE_ZONE,
- DEFAULT_DNS_SPLIT_REVERSE_ZONE);
- if (shouldSplitReverseZone) {
- int subnetCount = ReverseZoneUtils.getSubnetCountForReverseZones(conf);
- addSplitReverseZones(conf, subnetCount);
- // Single reverse zone
- } else {
- Name reverseLookupZoneName = getReverseZoneName(conf);
- if (reverseLookupZoneName == null) {
- // reverse lookup disabled
- return;
- }
- Zone reverseLookupZone = configureZone(reverseLookupZoneName, conf);
- zones.put(reverseLookupZone.getOrigin(), reverseLookupZone);
- }
- }
-
- /**
- * Create the zones based on the zone count.
- *
- * @param conf the Hadoop configuration.
- * @param subnetCount number of subnets to create reverse zones for.
- * @throws IOException if the DNSSEC key can not be read.
- */
- @VisibleForTesting
- protected void addSplitReverseZones(Configuration conf, int subnetCount)
- throws IOException {
- String subnet = conf.get(KEY_DNS_ZONE_SUBNET);
- String range = conf.get(KEY_DNS_SPLIT_REVERSE_ZONE_RANGE);
-
- // Add the split reverse zones
- for (int idx = 0; idx < subnetCount; idx++) {
- Name reverseLookupZoneName = getReverseZoneName(ReverseZoneUtils
- .getReverseZoneNetworkAddress(subnet, Integer.parseInt(range), idx));
- Zone reverseLookupZone = configureZone(reverseLookupZoneName, conf);
- zones.put(reverseLookupZone.getOrigin(), reverseLookupZone);
- }
- }
-
- /**
- * Returns the list of reverse lookup zones.
- *
- * @param conf the hadoop configuration.
- * @return the list of reverse zone names required based on the configuration
- * properties.
- */
- protected Name getReverseZoneName(Configuration conf) {
- Name name = null;
- String zoneSubnet = getZoneSubnet(conf);
- if (zoneSubnet == null) {
- LOG.warn("Zone subnet is not configured. Reverse lookups disabled");
- } else {
- // is there a netmask
- String mask = conf.get(KEY_DNS_ZONE_MASK);
- if (mask != null) {
- // get the range of IPs
- SubnetUtils utils = new SubnetUtils(zoneSubnet, mask);
- name = getReverseZoneName(utils, zoneSubnet);
- } else {
- name = getReverseZoneName(zoneSubnet);
- }
- }
- return name;
- }
-
- /**
- * Return the subnet for the zone. this should be a network address for the
- * subnet (ends in ".0").
- *
- * @param conf the hadoop configuration.
- * @return the zone subnet.
- */
- private String getZoneSubnet(Configuration conf) {
- String subnet = conf.get(KEY_DNS_ZONE_SUBNET);
- if (subnet != null) {
- final String[] bytes = subnet.split("\\.");
- if (bytes.length == 3) {
- subnet += ".0";
- }
- }
- return subnet;
- }
-
- /**
- * Return the reverse zone name based on the address.
- *
- * @param networkAddress the network address.
- * @return the reverse zone name.
- */
- private Name getReverseZoneName(String networkAddress) {
- return getReverseZoneName(null, networkAddress);
- }
-
- /**
- * Return the reverse zone name based on the address.
- *
- * @param utils subnet utils
- * @param networkAddress the network address.
- * @return the reverse zone name.
- */
- private Name getReverseZoneName(SubnetUtils utils, String networkAddress) {
- Name reverseZoneName = null;
- boolean isLargeNetwork = false;
- if (utils != null) {
- isLargeNetwork = utils.getInfo().getAddressCount() > 256;
- }
- final String[] bytes = networkAddress.split("\\.");
- if (bytes.length == 4) {
- String reverseLookupZoneName = null;
- if (isLargeNetwork) {
- reverseLookupZoneName =
- String.format("%s.%s.%s",
- bytes[1],
- bytes[0],
- IN_ADDR_ARPA);
- } else {
- reverseLookupZoneName =
- String.format("%s.%s.%s.%s",
- bytes[2],
- bytes[1],
- bytes[0],
- IN_ADDR_ARPA);
- }
- try {
- reverseZoneName = Name.fromString(reverseLookupZoneName);
- } catch (TextParseException e) {
- LOG.warn("Unable to convert {} to DNS name", reverseLookupZoneName);
- }
- }
- return reverseZoneName;
- }
-
- /**
- * Create the zone and its related zone associated DNS records (NS, SOA).
- *
- * @param zoneName domain name of the zone
- * @param conf configuration reference.
- * @return the zone.
- * @throws IOException
- */
- private Zone configureZone(Name zoneName, Configuration conf)
- throws IOException {
- bindHost = Name.fromString(
- InetAddress.getLocalHost().getCanonicalHostName() + ".");
- SOARecord soaRecord = new SOARecord(zoneName, DClass.IN, ttl,
- bindHost,
- bindHost, getSerial(), 86000, 7200,
- 1209600, 600);
- NSRecord nsRecord = new NSRecord(zoneName, DClass.IN, ttl, bindHost);
- Zone zone = zones.get(zoneName);
- if (zone == null) {
- zone = new SecureableZone(zoneName, new Record[] {soaRecord, nsRecord});
- }
-
- try {
- enableDNSSECIfNecessary(zone, conf, soaRecord, nsRecord);
- } catch (NoSuchAlgorithmException e) {
- throw new IOException(e);
- } catch (InvalidKeySpecException e) {
- throw new IOException(e);
- } catch (DNSSEC.DNSSECException e) {
- throw new IOException(e);
- }
-
- return zone;
- }
-
- /**
- * Return a serial number based on the current date and time.
- *
- * @return the serial number.
- */
- private long getSerial() {
- Date curDate = new Date();
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHH");
- String serial = simpleDateFormat.format(curDate);
- return Long.parseLong(serial);
- }
-
- /**
- * Set the value of the DNSSEC enabled property.
- *
- * @param conf the Hadoop configuration.
- */
- @VisibleForTesting
- protected void setDNSSECEnabled(Configuration conf) {
- dnssecEnabled = conf.getBoolean(KEY_DNSSEC_ENABLED, false);
- }
-
- /**
- * Is DNSSEC enabled?
- *
- * @return true if enabled, false otherwise.
- */
- private boolean isDNSSECEnabled() {
- return dnssecEnabled;
- }
-
- /**
- * Load the required public/private keys, create the zone DNSKEY record, and
- * sign the zone level records.
- *
- * @param zone the zone.
- * @param conf the configuration.
- * @param soaRecord the SOA record.
- * @param nsRecord the NS record.
- * @throws IOException
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeySpecException
- * @throws DNSSEC.DNSSECException
- */
- private void enableDNSSECIfNecessary(Zone zone, Configuration conf,
- SOARecord soaRecord,
- NSRecord nsRecord)
- throws IOException, NoSuchAlgorithmException, InvalidKeySpecException,
- DNSSEC.DNSSECException {
- if (isDNSSECEnabled()) {
- // read in the DNSKEY and create the DNSKEYRecord
- // TODO: reading these out of config seems wrong...
- String publicKey = conf.get(KEY_DNSSEC_PUBLIC_KEY);
- if (publicKey == null) {
- throw new IOException("DNSSEC Key not configured");
- }
- //TODO - perhaps read in actual DNSKEY record structure?
- Name zoneName = zone.getOrigin();
- DNSKEYRecord dnskeyRecord = dnsKeyRecs.get(zoneName);
- if (dnskeyRecord == null) {
- byte[] key = Base64.decodeBase64(publicKey.getBytes("UTF-8"));
- dnskeyRecord = new DNSKEYRecord(zoneName,
- DClass.IN, ttl,
- DNSKEYRecord.Flags.ZONE_KEY,
- DNSKEYRecord.Protocol.DNSSEC,
- DNSSEC.Algorithm.RSASHA256, key);
- dnsKeyRecs.putIfAbsent(zoneName, dnskeyRecord);
- }
- LOG.info("Registering {}", dnskeyRecord);
- try (CloseableLock lock = writeLock.lock()) {
- zone.addRecord(dnskeyRecord);
-
- String privateKeyFile = conf.get(KEY_DNSSEC_PRIVATE_KEY_FILE,
- DEFAULT_DNSSEC_PRIVATE_KEY_FILE);
-
- Properties props = new Properties();
- try (
- FileInputStream inputStream = new FileInputStream(privateKeyFile)) {
- props.load(inputStream);
- }
-
- String privateModulus = props.getProperty("Modulus");
- String privateExponent = props.getProperty("PrivateExponent");
-
- RSAPrivateKeySpec privateSpec = new RSAPrivateKeySpec(
- new BigInteger(1, Base64.decodeBase64(privateModulus)),
- new BigInteger(1, Base64.decodeBase64(privateExponent)));
-
- KeyFactory factory = KeyFactory.getInstance("RSA");
- privateKey = factory.generatePrivate(privateSpec);
-
- signSiteRecord(zone, dnskeyRecord);
- signSiteRecord(zone, soaRecord);
- signSiteRecord(zone, nsRecord);
- }
- // create required DS records
-
- // domain
-// DSRecord dsRecord = new DSRecord(zoneName, DClass.IN, ttl,
-// DSRecord.Digest.SHA1, dnskeyRecord);
-// zone.addRecord(dsRecord);
-// signSiteRecord(zone, dsRecord);
- }
- }
-
- /**
- * Sign a DNS record.
- *
- * @param zone the zone reference
- * @param record the record to sign.
- * @throws DNSSEC.DNSSECException
- */
- private void signSiteRecord(Zone zone, Record record)
- throws DNSSEC.DNSSECException {
- RRset rrset = zone.findExactMatch(record.getName(),
- record.getType());
- Calendar cal = Calendar.getInstance();
- Date inception = cal.getTime();
- cal.add(Calendar.YEAR, 1);
- Date expiration = cal.getTime();
- RRSIGRecord rrsigRecord =
- DNSSEC.sign(rrset, dnsKeyRecs.get(zone.getOrigin()),
- privateKey, inception, expiration);
- LOG.info("Adding {}", record);
- rrset.addRR(rrsigRecord);
- }
-
- /**
- * Sets the zone/domain name. The name will be read from the configuration
- * and the code will ensure the name is absolute.
- *
- * @param conf the configuration.
- * @throws IOException
- */
- void setDomainName(Configuration conf) throws IOException {
- domainName = conf.get(KEY_DNS_DOMAIN);
- if (domainName == null) {
- throw new IOException("No DNS domain name specified");
- }
- if (!domainName.endsWith(".")) {
- domainName += ".";
- }
- }
-
- /**
- * Stops the registry.
- *
- * @throws Exception if the service stop generates an issue.
- */
- @Override
- protected void serviceStop() throws Exception {
- stopExecutor();
- super.serviceStop();
- }
-
- /**
- * Shuts down the leveraged executor service.
- */
- protected synchronized void stopExecutor() {
- if (executor != null) {
- executor.shutdownNow();
- }
- }
-
- /**
- * Creates a DNS error response.
- *
- * @param in the byte array detailing the error.
- * @return the error message, in bytes
- */
- public byte[] formErrorMessage(byte[] in) {
- Header header;
- try {
- header = new Header(in);
- } catch (IOException e) {
- return null;
- }
- return buildErrorMessage(header, Rcode.FORMERR, null);
- }
-
- /**
- * Process a TCP request.
- *
- * @param ch the socket channel for the request.
- * @throws IOException if the tcp processing generates an issue.
- */
- public void nioTCPClient(SocketChannel ch) throws IOException {
- try {
- // query sizes are small, so the following two lines should work
- // in all instances
- ByteBuffer buf = ByteBuffer.allocate(1024);
- ch.read(buf);
- buf.flip();
- int messageLength = getMessgeLength(buf);
-
- byte[] in = new byte[messageLength];
-
- buf.get(in, 0, messageLength);
-
- Message query;
- byte[] response;
- try {
- query = new Message(in);
- LOG.info("received TCP query {}", query.getQuestion());
- response = generateReply(query, ch.socket());
- if (response == null) {
- return;
- }
- } catch (IOException e) {
- response = formErrorMessage(in);
- }
-
- ByteBuffer out = ByteBuffer.allocate(response.length + 2);
- out.clear();
- byte[] data = new byte[2];
-
- data[1] = (byte)(response.length & 0xFF);
- data[0] = (byte)((response.length >> 8) & 0xFF);
- out.put(data);
- out.put(response);
- out.flip();
-
- while(out.hasRemaining()) {
- ch.write(out);
- }
-
- } catch (IOException e) {
- throw NetUtils.wrapException(ch.socket().getInetAddress().getHostName(),
- ch.socket().getPort(),
- ch.socket().getLocalAddress().getHostName(),
- ch.socket().getLocalPort(), e);
- } catch (BufferUnderflowException e) {
- // Ignore system monitor ping packets
- } finally {
- IOUtils.closeStream(ch);
- }
-
- }
-
- /**
- * Calculate the inbound message length, which is related in the message as an
- * unsigned short value.
- *
- * @param buf the byte buffer containing the message.
- * @return the message length
- * @throws EOFException
- */
- private int getMessgeLength(ByteBuffer buf) throws EOFException {
- int ch1 = buf.get();
- int ch2 = buf.get();
- if ((ch1 | ch2) < 0) {
- throw new EOFException();
- }
- return (ch1 << 8) + (ch2 & 0xff);
- }
-
- /**
- * Monitor the TCP socket for inbound requests.
- *
- * @param serverSocketChannel the server socket channel
- * @param addr the local inet address
- * @param port the listener (local) port
- * @throws Exception if the tcp processing fails.
- */
- public void serveNIOTCP(ServerSocketChannel serverSocketChannel,
- InetAddress addr, int port) throws Exception {
- try {
-
- while (true) {
- final SocketChannel socketChannel = serverSocketChannel.accept();
- if (socketChannel != null) {
- executor.submit(new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
- nioTCPClient(socketChannel);
- return true;
- }
- });
-
- } else {
- Thread.sleep(500);
- }
- }
- } catch (IOException e) {
- throw NetUtils.wrapException(addr.getHostName(), port,
- addr.getHostName(), port, e);
- }
- }
-
- /**
- * Open the TCP listener.
- *
- * @param addr the host address.
- * @param port the host port.
- * @return the created server socket channel.
- * @throws IOException
- */
- private ServerSocketChannel openTCPChannel(InetAddress addr, int port)
- throws IOException {
- ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
- try {
- serverSocketChannel.socket().bind(new InetSocketAddress(addr, port));
- serverSocketChannel.configureBlocking(false);
- } catch (IOException e) {
- throw NetUtils.wrapException(null, 0,
- InetAddress.getLocalHost().getHostName(),
- port, e);
- }
- return serverSocketChannel;
- }
-
- /**
- * Create the thread (Callable) monitoring the TCP listener.
- *
- * @param addr host address.
- * @param port host port.
- * @throws Exception if the tcp listener generates an error.
- */
- public void addNIOTCP(final InetAddress addr, final int port)
- throws Exception {
- final ServerSocketChannel tcpChannel = openTCPChannel(addr, port);
- executor.submit(new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
- try {
- serveNIOTCP(tcpChannel, addr, port);
- } catch (Exception e) {
- LOG.error("Error initializing DNS TCP listener", e);
- throw e;
- }
-
- return true;
- }
-
- });
- }
-
- /**
- * Create the thread monitoring the socket for inbound UDP requests.
- *
- * @param addr host address.
- * @param port host port.
- * @throws Exception if the UDP listener creation generates an error.
- */
- public void addNIOUDP(final InetAddress addr, final int port)
- throws Exception {
- final DatagramChannel udpChannel = openUDPChannel(addr, port);
- executor.submit(new Callable<Boolean>() {
- @Override
- public Boolean call() throws Exception {
- try {
- serveNIOUDP(udpChannel, addr, port);
- } catch (Exception e) {
- LOG.error("Error initializing DNS UDP listener", e);
- throw e;
- }
- return true;
- }
- });
- }
-
- /**
- * Process an inbound UDP request.
- *
- * @param channel the UDP datagram channel.
- * @param addr local host address.
- * @param port local port.
- * @throws IOException if the UDP processing fails.
- */
- private synchronized void serveNIOUDP(DatagramChannel channel,
- InetAddress addr, int port) throws Exception {
- SocketAddress remoteAddress = null;
- try {
-
- ByteBuffer input = ByteBuffer.allocate(4096);
- ByteBuffer output = ByteBuffer.allocate(4096);
- byte[] in = null;
-
- while (true) {
- input.clear();
- try {
- remoteAddress = channel.receive(input);
- } catch (IOException e) {
- LOG.debug("Error during message receipt", e);
- continue;
- }
- Message query;
- byte[] response = null;
- try {
- int position = input.position();
- in = new byte[position];
- input.flip();
- input.get(in);
- query = new Message(in);
- LOG.info("{}: received UDP query {}", remoteAddress,
- query.getQuestion());
- response = generateReply(query, null);
- if (response == null) {
- continue;
- }
- } catch (IOException e) {
- response = formErrorMessage(in);
- }
- output.clear();
- output.put(response);
- output.flip();
-
- LOG.debug("{}: sending response", remoteAddress);
- channel.send(output, remoteAddress);
- }
- } catch (Exception e) {
- if (e instanceof IOException && remoteAddress != null) {
- throw NetUtils.wrapException(addr.getHostName(),
- port,
- ((InetSocketAddress) remoteAddress).getHostName(),
- ((InetSocketAddress) remoteAddress).getPort(),
- (IOException) e);
- } else {
- throw e;
- }
- }
- }
-
- /**
- * Create and UDP listener socket.
- *
- * @param addr host address.
- * @param port host port.
- * @return
- * @throws IOException if listener creation fails.
- */
- private DatagramChannel openUDPChannel(InetAddress addr, int port)
- throws IOException {
- DatagramChannel channel = DatagramChannel.open();
- try {
- channel.socket().bind(new InetSocketAddress(addr, port));
- } catch (IOException e) {
- throw NetUtils.wrapException(null, 0,
- InetAddress.getLocalHost().getHostName(),
- port, e);
- }
- return channel;
- }
-
- /**
- * Create an error message.
- *
- * @param header the response header.
- * @param rcode the response code.
- * @param question the question record.
- * @return the error message.
- */
- byte[] buildErrorMessage(Header header, int rcode, Record question) {
- Message response = new Message();
- response.setHeader(header);
- for (int i = 0; i < 4; i++) {
- response.removeAllRecords(i);
- }
- response.addRecord(question, Section.QUESTION);
- header.setRcode(rcode);
- return response.toWire();
- }
-
- /**
- * Generate an error message based on inbound query.
- *
- * @param query the query.
- * @param rcode the response code for the specific error.
- * @return the error message.
- */
- public byte[] errorMessage(Message query, int rcode) {
- return buildErrorMessage(query.getHeader(), rcode,
- query.getQuestion());
- }
-
- /**
- * Generate the response for the inbound DNS query.
- *
- * @param query the query.
- * @param s the socket associated with the query.
- * @return the response, in bytes.
- * @throws IOException if reply generation fails.
- */
- byte[] generateReply(Message query, Socket s)
- throws IOException {
- Header header;
- boolean badversion;
- int maxLength;
- int flags = 0;
-
- OPTRecord queryOPT = query.getOPT();
- maxLength = getMaxLength(s, queryOPT);
-
- header = query.getHeader();
- if (header.getFlag(Flags.QR)) {
- LOG.debug("returning null");
- return null;
- }
- if (header.getRcode() != Rcode.NOERROR) {
- return errorMessage(query, Rcode.FORMERR);
- }
- if (header.getOpcode() != Opcode.QUERY) {
- return errorMessage(query, Rcode.NOTIMP);
- }
-
- Record queryRecord = query.getQuestion();
-
- if (queryOPT != null && (queryOPT.getFlags() & ExtendedFlags.DO) != 0) {
- flags = FLAG_DNSSECOK;
- }
-
- Message response = new Message(query.getHeader().getID());
- response.getHeader().setFlag(Flags.QR);
- if (query.getHeader().getFlag(Flags.RD)) {
- response.getHeader().setFlag(Flags.RD);
- response.getHeader().setFlag(Flags.RA);
- }
- response.addRecord(queryRecord, Section.QUESTION);
-
- Name name = queryRecord.getName();
- int type = queryRecord.getType();
- int dclass = queryRecord.getDClass();
-
- TSIGRecord queryTSIG = query.getTSIG();
- if (type == Type.AXFR && s != null) {
- return doAXFR(name, query, null, queryTSIG, s);
- }
- if (!Type.isRR(type) && type != Type.ANY) {
- return errorMessage(query, Rcode.NOTIMP);
- }
-
- LOG.debug("calling addAnswer");
- byte rcode = addAnswer(response, name, type, dclass, 0, flags);
- if (rcode != Rcode.NOERROR) {
- rcode = remoteLookup(response, name, type, 0);
- response.getHeader().setRcode(rcode);
- }
- addAdditional(response, flags);
-
- if (queryOPT != null) {
- int optflags = (flags == FLAG_DNSSECOK) ? ExtendedFlags.DO : 0;
- OPTRecord opt = new OPTRecord((short) 4096, rcode >>> 16, (byte) 0,
- optflags);
- response.addRecord(opt, Section.ADDITIONAL);
- }
-
- return response.toWire(maxLength);
- }
-
- /**
- * Lookup record from upstream DNS servers.
- */
- private byte remoteLookup(Message response, Name name, int type,
- int iterations) {
- // If retrieving the root zone, query for NS record type
- if (name.toString().equals(".")) {
- type = Type.NS;
- }
-
- // Always add any CNAMEs to the response first
- if (type != Type.CNAME) {
- Record[] cnameAnswers = getRecords(name, Type.CNAME);
- if (cnameAnswers != null) {
- for (Record cnameR : cnameAnswers) {
- if (!response.findRecord(cnameR)) {
- response.addRecord(cnameR, Section.ANSWER);
- }
- }
- }
- }
-
- // Forward lookup to primary DNS servers
- Record[] answers = getRecords(name, type);
- try {
- for (Record r : answers) {
- if (!response.findRecord(r)) {
- if (r.getType() == Type.SOA) {
- response.addRecord(r, Section.AUTHORITY);
- } else {
- response.addRecord(r, Section.ANSWER);
- }
- }
- if (r.getType() == Type.CNAME) {
- Name cname = ((CNAMERecord) r).getAlias();
- if (iterations < 6) {
- remoteLookup(response, cname, type, iterations + 1);
- }
- }
- }
- } catch (NullPointerException e) {
- return Rcode.NXDOMAIN;
- } catch (Throwable e) {
- return Rcode.SERVFAIL;
- }
- return Rcode.NOERROR;
- }
-
- /**
- * Requests records for the given resource name.
- *
- * @param name - query string
- * @param type - type of DNS record to lookup
- * @return DNS records
- */
- protected Record[] getRecords(Name name, int type) {
- Record[] result = null;
- ExecutorService executor = Executors.newSingleThreadExecutor();
- Future<Record[]> future = executor.submit(new LookupTask(name, type));
- try {
- result = future.get(1500, TimeUnit.MILLISECONDS);
- return result;
- } catch (InterruptedException | ExecutionException |
- TimeoutException | NullPointerException |
- ExceptionInInitializerError e) {
- LOG.warn("Failed to lookup: {} type: {}", name, Type.string(type), e);
- return result;
- } finally {
- executor.shutdown();
- }
- }
-
- /**
- * Create a query to forward to the primary DNS server (if configured).
- * NOTE: Experimental
- *
- * @param query the inbound query.
- * @return the query to forward to the primary server.
- * @throws NameTooLongException
- * @throws TextParseException if query creation fails.
- */
- private Message createPrimaryQuery(Message query)
- throws NameTooLongException, TextParseException {
- Name name = query.getQuestion().getName();
- if (name.labels() > 0 && name.labels() <= 2) {
- // short relative or absolute name. this code may not be necessary -
- // OS resolution utilities probably append the search paths defined
- // in resolv.conf prior to the lookup
- int id = query.getHeader().getID();
- String queryName = name.getLabelString(0);
- Name qualifiedName = Name.concatenate(Name.fromString(queryName),
- Name.fromString(domainName));
- LOG.info("Received query {}. Forwarding query {}", name, qualifiedName);
- Record question = Record.newRecord(qualifiedName,
- query.getQuestion().getType(),
- query.getQuestion().getDClass());
- query = Message.newQuery(question);
- query.getHeader().setID(id);
- }
- return query;
- }
-
- /**
- * Calculate the max length for a response.
- *
- * @param s the request socket.
- * @param queryOPT describes Extended DNS (EDNS) properties of a Message.
- * @return the length of the response.
- */
- private int getMaxLength(Socket s, OPTRecord queryOPT) {
- int maxLength;
- if (s != null) {
- maxLength = 65535;
- } else if (queryOPT != null) {
- maxLength = Math.max(queryOPT.getPayloadSize(), 512);
- } else {
- maxLength = 512;
- }
- return maxLength;
- }
-
- /**
- * Add additional information to a DNS response section if a glue name is
- * specified.
- *
- * @param response the response message.
- * @param section the section of the response (e.g. ANSWER, AUTHORITY)
- * @param flags the flags.
- */
- private void addAdditional2(Message response, int section, int flags) {
- Record[] records = response.getSectionArray(section);
- for (int i = 0; i < records.length; i++) {
- Record r = records[i];
- Name glueName = r.getAdditionalName();
- if (glueName != null) {
- addGlue(response, glueName, flags);
- }
- }
- }
-
- /**
- * Process any additional records indicated for both the ANSWER and AUTHORITY
- * sections of the response.
- *
- * @param response the response message.
- * @param flags the flags.
- */
- private void addAdditional(Message response, int flags) {
- addAdditional2(response, Section.ANSWER, flags);
- addAdditional2(response, Section.AUTHORITY, flags);
- }
-
- /**
- * Add the specific record indicated by the "glue", or the mapping to a
- * specific host.
- *
- * @param response the response message.
- * @param name the name of the glue record.
- * @param flags the flags.
- */
- private void addGlue(Message response, Name name, int flags) {
- RRset a = findExactMatch(name, Type.A);
- if (a == null) {
- return;
- }
- addRRset(name, response, a, Section.ADDITIONAL, flags);
- }
-
- /**
- * Find the record set that matches the requested name and type.
- *
- * @param name the requested name.
- * @param type the record type.
- * @return the set of records with the given name and type.
- */
- public RRset findExactMatch(Name name, int type) {
- try (CloseableLock lock = readLock.lock()) {
- Zone zone = findBestZone(name);
- if (zone != null) {
- return zone.findExactMatch(name, type);
- }
- }
-
- return null;
- }
-
- /**
- * Find the zone that correlates to the provided name.
- *
- * @param name the name to be matched to a zone.
- * @return the zone.
- */
- @Override public Zone findBestZone(Name name) {
- Zone foundzone = null;
- foundzone = zones.get(name);
- if (foundzone != null) {
- return foundzone;
- }
- int labels = name.labels();
- for (int i = 1; i < labels; i++) {
- Name tname = new Name(name, i);
- foundzone = zones.get(tname);
- if (foundzone != null) {
- return foundzone;
- }
- }
- return null;
- }
-
- /**
- * Add the answer section to the response.
- *
- * @param response the response message.
- * @param name the name of the answer record.
- * @param type the type of record.
- * @param dclass the DNS class.
- * @param iterations iteration count.
- * @param flags
- * @return the response code.
- */
- byte addAnswer(Message response, Name name, int type, int dclass,
- int iterations, int flags) {
- SetResponse sr = null;
- byte rcode = Rcode.NOERROR;
-
- if (iterations > 6) {
- return Rcode.NOERROR;
- }
-
- if (type == Type.SIG || type == Type.RRSIG) {
- type = Type.ANY;
- flags |= FLAG_SIGONLY;
- }
-
- Zone zone = findBestZone(name);
-
- LOG.debug("finding record");
- try (CloseableLock lock = readLock.lock()) {
- if (zone != null) {
- sr = zone.findRecords(name, type);
- } else {
- rcode = Rcode.NOTAUTH;
- }
- }
- LOG.info("found local record? {}", sr != null && sr.isSuccessful());
-
- if (sr != null) {
- if (sr.isCNAME()) {
- CNAMERecord cname = sr.getCNAME();
- RRset rrset = zone.findExactMatch(cname.getName(), Type.CNAME);
- addRRset(name, response, rrset, Section.ANSWER, flags);
- if (iterations == 0) {
- response.getHeader().setFlag(Flags.AA);
- }
- rcode = addAnswer(response, cname.getTarget(),
- type, dclass, iterations + 1, flags);
- }
- if (sr.isNXDOMAIN()) {
- response.getHeader().setRcode(Rcode.NXDOMAIN);
- if (isDNSSECEnabled()) {
- try {
- addNXT(response, flags);
- } catch (Exception e) {
- LOG.warn("Unable to add NXTRecord to AUTHORITY Section", e);
- }
- }
- addSOA(response, zone, flags);
- if (iterations == 0) {
- response.getHeader().setFlag(Flags.AA);
- }
- rcode = Rcode.NXDOMAIN;
- } else if (sr.isNXRRSET()) {
- LOG.info("No data found the given name {} and type {}", name, type);
- addSOA(response, zone, flags);
- if (iterations == 0) {
- response.getHeader().setFlag(Flags.AA);
- }
- } else if (sr.isSuccessful()) {
- RRset[] rrsets = sr.answers();
- LOG.info("found answers {}", rrsets);
- for (int i = 0; i < rrsets.length; i++) {
- addRRset(name, response, rrsets[i],
- Section.ANSWER, flags);
- }
- addNS(response, zone, flags);
- if (iterations == 0) {
- response.getHeader().setFlag(Flags.AA);
- }
- }
- } else {
- if (zone != null) {
- Name defaultDomain = null;
- try {
- defaultDomain = Name.fromString(domainName);
- zone = zones.get(defaultDomain);
- addNS(response, zone, flags);
- if (iterations == 0) {
- response.getHeader().setFlag(Flags.AA);
- }
- } catch (TextParseException e) {
- LOG.warn("Unable to obtain default zone for unknown name response",
- e);
- }
- }
- }
-
- return rcode;
- }
-
- /**
- * Add the SOA record (describes the properties of the zone) to the authority
- * section of the response.
- *
- * @param response the response message.
- * @param zone the DNS zone.
- */
- private void addSOA(Message response, Zone zone, int flags) {
- RRset soa = zone.findExactMatch(zone.getOrigin(), Type.SOA);
- addRRset(soa.getName(), response, soa,
- Section.AUTHORITY, flags);
- }
-
- /**
- * Add the NXT record to the authority
- * section of the response.
- *
- * @param response the response message.
- */
- private void addNXT(Message response, int flags)
- throws DNSSEC.DNSSECException, IOException {
- Record nxtRecord = getNXTRecord(
- response.getSectionArray(Section.QUESTION)[0]);
- Zone zone = findBestZone(nxtRecord.getName());
- addRecordCommand.exec(zone, nxtRecord);
- RRset nxtRR = zone.findExactMatch(nxtRecord.getName(), Type.NXT);
- addRRset(nxtRecord.getName(), response, nxtRR, Section.AUTHORITY, flags);
-
- removeRecordCommand.exec(zone, nxtRecord);
- }
-
- /**
- * Return an NXT record required to validate negative responses. If there is
- * an issue returning the NXT record, a SOA record will be returned.
- *
- * @param query the query record.
- * @return an NXT record.
- */
- private Record getNXTRecord(Record query) {
- Record response = null;
- SecureableZone zone = (SecureableZone) findBestZone(query.getName());
- if (zone != null) {
- response = zone.getNXTRecord(query, zone);
- if (response == null) {
- response = zone.getSOA();
- }
- }
-
- return response;
- }
-
- /**
- * Add the name server info to the authority section.
- *
- * @param response the response message.
- * @param zone the DNS zone.
- * @param flags the flags.
- */
- private void addNS(Message response, Zone zone, int flags) {
- RRset nsRecords = zone.getNS();
- addRRset(nsRecords.getName(), response, nsRecords,
- Section.AUTHORITY, flags);
- }
-
- /**
- * Add the provided record set to the response section specified.
- *
- * @param name the name associated with the record set.
- * @param response the response message.
- * @param rrset the record set.
- * @param section the response section to which the record set will be added.
- * @param flags the flags.
- */
- private void addRRset(Name name, Message response, RRset rrset, int section,
- int flags) {
- for (int s = 1; s <= section; s++) {
- if (response.findRRset(name, rrset.getType(), s)) {
- return;
- }
- }
- if ((flags & FLAG_SIGONLY) == 0) {
- Iterator it = rrset.rrs();
- while (it.hasNext()) {
- Record r = (Record) it.next();
- if (r.getName().isWild() && !name.isWild()) {
- r = r.withName(name);
- }
- response.addRecord(r, section);
- }
- }
- if ((flags & (FLAG_SIGONLY | FLAG_DNSSECOK)) != 0) {
- Iterator it = rrset.sigs();
- while (it.hasNext()) {
- Record r = (Record) it.next();
- if (r.getName().isWild() && !name.isWild()) {
- r = r.withName(name);
- }
- response.addRecord(r, section);
- }
- }
- }
-
- /**
- * Perform a zone transfer.
- *
- * @param name the zone name.
- * @param query the query.
- * @param tsig the query signature.
- * @param qtsig the signature record.
- * @param s the connection socket.
- * @return an error message if there is no matching zone
- * or null due to error.
- */
- byte[] doAXFR(Name name, Message query, TSIG tsig, TSIGRecord qtsig,
- Socket s) {
- boolean first = true;
- Zone zone = findBestZone(name);
- if (zone == null) {
- return errorMessage(query, Rcode.REFUSED);
- }
- Iterator it = zone.AXFR();
- try {
- DataOutputStream dataOut;
- dataOut = new DataOutputStream(s.getOutputStream());
- int id = query.getHeader().getID();
- while (it.hasNext()) {
- RRset rrset = (RRset) it.next();
- Message response = new Message(id);
- Header header = response.getHeader();
- header.setFlag(Flags.QR);
- header.setFlag(Flags.AA);
- addRRset(rrset.getName(), response, rrset,
- Section.ANSWER, FLAG_DNSSECOK);
- if (tsig != null) {
- tsig.applyStream(response, qtsig, first);
- qtsig = response.getTSIG();
- }
- first = false;
- byte[] out = response.toWire();
- dataOut.writeShort(out.length);
- dataOut.write(out);
- }
- } catch (IOException ex) {
- System.out.println("AXFR failed");
- }
- try {
- s.close();
- } catch (IOException ex) {
- }
- return null;
- }
-
- /**
- * Perform the registry operation (register or delete). This method will take
- * the provided service record and either add or remove the DNS records
- * indicated.
- *
- * @param path the ZK path for the service record.
- * @param record the service record.
- * @param command the registry command (REGISTER or DELETE).
- * @throws IOException if the is an error performing registry operation.
- */
- private void op(String path, ServiceRecord record, RegistryCommand command)
- throws IOException {
- ServiceRecordProcessor processor;
- try {
- String yarnPersistanceValue = record.get(
- YarnRegistryAttributes.YARN_PERSISTENCE);
- if (yarnPersistanceValue != null) {
- if (yarnPersistanceValue.equals(CONTAINER)) {
- // container registration. the logic to identify and create the
- // container entry needs to be enhanced/more accurate and associate
- // to correct host
- processor =
- new ContainerServiceRecordProcessor(record, path, domainName,
- this);
- } else {
- LOG.debug("Creating ApplicationServiceRecordProcessor for {}",
- yarnPersistanceValue);
- processor =
- new ApplicationServiceRecordProcessor(record, path, domainName,
- this);
- }
- processor.manageDNSRecords(command);
- } else {
- LOG.warn("Yarn Registry record {} does not contain {} attribute ",
- record.toString(), YarnRegistryAttributes.YARN_PERSISTENCE);
- }
- } catch (Exception e) {
- throw new IOException(e);
- }
-
- }
-
- /**
- * Return the username found in the ZK path.
- *
- * @param path the ZK path.
- * @return the user name.
- */
- private String getUsername(String path) {
- String user = "anonymous";
- Matcher matcher = USER_NAME.matcher(path);
- if (matcher.find()) {
- user = matcher.group(1);
- }
- return user;
- }
-
- /**
- * Register DNS records based on the provided service record.
- *
- * @param path the ZK path of the service record.
- * @param record record providing DNS registration info.
- * @throws IOException if registration causes an error.
- */
- @Override
- public void register(String path, ServiceRecord record) throws IOException {
- op(path, record, addRecordCommand);
- }
-
- /**
- * Delete the DNS records generated by the provided service record.
- *
- * @param path the ZK path for the given record.
- * @param record the service record
- * @throws IOException if deletion causes and error.
- */
- @Override
- public void delete(String path, ServiceRecord record) throws IOException {
- op(path, record, removeRecordCommand);
- }
-
- /**
- * An interface representing a registry associated function/command (see
- * command pattern).
- */
- interface RegistryCommand {
- void exec(Zone zone, Record record) throws IOException;
-
- String getLogDescription();
- }
-
- /**
- * The "add record" command.
- */
- private final RegistryCommand addRecordCommand = new RegistryCommand() {
- @Override
- public void exec(Zone zone, Record record) throws IOException {
- if (zone != null) {
- try (CloseableLock lock = writeLock.lock()) {
- zone.addRecord(record);
- LOG.info("Registered {}", record);
- if (isDNSSECEnabled()) {
- Calendar cal = Calendar.getInstance();
- Date inception = cal.getTime();
- cal.add(Calendar.YEAR, 1);
- Date expiration = cal.getTime();
- RRset rRset =
- zone.findExactMatch(record.getName(), record.getType());
- try {
- DNSKEYRecord dnskeyRecord = dnsKeyRecs.get(zone.getOrigin());
- RRSIGRecord rrsigRecord =
- DNSSEC.sign(rRset, dnskeyRecord, privateKey,
- inception, expiration);
- LOG.info("Adding {}", rrsigRecord);
- rRset.addRR(rrsigRecord);
-
- //addDSRecord(zone, record.getName(), record.getDClass(),
- // record.getTTL(), inception, expiration);
-
- } catch (DNSSEC.DNSSECException e) {
- throw new IOException(e);
- }
- }
- }
- } else {
- LOG.warn("Unable to find zone matching record {}", record);
- }
- }
-
- /**
- * Add a DS record associated with the input name.
- * @param zone the zone.
- * @param name the record name.
- * @param dClass the DNS class.
- * @param dsTtl the ttl value.
- * @param inception the time of inception of the record.
- * @param expiration the expiry time of the record.
- * @throws DNSSEC.DNSSECException if the addition of DS record fails.
- */
- private void addDSRecord(Zone zone,
- Name name, int dClass, long dsTtl,
- Date inception,
- Date expiration) throws DNSSEC.DNSSECException {
- RRset rRset;
- RRSIGRecord rrsigRecord;
-
- DNSKEYRecord dnskeyRecord = dnsKeyRecs.get(zone.getOrigin());
- DSRecord dsRecord = new DSRecord(name, dClass,
- dsTtl, DSRecord.Digest.SHA1,
- dnskeyRecord);
- zone.addRecord(dsRecord);
- LOG.info("Adding {}", dsRecord);
- rRset = zone.findExactMatch(dsRecord.getName(), dsRecord.getType());
-
- rrsigRecord = DNSSEC.sign(rRset, dnskeyRecord, privateKey,
- inception, expiration);
- rRset.addRR(rrsigRecord);
- }
-
- @Override
- public String getLogDescription() {
- return "Registering ";
- }
- };
-
- /**
- * The "remove record" command.
- */
- private final RegistryCommand removeRecordCommand = new RegistryCommand() {
- @Override
- public void exec(Zone zone, Record record) throws IOException {
- if (zone == null) {
- LOG.error("Unable to remove record because zone is null: {}", record);
- return;
- }
- zone.removeRecord(record);
- LOG.info("Removed {}", record);
- if (isDNSSECEnabled()) {
- RRset rRset = zone.findExactMatch(record.getName(), Type.DS);
- if (rRset != null) {
- zone.removeRecord(rRset.first());
- }
- }
- }
-
- @Override
- public String getLogDescription() {
- return "Deleting ";
- }
- };
-
- /**
- * An implementation allowing for obtaining and releasing a lock.
- */
- public static class CloseableLock implements AutoCloseable {
- private Lock lock;
-
- public CloseableLock(Lock lock) {
- this.lock = lock;
- }
-
- public CloseableLock lock() {
- lock.lock();
- return this;
- }
-
- @Override
- public void close() {
- lock.unlock();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e2a9fa84/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNSServer.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNSServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNSServer.java
deleted file mode 100644
index c7f6831..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/RegistryDNSServer.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.registry.server.dns;
-
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.PathNotFoundException;
-import org.apache.hadoop.registry.client.api.DNSOperationsFactory;
-import org.apache.hadoop.registry.client.api.RegistryConstants;
-import org.apache.hadoop.registry.client.binding.RegistryPathUtils;
-import org.apache.hadoop.registry.client.binding.RegistryUtils;
-import org.apache.hadoop.registry.client.impl.zk.PathListener;
-import org.apache.hadoop.registry.client.impl.zk.RegistryOperationsService;
-import org.apache.hadoop.registry.client.types.RegistryPathStatus;
-import org.apache.hadoop.registry.client.types.ServiceRecord;
-import org.apache.hadoop.service.CompositeService;
-import org.apache.hadoop.util.ExitUtil;
-import org.apache.hadoop.util.GenericOptionsParser;
-import org.apache.hadoop.util.ShutdownHookManager;
-import org.apache.hadoop.util.StringUtils;
-import org.apache.hadoop.yarn.YarnUncaughtExceptionHandler;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * A server/service that starts and manages the lifecycle of a DNS registry
- * instance.
- */
-public class RegistryDNSServer extends CompositeService {
-
-
- public static final int SHUTDOWN_HOOK_PRIORITY = 30;
- private RegistryDNS registryDNS;
- private RegistryOperationsService registryOperations;
- private static final Logger LOG =
- LoggerFactory.getLogger(RegistryDNS.class);
- private ConcurrentMap<String, ServiceRecord> pathToRecordMap;
-
- /**
- * Creates the DNS server.
- * @param name the server name.
- * @param registryDNS the registry DNS instance.
- */
- public RegistryDNSServer(String name, final RegistryDNS registryDNS) {
- super(name);
- this.registryDNS = registryDNS;
- }
-
- /**
- * Initializes the DNS server.
- * @param conf the hadoop configuration instance.
- * @throws Exception if service initialization fails.
- */
- @Override
- protected void serviceInit(Configuration conf) throws Exception {
-
- pathToRecordMap = new ConcurrentHashMap<>();
-
- registryOperations = new RegistryOperationsService("RegistryDNSOperations");
- addService(registryOperations);
-
- if (registryDNS == null) {
- registryDNS = (RegistryDNS) DNSOperationsFactory.createInstance(conf);
- }
- addService(registryDNS);
-
- super.serviceInit(conf);
- }
-
- /**
- * Starts the server.
- * @throws Exception if service start fails.
- */
- @Override
- protected void serviceStart() throws Exception {
- super.serviceStart();
- manageRegistryDNS();
- }
-
- /**
- * Performs operations required to setup the DNS registry instance (e.g. sets
- * up a path listener to react to service record creation/deletion and invoke
- * the appropriate registry method).
- */
- private void manageRegistryDNS() {
-
- try {
- registryOperations.monitorRegistryEntries();
- registryOperations.registerPathListener(new PathListener() {
- private String registryRoot = getConfig().
- get(RegistryConstants.KEY_REGISTRY_ZK_ROOT,
- RegistryConstants.DEFAULT_ZK_REGISTRY_ROOT);
-
- @Override
- public void nodeAdded(String path) throws IOException {
- // get a listing of service records
- String relativePath = getPathRelativeToRegistryRoot(path);
- String child = RegistryPathUtils.lastPathEntry(path);
- Map<String, RegistryPathStatus> map = new HashMap<>();
- map.put(child, registryOperations.stat(relativePath));
- Map<String, ServiceRecord> records =
- RegistryUtils.extractServiceRecords(registryOperations,
- getAdjustedParentPath(path),
- map);
- processServiceRecords(records, register);
- pathToRecordMap.putAll(records);
- }
-
- private String getAdjustedParentPath(String path) {
- Preconditions.checkNotNull(path);
- String adjustedPath = null;
- adjustedPath = getPathRelativeToRegistryRoot(path);
- try {
- return RegistryPathUtils.parentOf(adjustedPath);
- } catch (PathNotFoundException e) {
- // attempt to use passed in path
- return path;
- }
- }
-
- private String getPathRelativeToRegistryRoot(String path) {
- String adjustedPath;
- if (path.equals(registryRoot)) {
- adjustedPath = "/";
- } else {
- adjustedPath = path.substring(registryRoot.length());
- }
- return adjustedPath;
- }
-
- @Override
- public void nodeRemoved(String path) throws IOException {
- ServiceRecord record = pathToRecordMap.remove(path.substring(
- registryRoot.length()));
- processServiceRecord(path, record, delete);
- }
-
- });
-
- // create listener for record deletions
-
- } catch (Exception e) {
- LOG.warn("Unable to monitor the registry. DNS support disabled.", e);
- }
- }
-
- /**
- * A registry management command interface.
- */
- interface ManagementCommand {
- void exec(String path, ServiceRecord record) throws IOException;
- }
-
- /**
- * Performs registry service record registration.
- */
- private final ManagementCommand register = new ManagementCommand() {
- @Override
- public void exec(String path, ServiceRecord record) throws IOException {
- if (record != null) {
- LOG.info("Registering DNS records for {}", path);
- registryDNS.register(path, record);
- }
- }
- };
-
- /**
- * Performs registry service record deletion.
- */
- private ManagementCommand delete = new ManagementCommand() {
- @Override
- public void exec(String path, ServiceRecord record) throws IOException {
- if (record != null) {
- LOG.info("Deleting DNS records for {}", path);
- registryDNS.delete(path, record);
- }
- }
- };
-
- /**
- * iterates thru the supplied service records, executing the provided registry
- * command.
- * @param records the service records.
- * @param command the registry command.
- * @throws IOException
- */
- private void processServiceRecords(Map<String, ServiceRecord> records,
- ManagementCommand command)
- throws IOException {
- for (Map.Entry<String, ServiceRecord> entry : records.entrySet()) {
- processServiceRecord(entry.getKey(), entry.getValue(), command);
- }
- }
-
- /**
- * Process the service record, parsing the information and creating the
- * required DNS records.
- * @param path the service record path.
- * @param record the record.
- * @param command the registry command to execute.
- * @throws IOException
- */
- private void processServiceRecord(String path, ServiceRecord record,
- ManagementCommand command)
- throws IOException {
- command.exec(path, record);
- }
-
- /**
- * Launch the server.
- * @param conf configuration
- * @param rdns registry dns instance
- * @return
- */
- static RegistryDNSServer launchDNSServer(Configuration conf,
- RegistryDNS rdns) {
- RegistryDNSServer dnsServer = null;
-
- Thread
- .setDefaultUncaughtExceptionHandler(new YarnUncaughtExceptionHandler());
- try {
- dnsServer = new RegistryDNSServer("RegistryDNSServer", rdns);
- ShutdownHookManager.get().addShutdownHook(
- new CompositeService.CompositeServiceShutdownHook(dnsServer),
- SHUTDOWN_HOOK_PRIORITY);
- dnsServer.init(conf);
- dnsServer.start();
- } catch (Throwable t) {
- LOG.error("Error starting Registry DNS Server", t);
- ExitUtil.terminate(-1, "Error starting Registry DNS Server");
- }
- return dnsServer;
- }
-
- /**
- * Lanches the server instance.
- * @param args the command line args.
- * @throws IOException if command line options can't be parsed
- */
- public static void main(String[] args) throws IOException {
- StringUtils.startupShutdownMessage(RegistryDNSServer.class, args, LOG);
- YarnConfiguration conf = new YarnConfiguration();
- new GenericOptionsParser(conf, args);
- launchDNSServer(conf, null);
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e2a9fa84/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ReverseZoneUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ReverseZoneUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ReverseZoneUtils.java
deleted file mode 100644
index a62bef7..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ReverseZoneUtils.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.registry.server.dns;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.net.util.SubnetUtils;
-import org.apache.hadoop.conf.Configuration;
-import static org.apache.hadoop.registry.client.api.RegistryConstants.KEY_DNS_SPLIT_REVERSE_ZONE_RANGE;
-import static org.apache.hadoop.registry.client.api.RegistryConstants.KEY_DNS_ZONE_MASK;
-import static org.apache.hadoop.registry.client.api.RegistryConstants.KEY_DNS_ZONE_SUBNET;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Utilities for configuring reverse zones.
- */
-public final class ReverseZoneUtils {
-
- private static final Logger LOG =
- LoggerFactory.getLogger(ReverseZoneUtils.class);
-
- private static final long POW3 = (long) Math.pow(256, 3);
- private static final long POW2 = (long) Math.pow(256, 2);
- private static final long POW1 = (long) Math.pow(256, 1);
-
- private ReverseZoneUtils() {
- }
-
- /**
- * Given a baseIp, range and index, return the network address for the
- * reverse zone.
- *
- * @param baseIp base ip address to perform calculations against.
- * @param range number of ip addresses per subnet.
- * @param index the index of the subnet to calculate.
- * @return the calculated ip address.
- * @throws UnknownHostException if an invalid ip is provided.
- */
- protected static String getReverseZoneNetworkAddress(String baseIp, int range,
- int index) throws UnknownHostException {
- if (index < 0) {
- throw new IllegalArgumentException(
- String.format("Invalid index provided, must be positive: %d", index));
- }
- if (range < 0) {
- throw new IllegalArgumentException(
- String.format("Invalid range provided, cannot be negative: %d",
- range));
- }
- return calculateIp(baseIp, range, index);
- }
-
- /**
- * When splitting the reverse zone, return the number of subnets needed,
- * given the range and netmask.
- *
- * @param conf the Hadoop configuration.
- * @return The number of subnets given the range and netmask.
- */
- protected static int getSubnetCountForReverseZones(Configuration conf) {
- String subnet = conf.get(KEY_DNS_ZONE_SUBNET);
- String mask = conf.get(KEY_DNS_ZONE_MASK);
- String range = conf.get(KEY_DNS_SPLIT_REVERSE_ZONE_RANGE);
-
- int parsedRange;
- try {
- parsedRange = Integer.parseInt(range);
- } catch (NumberFormatException e) {
- LOG.error("The supplied range is not a valid integer: Supplied range: ",
- range);
- throw e;
- }
- if (parsedRange < 0) {
- String msg = String
- .format("Range cannot be negative: Supplied range: %d", parsedRange);
- LOG.error(msg);
- throw new IllegalArgumentException(msg);
- }
-
- int ipCount;
- try {
- SubnetUtils subnetUtils = new SubnetUtils(subnet, mask);
- subnetUtils.setInclusiveHostCount(true);
- ipCount = subnetUtils.getInfo().getAddressCount();
-
- } catch (IllegalArgumentException e) {
- LOG.error("The subnet or mask is invalid: Subnet: {} Mask: {}", subnet,
- mask);
- throw e;
- }
-
- if (parsedRange == 0) {
- return ipCount;
- }
- return ipCount / parsedRange;
- }
-
- private static String calculateIp(String baseIp, int range, int index)
- throws UnknownHostException {
- long[] ipParts = splitIp(baseIp);
-
- long ipNum1 = POW3 * ipParts[0];
- long ipNum2 = POW2 * ipParts[1];
- long ipNum3 = POW1 * ipParts[2];
- long ipNum4 = ipParts[3];
- long ipNum = ipNum1 + ipNum2 + ipNum3 + ipNum4;
-
- ArrayList<Long> ipPartsOut = new ArrayList<>();
- // First octet
- long temp = ipNum + range * (long) index;
- ipPartsOut.add(0, temp / POW3);
-
- // Second octet
- temp = temp - ipPartsOut.get(0) * POW3;
- ipPartsOut.add(1, temp / POW2);
-
- // Third octet
- temp = temp - ipPartsOut.get(1) * POW2;
- ipPartsOut.add(2, temp / POW1);
-
- // Fourth octet
- temp = temp - ipPartsOut.get(2) * POW1;
- ipPartsOut.add(3, temp);
-
- return StringUtils.join(ipPartsOut, '.');
- }
-
- @VisibleForTesting
- protected static long[] splitIp(String baseIp) throws UnknownHostException {
- InetAddress inetAddress;
- try {
- inetAddress = InetAddress.getByName(baseIp);
- } catch (UnknownHostException e) {
- LOG.error("Base IP address is invalid");
- throw e;
- }
- if (inetAddress instanceof Inet6Address) {
- throw new IllegalArgumentException(
- "IPv6 is not yet supported for " + "reverse zones");
- }
- byte[] octets = inetAddress.getAddress();
- if (octets.length != 4) {
- throw new IllegalArgumentException("Base IP address is invalid");
- }
- long[] results = new long[4];
- for (int i = 0; i < octets.length; i++) {
- results[i] = octets[i] & 0xff;
- }
- return results;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e2a9fa84/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/SecureableZone.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/SecureableZone.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/SecureableZone.java
deleted file mode 100644
index 4b0a852..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/SecureableZone.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.registry.server.dns;
-
-import org.xbill.DNS.DClass;
-import org.xbill.DNS.NXTRecord;
-import org.xbill.DNS.Name;
-import org.xbill.DNS.RRset;
-import org.xbill.DNS.Record;
-import org.xbill.DNS.SetResponse;
-import org.xbill.DNS.Type;
-import org.xbill.DNS.Zone;
-import org.xbill.DNS.ZoneTransferException;
-import org.xbill.DNS.ZoneTransferIn;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * A zone implementation geared to support some DNSSEC functionality.
- */
-public class SecureableZone extends Zone {
- private List<Record> records;
-
- /**
- * Creates a Zone by doing the specified zone transfer.
- * @param xfrin The incoming zone transfer to execute.
- * @throws IOException if there is an error.
- * @throws ZoneTransferException if there is an error.
- */
- public SecureableZone(ZoneTransferIn xfrin)
- throws IOException, ZoneTransferException {
- super(xfrin);
- }
-
- /**
- * Creates a Zone by performing a zone transfer to the specified host.
- * @param zone zone name.
- * @param dclass the dclass
- * @param remote the remote host.
- * @throws IOException if there is an error.
- * @throws ZoneTransferException if there is an error.
- */
- public SecureableZone(Name zone, int dclass, String remote)
- throws IOException, ZoneTransferException {
- super(zone, dclass, remote);
- }
-
- /**
- * Creates a Zone from the records in the specified master file.
- * @param zone The name of the zone.
- * @param file The master file to read from.
- * @throws IOException if there is an error.
- */
- public SecureableZone(Name zone, String file) throws IOException {
- super(zone, file);
- }
-
- /**
- * Creates a Zone from an array of records.
- * @param zone The name of the zone.
- * @param records The records to add to the zone.
- * @throws IOException if there is an error.
- */
- public SecureableZone(Name zone, Record[] records)
- throws IOException {
- super(zone, records);
- }
-
- /**
- * Adds a Record to the Zone.
- * @param r The record to be added
- * @see Record
- */
- @Override public void addRecord(Record r) {
- if (records == null) {
- records = new ArrayList<Record>();
- }
- super.addRecord(r);
- records.add(r);
- }
-
- /**
- * Removes a record from the Zone.
- * @param r The record to be removed
- * @see Record
- */
- @Override public void removeRecord(Record r) {
- if (records == null) {
- records = new ArrayList<Record>();
- }
- super.removeRecord(r);
- records.remove(r);
- }
-
- /**
- * Return a NXT record appropriate for the query.
- * @param queryRecord the query record.
- * @param zone the zone to search.
- * @return the NXT record describing the insertion point.
- */
- @SuppressWarnings({"unchecked"})
- public Record getNXTRecord(Record queryRecord, Zone zone) {
- Collections.sort(records);
-
- int index = Collections.binarySearch(records, queryRecord,
- new Comparator<Record>() {
- @Override public int compare(Record r1, Record r2) {
- return r1.compareTo(r2);
- }
- });
- if (index >= 0) {
- return null;
- }
- index = -index - 1;
- if (index >= records.size()) {
- index = records.size() - 1;
- }
- Record base = records.get(index);
- SetResponse sr = zone.findRecords(base.getName(), Type.ANY);
- BitSet bitMap = new BitSet();
- bitMap.set(Type.NXT);
- RRset[] rRsets = sr.answers();
- for (RRset rRset : rRsets) {
- int typeCode = rRset.getType();
- if (typeCode > 0 && typeCode < 128) {
- bitMap.set(typeCode);
- }
- }
- return new NXTRecord(base.getName(), DClass.IN, zone.getSOA().getMinimum(),
- queryRecord.getName(), bitMap);
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e2a9fa84/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ServiceRecordProcessor.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ServiceRecordProcessor.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ServiceRecordProcessor.java
deleted file mode 100644
index b67cc7d..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ServiceRecordProcessor.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.registry.server.dns;
-
-import org.apache.hadoop.registry.client.types.ServiceRecord;
-
-import java.io.IOException;
-
-/**
- * Manage the processing of service records in order to create DNS records.
- */
-public interface ServiceRecordProcessor {
- /**
- * Initialize the mapping between DNS record type and record information
- * for the given service record.
- * @param serviceRecord the registry service record.
- * @throws Exception if encountering an error.
- */
- void initTypeToInfoMapping(ServiceRecord serviceRecord)
- throws Exception;
-
- /**
- * Return the DNS record types valid for this processor.
- * @return the array of DNS record types.
- */
- int[] getRecordTypes();
-
- /**
- * Manage the creation and registration of DNS records generated by parsing
- * a service record.
- * @param command the DNS registration command object (e.g. add_record,
- * remove record)
- * @throws IOException if the creation or registration generates an issue.
- */
- void manageDNSRecords(RegistryDNS.RegistryCommand command)
- throws IOException;
-
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e2a9fa84/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ZoneSelector.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ZoneSelector.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ZoneSelector.java
deleted file mode 100644
index 5043b85..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/ZoneSelector.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.registry.server.dns;
-
-import org.xbill.DNS.Name;
-import org.xbill.DNS.Zone;
-
-/**
- * A selector that returns the zone associated with a provided name.
- */
-public interface ZoneSelector {
- /**
- * Finds the best matching zone given the provided name.
- * @param name the record name for which a zone is requested.
- * @return the matching zone.
- */
- Zone findBestZone(Name name);
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e2a9fa84/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/package-info.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/package-info.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/package-info.java
deleted file mode 100644
index 00d8c9db..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/server/dns/package-info.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * DNS Server classes.
- * <p>
- * These classes are leveraged to create a DNS server that can provide the
- * facilities necessary for YARN application and/or service discovery.
- * </p>
- */
-package org.apache.hadoop.registry.server.dns;
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org