Blame plugins/modules/ipapermission.py

Packit Service ee01e6
#!/usr/bin/python
Packit Service a166ed
# -*- coding: utf-8 -*-
Packit Service a166ed
Packit Service a166ed
# Authors:
Packit Service a166ed
#   Seth Kress <kresss@gmail.com>
Packit Service a166ed
#
Packit Service a166ed
# Copyright (C) 2020 Red Hat
Packit Service a166ed
# see file 'COPYING' for use and warranty information
Packit Service a166ed
#
Packit Service a166ed
# This program is free software; you can redistribute it and/or modify
Packit Service a166ed
# it under the terms of the GNU General Public License as published by
Packit Service a166ed
# the Free Software Foundation, either version 3 of the License, or
Packit Service a166ed
# (at your option) any later version.
Packit Service a166ed
#
Packit Service a166ed
# This program is distributed in the hope that it will be useful,
Packit Service a166ed
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a166ed
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a166ed
# GNU General Public License for more details.
Packit Service a166ed
#
Packit Service a166ed
# You should have received a copy of the GNU General Public License
Packit Service a166ed
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service a166ed
Packit Service a166ed
ANSIBLE_METADATA = {
Packit Service a166ed
    "metadata_version": "1.0",
Packit Service a166ed
    "supported_by": "community",
Packit Service a166ed
    "status": ["preview"],
Packit Service a166ed
}
Packit Service a166ed
Packit Service a166ed
DOCUMENTATION = """
Packit Service a166ed
---
Packit Service a166ed
module: ipapermission
Packit Service a166ed
short description: Manage FreeIPA permission
Packit Service a166ed
description: Manage FreeIPA permission and permission members
Packit Service a166ed
options:
Packit Service a166ed
  ipaadmin_principal:
Packit Service a166ed
    description: The admin principal.
Packit Service a166ed
    default: admin
Packit Service a166ed
  ipaadmin_password:
Packit Service a166ed
    description: The admin password.
Packit Service a166ed
    required: false
Packit Service a166ed
  name:
Packit Service a166ed
    description: The permission name string.
Packit Service a166ed
    required: true
Packit Service a166ed
    aliases: ["cn"]
Packit Service a166ed
  right:
Packit Service a166ed
    description: Rights to grant
Packit Service a166ed
    required: false
Packit Service a166ed
    choices: ["read", "search", "compare", "write", "add", "delete", "all"]
Packit Service a166ed
    type: list
Packit Service a166ed
    aliases: ["ipapermright"]
Packit Service a166ed
  attrs:
Packit Service a166ed
    description: All attributes to which the permission applies
Packit Service a166ed
    required: false
Packit Service a166ed
    type: list
Packit Service a166ed
  bindtype:
Packit Service a166ed
    description: Bind rule type
Packit Service a166ed
    required: false
Packit Service a166ed
    choices: ["permission", "all", "anonymous"]
Packit Service a166ed
    aliases: ["ipapermbindruletype"]
Packit Service a166ed
  subtree:
Packit Service a166ed
    description: Subtree to apply permissions to
Packit Service a166ed
    required: false
Packit Service a166ed
    aliases: ["ipapermlocation"]
Packit Service a166ed
  filter:
Packit Service a166ed
    description: Extra target filter
Packit Service a166ed
    required: false
Packit Service a166ed
    type: list
Packit Service a166ed
    aliases: ["extratargetfilter"]
Packit Service a166ed
  rawfilter:
Packit Service a166ed
    description: All target filters
Packit Service a166ed
    required: false
Packit Service a166ed
    type: list
Packit Service a166ed
    aliases: ["ipapermtargetfilter"]
Packit Service a166ed
  target:
Packit Service a166ed
    description: Optional DN to apply the permission to
Packit Service a166ed
    required: false
Packit Service a166ed
    aliases: ["ipapermtarget"]
Packit Service a166ed
  targetto:
Packit Service a166ed
    description: Optional DN subtree where an entry can be moved to
Packit Service a166ed
    required: false
Packit Service a166ed
    aliases: ["ipapermtargetto"]
Packit Service a166ed
  targetfrom:
Packit Service a166ed
    description: Optional DN subtree from where an entry can be moved
Packit Service a166ed
    required: false
Packit Service a166ed
    aliases: ["ipapermtargetfrom"]
Packit Service a166ed
  memberof:
Packit Service a166ed
    description: Target members of a group (sets memberOf targetfilter)
Packit Service a166ed
    required: false
Packit Service a166ed
    type: list
Packit Service a166ed
  targetgroup:
Packit Service a166ed
    description: User group to apply permissions to (sets target)
Packit Service a166ed
    required: false
Packit Service a166ed
    aliases: ["targetgroup"]
Packit Service a166ed
  object_type:
Packit Service a166ed
    description: Type of IPA object (sets subtree and objectClass targetfilter)
Packit Service a166ed
    required: false
Packit Service a166ed
    aliases: ["type"]
Packit Service a166ed
  no_members:
Packit Service a166ed
    description: Suppress processing of membership
Packit Service a166ed
    required: false
Packit Service a166ed
    type: bool
Packit Service a166ed
  rename:
Packit Service a166ed
    description: Rename the permission object
Packit Service a166ed
    required: false
Packit Service a166ed
  privilege:
Packit Service a166ed
    description: Member Privilege of Permission
Packit Service a166ed
    required: false
Packit Service a166ed
    type: list
Packit Service a166ed
  action:
Packit Service a166ed
    description: Work on permission or member privilege level.
Packit Service a166ed
    choices: ["permission", "member"]
Packit Service a166ed
    default: permission
Packit Service a166ed
    required: false
Packit Service a166ed
  state:
Packit Service a166ed
    description: The state to ensure.
Packit Service a166ed
    choices: ["present", "absent", "renamed"]
Packit Service a166ed
    default: present
Packit Service a166ed
    required: true
Packit Service a166ed
"""
Packit Service a166ed
Packit Service a166ed
EXAMPLES = """
Packit Service a166ed
# Ensure permission NAME is present
Packit Service a166ed
- ipapermission:
Packit Service a166ed
    name: manage-my-hostgroup
Packit Service a166ed
    right: all
Packit Service a166ed
    bindtype: permission
Packit Service a166ed
    object_type: host
Packit Service a166ed
Packit Service a166ed
# Ensure permission "NAME" member privilege VALUE is present
Packit Service a166ed
- ipapermission:
Packit Service a166ed
    name: "Add Automember Rebuild Membership Task"
Packit Service a166ed
    privilege: "Automember Task Administrator"
Packit Service a166ed
    action: member
Packit Service a166ed
Packit Service a166ed
# Ensure permission "NAME" member privilege VALUE is absent
Packit Service a166ed
- ipapermission:
Packit Service a166ed
    name: "Add Automember Rebuild Membership Task"
Packit Service a166ed
    privilege: "IPA Masters Readers"
Packit Service a166ed
    action: member
Packit Service a166ed
    state: absent
Packit Service a166ed
Packit Service a166ed
# Ensure permission NAME is absent
Packit Service a166ed
- ipapermission:
Packit Service a166ed
    name: "Removed Permission Name"
Packit Service a166ed
    state: absent
Packit Service a166ed
"""
Packit Service a166ed
Packit Service a166ed
RETURN = """
Packit Service a166ed
"""
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
from ansible.module_utils.basic import AnsibleModule
Packit Service a166ed
from ansible.module_utils.ansible_freeipa_module import \
Packit Service a166ed
    temp_kinit, temp_kdestroy, valid_creds, api_connect, api_command, \
Packit Service a166ed
    compare_args_ipa, module_params_get, gen_add_del_lists, \
Packit Service a166ed
    api_check_ipa_version
Packit Service a166ed
import six
Packit Service a166ed
Packit Service a166ed
if six.PY3:
Packit Service a166ed
    unicode = str
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
def find_permission(module, name):
Packit Service a166ed
    """Find if a permission with the given name already exist."""
Packit Service a166ed
    try:
Packit Service a166ed
        _result = api_command(module, "permission_show", name, {"all": True})
Packit Service a166ed
    except Exception:  # pylint: disable=broad-except
Packit Service a166ed
        # An exception is raised if permission name is not found.
Packit Service a166ed
        return None
Packit Service a166ed
    else:
Packit Service a166ed
        return _result["result"]
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
def gen_args(right, attrs, bindtype, subtree,
Packit Service a166ed
             extra_target_filter, rawfilter, target,
Packit Service a166ed
             targetto, targetfrom, memberof, targetgroup,
Packit Service a166ed
             object_type, no_members, rename):
Packit Service a166ed
    _args = {}
Packit Service a166ed
    if right is not None:
Packit Service a166ed
        _args["ipapermright"] = right
Packit Service a166ed
    if attrs is not None:
Packit Service a166ed
        _args["attrs"] = attrs
Packit Service a166ed
    if bindtype is not None:
Packit Service a166ed
        _args["ipapermbindruletype"] = bindtype
Packit Service a166ed
    if subtree is not None:
Packit Service a166ed
        _args["ipapermlocation"] = subtree
Packit Service a166ed
    if extra_target_filter is not None:
Packit Service a166ed
        _args["extratargetfilter"] = extra_target_filter
Packit Service a166ed
    if rawfilter is not None:
Packit Service a166ed
        _args["ipapermtargetfilter"] = rawfilter
Packit Service a166ed
    if target is not None:
Packit Service a166ed
        _args["ipapermtarget"] = target
Packit Service a166ed
    if targetto is not None:
Packit Service a166ed
        _args["ipapermtargetto"] = targetto
Packit Service a166ed
    if targetfrom is not None:
Packit Service a166ed
        _args["ipapermtargetfrom"] = targetfrom
Packit Service a166ed
    if memberof is not None:
Packit Service a166ed
        _args["memberof"] = memberof
Packit Service a166ed
    if targetgroup is not None:
Packit Service a166ed
        _args["targetgroup"] = targetgroup
Packit Service a166ed
    if object_type is not None:
Packit Service a166ed
        _args["type"] = object_type
Packit Service a166ed
    if no_members is not None:
Packit Service a166ed
        _args["no_members"] = no_members
Packit Service a166ed
    if rename is not None:
Packit Service a166ed
        _args["rename"] = rename
Packit Service a166ed
    return _args
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
def gen_member_args(privilege):
Packit Service a166ed
    _args = {}
Packit Service a166ed
    if privilege is not None:
Packit Service a166ed
        _args["privilege"] = privilege
Packit Service a166ed
    return _args
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
def main():
Packit Service a166ed
    ansible_module = AnsibleModule(
Packit Service a166ed
        argument_spec=dict(
Packit Service a166ed
            # general
Packit Service a166ed
            ipaadmin_principal=dict(type="str", default="admin"),
Packit Service a166ed
            ipaadmin_password=dict(type="str", required=False, no_log=True),
Packit Service a166ed
Packit Service a166ed
            name=dict(type="list", aliases=["cn"],
Packit Service a166ed
                      default=None, required=True),
Packit Service a166ed
            # present
Packit Service a166ed
            right=dict(type="list", aliases=["ipapermright"], default=None,
Packit Service a166ed
                       required=False,
Packit Service a166ed
                       choices=["read", "search", "compare", "write", "add",
Packit Service a166ed
                                "delete", "all"]),
Packit Service a166ed
            attrs=dict(type="list", default=None, required=False),
Packit Service a166ed
            # Note: bindtype has a default of permission for Adds.
Packit Service a166ed
            bindtype=dict(type="str", aliases=["ipapermbindruletype"],
Packit Service a166ed
                          default=None, require=False, choices=["permission",
Packit Service a166ed
                          "all", "anonymous", "self"]),
Packit Service a166ed
            subtree=dict(type="str", aliases=["ipapermlocation"], default=None,
Packit Service a166ed
                         required=False),
Packit Service a166ed
            extra_target_filter=dict(type="list", aliases=["filter",
Packit Service a166ed
                                     "extratargetfilter"], default=None,
Packit Service a166ed
                                     required=False),
Packit Service a166ed
            rawfilter=dict(type="list", aliases=["ipapermtargetfilter"],
Packit Service a166ed
                           default=None, required=False),
Packit Service a166ed
            target=dict(type="str", aliases=["ipapermtarget"], default=None,
Packit Service a166ed
                        required=False),
Packit Service a166ed
            targetto=dict(type="str", aliases=["ipapermtargetto"],
Packit Service a166ed
                          default=None, required=False),
Packit Service a166ed
            targetfrom=dict(type="str", aliases=["ipapermtargetfrom"],
Packit Service a166ed
                            default=None, required=False),
Packit Service a166ed
            memberof=dict(type="list", default=None, required=False),
Packit Service a166ed
            targetgroup=dict(type="str", default=None, required=False),
Packit Service a166ed
            object_type=dict(type="str", aliases=["type"], default=None,
Packit Service a166ed
                             required=False),
Packit Service a166ed
            no_members=dict(type=bool, default=None, require=False),
Packit Service a166ed
            rename=dict(type="str", default=None, required=False),
Packit Service a166ed
            privilege=dict(type="list", default=None, required=False),
Packit Service a166ed
Packit Service a166ed
            action=dict(type="str", default="permission",
Packit Service a166ed
                        choices=["member", "permission"]),
Packit Service a166ed
            # state
Packit Service a166ed
            state=dict(type="str", default="present",
Packit Service a166ed
                       choices=["present", "absent", "renamed"]),
Packit Service a166ed
        ),
Packit Service a166ed
        supports_check_mode=True,
Packit Service a166ed
    )
Packit Service a166ed
Packit Service a166ed
    ansible_module._ansible_debug = True
Packit Service a166ed
Packit Service a166ed
    # Get parameters
Packit Service a166ed
Packit Service a166ed
    # general
Packit Service a166ed
    ipaadmin_principal = module_params_get(ansible_module,
Packit Service a166ed
                                           "ipaadmin_principal")
Packit Service a166ed
    ipaadmin_password = module_params_get(ansible_module, "ipaadmin_password")
Packit Service a166ed
    names = module_params_get(ansible_module, "name")
Packit Service a166ed
Packit Service a166ed
    # present
Packit Service a166ed
    right = module_params_get(ansible_module, "right")
Packit Service a166ed
    attrs = module_params_get(ansible_module, "attrs")
Packit Service a166ed
    bindtype = module_params_get(ansible_module, "bindtype")
Packit Service a166ed
    subtree = module_params_get(ansible_module, "subtree")
Packit Service a166ed
    extra_target_filter = module_params_get(ansible_module,
Packit Service a166ed
                                            "extra_target_filter")
Packit Service a166ed
    rawfilter = module_params_get(ansible_module, "rawfilter")
Packit Service a166ed
    target = module_params_get(ansible_module, "target")
Packit Service a166ed
    targetto = module_params_get(ansible_module, "targetto")
Packit Service a166ed
    targetfrom = module_params_get(ansible_module, "targetfrom")
Packit Service a166ed
    memberof = module_params_get(ansible_module, "memberof")
Packit Service a166ed
    targetgroup = module_params_get(ansible_module, "targetgroup")
Packit Service a166ed
    object_type = module_params_get(ansible_module, "object_type")
Packit Service a166ed
    no_members = module_params_get(ansible_module, "no_members")
Packit Service a166ed
    rename = module_params_get(ansible_module, "rename")
Packit Service a166ed
    privilege = module_params_get(ansible_module, "privilege")
Packit Service a166ed
    action = module_params_get(ansible_module, "action")
Packit Service a166ed
Packit Service a166ed
    # state
Packit Service a166ed
    state = module_params_get(ansible_module, "state")
Packit Service a166ed
Packit Service a166ed
    # Check parameters
Packit Service a166ed
Packit Service a166ed
    invalid = []
Packit Service a166ed
Packit Service a166ed
    if state == "present":
Packit Service a166ed
        if len(names) != 1:
Packit Service a166ed
            ansible_module.fail_json(
Packit Service a166ed
                msg="Only one permission can be added at a time.")
Packit Service a166ed
        if action == "member":
Packit Service a166ed
            invalid = ["right", "attrs", "bindtype", "subtree",
Packit Service a166ed
                       "extra_target_filter", "rawfilter", "target",
Packit Service a166ed
                       "targetto", "targetfrom", "memberof", "targetgroup",
Packit Service a166ed
                       "object_type", "rename"]
Packit Service a166ed
Packit Service a166ed
    if state == "renamed":
Packit Service a166ed
        if len(names) != 1:
Packit Service a166ed
            ansible_module.fail_json(
Packit Service a166ed
                msg="Only one permission can be renamed at a time.")
Packit Service a166ed
        if action == "member":
Packit Service a166ed
            ansible_module.fail_json(
Packit Service a166ed
                msg="Member Privileges cannot be renamed")
Packit Service a166ed
        invalid = ["right", "attrs", "bindtype", "subtree",
Packit Service a166ed
                   "extra_target_filter", "rawfilter", "target", "targetto",
Packit Service a166ed
                   "targetfrom", "memberof", "targetgroup", "object_type",
Packit Service a166ed
                   "no_members"]
Packit Service a166ed
Packit Service a166ed
    if state == "absent":
Packit Service a166ed
        if len(names) < 1:
Packit Service a166ed
            ansible_module.fail_json(msg="No name given.")
Packit Service a166ed
        invalid = ["right", "attrs", "bindtype", "subtree",
Packit Service a166ed
                   "extra_target_filter", "rawfilter", "target", "targetto",
Packit Service a166ed
                   "targetfrom", "memberof", "targetgroup", "object_type",
Packit Service a166ed
                   "no_members", "rename"]
Packit Service a166ed
        if action == "permission":
Packit Service a166ed
            invalid.append("privilege")
Packit Service a166ed
Packit Service a166ed
    for x in invalid:
Packit Service a166ed
        if vars()[x] is not None:
Packit Service a166ed
            ansible_module.fail_json(
Packit Service a166ed
                msg="Argument '%s' can not be used with action "
Packit Service a166ed
                "'%s' and state '%s'" % (x, action, state))
Packit Service a166ed
Packit Service a166ed
    if bindtype == "self" and api_check_ipa_version("<", "4.8.7"):
Packit Service a166ed
        ansible_module.fail_json(
Packit Service a166ed
            msg="Bindtype 'self' is not supported by your IPA version.")
Packit Service a166ed
Packit Service a166ed
    # Init
Packit Service a166ed
Packit Service a166ed
    changed = False
Packit Service a166ed
    exit_args = {}
Packit Service a166ed
    ccache_dir = None
Packit Service a166ed
    ccache_name = None
Packit Service a166ed
    try:
Packit Service a166ed
        if not valid_creds(ansible_module, ipaadmin_principal):
Packit Service a166ed
            ccache_dir, ccache_name = temp_kinit(ipaadmin_principal,
Packit Service a166ed
                                                 ipaadmin_password)
Packit Service a166ed
        api_connect()
Packit Service a166ed
Packit Service a166ed
        commands = []
Packit Service a166ed
        for name in names:
Packit Service a166ed
            # Make sure permission exists
Packit Service a166ed
            res_find = find_permission(ansible_module, name)
Packit Service a166ed
Packit Service a166ed
            # Create command
Packit Service a166ed
            if state == "present":
Packit Service a166ed
                # Generate args
Packit Service a166ed
                args = gen_args(right, attrs, bindtype, subtree,
Packit Service a166ed
                                extra_target_filter, rawfilter, target,
Packit Service a166ed
                                targetto, targetfrom, memberof, targetgroup,
Packit Service a166ed
                                object_type, no_members, rename)
Packit Service a166ed
Packit Service a166ed
                no_members_value = False
Packit Service a166ed
Packit Service a166ed
                if no_members is not None:
Packit Service a166ed
                    no_members_value = no_members
Packit Service a166ed
Packit Service a166ed
                if action == "permission":
Packit Service a166ed
                    # Found the permission
Packit Service a166ed
                    if res_find is not None:
Packit Service a166ed
                        # For all settings is args, check if there are
Packit Service a166ed
                        # different settings in the find result.
Packit Service a166ed
                        # If yes: modify
Packit Service a166ed
                        if not compare_args_ipa(ansible_module, args,
Packit Service a166ed
                                                res_find):
Packit Service a166ed
                            commands.append([name, "permission_mod", args])
Packit Service a166ed
                    else:
Packit Service a166ed
                        commands.append([name, "permission_add", args])
Packit Service a166ed
Packit Service a166ed
                    member_args = gen_member_args(privilege)
Packit Service a166ed
                    if not compare_args_ipa(ansible_module, member_args,
Packit Service a166ed
                                            res_find):
Packit Service a166ed
Packit Service a166ed
                        # Generate addition and removal lists
Packit Service a166ed
                        privilege_add, privilege_del = gen_add_del_lists(
Packit Service a166ed
                                privilege, res_find.get("member_privilege"))
Packit Service a166ed
Packit Service a166ed
                        # Add members
Packit Service a166ed
                        if len(privilege_add) > 0:
Packit Service a166ed
                            commands.append([name, "permission_add_member",
Packit Service a166ed
                                             {
Packit Service a166ed
                                                 "privilege": privilege_add,
Packit Service a166ed
                                                 "no_members": no_members_value
Packit Service a166ed
                                             }])
Packit Service a166ed
                        # Remove members
Packit Service a166ed
                        if len(privilege_del) > 0:
Packit Service a166ed
                            commands.append([name, "permission_remove_member",
Packit Service a166ed
                                             {
Packit Service a166ed
                                                 "privilege": privilege_del,
Packit Service a166ed
                                                 "no_members": no_members_value
Packit Service a166ed
                                             }])
Packit Service a166ed
                elif action == "member":
Packit Service a166ed
                    if res_find is None:
Packit Service a166ed
                        ansible_module.fail_json(
Packit Service a166ed
                            msg="No permission '%s'" % name)
Packit Service a166ed
Packit Service a166ed
                    if privilege is None:
Packit Service a166ed
                        ansible_module.fail_json(msg="No privilege given")
Packit Service a166ed
Packit Service a166ed
                    commands.append([name, "permission_add_member",
Packit Service a166ed
                                     {
Packit Service a166ed
                                         "privilege": privilege,
Packit Service a166ed
                                         "no_members": no_members_value
Packit Service a166ed
                                     }])
Packit Service a166ed
                else:
Packit Service a166ed
                    ansible_module.fail_json(
Packit Service a166ed
                        msg="Unknown action '%s'" % action)
Packit Service a166ed
            elif state == "renamed":
Packit Service a166ed
                if action == "permission":
Packit Service a166ed
                    # Generate args
Packit Service a166ed
                    # Note: Only valid arg for rename is rename.
Packit Service a166ed
                    args = gen_args(right, attrs, bindtype, subtree,
Packit Service a166ed
                                    extra_target_filter, rawfilter, target,
Packit Service a166ed
                                    targetto, targetfrom, memberof,
Packit Service a166ed
                                    targetgroup, object_type, no_members,
Packit Service a166ed
                                    rename)
Packit Service a166ed
Packit Service a166ed
                    # Found the permission
Packit Service a166ed
                    if res_find is not None:
Packit Service a166ed
                        # For all settings is args, check if there are
Packit Service a166ed
                        # different settings in the find result.
Packit Service a166ed
                        # If yes: modify
Packit Service a166ed
                        if not compare_args_ipa(ansible_module, args,
Packit Service a166ed
                                                res_find):
Packit Service a166ed
                            commands.append([name, "permission_mod", args])
Packit Service a166ed
                    else:
Packit Service a166ed
                        ansible_module.fail_json(
Packit Service a166ed
                            msg="Permission not found, cannot rename")
Packit Service a166ed
                else:
Packit Service a166ed
                    ansible_module.fail_json(
Packit Service a166ed
                        msg="Unknown action '%s'" % action)
Packit Service a166ed
            elif state == "absent":
Packit Service a166ed
                if action == "permission":
Packit Service a166ed
                    if res_find is not None:
Packit Service a166ed
                        commands.append([name, "permission_del", {}])
Packit Service a166ed
Packit Service a166ed
                elif action == "member":
Packit Service a166ed
                    if res_find is None:
Packit Service a166ed
                        ansible_module.fail_json(
Packit Service a166ed
                            msg="No permission '%s'" % name)
Packit Service a166ed
Packit Service a166ed
                    if privilege is None:
Packit Service a166ed
                        ansible_module.fail_json(msg="No privilege given")
Packit Service a166ed
Packit Service a166ed
                    commands.append([name, "permission_remove_member",
Packit Service a166ed
                                     {
Packit Service a166ed
                                         "privilege": privilege,
Packit Service a166ed
                                     }])
Packit Service a166ed
Packit Service a166ed
            else:
Packit Service a166ed
                ansible_module.fail_json(msg="Unknown state '%s'" % state)
Packit Service a166ed
Packit Service a166ed
        # Execute commands
Packit Service a166ed
Packit Service a166ed
        for name, command, args in commands:
Packit Service a166ed
            try:
Packit Service a166ed
                result = api_command(ansible_module, command, name,
Packit Service a166ed
                                     args)
Packit Service a166ed
                if "completed" in result:
Packit Service a166ed
                    if result["completed"] > 0:
Packit Service a166ed
                        changed = True
Packit Service a166ed
                else:
Packit Service a166ed
                    changed = True
Packit Service a166ed
            except Exception as e:
Packit Service a166ed
                ansible_module.fail_json(msg="%s: %s: %s" % (command, name,
Packit Service a166ed
                                                             str(e)))
Packit Service a166ed
            # Get all errors
Packit Service a166ed
            # All "already a member" and "not a member" failures in the
Packit Service a166ed
            # result are ignored. All others are reported.
Packit Service a166ed
            errors = []
Packit Service a166ed
            for failed_item in result.get("failed", []):
Packit Service a166ed
                failed = result["failed"][failed_item]
Packit Service a166ed
                for member_type in failed:
Packit Service a166ed
                    for member, failure in failed[member_type]:
Packit Service a166ed
                        if "already a member" in failure \
Packit Service a166ed
                           or "not a member" in failure:
Packit Service a166ed
                            continue
Packit Service a166ed
                        errors.append("%s: %s %s: %s" % (
Packit Service a166ed
                            command, member_type, member, failure))
Packit Service a166ed
            if len(errors) > 0:
Packit Service a166ed
                ansible_module.fail_json(msg=", ".join(errors))
Packit Service a166ed
Packit Service a166ed
    except Exception as e:
Packit Service a166ed
        ansible_module.fail_json(msg=str(e))
Packit Service a166ed
Packit Service a166ed
    finally:
Packit Service a166ed
        temp_kdestroy(ccache_dir, ccache_name)
Packit Service a166ed
Packit Service a166ed
    # Done
Packit Service a166ed
Packit Service a166ed
    ansible_module.exit_json(changed=changed, **exit_args)
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
if __name__ == "__main__":
Packit Service a166ed
    main()