1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
"""DNS lookups for server autodiscovery."""
import logging
from twisted.names import dns
from twisted.names.client import Resolver
def discover_server(autodiscover_srv_query_string="",
autodiscover_a_query_string="", resolver=None):
"""
Look up the dns location of the landscape server.
@param autodiscover_srv_query_string: The query string to send to the DNS
server when making a SRV query.
@param autodiscover_a_query_string: The query string to send to the DNS
server when making a A query.
@type resolver: The resolver to use. If none is specified a resolver that
uses settings from /etc/resolv.conf will be created. (Testing only)
"""
if not resolver:
resolver = Resolver("/etc/resolv.conf")
d = _lookup_server_record(resolver, autodiscover_srv_query_string)
d.addErrback(_lookup_hostname, resolver, autodiscover_a_query_string)
return d
def _lookup_server_record(resolver, service_name):
"""
Do a DNS SRV record lookup for the location of the landscape server.
@type resolver: A resolver to use for DNS lookups
L{twisted.names.client.Resolver}.
@param service_name: The query string to send to the DNS server when
making a SRV query.
@return: A deferred containing either the hostname of the landscape server
if found or an empty string if not found.
"""
def lookup_done(result):
name = ""
for item in result:
for row in item:
if row.type == dns.SRV:
name = row.payload.target.name
break
return name
def lookup_failed(result):
logging.info("SRV lookup of %s failed." % service_name)
return result
d = resolver.lookupService(service_name)
d.addCallback(lookup_done)
d.addErrback(lookup_failed)
return d
def _lookup_hostname(result, resolver, hostname):
"""
Do a DNS name lookup for the location of the landscape server.
@param result: The result from a call to lookup_server_record.
@param resolver: The resolver to use for DNS lookups.
@param hostname: The query string to send to the DNS server when making
a A query.
@param return: A deferred containing the ip address of the landscape
server if found or None if not found.
"""
def lookup_done(result):
return result
def lookup_failed(result):
logging.info("Name lookup of %s failed." % hostname)
return result
d = resolver.getHostByName(hostname)
d.addCallback(lookup_done)
d.addErrback(lookup_failed)
return d
|