]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blobdiff - webapp/backend/releases.py
netboot: Allow booting multiple architectures
[people/shoehn/ipfire.org.git] / webapp / backend / releases.py
index 64bed28818d3f19f84d761df35eed85789ad95e9..48f7b5d25c7645a40a54dfb0037e67fb883c8b80 100644 (file)
@@ -51,6 +51,9 @@ class File(Object):
                        return "torrent"
 
                elif "xen" in filename:
+                       if "downloader" in filename:
+                               return "xen-downloader"
+
                        return "xen"
 
                elif "sources" in filename:
@@ -93,10 +96,11 @@ class File(Object):
                        "iso"           : _("Installable CD image"),
                        "torrent"       : _("Torrent file"),
                        "flash"         : _("Flash image"),
-                       "alix"          : _("Alix image"),
+                       "alix"          : _("Flash image for devices with serial console"),
                        "usbfdd"        : _("USB FDD Image"),
                        "usbhdd"        : _("USB HDD Image"),
                        "xen"           : _("Pregenerated Xen image"),
+                       "xen-downloader": _("Xen-Image Generator"),
                }
 
                try:
@@ -116,6 +120,7 @@ class File(Object):
                        "armv5tel"      : 40,
                        "armv5tel-scon" : 41,
                        "xen"           : 50,
+                       "xen-downloader": 51,
                }
                
                try:
@@ -137,6 +142,7 @@ class File(Object):
                        "usbfdd"        : _("Install IPFire from a floppy-formated USB key."),
                        "usbhdd"        : _("If the floppy image doesn't work, use this image instead."),
                        "xen"           : _("A ready-to-run image for Xen."),
+                       "xen-downloader": _("Generator for creating a Xen image."),
                }
 
                try:
@@ -195,14 +201,14 @@ class File(Object):
                if not self.torrent_hash:
                        return
 
-               return self.tracker.get_seeds(self.torrent_hash)
+               return self.backend.tracker.complete(self.torrent_hash)
 
        @property
        def peers(self):
                if not self.torrent_hash:
                        return
 
-               return self.tracker.get_peers(self.torrent_hash)
+               return self.backend.tracker.incomplete(self.torrent_hash)
 
 
 class Release(Object):
@@ -359,20 +365,48 @@ class Release(Object):
                        if f:
                                f.close()
 
+       def supports_arch(self, arch):
+               # Currently there is nothing else than i586 supported
+               if arch == "i586":
+                       return True
+
+               return False
+
+       def supports_platform(self, platform):
+               # Currently there is nothing else than pcbios supported
+               if platform == "pcbios":
+                       return True
+
+               return False
+
        def is_netboot_capable(self):
                return self.path and "ipfire-2.x" in self.path
 
-       @property
-       def netboot_kernel(self):
+       def netboot_kernel_url(self, arch, platform):
+               assert self.supports_arch(arch)
+               assert self.supports_platform(platform)
+
                return "http://downloads.ipfire.org/%s/images/vmlinuz" % self.path
 
-       @property
-       def netboot_initrd(self):
+       def netboot_initrd_url(self, arch, platform):
+               assert self.supports_arch(arch)
+               assert self.supports_platform(platform)
+
                return "http://downloads.ipfire.org/%s/images/instroot" % self.path
 
+       def netboot_args(self, arch, platform):
+               return ""
+
+       @property
+       def news_id(self):
+               return self.__data.news_id
+
        @property
-       def netboot_append(self):
-               return "ro"
+       def news(self):
+               if not hasattr(self, "_news"):
+                       self._news = self.backend.news.get(self.news_id)
+
+               return self._news
 
 
 class Releases(Object):
@@ -388,6 +422,12 @@ class Releases(Object):
                if ret:
                        return Release(self.backend, ret.id, data=ret)
 
+       def get_by_news_id(self, news_id):
+               ret = self.db.get("SELECT * FROM releases WHERE news_id = %s", news_id)
+
+               if ret:
+                       return Release(self.backend, ret.id, data=ret)
+
        def get_latest(self, stable=True):
                ret = self.db.get("SELECT * FROM releases WHERE published IS NOT NULL AND published <= NOW() \
                        AND stable = %s ORDER BY published DESC LIMIT 1", stable)
@@ -395,6 +435,17 @@ class Releases(Object):
                if ret:
                        return Release(self.backend, ret.id, data=ret)
 
+       def get_latest_unstable(self):
+               ret = self.db.get("SELECT * FROM releases r1 \
+                       WHERE r1.published IS NOT NULL AND r1.published <= NOW() \
+                       AND stable = %s AND NOT EXISTS ( \
+                               SELECT * FROM releases r2 WHERE r2.stable = %s AND \
+                                       r2.published IS NOT NULL AND r2.published >= r1.published \
+                               ) ORDER BY r1.published DESC LIMIT 1", False, True)
+
+               if ret:
+                       return Release(self.backend, ret.id, data=ret)
+
        def get_stable(self):
                query = self.db.query("SELECT * FROM releases \
                        WHERE published IS NOT NULL AND published <= NOW() AND stable = TRUE \
@@ -431,6 +482,16 @@ class Releases(Object):
 
                return releases
 
+       def _get_all(self):
+               query = self.db.query("SELECT * FROM releases ORDER BY published DESC")
+
+               releases = []
+               for row in query:
+                       release = Release(self.backend, row.id, data=row)
+                       releases.append(release)
+
+               return releases
+
        def get_file_for_torrent_hash(self, torrent_hash):
                file = self.db.get("SELECT id, releases FROM files WHERE torrent_hash = %s LIMIT 1",
                        torrent_hash)
@@ -438,7 +499,7 @@ class Releases(Object):
                if not file:
                        return
 
-               release = Release(file.releases)
-               file = File(release, file.id)
+               release = Release(self.backend, file.releases)
+               file = File(self.backend, release, file.id)
 
                return file