root / trunk / twisted / names / tap.py

Revision 13001, 3.8 kB (checked in by exarkun, 4 years ago)

remove option that never did anything

Line 
1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories.
2 # See LICENSE for details.
3
4
5 """
6 Domain Name Server
7 """
8
9 import os, traceback
10
11 from twisted.python import usage
12 from twisted.names import dns
13 from twisted.application import internet, service
14
15 from twisted.names import server
16 from twisted.names import authority
17 from twisted.names import secondary
18
19 class Options(usage.Options):
20     optParameters = [
21         ["interface", "i", "",   "The interface to which to bind"],
22         ["port",      "p", "53", "The port on which to listen"],
23         ["resolv-conf", None, None,
24             "Override location of resolv.conf (implies --recursive)"],
25         ["hosts-file", None, None, "Perform lookups with a hosts file"],
26     ]
27
28     optFlags = [
29         ["cache",       "c", "Enable record caching"],
30         ["recursive",   "r", "Perform recursive lookups"],
31         ["verbose",     "v", "Log verbosely"],
32     ]
33
34     zones = None
35     zonefiles = None
36
37     def __init__(self):
38         usage.Options.__init__(self)
39         self['verbose'] = 0
40         self.bindfiles = []
41         self.zonefiles = []
42         self.secondaries = []
43
44
45     def opt_pyzone(self, filename):
46         """Specify the filename of a Python syntax zone definition"""
47         if not os.path.exists(filename):
48             raise usage.UsageError(filename + ": No such file")
49         self.zonefiles.append(filename)
50
51     def opt_bindzone(self, filename):
52         """Specify the filename of a BIND9 syntax zone definition"""
53         if not os.path.exists(filename):
54             raise usage.UsageError(filename + ": No such file")
55         self.bindfiles.append(filename)
56
57
58     def opt_secondary(self, ip_domain):
59         """Act as secondary for the specified domain, performing
60         zone transfers from the specified IP (IP/domain)
61         """
62         args = ip_domain.split('/', 1)
63         if len(args) != 2:
64             raise usage.UsageError("Argument must be of the form IP/domain")
65         self.secondaries.append((args[0], [args[1]]))
66
67     def opt_verbose(self):
68         """Increment verbosity level"""
69         self['verbose'] += 1
70
71
72     def postOptions(self):
73         if self['resolv-conf']:
74             self['recursive'] = True
75
76         self.svcs = []
77         self.zones = []
78         for f in self.zonefiles:
79             try:
80                 self.zones.append(authority.PySourceAuthority(f))
81             except Exception, e:
82                 traceback.print_exc()
83                 raise usage.UsageError("Invalid syntax in " + f)
84         for f in self.bindfiles:
85             try:
86                 self.zones.append(authority.BindAuthority(f))
87             except Exception, e:
88                 traceback.print_exc()
89                 raise usage.UsageError("Invalid syntax in " + f)
90         for f in self.secondaries:
91             self.svcs.append(secondary.SecondaryAuthorityService(*f))
92             self.zones.append(self.svcs[-1].getAuthority())
93         try:
94             self['port'] = int(self['port'])
95         except ValueError:
96             raise usage.UsageError("Invalid port: %r" % (self['port'],))
97
98
99 def makeService(config):
100     import client, cache, hosts
101
102     ca, cl = [], []
103     if config['cache']:
104         ca.append(cache.CacheResolver(verbose=config['verbose']))
105     if config['recursive']:
106         cl.append(client.createResolver(resolvconf=config['resolv-conf']))
107     if config['hosts-file']:
108         cl.append(hosts.Resolver(file=config['hosts-file']))
109
110     f = server.DNSServerFactory(config.zones, ca, cl, config['verbose'])
111     p = dns.DNSDatagramProtocol(f)
112     f.noisy = 0
113     ret = service.MultiService()
114     for (klass, arg) in [(internet.TCPServer, f), (internet.UDPServer, p)]:
115         s = klass(config['port'], arg, interface=config['interface'])
116         s.setServiceParent(ret)
117     for svc in config.svcs:
118         svc.setServiceParent(ret)
119     return ret
Note: See TracBrowser for help on using the browser.