summaryrefslogtreecommitdiff
path: root/roles/raspios/image/filter_plugins/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'roles/raspios/image/filter_plugins/main.py')
-rw-r--r--roles/raspios/image/filter_plugins/main.py62
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