OLD | NEW |
| (Empty) |
1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
2 # See LICENSE for details. | |
3 | |
4 | |
5 from twisted.names import dns | |
6 from twisted.persisted import styles | |
7 from twisted.python import failure | |
8 from twisted.internet import defer | |
9 | |
10 from twisted.names import common | |
11 | |
12 def searchFileFor(file, name): | |
13 try: | |
14 fp = open(file) | |
15 except: | |
16 return None | |
17 | |
18 lines = fp.readlines() | |
19 for line in lines: | |
20 idx = line.find('#') | |
21 if idx != -1: | |
22 line = line[:idx] | |
23 if not line: | |
24 continue | |
25 parts = line.split() | |
26 if name.lower() in [s.lower() for s in parts[1:]]: | |
27 return parts[0] | |
28 return None | |
29 | |
30 | |
31 | |
32 class Resolver(common.ResolverBase, styles.Versioned): | |
33 """A resolver that services hosts(5) format files.""" | |
34 #TODO: IPv6 support | |
35 | |
36 persistenceVersion = 1 | |
37 | |
38 def upgradeToVersion1(self): | |
39 # <3 exarkun | |
40 self.typeToMethod = {} | |
41 for (k, v) in common.typeToMethod.items(): | |
42 self.typeToMethod[k] = getattr(self, v) | |
43 | |
44 | |
45 def __init__(self, file='/etc/hosts', ttl = 60 * 60): | |
46 common.ResolverBase.__init__(self) | |
47 self.file = file | |
48 self.ttl = ttl | |
49 | |
50 | |
51 def lookupAddress(self, name, timeout = None): | |
52 res = searchFileFor(self.file, name) | |
53 if res: | |
54 return defer.succeed([ | |
55 (dns.RRHeader(name, dns.A, dns.IN, self.ttl, dns.Record_A(res, s
elf.ttl)),), (), () | |
56 ]) | |
57 return defer.fail(failure.Failure(dns.DomainError(name))) | |
58 | |
59 | |
60 # When we put IPv6 support in, this'll need a real impl | |
61 lookupAllRecords = lookupAddress | |
OLD | NEW |