B
    `(                 @   s   d dl mZmZmZ eZddgddZdZdZdZ	d d	l
Z
d d
lmZmZ ddlmZmZmZ yd d	lZdZd	ZW n  ek
r   dZe
 ZY nX dd Zdd Zdd Zdd Zdd Zdd Zdd Zedkre  d	S )    )absolute_importdivisionprint_functionz1.1ZstableinterfaceZ	certified)metadata_versionstatusZsupported_bya  
module: user
author:
  - Paul Arthur (@flowerysong)
  - Aljaz Kosir (@aljazkosir)
  - Tadej Borovsak (@tadeboro)
short_description: Manage Sensu users
description:
  - Create, update, activate or deactivate Sensu user.
  - For more information, refer to the Sensu documentation at
    U(https://docs.sensu.io/sensu-go/latest/reference/rbac/#users).
version_added: 1.0.0
extends_documentation_fragment:
  - sensu.sensu_go.requirements
  - sensu.sensu_go.auth
  - sensu.sensu_go.name
requirements:
  - bcrypt (when managing Sensu Go 5.21.0 or newer)
seealso:
  - module: sensu.sensu_go.user_info
options:
  state:
    description:
      - Desired state of the user.
      - Users cannot actually be deleted, only deactivated.
    type: str
    choices: [ enabled, disabled ]
    default: enabled
  password:
    description:
      - Password for the user.
      - Required if user with a desired name does not exist yet on the backend
        and I(password_hash) is not set.
      - If both I(password) and I(password_hash) are set, I(password_hash) is
        ignored and calculated from the I(password) if required.
    type: str
  password_hash:
    description:
      - Bcrypt password hash for the user.
      - Use C(sensuctl user hash-password PASSWORD) to generate a hash.
      - Required if user with a desired name does not exist yet on the backend
        and I(password) is not set.
      - If both I(password) and I(password_hash) are set, I(password_hash) is
        ignored and calculated from the I(password) if required.
      - Sensu Go < 5.21.0 does not support creating/updating users using
        hashed passwords. Use I(password) parameter if you need to manage such
        Sensu Go installations.
      - At the moment, change detection does not work properly when using
        password hashes because the Sensu Go backend does not expose enough
        information via its API.
    type: str
    version_added: 1.8.0
  groups:
    description:
      - List of groups user belongs to.
    type: list
    elements: str
a  
- name: Create a user
  sensu.sensu_go.user:
    auth:
      url: http://localhost:8080
    name: awesome_username
    password: hidden_password?
    groups:
      - dev
      - prod

- name: Use pre-hashed password
  sensu.sensu_go.user:
    auth:
      url: http://localhost:8080
    name: awesome_username
    password_hash: $5f$14$.brXRviMZpbaleSq9kjoUuwm67V/s4IziOLGHjEqxJbzPsreQAyNm

- name: Deactivate a user
  sensu.sensu_go.user:
    name: awesome_username
    state: disabled
a  
object:
  description: Object representing Sensu user.
  returned: success
  type: dict
  sample:
    disabled: false
    groups:
      - ops
      - dev
    password: USER_PASSWORD
    password_hash: $5f$14$.brXRviMZpbaleSq9kjoUuwm67V/s4IziOLGHjEqxJbzPsreQAyNm
    username: alice
N)AnsibleModulemissing_required_lib   )	argumentserrorsutilsTFc                s   d t  fdd|  D S )N)passwordpassword_hashc             3   s"   | ]\}}| kr||fV  qd S )N ).0kv)masked_keysr   f/home/dcms/DCMS/lib/python3.7/site-packages/ansible_collections/sensu/sensu_go/plugins/modules/user.py	<genexpr>   s    z-_simulate_backend_response.<locals>.<genexpr>)dictitems)payloadr   )r   r   _simulate_backend_response   s    r   c          	   C   st   |  ||rdS |sp| jdk r:t| |d t||d n6t|dt }t| |d t||	dd d	S )
NFz5.21.0z	/password)usernamer   zutf-8z/reset_passwordascii)r   r   T)
Zvalidate_auth_dataversionr   putr   bcryptZhashpwencodeZgensaltdecode)clientpathr   r   
check_modehashr   r   r   update_password   s    
r%   c             C   s6   | j dk rtd|s2t| |d t||d dS )Nz5.21.0z2Sensu Go < 5.21.0 does not support password hashesz/reset_password)r   r   T)r   r   
SensuErrorr   r   r   )r!   r"   r   r   r#   r   r   r   update_password_hash   s    
r'   c             C   sz   t ||}t ||}|sfx"|D ]}t| |d | d  q&W x |D ]}t| |d |  qJW t|t| dkS )Nz/groups/r   )set
differencer   r   deletelen)r!   r"   Z
old_groupsZ
new_groupsr#   Z	to_deleteZto_addgr   r   r   update_groups   s    

r-   c             C   s8   ||k}|s4|r4|r"t | | nt | |d d  |S )Nz
/reinstate)r   r*   r   )r!   r"   Zold_disabledZnew_disabledr#   changedr   r   r   update_state   s    r/   c             C   s   | d kr6|rdt |fS t||| dt||fS d}d|kr`t|||d |d |p\|}n$d|krt|||d |d |p|}d|krt||| dpg |d |p|}d|krt||| d |d |p|}|r|t| ft |fS |t||fS )NTFr   r   r   groupsdisabled)	r   r   r   getr%   r'   r-   r/   r   )remote_objectr!   r"   r   r#   r.   r   r   r   sync   s<    r4   c              C   s  t dttddtdddgdtddtddtd	d
ddd} t| jd }td d| jd }y$ts|j	dkr| j
tdtd W n4 tjk
r } z| j
t|d W d d }~X Y nX yt||}W n6 tjk
r } z| j
t|d W d d }~X Y nX |d kr>| jd d kr>| jd d kr>| j
dd t| jddd}| jd |d< | jd dk|d< y(t||||| j\}}| j||d W n6 tjk
r } z| j
t|d W d d }~X Y nX d S )NTauthnameZenabledr1   )defaultchoices)Zno_logFliststr)typeelements)stater   r   r0   )Zsupports_check_modeZargument_specZusersz5.21.0r   )msg	exception)r>   r   r   z3Cannot create new user without a password or a hashr0   r   r=   )r.   object)r   r   r
   Zget_specZget_sensu_clientparamsr   Zbuild_core_v2_path
HAS_BCRYPTr   Z	fail_jsonr   BCRYPT_IMPORT_ERRORr   r&   r:   r2   ErrorZget_spec_payloadr4   r#   Z	exit_json)moduler!   r"   er3   r   r.   userr   r   r   main  sR    

""
rH   __main__)
__future__r   r   r   r;   __metaclass__ZANSIBLE_METADATAZDOCUMENTATIONZEXAMPLESZRETURN	tracebackZansible.module_utils.basicr   r   Zmodule_utilsr
   r   r   r   rB   rC   ImportError
format_excr   r%   r'   r-   r/   r4   rH   __name__r   r   r   r   <module>   s4   <;>