HEX
Server: LiteSpeed
System: Linux kapuas.iixcp.rumahweb.net 5.14.0-427.42.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Nov 1 14:58:02 EDT 2024 x86_64
User: mirz4654 (1666)
PHP: 8.1.33
Disabled: system,exec,escapeshellarg,escapeshellcmd,passthru,proc_close,proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,popen,pclose,dl,pfsockopen,leak,apache_child_terminate,posix_kill,posix_mkfifo,posix_setsid,posix_setuid,posix_setpgid,ini_alter,show_source,define_syslog_variables,symlink,syslog,openlog,openlog,closelog,ocinumcols,listen,chgrp,apache_note,apache_setenv,debugger_on,debugger_off,ftp_exec,dll,ftp,myshellexec,socket_bind,mail,posix_getwpuid
Upload Files
File: //usr/lib/python3.9/site-packages/ansible_collections/sensu/sensu_go/plugins/modules/asset.py
# -*- coding: utf-8 -*-
# Copyright: (c) 2019, Cameron Hurst <[email protected]>
# Copyright: (c) 2019, XLAB Steampunk <[email protected]>
#
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

from __future__ import absolute_import, division, print_function
__metaclass__ = type

ANSIBLE_METADATA = {
    "metadata_version": "1.1",
    "status": ["stableinterface"],
    "supported_by": "certified",
}

DOCUMENTATION = """
module: asset
author:
  - Cameron Hurst (@wakemaster39)
  - Aljaz Kosir (@aljazkosir)
  - Manca Bizjak (@mancabizjak)
  - Miha Plesko (@miha-plesko)
  - Tadej Borovsak (@tadeboro)
short_description: Manage Sensu assets
description:
  - Create, update or delete Sensu Go asset.
  - For more information, refer to the Sensu documentation at
    U(https://docs.sensu.io/sensu-go/latest/reference/assets/).
version_added: 1.0.0
extends_documentation_fragment:
  - sensu.sensu_go.requirements
  - sensu.sensu_go.auth
  - sensu.sensu_go.name
  - sensu.sensu_go.namespace
  - sensu.sensu_go.state
  - sensu.sensu_go.labels
  - sensu.sensu_go.annotations
seealso:
  - module: sensu.sensu_go.asset_info
  - module: sensu.sensu_go.bonsai_asset
options:
  builds:
    description:
      - A list of asset builds used to define multiple artefacts which
        provide the named asset.
      - Required if I(state) is C(present).
    type: list
    elements: dict
    suboptions:
      url:
        description:
          - The URL location of the asset.
        type: str
        required: yes
      sha512:
        description:
          - The checksum of the asset.
        type: str
        required: yes
      filters:
        description:
          - A set of Sensu query expressions used to determine if the asset
            should be installed.
        type: list
        elements: str
      headers:
        description:
          - Additional headers to send when retrieving the asset, e.g. for
            authorization.
        type: dict
"""

EXAMPLES = """
- name: Create a multiple-build asset
  sensu.sensu_go.asset:
    name: sensu-plugins-cpu-checks
    builds:
      - url: https://assets.bonsai.sensu.io/68546e739d96fd695655b77b35b5aabfbabeb056/sensu-plugins-cpu-checks_4.0.0_centos_linux_amd64.tar.gz
        sha512: 518e7c17cf670393045bff4af318e1d35955bfde166e9ceec2b469109252f79043ed133241c4dc96501b6636a1ec5e008ea9ce055d1609865635d4f004d7187b
        filters:
          - entity.system.os == 'linux'
          - entity.system.arch == 'amd64'
          - entity.system.platform == 'rhel'
      - url: https://assets.bonsai.sensu.io/68546e739d96fd695655b77b35b5aabfbabeb056/sensu-plugins-cpu-checks_4.0.0_alpine_linux_amd64.tar.gz
        sha512: b2da25ecd7642e6de41fde37d674fe19dcb6ee3d680e145e32289f7cfc352e6b5f9413ee9b701d61faeaa47b399aa30b25885dbc1ca432c4061c8823774c28f3
        filters:
          - entity.system.os == 'linux'
          - entity.system.arch == 'amd64'
          - entity.system.platform == 'alpine'

- name: Delete an asset
  sensu.sensu_go.asset:
    name: sensu-plugins-cpu-check
    state: absent
"""

RETURN = """
object:
  description: Object representing Sensu asset.
  returned: success
  type: dict
  sample:
    metadata:
      name: check_script
      namespace: default
    builds:
      - sha512: 4f926bf4328f...2c58ad9ab40c9e2edc31b288d066b195b21b
        url: http://example.com/asset.tar.gz
"""

from ansible.module_utils.basic import AnsibleModule

from ..module_utils import arguments, errors, utils


def validate_module_params(params):
    if params["state"] == "present":
        if not params['builds']:
            return "builds must include at least one element"
    return None


def _build_set(builds):
    return set((
        b.get('sha512'),
        b.get('url'),
        frozenset((b.get('headers', {}) or {}).items()),
        frozenset(b.get('filters', []) or []),
    ) for b in builds)


def _do_builds_differ(current, desired):
    # Since Sensu Go 5.16, the web API returns builds: None if the asset
    # in question is a deprecated, single-build asset.
    if current is None:
        return True

    if len(current) != len(desired):
        return True

    return _build_set(current) != _build_set(desired)


def do_differ(current, desired):
    if _do_builds_differ(current['builds'], desired['builds']):
        return True

    return utils.do_differ(current, desired, 'builds')


def build_api_payload(params):
    payload = arguments.get_mutation_payload(params)
    if params['state'] == 'present':
        builds = [arguments.get_spec_payload(b, *b.keys()) for b in params['builds']]
        payload["builds"] = builds
    return payload


def main():
    required_if = [
        ("state", "present", ["builds"])
    ]
    module = AnsibleModule(
        required_if=required_if,
        supports_check_mode=True,
        argument_spec=dict(
            arguments.get_spec(
                "auth", "name", "namespace", "state", "labels", "annotations",
            ),
            builds=dict(
                type="list",
                elements="dict",
                options=dict(
                    url=dict(
                        required=True,
                    ),
                    sha512=dict(
                        required=True,
                    ),
                    filters=dict(
                        type="list",
                        elements="str",
                    ),
                    headers=dict(
                        type="dict",
                    ),
                )
            ),
        ),
    )

    msg = validate_module_params(module.params)
    if msg:
        module.fail_json(msg=msg)

    client = arguments.get_sensu_client(module.params["auth"])
    path = utils.build_core_v2_path(
        module.params["namespace"], "assets", module.params["name"],
    )
    payload = build_api_payload(module.params)

    try:
        changed, asset = utils.sync(
            module.params["state"], client, path, payload, module.check_mode, do_differ
        )
        module.exit_json(changed=changed, object=asset)
    except errors.Error as e:
        module.fail_json(msg=str(e))


if __name__ == "__main__":
    main()