Made the DHT bootstrapping use IPs instead of DNS names.
[quix0rs-apt-p2p.git] / apt_dht / apt_dht.py
1
2 from twisted.internet import defer
3 from twisted.web2 import server, http, http_headers
4 from twisted.python import log
5
6 from apt_dht_conf import config
7 from PeerManager import PeerManager
8 from HTTPServer import TopLevel
9 from MirrorManager import MirrorManager
10
11 class AptDHT:
12     def __init__(self, dht):
13         log.msg('Initializing the main apt_dht application')
14         self.dht = dht
15         self.http_server = TopLevel(config.get('DEFAULT', 'cache_dir'), self)
16         self.http_site = server.Site(self.http_server)
17         self.peers = PeerManager()
18         self.mirrors = MirrorManager(config.get('DEFAULT', 'cache_dir'))
19     
20     def getSite(self):
21         return self.http_site
22     
23     def check_freshness(self, path, modtime, resp):
24         d = self.peers.get([path], "HEAD", modtime)
25         d.addCallback(self.check_freshness_done, path, resp)
26         return d
27     
28     def check_freshness_done(self, resp, path, orig_resp):
29         if resp.code == "304":
30             return orig_resp
31         else:
32             return self.get_resp(path)
33     
34     def get_resp(self, path):
35         d = defer.Deferred()
36         
37         findDefer = self.mirrors.findHash(path)
38         
39         findDefer.addcallback(self.findHash_done, path, d)
40         return d
41         
42     def findHash_done(self, (hash, size), path, d):
43         if hash is None:
44             getDefer = self.peers.get([path])
45             getDefer.addCallback(d.callback)
46         else:
47             # Lookup hash from DHT
48             lookupDefer = self.dht.getValue(hash)
49             lookupDefer.addCallback(self.lookupHash_done, hash, size, path, d)
50             
51     def lookupHash_done(self, locations, hash, size, path, d):
52         if not locations:
53             getDefer = self.peers.get([path])
54             getDefer.addCallback(d.callback)
55         else:
56             # Download from the found peers
57             getDefer = self.peers.get(locations)
58             getDefer.addCallback(d.callback)
59