summaryrefslogtreecommitdiff
path: root/roles/raspios/image/filter_plugins/main.py
blob: a8086f661036306dbb5af3416a93cdd204dc94f0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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