1
"""DNS lookups for server autodiscovery."""
4
from twisted.names import dns
5
from twisted.names.client import Resolver
8
def discover_server(autodiscover_srv_query_string="",
9
autodiscover_a_query_string="", resolver=None):
11
Look up the dns location of the landscape server.
13
@param autodiscover_srv_query_string: The query string to send to the DNS
14
server when making a SRV query.
15
@param autodiscover_a_query_string: The query string to send to the DNS
16
server when making a A query.
17
@type resolver: The resolver to use. If none is specified a resolver that
18
uses settings from /etc/resolv.conf will be created. (Testing only)
21
resolver = Resolver("/etc/resolv.conf")
22
d = _lookup_server_record(resolver, autodiscover_srv_query_string)
23
d.addErrback(_lookup_hostname, resolver, autodiscover_a_query_string)
27
def _lookup_server_record(resolver, service_name):
29
Do a DNS SRV record lookup for the location of the landscape server.
31
@type resolver: A resolver to use for DNS lookups
32
L{twisted.names.client.Resolver}.
33
@param service_name: The query string to send to the DNS server when
35
@return: A deferred containing either the hostname of the landscape server
36
if found or an empty string if not found.
38
def lookup_done(result):
42
if row.type == dns.SRV:
43
name = row.payload.target.name
47
def lookup_failed(result):
48
logging.info("SRV lookup of %s failed." % service_name)
51
d = resolver.lookupService(service_name)
52
d.addCallback(lookup_done)
53
d.addErrback(lookup_failed)
57
def _lookup_hostname(result, resolver, hostname):
59
Do a DNS name lookup for the location of the landscape server.
61
@param result: The result from a call to lookup_server_record.
62
@param resolver: The resolver to use for DNS lookups.
63
@param hostname: The query string to send to the DNS server when making
65
@param return: A deferred containing the ip address of the landscape
66
server if found or None if not found.
68
def lookup_done(result):
71
def lookup_failed(result):
72
logging.info("Name lookup of %s failed." % hostname)
75
d = resolver.getHostByName(hostname)
76
d.addCallback(lookup_done)
77
d.addErrback(lookup_failed)