
    Vh!                         d dl mZmZmZ eZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d Z G d	 d
e      Zd Zy)    )absolute_importdivisionprint_functionN)to_bytes	to_nativeto_text)PY3)quote)	fetch_url
HAS_GSSAPI)env_fallbackAnsibleFallbackNotFoundc                      	 t        | i |}|dk(  rt        |S # t        $ rB 	 t        j                  t        j                  d            d   cY S # t
        $ r t        w xY ww xY w)z1 Load value from environment or DNS in that order zipa-car   )r   r   socketgethostbyaddrgethostbyname	Exception)argskwargsresults      n/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/module_utils/ipa.py_env_then_dns_fallbackr      sr    *t.v.R<))" *	*''(<(<X(FGJJ 	*))	**s     	A%*AA%A!!A%c                   L    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dd	Z
d
 ZddZy)	IPAClientc                     || _         || _        || _        || _        d | _        |j
                  j                  d      | _        d| _        y )Nipa_timeoutF)	hostportprotocolmoduleheadersparamsgettimeout
use_gssapi)selfr!   r   r   r    s        r   __init__zIPAClient.__init__/   sB    		 }}((7    c                 :    | j                   d| j                  dS )Nz://z/ipa)r    r   r'   s    r   get_base_urlzIPAClient.get_base_url8   s     $tyy99r)   c                 (    d| j                         z  S )N%s/session/json)r,   r+   s    r   get_json_urlzIPAClient.get_json_url;   s     4#4#4#666r)   c                    dt         j                  v rt        r	d| _        nRdt         j                  v rAt        r;dt	        t        j                               z   }|t         j                  d<   d| _        n|sQdt         j                  v sdt         j                  v r| j                  j                  d       | j                  dd       d| j                         z  }d	t        |d
      dt        |d
      }| j                         ddd}	 t        | j                  |t        |      || j                        \  }}|d   }	|	dvr| j                  d|d          d|j                  d      i| _        | j                   st'               | _        | j                   j)                  | j                         ddd       y # t"        $ r%}
| j                  dt%        |
             Y d }
~
rd }
~
ww xY w)N
KRB5CCNAMETKRB5_CLIENT_KTNAMEzMEMORY:z;In order to use GSSAPI, you need to install 'urllib_gssapi'loginzPassword is required if not using GSSAPI. To use GSSAPI, please set the KRB5_CLIENT_KTNAME or KRB5CCNAME (or both)  environment variables.z%s/session/login_passwordzuser=r   )safez
&password=z!application/x-www-form-urlencodedz
text/plain)refererzContent-TypeAccept)r!   urldatar"   r%   status         msgCookiez
set-cookiezapplication/json)osenvironr   r&   struuiduuid4r!   warn_failr,   r
   r   r   r%   r$   r"   r   r   dictupdate)r'   usernamepasswordccacher7   r8   r"   respinfostatus_codees              r   r3   zIPAClient.login>   s   2::%*"DO!RZZ/JTZZ\!22F'-BJJ|$"DO2::-1E1SKK$$%bc

7 %5 6 .0A0A0CCC,1(,DeH[]F^_D"&"3"3"5'J!-/G2&dkksRVahrvr~r~
d"8no5JJwU4 ($((<*@A ||6DL((*.(* 	+	  2

7IaL112s   A&F= =	G+G&&G+c                 v    d|v r|j                  d      }n|}| j                  j                  |d|       y )Nmessagez: )r>   )r$   r!   	fail_json)r'   r>   rO   
err_strings       r   rF   zIPAClient._failb   s6    >y)JJc:">?r)   c                     | j                         d   }t        j                  d      }|j                  |      }d }|r|j	                         d   }|S )Nsummaryz$IPA server version (\d+\.\d+\.\d+).*r   )pingrecompilematchgroups)r'   responseipa_ver_regexversion_matchipa_versions        r   get_ipa_versionzIPAClient.get_ipa_versioni   sR    99;y)

#JK%++H5'..03Kr)   c                 (    | j                  dd       S )NrV   )methodname)
_post_jsonr+   s    r   rV   zIPAClient.pingr   s    f488r)   Nc           	         |i }d| j                         z  }t        |      }|dv rg i g|d<   n|dv rg |g|d<   n|g|g|d<   	 t        | j                  |t	        t        j                  |            | j                  | j                  | j                        \  }}|d   }|dvr| j                  ||d	          t        rj                  j                  d      }
n"j                  j                  d      }|r|}
nd}
t        j                   t#        |j%                         |
            }|j'                  d      }|| j                  d|z  |       d|v rM|j'                  d      }d|v r6|j'                  d      }t)        |t*              rt-        |      dkD  r|d   S i S |S y # t        $ r)}	| j                  d
|z  t        |	             Y d }	~	d }	~	ww xY w)Nr.   )ra   )rV   config_showotpconfig_showr#   )
config_modotpconfig_mod)r!   r7   r8   r"   r%   r&   r9   r:   r>   zpost %szlatin-1charset)encodingerrorzresponse %sr   r   )r,   rG   r   r!   r   jsondumpsr"   r%   r&   rF   r   r   r	   get_content_charsetgetparamloadsr   readr$   
isinstancelistlen)r'   ra   rb   itemr7   r8   rL   rM   rN   rO   ri   response_charseterrr   s                 r   rc   zIPAClient._post_jsonu   s   <D$"3"3"556" >> "XDN66 $ZDN#fd^DN	9"$++3XdjjY]N^E_+/<<Z^ZiZikJD$x.K/1

64;/ ll66yAG#||44Y?*#zz'$))+@Ahhw?JJ}v-s3tXXh'F6!H-fd+6{Q%ay(!	M5  	9JJy6)9Q<88	9s   A6F' '	G0GGc                    g }|j                         D ]  }|j                  |d       }t        |t              rg }nd }|j                  ||      }t        |t              rt        |t              s|g}t        |t              r&t        |t              rt	        |      }t	        |      }||k7  s|j                  |        |S N)keysr$   rr   rs   sortedappend)r'   ipa_datamodule_datar   key	mod_valuedefault	ipa_values           r   get_diffzIPAClient.get_diff   s    ##% 	#C#T2I)T* S'2I)T*:i3N&K	)T*z)T/J"9-	"9-	I%c"	# r)   c                    d}t        t        |      t        |      z
        }	|dur?t        |	      dkD  r1d}| j                  j                  s|r ||||	i       n
 |||	       t        t        |      t        |      z
        }	t        |	      dkD  r2d}| j                  j                  s|r ||||	i       |S  |||	       |S )NFTr   )rb   ru   )rs   setrt   r!   
check_mode)
r'   rb   ipa_listmodule_list
add_methodremove_methodru   r|   changeddiffs
             r   modify_if_diffzIPAClient.modify_if_diff   s    CMC$445#d)a-G;;))!t4,?!t$7C$s8}45t9q=G;;))Dd|<  Dt4r)   ry   )NN)__name__
__module____qualname__r(   r,   r/   r3   rF   r_   rV   rc   r   r    r)   r   r   r   .   s7     :7"+H@9.`$r)   r   c                  &   t        t        ddddgt        dgf      t        ddt        dgf      t        d	d
t        dgf      t        ddt        dgf      t        ddt        dgf      t        d	dt        dgf      t        dd            S )NrB   httpshttpIPA_PROT)typer   choicesfallbackzipa.example.comIPA_HOST)r   r   r   inti  IPA_PORTadminIPA_USERTIPA_PASS)r   no_logr   
   IPA_TIMEOUTbool)r   r   )ipa_protipa_hostipa_portipa_useripa_passr   validate_certs)rG   r   r   r   r)   r   ipa_argument_specr      s    5'FG;LXdgqfrWst5*;G]`j_kFlm5#
|8TU5'\J<<XY5
|8TUeR<-:YZ6 r)   )
__future__r   r   r   r   __metaclass__rl   r@   r   rC   rW   +ansible.module_utils.common.text.convertersr   r   r   ansible.module_utils.sixr	   +ansible.module_utils.six.moves.urllib.parser
   ansible.module_utils.urlsr   r   ansible.module_utils.basicr   r   r   objectr   r   r   r)   r   <module>r      sM    C B  	   	 T T ( = ; L*"] ]@	r)   