]>
git.ipfire.org Git - ipfire.org.git/blob - webapp/backend/releases.py
64bed28818d3f19f84d761df35eed85789ad95e9
12 from misc
import Object
15 def __init__(self
, backend
, release
, id, data
=None):
16 Object
.__init
__(self
, backend
)
19 self
._release
= release
21 # get all data from database
24 def __cmp__(self
, other
):
25 return cmp(self
.prio
, other
.prio
)
29 if self
.__data
is None:
30 self
.__data
= self
.db
.get("SELECT * FROM files WHERE id = %s", self
.id)
38 release_id
= self
.data
.get("releases")
39 self
._release
= Release(release_id
)
45 filename
= self
.filename
47 if filename
.endswith(".iso"):
50 elif filename
.endswith(".torrent"):
53 elif "xen" in filename
:
56 elif "sources" in filename
:
59 elif "usb-fdd" in filename
:
62 elif "usb-hdd" in filename
:
65 elif "armv5tel" in filename
and "scon" in filename
:
66 return "armv5tel-scon"
68 elif "armv5tel" in filename
:
71 elif "scon" in filename
:
74 elif filename
.endswith(".img.gz"):
82 baseurl
= self
.settings
.get("download_url", "http://downloads.ipfire.org")
84 return urlparse
.urljoin(baseurl
, self
.filename
)
91 "armv5tel" : _("Image for the armv5tel architecture"),
92 "armv5tel-scon" : _("armv5tel image for boards with serial console"),
93 "iso" : _("Installable CD image"),
94 "torrent" : _("Torrent file"),
95 "flash" : _("Flash image"),
96 "alix" : _("Alix image"),
97 "usbfdd" : _("USB FDD Image"),
98 "usbhdd" : _("USB HDD Image"),
99 "xen" : _("Pregenerated Xen image"),
103 return descriptions
[self
.type]
105 return _("Unknown image type")
117 "armv5tel-scon" : 41,
122 return priorities
[self
.type]
131 "armv5tel" : _("This image runs on many ARM-based boards"),
132 "armv5tel-scon" : _("This image runs on ARM boards with a serial console"),
133 "iso" : _("Use this image to burn a CD and install IPFire from it."),
134 "torrent" : _("Download the CD image from the torrent network."),
135 "flash" : _("An image that is meant to run on embedded devices."),
136 "alix" : _("Flash image where a serial console is enabled by default."),
137 "usbfdd" : _("Install IPFire from a floppy-formated USB key."),
138 "usbhdd" : _("If the floppy image doesn't work, use this image instead."),
139 "xen" : _("A ready-to-run image for Xen."),
143 return remarks
[self
.type]
145 return _("Unknown image type")
149 return self
.data
.get("sha1")
153 return self
.data
.get("filename")
157 return os
.path
.basename(self
.filename
)
161 return self
.data
.get("filesize")
165 known_arches
= ("i586", "arm")
167 for arch
in known_arches
:
168 if arch
in self
.basename
:
174 def torrent_hash(self
):
175 return self
.data
.get("torrent_hash", None)
178 def magnet_link(self
):
179 # Don't return anything if we have no torrent hash.
180 if self
.torrent_hash
is None:
183 s
= "magnet:?xt=urn:btih:%s" % self
.torrent_hash
185 #s += "&xl=%d" % self.size
186 s
+= "&dn=%s" % urllib
.quote(self
.basename
)
189 s
+= "&tr=http://tracker.ipfire.org:6969/announce"
195 if not self
.torrent_hash
:
198 return self
.tracker
.get_seeds(self
.torrent_hash
)
202 if not self
.torrent_hash
:
205 return self
.tracker
.get_peers(self
.torrent_hash
)
208 class Release(Object
):
209 def __init__(self
, backend
, id, data
=None):
210 Object
.__init
__(self
, backend
)
213 # get all data from database
214 self
.__data
= data
or self
.db
.get("SELECT * FROM releases WHERE id = %s", self
.id)
220 return "<%s %s>" % (self
.__class
__.__name
__, self
.name
)
222 def __cmp__(self
, other
):
223 return cmp(self
.id, other
.id)
228 files
= self
.db
.query("SELECT * FROM files WHERE releases = %s \
229 AND NOT filename LIKE '%%.torrent'", self
.id)
231 self
.__files
= [File(self
.backend
, self
, f
.id, f
) for f
in files
]
240 for file in self
.files
:
241 if not file.torrent_hash
:
244 torrents
.append(file)
250 return self
.__data
.name
254 return self
.__data
.sname
258 return self
.__data
.stable
262 return self
.__data
.published
268 return self
.__data
.path
270 def get_file(self
, type):
271 for file in self
.files
:
272 if file.type == type:
275 def __file_hash(self
, filename
):
276 sha1
= hashlib
.sha1()
278 with
open(filename
) as f
:
280 buf
= f
.read(buf_size
)
283 buf
= f
.read(buf_size
)
285 return sha1
.hexdigest()
287 def scan_files(self
, basepath
="/srv/mirror0"):
291 path
= os
.path
.join(basepath
, self
.path
)
292 if not os
.path
.exists(path
):
295 files
= self
.db
.query("SELECT filename FROM files WHERE releases = %s", self
.id)
296 files
= [f
.filename
for f
in files
]
298 # Make files that do not exists not loadable.
299 for filename
in files
:
300 _filename
= os
.path
.join(basepath
, filename
)
301 if not os
.path
.exists(_filename
):
302 self
.db
.execute("UPDATE files SET loadable='N' WHERE filename = %s", filename
)
304 for filename
in os
.listdir(path
):
305 filename
= os
.path
.join(path
, filename
)
307 if os
.path
.isdir(filename
):
310 _filename
= re
.match(".*(releases/.*)", filename
).group(1)
311 if _filename
in files
:
314 if filename
.endswith(".md5"):
317 logging
.info("Hashing %s..." % filename
)
318 filehash
= self
.__file
_hash
(filename
)
319 filesize
= os
.path
.getsize(filename
)
321 # Check if there is a torrent download available for this file:
323 torrent_file
= "%s.torrent" % filename
324 if os
.path
.exists(torrent_file
):
325 torrent_hash
= self
.torrent_read_hash(torrent_file
)
327 self
.db
.execute("INSERT INTO files(releases, filename, filesize, \
328 sha1, torrent_hash) VALUES(%s, %s, %s, %s, %s)",
329 self
.id, _filename
, filesize
, filehash
, torrent_hash
)
331 # Search for all files that miss a torrent hash.
332 files
= self
.db
.query("SELECT id, filename FROM files \
333 WHERE releases = %s AND torrent_hash IS NULL", self
.id)
336 path
= os
.path
.join(basepath
, file.filename
)
338 torrent_file
= "%s.torrent" % path
339 if os
.path
.exists(torrent_file
):
340 torrent_hash
= self
.torrent_read_hash(torrent_file
)
342 self
.db
.execute("UPDATE files SET torrent_hash = %s WHERE id = %s",
343 torrent_hash
, file.id)
345 def torrent_read_hash(self
, filename
):
348 f
= open(filename
, "rb")
350 metainfo
= tracker
.bdecode(f
.read())
351 metainfo
= tracker
.bencode(metainfo
["info"])
353 hash = hashlib
.sha1()
354 hash.update(metainfo
)
356 return hash.hexdigest()
362 def is_netboot_capable(self
):
363 return self
.path
and "ipfire-2.x" in self
.path
366 def netboot_kernel(self
):
367 return "http://downloads.ipfire.org/%s/images/vmlinuz" % self
.path
370 def netboot_initrd(self
):
371 return "http://downloads.ipfire.org/%s/images/instroot" % self
.path
374 def netboot_append(self
):
378 class Releases(Object
):
379 def get_by_id(self
, id):
380 ret
= self
.db
.get("SELECT * FROM releases WHERE id = %s", id)
383 return Release(self
.backend
, ret
.id, data
=ret
)
385 def get_by_sname(self
, sname
):
386 ret
= self
.db
.get("SELECT * FROM releases WHERE sname = %s", sname
)
389 return Release(self
.backend
, ret
.id, data
=ret
)
391 def get_latest(self
, stable
=True):
392 ret
= self
.db
.get("SELECT * FROM releases WHERE published IS NOT NULL AND published <= NOW() \
393 AND stable = %s ORDER BY published DESC LIMIT 1", stable
)
396 return Release(self
.backend
, ret
.id, data
=ret
)
398 def get_stable(self
):
399 query
= self
.db
.query("SELECT * FROM releases \
400 WHERE published IS NOT NULL AND published <= NOW() AND stable = TRUE \
401 ORDER BY published DESC")
405 release
= Release(self
.backend
, row
.id, data
=row
)
406 releases
.append(release
)
410 def get_unstable(self
):
411 query
= self
.db
.query("SELECT * FROM releases \
412 WHERE published IS NOT NULL AND published <= NOW() AND stable = FALSE \
413 ORDER BY published DESC")
417 release
= Release(self
.backend
, row
.id, data
=row
)
418 releases
.append(release
)
423 query
= self
.db
.query("SELECT * FROM releases \
424 WHERE published IS NOT NULL AND published <= NOW() \
425 ORDER BY published DESC")
429 release
= Release(self
.backend
, row
.id, data
=row
)
430 releases
.append(release
)
434 def get_file_for_torrent_hash(self
, torrent_hash
):
435 file = self
.db
.get("SELECT id, releases FROM files WHERE torrent_hash = %s LIMIT 1",
441 release
= Release(file.releases
)
442 file = File(release
, file.id)