diff options
author | Christian Pointner <equinox@spreadspace.org> | 2022-09-04 18:25:12 +0200 |
---|---|---|
committer | Christian Pointner <equinox@spreadspace.org> | 2022-09-04 18:25:20 +0200 |
commit | 822b5e0e2eff46fbd007024ad1323abe27c2ff70 (patch) | |
tree | 3dfb358e3bbfe59815c881989f3e06be20108a9a /roles/raspios/image/filter_plugins | |
parent | ubuntu/installer: improved handling of latest image (diff) |
raspios: major refactoring for image fetching, TODO: customization
Diffstat (limited to 'roles/raspios/image/filter_plugins')
-rw-r--r-- | roles/raspios/image/filter_plugins/main.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/roles/raspios/image/filter_plugins/main.py b/roles/raspios/image/filter_plugins/main.py new file mode 100644 index 00000000..a8086f66 --- /dev/null +++ b/roles/raspios/image/filter_plugins/main.py @@ -0,0 +1,62 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import os +from ansible import errors +from urllib.parse import urlparse, urlunparse + + +def raspios_extract_download_base_url(os_list, variant, codename, arch): + try: + os_name = 'Raspberry Pi OS ' + if variant != 'desktop': + os_name += '%s ' % variant.capitalize() + os_name += {'armhf': '(32-bit)', 'arm64': '(64-bit)'}[arch] + + for item in os_list: + if item['os_name'] != os_name: + continue + if item['version'] != codename: + continue + result = urlparse(item['os_info']) + result = result._replace(path=os.path.dirname(result.path)) + return urlunparse(result) + except Exception as e: + raise errors.AnsibleFilterError("raspios_extract_download_base_url(): %s" % str(e)) + + raise errors.AnsibleFilterError("unable to find base url for: %s / %s / %s" % (variant, codename, arch)) + + +def _raspios_extract_latest_image_download_url_recursive(items, base_url): + base_url = base_url.replace('http://', 'https://') + for item in items: + if 'url' in item and item['url'].replace('http://', 'https://').startswith(base_url): + return item['url'] + if 'subitems' in item: + result = _raspios_extract_latest_image_download_url_recursive(item['subitems'], base_url) + if result: + return result + return None + + +def raspios_extract_latest_image_download_url(os_list, base_url): + try: + result = _raspios_extract_latest_image_download_url_recursive(os_list, base_url) + if result: + return result + + except Exception as e: + raise errors.AnsibleFilterError("raspios_extract_latest_image_download_url: %s" % str(e)) + + raise errors.AnsibleFilterError("unable to find latest image url for: %s" % (base_url)) + + +class FilterModule(object): + + filter_map = { + 'raspios_extract_download_base_url': raspios_extract_download_base_url, + 'raspios_extract_latest_image_download_url': raspios_extract_latest_image_download_url, + } + + def filters(self): + return self.filter_map |