diff options
| author | Markus Alexander Kuppe | 2010-07-18 19:21:05 +0000 |
|---|---|---|
| committer | Markus Alexander Kuppe | 2010-07-18 19:21:05 +0000 |
| commit | fde4f42726566e7adf8010908e49852df11f0cf9 (patch) | |
| tree | b166e8ff781305a0aaf9b9a317ce3375fb753dcd | |
| parent | 88d440cc9653c0592750d752f60dffd659141e11 (diff) | |
| download | org.eclipse.ecf-fde4f42726566e7adf8010908e49852df11f0cf9.tar.gz org.eclipse.ecf-fde4f42726566e7adf8010908e49852df11f0cf9.tar.xz org.eclipse.ecf-fde4f42726566e7adf8010908e49852df11f0cf9.zip | |
NEW - bug 320188: [Discovery][DNS-SD] IDiscoveryAdvertiser must use registration domains
https://bugs.eclipse.org/bugs/show_bug.cgi?id=320188
3 files changed, 69 insertions, 32 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java index 16fcbc86d..cdc1ea8ae 100644 --- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java +++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java @@ -12,6 +12,7 @@ package org.eclipse.ecf.provider.dnssd; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.ecf.core.ContainerConnectException; @@ -23,11 +24,16 @@ import org.eclipse.ecf.core.security.IConnectContext; import org.eclipse.ecf.discovery.DiscoveryContainerConfig; import org.eclipse.ecf.discovery.IServiceInfo; import org.eclipse.ecf.discovery.identity.IServiceTypeID; +import org.xbill.DNS.Lookup; import org.xbill.DNS.Message; +import org.xbill.DNS.NSRecord; import org.xbill.DNS.Name; import org.xbill.DNS.Rcode; import org.xbill.DNS.Record; +import org.xbill.DNS.SRVRecord; import org.xbill.DNS.SimpleResolver; +import org.xbill.DNS.TextParseException; +import org.xbill.DNS.Type; import org.xbill.DNS.Update; public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter { @@ -100,9 +106,35 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter { } } - private InetAddress getUpdateDomain(final Name zone) throws UnknownHostException { - //TODO resolve dyndns domain - return InetAddress.getByName("ns1.ecf-project.org"); + private InetAddress getUpdateDomain(final Name zone) throws TextParseException, UnknownHostException { + //TODO check if ._udp has to be prepended + Lookup query = new Lookup("_dns-update._udp." + zone, Type.SRV); + List srvRecords = getSRVRecord(query); + if(srvRecords.size() > 0) { + //TODO use the first one returned for the moment, use prio/weight later + SRVRecord srvRecord = (SRVRecord) srvRecords.get(0); + srvRecord.getTarget(); + srvRecord.getPort(); + return null; + } + return getAuthorityNameServer(zone); + } + + private InetAddress getAuthorityNameServer(final Name zone) throws UnknownHostException { + final Lookup query = new Lookup(zone, Type.NS); + query.setResolver(resolver); + final Record[] queryResult = query.run(); + //TODO file bug upstream that queryResult may never be null + int length = queryResult == null ? 0 : queryResult.length; + for (int j = 0; j < length; j++) { + Record record = queryResult[j]; + if(record instanceof NSRecord) { + NSRecord nsRecord = (NSRecord) record; + Name target = nsRecord.getTarget(); + return InetAddress.getByName(target.toString()); + } + } + return null; } diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java index 18a09b203..00b489c88 100644 --- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java +++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryContainerAdapter.java @@ -29,11 +29,14 @@ import org.eclipse.ecf.discovery.IServiceInfo; import org.eclipse.ecf.discovery.identity.IServiceID; import org.eclipse.ecf.discovery.identity.IServiceTypeID; import org.xbill.DNS.Lookup; +import org.xbill.DNS.Name; import org.xbill.DNS.PTRRecord; import org.xbill.DNS.Record; import org.xbill.DNS.Resolver; +import org.xbill.DNS.SRVRecord; import org.xbill.DNS.SimpleResolver; import org.xbill.DNS.TSIG; +import org.xbill.DNS.Type; public abstract class DnsSdDiscoveryContainerAdapter extends AbstractDiscoveryContainerAdapter { @@ -164,6 +167,37 @@ public abstract class DnsSdDiscoveryContainerAdapter extends return (Record[]) result.toArray(new Record[result.size()]); } + protected List getSRVRecords(Lookup[] queries) { + List srvRecords = new ArrayList(); + for (int i = 0; i < queries.length; i++) { + srvRecords.addAll(getSRVRecord(queries[i])); + } + return srvRecords; + } + + protected List getSRVRecord(Lookup query) { + final List srvRecords = new ArrayList(); + query.setResolver(resolver); + final Record[] queryResult = query.run(); + //TODO file bug upstream that queryResult may never be null + final int length = queryResult == null ? 0 : queryResult.length; + for (int j = 0; j < length; j++) { + Record[] srvQueryResult = null; + final Record record = queryResult[j]; + if(record instanceof PTRRecord) { + final PTRRecord ptrRecord = (PTRRecord) record; + final Name target = ptrRecord.getTarget(); + final Lookup srvQuery = new Lookup(target, Type.SRV); + srvQuery.setResolver(resolver); + srvQueryResult = srvQuery.run(); + } else if (record instanceof SRVRecord) { + srvQueryResult = new SRVRecord[]{(SRVRecord) record}; + } + srvRecords.addAll(Arrays.asList(srvQueryResult)); + } + return srvRecords; + } + /** * @param searchPaths The default search path used for discovery */ @@ -197,6 +231,4 @@ public abstract class DnsSdDiscoveryContainerAdapter extends public void setTsigKey(String tsigKeyName, String tsigKey) { resolver.setTSIGKey(new TSIG(tsigKeyName, tsigKey)); } - - } diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java index 9ceed4bda..691aa3456 100644 --- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java +++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java @@ -13,7 +13,6 @@ package org.eclipse.ecf.provider.dnssd; import java.net.URI; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -125,32 +124,6 @@ public class DnsSdDiscoveryLocator extends DnsSdDiscoveryContainerAdapter { return (IServiceInfo[]) serviceInfos.toArray(new IServiceInfo[serviceInfos.size()]); } - private List getSRVRecords(Lookup[] queries) { - List srvRecords = new ArrayList(); - for (int i = 0; i < queries.length; i++) { - Lookup query = queries[i]; - query.setResolver(resolver); - Record[] queryResult = query.run(); - //TODO file bug upstream that queryResult may never be null - int length = queryResult == null ? 0 : queryResult.length; - for (int j = 0; j < length; j++) { - Record[] srvQueryResult = null; - Record record = queryResult[j]; - if(record instanceof PTRRecord) { - PTRRecord ptrRecord = (PTRRecord) record; - Name target = ptrRecord.getTarget(); - Lookup srvQuery = new Lookup(target, Type.SRV); - srvQuery.setResolver(resolver); - srvQueryResult = srvQuery.run(); - } else if (record instanceof SRVRecord) { - srvQueryResult = new SRVRecord[]{(SRVRecord) record}; - } - srvRecords.addAll(Arrays.asList(srvQueryResult)); - } - } - return srvRecords; - } - private List getServiceInfos(List srvQueryResult) { List infos = new ArrayList(); for (Iterator iterator = srvQueryResult.iterator(); iterator.hasNext();) { |
