
    VhO                     h   d Z ddlmZmZmZ eZdZdZddl	m
Z
mZ ddlmZmZmZmZmZ dZ	 ddlmZ ed
        Zed        Zed        Zed        Zd Zd Zed        Zd Zed        Zed        Zed        Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*e+dk(  r e*        y y # e$ r d	ZY ~w xY w)!z Manage Infinibox users     )absolute_importdivisionprint_functiona8  
---
module: infini_user
version_added: 2.9.0
short_description: Create, Delete and Modify a User on Infinibox
description:
    - This module creates, deletes or modifies a user on Infinibox.
author: David Ohlemacher (@ohlemacher)
options:
  user_name:
    description:
      - The new user's Name. Once a user is created, the user_name may not be
        changed from this module. It may be changed from the UI or from
        infinishell.
    required: false
    type: str
  user_email:
    description:
      - The new user's Email address
    required: false
    type: str
  user_password:
    description:
      - The new user's password
    required: false
    type: str
  user_role:
    description:
      - The user's role
    required: false
    choices: [ "admin", "pool_admin", "read_only" ]
    type: str
  user_enabled:
    description:
      - Specify whether to enable the user
    type: bool
    required: false
    default: true
  user_pool:
    description:
      - Use with role==pool_admin. Specify the new user's pool.
    required: false
    type: str
  state:
    description:
      - Creates/Modifies user when present or removes when absent.
      - Use state 'login' to test user credentials.
      - Use state 'reset' to reset a user password.
    required: false
    default: present
    choices: [ "stat", "reset_password", "present", "absent", "login" ]
    type: str

  user_ldap_group_name:
    description:
      - Name of the LDAP user group
    required: false
    type: str
  user_ldap_group_dn:
    description:
      - DN of the LDAP user group
    required: false
    type: str
  user_ldap_group_ldap:
    description:
      - Name of the LDAP
    required: false
    type: str
  user_ldap_group_role:
    description:
      - Role for the LDAP user group
    choices: [ "admin", "pool_admin", "read_only" ]
    required: false
    type: str
  user_ldap_group_pools:
    description:
      - A list of existing pools managed by the LDAP user group
    default: []
    required: false
    type: list
    elements: str
extends_documentation_fragment:
    - infinibox
z
- name: Create new user
  infini_user:
    user_name: foo_user
    user_email: foo@example.com
    user_password: secret2
    user_role: pool_admin
    user_enabled: false
    pool: foo_pool
    state: present
    password: secret1
    system: ibox001
)AnsibleModulemissing_required_lib)api_wrapperinfinibox_argument_spec
get_systemget_usermerge_two_dictsT)APICommandFailedFc                     d}| j                   d   }d| d}t        |       }|j                  j                  |      }t	        |j                         d         dkD  r|j                         d   d   }|d   }|S )	z4
    Find the ID of the LDAP user group by name
    Nuser_ldap_group_nameusers?name=&type=eq%3ALdappathresultr   idparamsr
   apigetlenget_jsonmoduleldap_id	ldap_namer   system
api_resultr   s          s/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/infinidat/infinibox/plugins/modules/infini_user.pyfind_user_ldap_group_idr#      s    
 G45I?3DFT*J
: *+a/$$&x03,N    c                     d}| j                   d   }d| d}t        |       }|j                  j                  |      }t	        |j                         d         dkD  r|j                         d   d   }|d   }|S )	z)
    Find the ID of the LDAP by name
    Nuser_ldap_group_ldapzconfig/ldap?name=z
&fields=idr   r   r   r   r   r   s          r"   find_ldap_idr'      s    
 G45Iyk4DFT*J
: *+a/$$&x03,Nr$   c                    | j                   s|j                  j                  | j                  d   | j                  d   | j                  d   | j                  d         }|j	                  | j                  d          | j                  d   rR| j                  d   dk(  st        d	      |j                  j                  | j                  d   
      }t        ||       d}|S )z Create user 	user_nameuser_password
user_emailuser_enabled)namepasswordemailenabled	user_role	user_pool
pool_adminz+user_pool set, but role is not 'pool_admin'r-   T)	
check_modeuserscreater   update_roleAssertionErrorpoolsr   add_user_to_pool_owners)r   r    userpoolchangeds        r"   create_userr?      s     ||""k(B,2MM/,J)/|)D+1==+H # % 	{34==%==-=$%RSS<<##{)C#DD#D$/GNr$   c                 R   | j                   d   }| j                   d   }t        |       }| j                   d   }|sd| d| }| j                  |       d}t        |       }|| j                   d   || j                   d	   d
d}	 |j                  j                  ||       d}
t        | ||      }|D ]*  }|j                  j                  |      }t        ||       , |
S # t        $ r;}	|	j                  dv r#d| d|	j                   }| j                  |       Y d}	~	d}	~	ww xY w)z Create ldap user group r   r&   user_ldap_group_poolszCannot create LDAP group z. Cannot find ID for LDAP name msgr6   user_ldap_group_dnuser_ldap_group_roleLdap)r-   dnr   roletyper   data)i  z#Cannot create user_ldap_group_name : NTr4   )r   r'   	fail_jsonr
   r   postr   status_codemessager   r:   r   r;   )r   ldap_group_namer   r   
ldap_poolsrC   r   r    rK   errr>   r<   	pool_namer=   s                 r"   create_ldap_user_grouprU      sG    mm$:;O45I6"G67J)/)::YZcYdeS!DFmm0145D"

T-
 GFFO4D ,	||Y/d+,
 N  "??e#77H3;;-XCS!"s   C" "	D&+1D!!D&c                     d}|j                  dd      }|j                  dg       }t        |      }|j                         }|j	                  | j
                         ||k7  r|j                  | g       d}|S )a"  
    Find the current list of pool owners and add user using pool.set_owners().
    set_owners() replaces the current owners with the list of new owners. So,
    get owners, add user, then set owners.  Further, we need to know if the
    owners changed.  Use sets of owners to compare.
    FT
from_cache	raw_valueowners)
get_fieldsr   setcopyaddr   
set_owners)r<   r=   r>   pool_fieldspool_ownerspool_owners_setnew_pool_owners_sets          r"   r;   r;      sw     G//TT/BK//(B/K+&O)..0DGG$--Nr$   c                     d}|j                  dd      }|j                  dg       }	 |j                  |        |j                  |       d}|S # t        $ r Y |S w xY w)z Remove user from pool owners FTrW   rZ   )r[   r   remover_   
ValueError)r<   r=   r>   r`   ra   s        r"   remove_user_from_pool_ownersrg      sm    G//TT/BK//(B/K4 $ N  Ns   $A 	AAc                    |t        d| j                  d    d      d}|j                  dd      }|j                  d      | j                  d	   j	                         k7  r!|j                  d| j                  d	          d}|j                  d
      | j                  d   k7  r!|j                  d
| j                  d          d}|j                  d      | j                  d   k7  r!|j                  d| j                  d          d}| j                  d   r:	 | j                  d   }|j                  j                  |      }t        |      rd}|S # t        $ r"}| j                  d d|        Y d}~6d}~ww xY w)z Update user NzCannot update user r)   z. User not found.FTrW   rH   r1   r0   r,   r/   r+   r2   r4   zCannot find pool rL   rB   )
r9   r   r[   r   upperupdate_fieldr:   	ExceptionrM   r;   )r   r    r<   r>   fieldsrT   r=   rS   s           r"   update_userrm     st    |26==3M2NN_`aaG___=Fzz&V]];7==??&&--"<=zz)n ==)V]]>%BCzz'fmmL99'6==#>?}}[!	Ik2I<<###3D #4.GN	  	I#4YKr#!GHH	Is   +E 	E>E99E>c                 ^    t        |       }|s| j                  d       t        |        d}|S )z> Update ldap user group by deleting and creating the LDAP userzICannot delete LDAP user {ldap_group_name}. Cannot find ID for LDAP group.rB   T)delete_ldap_user_grouprM   rU   )r   r>   s     r"   update_ldap_user_grouprp     s3    $V,Ghi6"GNr$   c                     |#| j                  d| j                  d    d       |j                  | j                  d          y)z Reset user's password NzCannot change user r)   z password. User not found.rB   r*   )rM   r   update_password)r   r<   s     r"   reset_user_passwordrs   (  sF     |26==3M2NNhij78r$   c                 H    |syd}| j                   s|j                          |S )z Delete a user FT)r5   delete)r   r<   r>   s      r"   delete_userrv   0  s&     GNr$   c                 ,   d}| j                   d   }t        |       }|sd}|S d| d}t        |       }	 |j                  j	                  |       d}|S # t
        $ r5}|j                  dv rd}nd| d	| }| j                  |       Y d
}~|S d
}~ww xY w)z Delete a ldap user group Fr   zusers/z?approved=yesr   T)i  z0An error occurred deleting user_ldap_group_name rL   N)r   r#   r
   r   ru   r   rO   rM   )r   r>   rQ   ldap_group_idr   r    rS   rC   s           r"   ro   ro   =  s     Gmm$:;O+F3MM?-0DF"

t$ N  "??e#GD_DUUWX[W\]CS!N"s   A 	B*BBc                     d}| j                   d   }d| d}t        |       }|j                  j                  |      }t	        |j                         d         dkD  r|j                         d   d   }|S )z*
    Find the LDAP user group by name
    Nr   r   r   r   r   r   r   )r   r   r   r   r    r!   s         r"   get_user_ldap_grouprz   T  s     F!==)?@-.o>DFT*J
: *+a/$$&x03Mr$   c                    | j                         }|D cg c]  }|j                  d       }}| j                  dd      }|j                  dd      |j                  dd      |j                  dd      | j                  |j                  dd      ||j                  d	d      |j                  d
g       |j                  dd      d	}|S c c}w )z Get user's fields r-   TrW   rG   Nr/   r0   r   rH   rolesrI   )	rG   r/   r0   r   r   r:   rH   r|   rI   )get_owned_pools	get_fieldr[   r   r   )r<   r:   r=   
pool_namesrl   
field_dicts         r"   get_user_fieldsr   b  s      "E5:;T$..(;J;___=Fjjt$GT*::i.gg::i.

64(GR(

64(
J  <s   C
c                    | j                   d   }| j                   d   }|rPt        |       }t        | |      }| j                   d   }|s| j                  d| d       t	        |      }d| d}nJ|r5t        |       }|s| j                  d| d       t	        |      }d| d}nd	}| j                  |       d
|d}t        |      } | j                  di | y)z) Handle stat for user or LDAP group user r)   r   User 
 not foundrB   z stat foundzuser_ldap_group_name zUser LDAP group zGNeither user_name nor user_ldap_group_name were provided for state statFr>   rC   N )r   r
   r   rM   r   rz   r   	exit_json)r   r)   r   r    r<   r   rC   r   s           r"   handle_statr   v  s   k*I!==)?@F#'MM+.	5:!>?$T*
i[,	"6*#89M8Nj!YZ$T*
 !5 6kBW F VZ0FFvr$   c                    | j                   d   }| j                   d   }d}d}|rIt        |       }t        | |      }|st        | |      }d| d}nlt	        | ||      }|rd| d}nVd| d}nO|r:t        |       }|st        |       }d	| d}n.t        |       }|rd	| d
}nd	| d}nd}| j                  |       | j                  ||       y)z Handle making user present r)   r   FzMessage not setr   z createdz updatedz update required no changeszLDAP user group z; updated by deleting and recreating with updated parametersz! update not required - no changesz8Neither user_name nor user_ldap_group_name were providedr   N)
r   r
   r   r?   rm   rz   rU   rp   rM   r   )r   r)   r   r>   rC   r    r<   	ldap_users           r"   handle_presentr     s   k*I!==)?@G
CF#'!&&1G)H-C!&&$7Gi[1i[(CD	'/	,V4G$%9$:(CC,V4G()=(>>yz()=(>>_`H
W#.r$   c                 x   | j                   d   }| j                   d   }|rWt        |       }t        | |      }| j                   d   }|s	d}d| d}nt        | |      }d| d}| j	                  ||       y
|r.t        |       }|rd| d}nd| d}| j	                  ||       y
d	}| j                  |       y
)z Handle making user absent r)   r   Fr   z already absentz removedr   zLDAP group user zINeither user_name nor user_ldap_group_name were provided for state absentN)r   r
   r   rv   r   ro   rM   )r   r)   r   r    r<   r>   rC   s          r"   handle_absentr     s    k*I!==)?@F#'MM+.	G)O4C!&$/G)H-Cc2	(0$%9$:(CC$%9$:/JCc2Yr$   c                     t        |       }t        | |      }| j                  d   }|sd| d}| j                  |       y	t	        | |       d| d}| j                  d|       y	)
z Reset user password r)   zCannot change password. User r   rB   r   z password changedTr   N)r
   r   r   rM   rs   r   )r   r    r<   r)   rC   s        r"   handle_reset_passwordr     st    FFF#Dk*I-i[
CS!FD)i[ 123/r$   c                    t        |       }| j                  d   }| j                  d   }d}||d}	 |j                  j                  ||      }j                  d	k(  rd| d
}| j                  d|       yd| d|j                   }| j                  |       y# t        $ r d| d}| j                  |       Y qw xY w)z% Test user credentials by logging in r)   r*   zusers/login)usernamer.   rJ   r   z failed to loginrB      z successfully logged inFr   z# failed to login with status code: N)r
   r   r   rN   r   rM   rO   r   )r   r    r)   r*   r   rK   loginrC   s           r"   handle_loginr     s    Fk*IMM/2MD!D"

T5 Ci[ 78C0i[ CEDUDUCVWS!  "i[ 01S!"s   B !C Cc                 n   | j                   d   }	 |dk(  rt        |        nY|dk(  rt        |        nH|dk(  rt        |        n7|dk(  rt	        |        n&|dk(  rt        |        n| j                  d|        t        |       }|j                          y	# t        |       }|j                          w xY w)
z Find state and handle it statestatpresentabsentreset_passwordr   z'Internal handler error. Invalid state: rB   N)	r   r   r   r   r   r   rM   r
   logout)r   r   r    s      r"   execute_stater     s    MM'"EF?i6"h&!&&!&)g #J5'!RSF# F#s   A*B B4c                 6   | j                   d   }| j                   d   }| j                   d   }| j                   d   }| j                   d   }| j                   d   }|dk(  r|dk(  r|s| j                  d	
       |dk7  r|r| j                  d
       |s|sd}| j                  |
       |r|rd}| j                  |
       |r5g d}|D ],  }	| j                   |	   }
|
d|	 d}| j                  |
       . |rbg d}|D ],  }	| j                   |	   }
|
rd|	 d}| j                  |
       . |dk(  r'| j                   d   }|sd}| j                  |
       yyyy|dv r8| j                   d   r| j                   d   sd| d}| j                  |
       yyy)z Check option logic r   r)   r1   r2   r   rE   r   r3   z:user_role "pool_admin" requires a user_pool to be providedrB   z<Only user_role "pool_admin" should have a user_pool providedzIFor state "present", option user_name or user_ldap_group_name is requiredzVFor state "present", option user_name and user_ldap_group_name cannot both be provided)r+   r*   r1   NzFor state 'present', option z" is required with option user_name)rD   r&   rE   zFor state "present", option z- is required with option user_ldap_group_namerA   znFor state 'present' and user_ldap_group_role 'pool_admin', user_ldap_group_pool must specify one or more pools)r   r   r*   zFor state 'z0', user_name and user_password are both required)r   rM   )r   r   r)   r1   r2   r   rE   rC   required_user_paramsrequired_paramparamrequired_user_ldap_paramsrA   s                r"   check_optionsr     s   MM'"Ek*Ik*Ik*I!==)?@!==)?@	$Y!]^$!_`!5]C%-jC%$  #7 .n5=88HHjkC$$$-	.  )% #< .n588HHuvC$$$-	.
 $|3(.6M(N%, KC$$$- - 4   
-	-}}[)1Ow&VWC% 2P 
.r$   c                  
   t               } | j                  t        t        d      t        dd      t        ddd      t        dg dd      t        dd	d
      t        dd      t        dd      t        dd      t        dd      t        dg dd      t        dddg       t        dg d                   t        | d      }t        s|j                  t        d             t        |       t        |       y)z main F)requiredN)r   defaultT)r   no_logr   )adminr3   	read_only)r   choicesr   bool)r   rI   r   liststr)r   rI   elementsr   r   )r   r   r   r   r   )r   r   )r)   r+   r*   r1   r,   r2   r   rD   r&   rE   rA   r   )supports_check_mode	infinisdkrB   )	r	   updatedictr   HAS_INFINISDKrM   r   r   r   )argument_specr   s     r"   mainr   C  s    +-ME*UD9dDIE3Waefu64HE48!%ud!C#UDA!%ud!C!%u>blp!q"&FU\^"_y2jk	
" =dCF1+>?&&r$   __main__N),__doc__
__future__r   r   r   rI   __metaclass__DOCUMENTATIONEXAMPLESansible.module_utils.basicr   r   Fansible_collections.infinidat.infinibox.plugins.module_utils.infiniboxr   r	   r
   r   r   r   infinisdk.core.exceptionsr   ImportErrorr#   r'   r?   rU   r;   rg   rm   rp   rs   rv   ro   rz   r   r   r   r   r   r   r   r   r   __name__r   r$   r"   <module>r      sV    C BSj" K  :
      (    F&  8 9 9 	 	  ,(<"/J60".*2&j: zF {  Ms   B' 'B10B1