]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blobdiff - www/webapp/backend/releases.py
manager: Fix crash is release directory does not exist, yet.
[people/shoehn/ipfire.org.git] / www / webapp / backend / releases.py
index 8dc7e6c3db7a3a4999a9cd1e9edce28fed984708..9b82c13255e8ea01ef87188fe17c2c47ab74bbf8 100644 (file)
@@ -1,6 +1,9 @@
 #!/usr/bin/python
 
+import hashlib
 import logging
+import os
+import re
 import urlparse
 
 from databases import Databases
@@ -91,6 +94,10 @@ class File(object):
        def filename(self):
                return self.__data.get("filename")
 
+       @property
+       def basename(self):
+               return os.path.basename(self.filename)
+
 
 class Release(object):
        @property
@@ -137,6 +144,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 +159,78 @@ class Release(object):
                        if file.type == type:
                                return file
 
+       def __file_hash(self, filename):
+               sha1 = hashlib.sha1()
+
+               with open(filename) as f:
+                       sha1.update(f.read())
+
+               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 "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