"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "clc/modules/msgs/src/main/java/com/eucalyptus/util/dns/NameserverResolver.java" between
eucalyptus-4.4.1.tar.gz and eucalyptus-4.4.2.tar.gz

About: Eucalyptus (Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems) is an infrastructure for implementing "cloud computing" on clusters (compatible with Amazon’s EC2 interface, but designed to support multiple client-side interfaces).

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

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)