]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blobdiff - www/webapp/backend/releases.py
Website update.
[people/shoehn/ipfire.org.git] / www / webapp / backend / releases.py
index 8dc7e6c3db7a3a4999a9cd1e9edce28fed984708..b03f21f695e08b3984355f7117d6838c4307c8cf 100644 (file)
@@ -1,6 +1,9 @@
 #!/usr/bin/python
 
+import hashlib
 import logging
+import os
+import re
 import urlparse
 
 from databases import Databases
@@ -56,6 +59,7 @@ class File(object):
                        "alix"          : 41,
                        "usbfdd"        : 31,
                        "usbhdd"        : 30,
+                       "arm"       : 40,
                        "xen"           : 50,
                }
                
@@ -91,6 +95,24 @@ class File(object):
        def filename(self):
                return self.__data.get("filename")
 
+       @property
+       def basename(self):
+               return os.path.basename(self.filename)
+
+       @property
+       def size(self):
+               return self.__data.get("filesize")
+
+       @property
+       def arch(self):
+               known_arches = ("i586", "arm")
+
+               for arch in known_arches:
+                       if arch in self.basename:
+                               return arch
+
+               return "N/A" 
+
 
 class Release(object):
        @property
@@ -114,7 +136,7 @@ class Release(object):
        def files(self):
                if not self.__files:
                        files = self.db.query("SELECT id FROM files WHERE releases = %s \
-                                       AND loadable = 'Y'", self.id)
+                                       AND loadable = 'Y' AND NOT filetype = 'torrent'", self.id)
 
                        self.__files = [File(self, f.id) for f in files]
                        self.__files.sort(lambda a, b: cmp(a.prio, b.prio))
@@ -137,6 +159,10 @@ class Release(object):
        def date(self):
                return self.__data.get("date")
 
+       @property
+       def path(self):
+               return self.__data.get("path")
+
        @property
        def torrent_hash(self):
                h = self.__data.get("torrent_hash")
@@ -148,6 +174,85 @@ class Release(object):
                        if file.type == type:
                                return file
 
+       def __file_hash(self, filename):
+               sha1 = hashlib.sha1()
+
+               with open(filename) as f:
+                       buf_size = 1024
+                       buf = f.read(buf_size)
+                       while buf:
+                               sha1.update(buf)
+                               buf = f.read(buf_size)
+
+               return sha1.hexdigest()
+
+       def __guess_filetype(self, filename):
+               if filename.endswith(".iso"):
+                       return "iso"
+
+               if filename.endswith(".torrent"):
+                       return "torrent"
+
+               if "xen" in filename:
+                       return "xen"
+
+               if "sources" in filename:
+                       return "source"
+
+               if "usb-fdd" in filename:
+                       return "usbfdd"
+
+               if "usb-hdd" in filename:
+                       return "usbhdd"
+
+               if "arm" in filename:
+                       return "arm"
+
+               if "scon" in filename:
+                       return "alix"
+
+               if filename.endswith(".img.gz"):
+                       return "flash"
+
+               return "unknown"
+
+       def scan_files(self, basepath="/srv/mirror0"):
+               if not self.path:
+                       return
+
+               path = os.path.join(basepath, self.path)
+
+               if not os.path.exists(path):
+                       return
+
+               files = [f.filename for f in self.files]
+
+               # Make files that do not exists not loadable.
+               for filename in files:
+                       _filename = os.path.join(basepath, filename)
+                       if not os.path.exists(_filename):
+                               self.db.execute("UPDATE files SET loadable='N' WHERE filename = %s", filename)
+
+               for filename in os.listdir(path):
+                       filename = os.path.join(path, filename)
+
+                       if os.path.isdir(filename):
+                               continue
+
+                       _filename = re.match(".*(releases/.*)", filename).group(1)
+                       if _filename in files:
+                               continue
+
+                       if filename.endswith(".md5"):
+                               continue
+
+                       filehash = self.__file_hash(filename)
+                       filesize = os.path.getsize(filename)
+                       filetype = self.__guess_filetype(filename)
+
+                       self.db.execute("""INSERT INTO files(releases, filename, filesize, filetype, sha1)
+                               VALUES(%s, %s, %s, %s, %s)""", self.id, _filename, filesize, filetype, filehash)
+
 
 class Releases(object):
        __metaclass__ = Singleton