From bb86abb372366bc3293e7c2121a5b2ec6ea3b413 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 1 May 2025 14:58:46 +0000 Subject: [PATCH] downloads: Add document for the Raspberry Pi Imager Signed-off-by: Michael Tremer --- Makefile.am | 1 + src/backend/releases.py | 44 ++++++++++++++++++++++++++-- src/static/img/ipfire-tux-40x40.png | Bin 0 -> 4228 bytes src/web/__init__.py | 2 ++ src/web/downloads.py | 27 +++++++++++++++++ 5 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/static/img/ipfire-tux-40x40.png diff --git a/Makefile.am b/Makefile.am index 097bbd8d..fae05e8a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1105,6 +1105,7 @@ static_img_DATA = \ src/static/img/default-avatar.jpg \ src/static/img/fdroid-logo.svg \ src/static/img/ipfire-tux.png \ + src/static/img/ipfire-tux-40x40.png \ src/static/img/iuse-not-found.png \ src/static/img/kyberio-logo.svg \ src/static/img/lightningwirelabs-logo.svg \ diff --git a/src/backend/releases.py b/src/backend/releases.py index 895c6ca3..5990c4f6 100644 --- a/src/backend/releases.py +++ b/src/backend/releases.py @@ -264,10 +264,17 @@ class Release(Object): def path(self): return self.__data.path - def get_file(self, type): + def get_file(self, type, arch=None): for file in self.files: - if file.type == type: - return file + # Skip anything where the type does not match + if not file.type == type: + continue + + # Optionally skip the architecture + if arch and not file.arch == arch: + continue + + return file def __file_hash(self, filename, algo="sha256"): h = hashlib.new(algo) @@ -354,6 +361,37 @@ class Release(Object): def netboot_args(self, arch, platform): return "" + # OS List (For Raspberry Pi Imager) + + def make_os_list(self, arch): + """ + Returns an object according to this spec: + + https://github.com/raspberrypi/rpi-imager/blob/qml/doc/json-schema/os-list-schema.json + https://github.com/raspberrypi/rpi-imager/blob/qml/doc/os-sublist-example.json + """ + # Fetch the flash image + file = self.get_file(type="flash", arch=arch) + + # Return an empty object if we could not find the image file + if not file: + return {} + + # Make the document + return { + "name" : self.name, + "description" : "The Open Source Linux-based Firewall Operating System" + " with a Comprehensive Feature Set", + "url" : file.url, + "icon" : "https://www.ipfire.org/static/img/ipfire-tux-40x40.png", + "website" : "https://www.ipfire.org/", + "release_date" : self.published.strftime("%Y-%m-%d"), + + # Image Metadata + "image_download_size" : file.size, + "image_download_sha256" : file.sha256, + } + @property def post(self): if self.__data.blog_id: diff --git a/src/static/img/ipfire-tux-40x40.png b/src/static/img/ipfire-tux-40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..44541162751cc35d040d6b908022f63e11baa3b0 GIT binary patch literal 4228 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