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