]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/webapp/backend/releases.py
9 from databases
import Databases
10 from misc
import Singleton
11 from settings
import Settings
14 def __init__(self
, release
, id):
15 self
.release
= release
17 # get all data from database
18 self
.__data
= self
.db
.get("SELECT * FROM files WHERE id = %s", id)
22 return self
.release
.db
26 return self
.__data
.get("filetype")
30 baseurl
= Settings().get("download_url")
32 return urlparse
.urljoin(baseurl
, self
.filename
)
39 "iso" : _("Installable CD image"),
40 "torrent" : _("Torrent file"),
41 "flash" : _("Flash image"),
42 "alix" : _("Alix image"),
43 "usbfdd" : _("USB FDD Image"),
44 "usbhdd" : _("USB HDD Image"),
45 "xen" : _("Pregenerated Xen image"),
49 return descriptions
[self
.type]
51 return _("Unknown image type")
67 return priorities
[self
.type]
76 "iso" : _("Use this image to burn a CD and install IPFire from it."),
77 "torrent" : _("Download the CD image from the torrent network."),
78 "flash" : _("An image that is meant to run on embedded devices."),
79 "alix" : _("Flash image where a serial console is enabled by default."),
80 "usbfdd" : _("Install IPFire from a floppy-formated USB key."),
81 "usbhdd" : _("If the floppy image doesn't work, use this image instead."),
82 "xen" : _("A ready-to-run image for Xen."),
86 return remarks
[self
.type]
88 return _("Unknown image type")
92 return self
.__data
.get("sha1")
96 return self
.__data
.get("filename")
100 return os
.path
.basename(self
.filename
)
104 return self
.__data
.get("filesize")
108 known_arches
= ("i586", "arm")
110 for arch
in known_arches
:
111 if arch
in self
.basename
:
117 class Release(object):
122 def __init__(self
, id):
125 # get all data from database
127 self
.db
.get("SELECT * FROM releases WHERE id = %s", self
.id)
133 return "<%s %s>" % (self
.__class
__.__name
__, self
.name
)
138 files
= self
.db
.query("SELECT id FROM files WHERE releases = %s \
139 AND loadable = 'Y' AND NOT filetype = 'torrent'", self
.id)
141 self
.__files
= [File(self
, f
.id) for f
in files
]
142 self
.__files
.sort(lambda a
, b
: cmp(a
.prio
, b
.prio
))
148 return self
.__data
.get("name")
152 return self
.__data
.get("stable")
156 return self
.__data
.get("published")
160 return self
.__data
.get("date")
164 return self
.__data
.get("path")
167 def torrent_hash(self
):
168 h
= self
.__data
.get("torrent_hash")
172 def get_file(self
, type):
173 for file in self
.files
:
174 if file.type == type:
177 def __file_hash(self
, filename
):
178 sha1
= hashlib
.sha1()
180 with
open(filename
) as f
:
182 buf
= f
.read(buf_size
)
185 buf
= f
.read(buf_size
)
187 return sha1
.hexdigest()
189 def __guess_filetype(self
, filename
):
190 if filename
.endswith(".iso"):
193 if filename
.endswith(".torrent"):
196 if "xen" in filename
:
199 if "sources" in filename
:
202 if "usb-fdd" in filename
:
205 if "usb-hdd" in filename
:
208 if "arm" in filename
:
211 if "scon" in filename
:
214 if filename
.endswith(".img.gz"):
219 def scan_files(self
, basepath
="/srv/mirror0"):
223 path
= os
.path
.join(basepath
, self
.path
)
225 if not os
.path
.exists(path
):
228 files
= [f
.filename
for f
in self
.files
]
230 # Make files that do not exists not loadable.
231 for filename
in files
:
232 _filename
= os
.path
.join(basepath
, filename
)
233 if not os
.path
.exists(_filename
):
234 self
.db
.execute("UPDATE files SET loadable='N' WHERE filename = %s", filename
)
236 for filename
in os
.listdir(path
):
237 filename
= os
.path
.join(path
, filename
)
239 if os
.path
.isdir(filename
):
242 _filename
= re
.match(".*(releases/.*)", filename
).group(1)
243 if _filename
in files
:
246 if filename
.endswith(".md5"):
249 filehash
= self
.__file
_hash
(filename
)
250 filesize
= os
.path
.getsize(filename
)
251 filetype
= self
.__guess
_filetype
(filename
)
253 self
.db
.execute("""INSERT INTO files(releases, filename, filesize, filetype, sha1)
254 VALUES(%s, %s, %s, %s, %s)""", self
.id, _filename
, filesize
, filetype
, filehash
)
257 class Releases(object):
258 __metaclass__
= Singleton
262 return Databases().webapp
265 return [Release(r
.id) for r
in self
.db
.query("SELECT id FROM releases ORDER BY date DESC")]
267 def get_by_id(self
, id):
269 if id in [r
.id for r
in self
.db
.query("SELECT id FROM releases")]:
272 def get_latest(self
, stable
=1):
273 query
= "SELECT id FROM releases WHERE published='Y' AND"
275 query
+= " stable='Y'"
277 query
+= " stable='N'"
279 query
+= " ORDER BY date DESC LIMIT 1"
281 release
= self
.db
.get(query
)
283 return Release(release
.id)
285 def get_stable(self
):
286 releases
= self
.db
.query("""SELECT id FROM releases
287 WHERE published='Y' AND stable='Y'
288 ORDER BY date DESC""")
290 return [Release(r
.id) for r
in releases
]
292 def get_unstable(self
):
293 releases
= self
.db
.query("""SELECT id FROM releases
294 WHERE published='Y' AND stable='N'
295 ORDER BY date DESC""")
297 return [Release(r
.id) for r
in releases
]
300 releases
= self
.db
.query("""SELECT id FROM releases
301 WHERE published='Y' ORDER BY date DESC""")
303 return [Release(r
.id) for r
in releases
]
306 if __name__
== "__main__":
309 for release
in r
.get_all():