NameserverResolver.java (eucalyptus-4.4.1) | : | NameserverResolver.java (eucalyptus-4.4.2) | ||
---|---|---|---|---|
skipping to change at line 73 | skipping to change at line 73 | |||
*/ | */ | |||
package com.eucalyptus.util.dns; | package com.eucalyptus.util.dns; | |||
import static com.eucalyptus.util.dns.DnsResolvers.DnsRequest; | import static com.eucalyptus.util.dns.DnsResolvers.DnsRequest; | |||
import java.net.InetAddress; | import java.net.InetAddress; | |||
import java.util.List; | import java.util.List; | |||
import java.util.NavigableSet; | import java.util.NavigableSet; | |||
import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | |||
import java.util.function.Predicate; | ||||
import org.xbill.DNS.Name; | import org.xbill.DNS.Name; | |||
import org.xbill.DNS.Record; | import org.xbill.DNS.Record; | |||
import com.eucalyptus.bootstrap.Bootstrap; | import com.eucalyptus.bootstrap.Bootstrap; | |||
import com.eucalyptus.bootstrap.Host; | import com.eucalyptus.bootstrap.Host; | |||
import com.eucalyptus.bootstrap.Hosts; | import com.eucalyptus.bootstrap.Hosts; | |||
import com.eucalyptus.component.Components; | import com.eucalyptus.component.Components; | |||
import com.eucalyptus.component.ServiceConfiguration; | import com.eucalyptus.component.ServiceConfiguration; | |||
import com.eucalyptus.component.ServiceConfigurations; | ||||
import com.eucalyptus.component.id.Dns; | import com.eucalyptus.component.id.Dns; | |||
import com.eucalyptus.configurable.ConfigurableClass; | import com.eucalyptus.configurable.ConfigurableClass; | |||
import com.eucalyptus.configurable.ConfigurableField; | import com.eucalyptus.configurable.ConfigurableField; | |||
import com.eucalyptus.util.Cidr; | import com.eucalyptus.util.Cidr; | |||
import com.eucalyptus.util.CollectionUtils; | import com.eucalyptus.util.CollectionUtils; | |||
import com.eucalyptus.util.Internets; | import com.eucalyptus.util.Internets; | |||
import com.eucalyptus.util.Subnets; | import com.eucalyptus.util.Subnets; | |||
import com.eucalyptus.util.dns.DnsResolvers.DnsResolver; | import com.eucalyptus.util.dns.DnsResolvers.DnsResolver; | |||
import com.eucalyptus.util.dns.DnsResolvers.DnsResponse; | import com.eucalyptus.util.dns.DnsResolvers.DnsResponse; | |||
import com.eucalyptus.util.dns.DnsResolvers.RequestType; | import com.eucalyptus.util.dns.DnsResolvers.RequestType; | |||
import com.google.common.base.Function; | import com.google.common.base.Function; | |||
import com.google.common.base.Functions; | import com.google.common.base.Functions; | |||
import com.google.common.base.Objects; | import com.google.common.base.MoreObjects; | |||
import com.google.common.cache.CacheBuilder; | import com.google.common.cache.CacheBuilder; | |||
import com.google.common.cache.CacheLoader; | import com.google.common.cache.CacheLoader; | |||
import com.google.common.collect.Iterables; | import com.google.common.collect.Iterables; | |||
import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | |||
import com.google.common.primitives.Ints; | import com.google.common.primitives.Ints; | |||
import javaslang.collection.Stream; | ||||
import javaslang.control.Option; | ||||
@ConfigurableClass( root = "dns.ns", | @ConfigurableClass( root = "dns.ns", | |||
description = "Options controlling DNS name resolution for t he system's nameservers." ) | description = "Options controlling DNS name resolution for t he system's nameservers." ) | |||
public class NameserverResolver extends DnsResolver { | public class NameserverResolver extends DnsResolver { | |||
@ConfigurableField( description = "Enable the NS resolver. Note: dns.enable m ust also be 'true'" ) | @ConfigurableField( description = "Enable the NS resolver. Note: dns.enable m ust also be 'true'" ) | |||
public static Boolean enabled = Boolean.TRUE; | public static Boolean enabled = Boolean.TRUE; | |||
private static final Function<InetAddress,Cidr> cidrLookup = CacheBuilder.newB uilder( ) | private static final Function<InetAddress,Cidr> cidrLookup = CacheBuilder.newB uilder( ) | |||
.maximumSize( 64 ) | .maximumSize( 64 ) | |||
.expireAfterWrite( 1, TimeUnit.MINUTES ) | .expireAfterWrite( 1, TimeUnit.MINUTES ) | |||
skipping to change at line 122 | skipping to change at line 124 | |||
CollectionUtils.optionalOr( Cidr.of( 0, 0 ) ), | CollectionUtils.optionalOr( Cidr.of( 0, 0 ) ), | |||
Internets.interfaceCidr( ) ) ) ); | Internets.interfaceCidr( ) ) ) ); | |||
@Override | @Override | |||
public boolean checkAccepts( final DnsRequest request ) { | public boolean checkAccepts( final DnsRequest request ) { | |||
final Record query = request.getQuery( ); | final Record query = request.getQuery( ); | |||
final Name name = query.getName( ); | final Name name = query.getName( ); | |||
if ( !Bootstrap.isOperational( ) || !enabled || !DomainNames.isSystemSubdoma in( name ) ) { | if ( !Bootstrap.isOperational( ) || !enabled || !DomainNames.isSystemSubdoma in( name ) ) { | |||
return false; | return false; | |||
} else if ( RequestType.A.apply( query ) ) { | } else if ( RequestType.A.apply( query ) ) { | |||
return name.getLabelString( 0 ).matches( "ns[1-9]*" ); | return name.getLabelString( 0 ).matches( "ns(?:[1-9][0-9]*)?" ); | |||
} else if ( RequestType.NS.apply( query ) ) { | } else if ( RequestType.NS.apply( query ) ) { | |||
return true; | return true; | |||
} else { | } else { | |||
return false; | return false; | |||
} | } | |||
} | } | |||
@Override | @Override | |||
public DnsResponse lookupRecords( DnsRequest request ) { | public DnsResponse lookupRecords( DnsRequest request ) { | |||
final Record query = request.getQuery( ); | final Record query = request.getQuery( ); | |||
Name name = query.getName( ); | Name name = query.getName( ); | |||
if ( RequestType.A.apply( query ) && DomainNames.isSystemSubdomain( name ) ) { | if ( RequestType.A.apply( query ) && DomainNames.isSystemSubdomain( name ) ) { | |||
String label0 = name.getLabelString( 0 ); | String label0 = name.getLabelString( 0 ); | |||
if ( name.equals( Name.fromConstantString( label0 + "." + DomainNames.inte rnalSubdomain( ) ) ) | if ( name.equals( Name.fromConstantString( label0 + "." + DomainNames.inte rnalSubdomain( ) ) ) | |||
|| name.equals( Name.fromConstantString( label0 + "." + DomainNames.e xternalSubdomain( ) ) ) ) { | || name.equals( Name.fromConstantString( label0 + "." + DomainNames.e xternalSubdomain( ) ) ) ) { | |||
NavigableSet<ServiceConfiguration> nsServers = Components.lookup( Dns.cl ass ).services( ); | NavigableSet<ServiceConfiguration> nsServers = Components.lookup( Dns.cl ass ).services( ); | |||
Integer index = Objects.firstNonNull( Ints.tryParse( label0.substring( 2 ) ), 1 ); | Integer index = MoreObjects.firstNonNull( Ints.tryParse( label0.substrin g( 2 ) ), 1 ); | |||
if ( nsServers.size( ) >= index ) { | if ( nsServers.size( ) >= index ) { | |||
ServiceConfiguration conf = nsServers.toArray( new ServiceConfiguratio n[] {} )[index-1]; | ServiceConfiguration conf = nsServers.toArray( new ServiceConfiguratio n[] {} )[index-1]; | |||
final Record addressRecord = DomainNameRecords.addressRecord( | final Record addressRecord = DomainNameRecords.addressRecord( | |||
query.getName( ), | query.getName( ), | |||
maphost( request.getLocalAddress( ), conf.getInetAddress( ) ) ); | maphost( request.getLocalAddress( ), conf.getInetAddress( ) ) ); | |||
return DnsResponse.forName( name ).answer( addressRecord ); | return DnsResponse.forName( name ).answer( addressRecord ); | |||
} | } | |||
} | } | |||
} else if ( RequestType.NS.apply( query ) ) { | } else if ( RequestType.NS.apply( query ) ) { | |||
NavigableSet<ServiceConfiguration> nsServers = Components.lookup( Dns.clas | final NavigableSet<ServiceConfiguration> nsServers = Components.lookup( Dn | |||
s ).services( ); | s.class ).services( ); | |||
List<Record> aRecs = Lists.newArrayList( ); | final Predicate<ServiceConfiguration> nsServerUsable = DomainNameRecords.a | |||
Name domain = DomainNames.isInternalSubdomain( name ) ? DomainNames.intern | ctiveNameserverPredicate( ); | |||
alSubdomain( ) : DomainNames.externalSubdomain( ); | final Name domain = DomainNames.isInternalSubdomain( name ) ? DomainNames. | |||
internalSubdomain( ) : DomainNames.externalSubdomain( ); | ||||
final List<Record> aRecs = Lists.newArrayList( ); | ||||
int idx = 1; | int idx = 1; | |||
for ( ServiceConfiguration conf : nsServers ) { | for ( final ServiceConfiguration conf : nsServers ) { | |||
aRecs.add( DomainNameRecords.addressRecord( | final int offset = idx++; | |||
Name.fromConstantString( "ns" + (idx++) + "." + domain ) , | if ( nsServerUsable.test( conf ) ) { | |||
maphost( request.getLocalAddress( ), conf.getInetAddress( ) ) ) ); | aRecs.add( DomainNameRecords.addressRecord( | |||
Name.fromConstantString( "ns" + offset + "." + domain ) , | ||||
maphost( request.getLocalAddress( ), conf.getInetAddress( ) ) ) ); | ||||
} | ||||
} | } | |||
return DnsResponse.forName( name ) | return DnsResponse.forName( name ) | |||
.withAdditional( aRecs ) | .withAdditional( aRecs ) | |||
.answer( DomainNameRecords.nameservers( name ) ); | .answer( DomainNameRecords.nameservers( name ) ); | |||
} | } | |||
return null; | return null; | |||
} | } | |||
@Override | @Override | |||
public String toString( ) { | public String toString( ) { | |||
return this.getClass( ).getSimpleName( ); | return this.getClass( ).getSimpleName( ); | |||
} | } | |||
@SuppressWarnings( "unused" ) | ||||
public static class NameserverReverseResolver extends DnsResolver { | public static class NameserverReverseResolver extends DnsResolver { | |||
@Override | @Override | |||
public boolean checkAccepts( DnsRequest request ) { | public boolean checkAccepts( DnsRequest request ) { | |||
final Record query = request.getQuery( ); | final Record query = request.getQuery( ); | |||
return RequestType.PTR.apply( query ) && Subnets.isSystemHostAddress( Doma inNameRecords.inAddrArpaToInetAddress( query.getName( ) ) ); | return RequestType.PTR.apply( query ) && Subnets.isSystemHostAddress( Doma inNameRecords.inAddrArpaToInetAddress( query.getName( ) ) ); | |||
} | } | |||
@Override | @Override | |||
public DnsResponse lookupRecords( DnsRequest request ) { | public DnsResponse lookupRecords( DnsRequest request ) { | |||
final Record query = request.getQuery( ); | final Record query = request.getQuery( ); | |||
final InetAddress hostAddr = DomainNameRecords.inAddrArpaToInetAddress( qu ery.getName( ) ); | final InetAddress hostAddr = DomainNameRecords.inAddrArpaToInetAddress( qu ery.getName( ) ); | |||
final String hostAddress = hostAddr.getHostAddress( ); | final Host host = Hosts.lookup( hostAddr ); | |||
if ( Hosts.contains( hostAddress ) ) { | if ( host != null ) { | |||
NavigableSet<ServiceConfiguration> nsServers = Components.lookup( Dns.cl | final String hostAddress = host.getBindAddress( ).getHostAddress( ); | |||
ass ).services( ); | final NavigableSet<ServiceConfiguration> nsServers = Components.lookup( | |||
int index = nsServers.headSet( ServiceConfigurations.lookupByHost( Dns.c | Dns.class ).services( ); | |||
lass, hostAddr.getHostAddress( ) ) ).size( ); | final Option<ServiceConfiguration> hostConfiguration = | |||
final Name nsName = Name.fromConstantString( "ns" + index + "." + Domain | Stream.ofAll( nsServers ).find( configuration -> hostAddress.equals( | |||
Names.externalSubdomain( ) ); | configuration.getHostName( ) ) ); | |||
final Record ptrRecord = DomainNameRecords.ptrRecord( nsName, hostAddr ) | if ( hostConfiguration.isDefined( ) ) { | |||
; | int index = nsServers.headSet( hostConfiguration.get( ) ).size( ); | |||
return DnsResponse.forName( query.getName( ) ).answer( ptrRecord ); | final Name nsName = Name.fromConstantString( "ns" + (index+1) + "." + | |||
DomainNames.externalSubdomain( ) ); | ||||
final Record ptrRecord = DomainNameRecords.ptrRecord( nsName, hostAddr | ||||
); | ||||
return DnsResponse.forName( query.getName( ) ).answer( ptrRecord ); | ||||
} | ||||
} | } | |||
// EUCA-10245: return zero answer so that the next reverse resolver would answer | // EUCA-10245: return zero answer so that the next reverse resolver would answer | |||
return DnsResponse.forName( query.getName( ) ).answer(); | return DnsResponse.forName( query.getName( ) ).answer(); | |||
} | } | |||
} | } | |||
@SuppressWarnings( "ConstantConditions" ) | @SuppressWarnings( "ConstantConditions" ) | |||
public static InetAddress maphost( final InetAddress listenerAddress, | public static InetAddress maphost( final InetAddress listenerAddress, | |||
final InetAddress hostAddress ) { | final InetAddress hostAddress ) { | |||
InetAddress result = hostAddress; | InetAddress result = hostAddress; | |||
End of changes. 10 change blocks. | ||||
24 lines changed or deleted | 37 lines changed or added |