]>
git.ipfire.org Git - ipfire.org.git/blob - www/webapp/mirrors.py
3 import tornado
.httpclient
10 from helpers
import Item
, _stringify
, ping
12 class Mirrors(threading
.Thread
):
13 def __init__(self
, filename
):
14 threading
.Thread
.__init
__(self
, name
="Mirror Monitor")
23 def load(self
, filename
):
28 for item
in simplejson
.loads(data
):
29 self
.items
.append(MirrorItem(**_stringify(item
)))
33 return sorted(self
.items
)
38 #return random.shuffle(self.items)
42 rnd
= random
.randint(0, len(items
)-1)
43 ret
.append(items
.pop(rnd
))
49 for mirror
in self
.items
:
50 if not mirror
.reachable
:
56 def unreachable(self
):
58 for mirror
in self
.all
:
59 if mirror
in self
.reachable
:
64 def pickone(self
, reachable
=False):
67 mirrors
= self
.reachable
70 return random
.choice(mirrors
)
72 def with_file(self
, path
):
74 for mirror
in self
.random
:
75 if not mirror
["serves"]["isos"]:
77 if path
in mirror
.files
:
82 self
.__running
= False
85 for mirror
in self
.random
:
86 if not self
.__running
:
94 mirror
= self
.pickone()
102 class MirrorItem(Item
):
103 def __init__(self
, *args
, **kwargs
):
104 Item
.__init
__(self
, *args
, **kwargs
)
106 self
.filelist
= MirrorFilelist(self
)
109 def __cmp__(self
, other
):
110 return cmp(self
.name
, other
.name
)
113 self
.latency
= ping(self
.hostname
) or "N/A"
114 if self
.filelist
.outdated
:
115 self
.filelist
.update()
119 return not self
.latency
== "N/A"
123 ret
= "http://" + self
.hostname
124 if not self
.path
.startswith("/"):
127 if not ret
.endswith("/"):
133 return self
.filelist
.files
135 def has_file(self
, path
):
136 return path
in self
.files
139 class MirrorFilelist(object):
140 def __init__(self
, mirror
):
146 #self.update(now=True)
148 def update(self
, now
=False):
152 while not self
.mirror
.reachable
:
155 http
= tornado
.httpclient
.HTTPClient()
158 http
= tornado
.httpclient
.AsyncHTTPClient()
159 args
["callback"] = self
.on_response
162 reponse
= http
.fetch(self
.mirror
.url
+ ".filelist", **args
)
163 except tornado
.httpclient
.HTTPError
:
164 self
.__time
= time
.time()
168 self
.on_response(reponse
)
170 def on_response(self
, response
):
172 self
.__time
= time
.time()
174 if not response
.code
== 200:
177 # If invalid html content...
178 if response
.body
.startswith("<!"):
181 for line
in response
.body
.split("\n"):
184 self
.__files
.append(line
)
188 return (time
.time() - self
.__time
) > 60*60
197 mirrors
= Mirrors("mirrors.json")