diff --git a/plugins/modules/ipasudorule.py b/plugins/modules/ipasudorule.py index 5eb0efb0e7df9ab7c1282c785bb2f53a7ba5d4a3..89f0f519fd04f9e94406b1698318142986ae3f53 100644 --- a/plugins/modules/ipasudorule.py +++ b/plugins/modules/ipasudorule.py @@ -190,7 +190,7 @@ RETURN = """ from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.ansible_freeipa_module import temp_kinit, \ temp_kdestroy, valid_creds, api_connect, api_command, compare_args_ipa, \ - module_params_get, gen_add_del_lists + module_params_get, gen_add_del_lists, gen_add_list, gen_intersection_list def find_sudorule(module, name): @@ -579,6 +579,58 @@ def main(): if res_find is None: ansible_module.fail_json(msg="No sudorule '%s'" % name) + # Generate add lists for host, hostgroup, user, group, + # allow_sudocmd, allow_sudocmdgroup, deny_sudocmd, + # deny_sudocmdgroup, sudooption, runasuser, runasgroup + # and res_find to only try to add the items that not in + # the sudorule already + if host is not None and \ + "memberhost_host" in res_find: + host = gen_add_list( + host, res_find["memberhost_host"]) + if hostgroup is not None and \ + "memberhost_hostgroup" in res_find: + hostgroup = gen_add_list( + hostgroup, res_find["memberhost_hostgroup"]) + if user is not None and \ + "memberuser_user" in res_find: + user = gen_add_list( + user, res_find["memberuser_user"]) + if group is not None and \ + "memberuser_group" in res_find: + group = gen_add_list( + group, res_find["memberuser_group"]) + if allow_sudocmd is not None and \ + "memberallowcmd_sudocmd" in res_find: + allow_sudocmd = gen_add_list( + allow_sudocmd, res_find["memberallowcmd_sudocmd"]) + if allow_sudocmdgroup is not None and \ + "memberallowcmd_sudocmdgroup" in res_find: + allow_sudocmdgroup = gen_add_list( + allow_sudocmdgroup, + res_find["memberallowcmd_sudocmdgroup"]) + if deny_sudocmd is not None and \ + "memberdenycmd_sudocmd" in res_find: + deny_sudocmd = gen_add_list( + deny_sudocmd, res_find["memberdenycmd_sudocmd"]) + if deny_sudocmdgroup is not None and \ + "memberdenycmd_sudocmdgroup" in res_find: + deny_sudocmdgroup = gen_add_list( + deny_sudocmdgroup, + res_find["memberdenycmd_sudocmdgroup"]) + if sudooption is not None and \ + "ipasudoopt" in res_find: + sudooption = gen_add_list( + sudooption, res_find["ipasudoopt"]) + if runasuser is not None and \ + "ipasudorunas_user" in res_find: + runasuser = gen_add_list( + runasuser, res_find["ipasudorunas_user"]) + if runasgroup is not None and \ + "ipasudorunasgroup_group" in res_find: + runasgroup = gen_add_list( + runasgroup, res_find["ipasudorunasgroup_group"]) + # Add hosts and hostgroups if host is not None or hostgroup is not None: commands.append([name, "sudorule_add_host", @@ -612,12 +664,12 @@ def main(): }]) # Add RunAS Users - if runasuser is not None: + if runasuser is not None and len(runasuser) > 0: commands.append([name, "sudorule_add_runasuser", {"user": runasuser}]) # Add RunAS Groups - if runasgroup is not None: + if runasgroup is not None and len(runasgroup) > 0: commands.append([name, "sudorule_add_runasgroup", {"group": runasgroup}]) @@ -638,6 +690,83 @@ def main(): if res_find is None: ansible_module.fail_json(msg="No sudorule '%s'" % name) + # Generate intersection lists for host, hostgroup, user, + # group, allow_sudocmd, allow_sudocmdgroup, deny_sudocmd + # deny_sudocmdgroup, sudooption, runasuser, runasgroup + # and res_find to only try to remove the items that are + # in sudorule + if host is not None: + if "memberhost_host" in res_find: + host = gen_intersection_list( + host, res_find["memberhost_host"]) + else: + host = None + if hostgroup is not None: + if "memberhost_hostgroup" in res_find: + hostgroup = gen_intersection_list( + hostgroup, res_find["memberhost_hostgroup"]) + else: + hostgroup = None + if user is not None: + if "memberuser_user" in res_find: + user = gen_intersection_list( + user, res_find["memberuser_user"]) + else: + user = None + if group is not None: + if "memberuser_group" in res_find: + group = gen_intersection_list( + group, res_find["memberuser_group"]) + else: + group = None + if allow_sudocmd is not None: + if "memberallowcmd_sudocmd" in res_find: + allow_sudocmd = gen_intersection_list( + allow_sudocmd, + res_find["memberallowcmd_sudocmd"]) + else: + allow_sudocmd = None + if allow_sudocmdgroup is not None: + if "memberallowcmd_sudocmdgroup" in res_find: + allow_sudocmdgroup = gen_intersection_list( + allow_sudocmdgroup, + res_find["memberallowcmd_sudocmdgroup"]) + else: + allow_sudocmdgroup = None + if deny_sudocmd is not None: + if "memberdenycmd_sudocmd" in res_find: + deny_sudocmd = gen_intersection_list( + deny_sudocmd, + res_find["memberdenycmd_sudocmd"]) + else: + deny_sudocmd = None + if deny_sudocmdgroup is not None: + if "memberdenycmd_sudocmdgroup" in res_find: + deny_sudocmdgroup = gen_intersection_list( + deny_sudocmdgroup, + res_find["memberdenycmd_sudocmdgroup"]) + else: + deny_sudocmdgroup = None + if sudooption is not None: + if "ipasudoopt" in res_find: + sudooption = gen_intersection_list( + sudooption, res_find["ipasudoopt"]) + else: + sudooption = None + if runasuser is not None: + if "ipasudorunas_user" in res_find: + runasuser = gen_intersection_list( + runasuser, res_find["ipasudorunas_user"]) + else: + runasuser = None + if runasgroup is not None: + if "ipasudorunasgroup_group" in res_find: + runasgroup = gen_intersection_list( + runasgroup, + res_find["ipasudorunasgroup_group"]) + else: + runasgroup = None + # Remove hosts and hostgroups if host is not None or hostgroup is not None: commands.append([name, "sudorule_remove_host", @@ -733,16 +862,12 @@ def main(): ansible_module.fail_json(msg="%s: %s: %s" % (command, name, str(ex))) # Get all errors - # All "already a member" and "not a member" failures in the # result are ignored. All others are reported. if "failed" in result and len(result["failed"]) > 0: for item in result["failed"]: failed_item = result["failed"][item] for member_type in failed_item: for member, failure in failed_item[member_type]: - if "already a member" in failure \ - or "not a member" in failure: - continue errors.append("%s: %s %s: %s" % ( command, member_type, member, failure)) if len(errors) > 0: