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_latest_image_download_url_recursive(items, image_name_suffix): for item in items: if not item['name'].startswith('Raspberry Pi OS '): continue if 'url' in item: result = urlparse(item['url']) if not os.path.basename(result.path).endswith(image_name_suffix): continue return urlunparse(result) if 'subitems' in item: result = _raspios_extract_latest_image_download_url_recursive(item['subitems'], image_name_suffix) if result: return result return None def raspios_extract_latest_image_download_url(os_list, variant, codename, arch): try: image_name_suffix = 'raspios-%s-%s' % (codename, arch) if variant != 'desktop': image_name_suffix += '-%s' % variant image_name_suffix += '.img.xz' result = _raspios_extract_latest_image_download_url_recursive(os_list, image_name_suffix) 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_latest_image_download_url': raspios_extract_latest_image_download_url, } def filters(self): return self.filter_map