
    Vh>                     2   d dl mZmZmZ eZd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 d dlmZ d dlmZ d dlmZmZ 	 d dlmZmZmZ d	Z	 d dlmZmZ d dlmZ d dl m!Z! d	Z"dddZ#g dZ$e$g dz   Z% G d de      Z&y# e$ r d
ZY <w xY w# e$ r d
Z"Y 2w xY w)    )absolute_importdivisionprint_functiona  
---
name: aci
author:
- Shreyas Srish (@shrsr)
short_description: Ansible ACI HTTPAPI Plugin.
description:
  - This ACI plugin provides the HTTPAPI methods needed to initiate
    a connection to the APIC, send API requests and process the
    response from the controller.
N)to_text	to_native)ConnectionError)HttpApiBase)copydeepcopy)FILETYPE_PEMload_privatekeysignTF)serializationhashes)padding)default_backendremote_userpersistent_command_timeout)usernametimeout)r   passwordport)r   	use_proxyuse_sslvalidate_certsc                   j     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZddZ xZS )HttpApic                     t        t        | 
  |i | d | _        i | _        d | _        d| _        i | _        d | _        d | _	        d | _
        y )NF)superr   __init__paramsresultbackup_hostsconnection_error_checkconnection_parameterscurrent_hostprovided_hostsinventory_hosts)selfargskwargs	__class__s      a/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/cisco/aci/plugins/httpapi/aci.pyr    zHttpApi.__init__E   sU    gt%t6v6 &+#%'" "#    c                     || _         y )N)r!   )r)   r!   s     r-   
set_paramszHttpApi.set_paramsP   s	    r.   c           	      l   | j                   j                  ddj                  || j                   j                  d                   d}d}dd||dii}t	        j
                  |      }d	| j                   _        	 | j                   j                  |||
      \  }}d|j                  j                  d      i| j                   _
        | j                   j                  ddj                  | j                   j                  d                   y# t        $ r}	d| j                   _        ||	_         d}	~	ww xY w)zLog in to APICdebugz!Establishing login for {0} to {1}hostPOSTz/api/aaaLogin.jsonaaaUser
attributes)namepwdTmethodCookiez
Set-Cookiez Connection to {0} was successfulFN)
connectionqueue_messageformat
get_optionjsondumps
_connectedsendheadersget_auth	Exceptionpath)
r)   r   r   r:   rH   payloaddataresponseresponse_data	exc_logins
             r-   loginzHttpApi.loginT   s&    	%%g/R/Y/YZbdhdsdsd~d~  @F  eG  0H  	I#|hx-PQRzz'"%)"	&*oo&:&:4f&:&U#Hm%-x/?/?/C/CL/Q$RDOO!OO))'3U3\3\]a]l]l]w]wx~]  4A  B 	).DOO&!IN	s   :BD 	D3D..D3c                 D   i }t         D ][  }| j                  j                  |      | j                  j                  |      n.| j                  j	                  t
        j                  ||            }|dk(  r|d}| j                  j                  t
        j                  ||      |       |dk(  r=| j                  j	                  d      |k  r| j                  j                  d|dz          |||<   | j                  s|| j                  j                  |      k7  s|t        v s d| j                  _	        | j                  j                  ddj                  |             ^ | j                  j                  d	      Z| j                  j                  d
d        | j                  j                  d      |d<   | j                  j                  d	      |d	<   n| j                  j	                  d
      | j                  j                  d      qt        | j                  j	                  d
      j                               d   |d<   t        | j                  j	                  d
      j                               d   |d	<   nn| j                  j                  d	      -d| j                  _	        | j                  j                  dd       | j                  j                  d
d        d |d	<   d |d<   | j                  |k7  rt        |      | _        | j!                          y )Nr   adminr   persistent_connect_timeout   Fr2   z.Re-setting connection due to change in the {0}private_keysession_keycertificate_namer   r   zfRe-setting connection due to change from private/session key authentication to password authentication)CONNECTION_KEYSr!   rE   r<   r?   CONNECTION_MAP
set_optionr%   
RESET_KEYSrB   r=   r>   listkeysvaluesr
   	set_hosts)r)   r%   keyvalues       r-   set_parameterszHttpApi.set_parametersf   s    "" 	uC,0KKOOC,@,LDKKOOC(RVRaRaRlRlm{mm  AD  FI  nJ  SKEj U]OO&&~'9'9#s'CUKiDOO$>$>?[$\`e$e**+GQST).!#&))et7Q7Q7U7UVY7Z.Z_bfp_p-2*--g7g7n7nor7st	u ;;??=)5OO&&}d;8<HZ8[!"4537;;??=3Q!-0__''6Bt{{WaGbGj8<T__=W=WXe=f=k=k=m8nop8q!"45378R8RS`8a8h8h8j3klm3n!-0))--m<H-2*--  F OO&&}d;37!-08<!"45%%)>>)-.C)DD&r.   c                 2   | j                   j                  d      vd| j                   j                  d      v r.t        j                  | j                   j                  d            n)| j                   j                  d      j	                  d      }n\| j
                  Dt        j                  dd| j                  j                  d            j	                  d      | _        | j
                  }| j                  t        |      | _
        | j                  j                  ddj                  | j                               t        |      | _        | j                  j                  d      | _        | j                  j                  dd	j                  | j                                n| j                  |k7  rt        |      | _
        | j                  j                  dd
j                  | j                               t        |      | _        	 | j                  j                  | j                  j#                  | j                                | j                  j                  ddj                  | j                                | j                  j)                  d| j                          y # t$        $ ri | j                  j                  d      | _        d| j                  _        | j                  j                  dd	j                  | j                                Y w xY w)Nr3   [,z[[\]] r2   zProvided Hosts: {0}r   zInitializing operation on {0}z Provided Hosts have changed: {0}zCConnected host {0} found in the provided hosts. Continuing with it.F)r!   rE   astliteral_evalsplitr(   resubr<   r?   r'   r   r=   r>   r#   popr&   indexrG   rB   rX   )r)   hostss     r-   r]   zHttpApi.set_hosts   s   ;;??6".ADX^H_A_C$$T[[__V%<=eiepepetetu{e|  fC  fC  DG  fHE##+')vvhDOO<V<VW]<^'_'e'efi'j$((E&"*5/DOO))'3H3O3OPTPcPc3de (D $ 1 1 5 5a 8DOO))'3R3Y3YZ^ZkZk3lm  E)"*5/DOO))'3U3\3\]a]p]p3qr (Dr!!%%d&7&7&=&=d>O>O&PQ--g7|  8D  8D  EI  EV  EV  8W  X
 	""64+<+<=	  r$($5$5$9$9!$<!-2*--g7V7]7]^b^o^o7pqrs   
A3J$ $A/LLc           	         | j                          | j                  j                  d      T	 ddj                  | j	                  |||      j                  d            i| j
                  _        d| j
                  _        	 | j
                  j                  du rD| j                  | j
                  j                  d      | j
                  j                  d	             | j
                  j                  d
dj                  || j
                  j                  |z                | j
                  j!                  |||      \  }}| j
                  j                  d
dj                  | j
                  j                  d      ||j#                                      | j9                  ||||      S # t        $ r^}d| j
                  _        | j                  d|| j                  | j
                  j                  |z         t        |            cY d}~S d}~ww xY w# t        $ r}| j
                  j                  d
dj                  | j
                  j                  d      |             t%        | j&                        dk(  rd| _        d| j
                  _        t+        ddj                  | j
                  j                  d                  }dt-        |      v r|j.                  }| j                  d|| j                  | j
                  j                  |z         t        |      |      cY d}~S | j&                  j1                  d      | _        | j
                  j                  d
dj                  | j
                  j                  d      | j2                               | j
                  j5                  d| j2                         | j7                  |||      cY d}~S d}~ww xY w)z?This method handles all APIC REST API requests other than loginrS   Nr;   {0}TFrd   r   r   r2   zSending {0} request to {1}r9   z;Received response from {0} for {1} operation with HTTP: {2}r3   z!Connection to {0} has failed: {1}r   zKNo hosts left in the cluster to continue operation! Error on final host {0})codetextrH   )errorzSwitching host from {0} to {1})r`   r%   rE   r>   	cert_authr<   rF   rB   rG   _return_infovalidate_url_urlstrrN   r?   r=   rC   getcodelenr#   r'   dictdirrH   rj   r&   rX   send_request_verify_response)r)   r:   rH   rJ   exc_responserK   rL   rr   s           r-   r|   zHttpApi.send_request   s    	%%))-8Dx)15<<vW[]a@b@f@fgo@p3q(r%-1*
	9))U2

4??55mDdooF`F`akFlmOO))'3O3V3VW]_c_n_n_s_svz_z3{|&*oo&:&:4f&:&U#HmOO))V]]^b^m^m^x^xy  _A  CI  KS  K[  K[  K]  ^* $$Xvt]KK=  x-2*((VT5F5FtG[G[^bGb5cehiuevwwx  	9OO))'3V3]3]^b^m^m^x^xy  _A  CO  4P  Q4$$%*&*#-2*"o"v"vw{  xG  xG  xR  xR  SY  xZ  #[ S..',,D((VT5F5FtG[G[^bGb5cehiuev  D(  E  E$($5$5$9$9!$<!--g7W7^7^_c_n_n_y_y  {A  `B  DH  DU  DU  8V  W**643D3DE$$VT488!	9sL   AF) DH )	H2AHHH
ODO$O*B'OOOc                    | j                   j                  ddj                  | j                   j                  d      |             |j                  dk(  rt        |      |j                  dk(  rq| j                  j                  d      Vd | j                   _        | j                  | j                   j                  d      | j                   j                  d             y	|S )
Nr2   z,Failed to receive response from {0} with {1}r3   i  i  rS   r   r   T)
r<   r=   r>   r?   rp   r   r%   rE   rF   rN   )r)   excs     r-   handle_httperrorzHttpApi.handle_httperror   s    %%g/]/d/deietetee  AG  fH  JM  0N  	O88s?!#&&XX_!;!;!?!?!N!V$(DOO!JJt11-@$//B\B\]gBhi
r.   c                     t        j                  d|      j                  d      }| j                  j	                  d      5|j                  t        j                  d|      j                  d      d      S |S )Nz^.*?\.json|^.*?\.xmlr   r   z(https?:\/\/.*)(:\d*)\/?(.*)   rd   )rh   matchgroupr%   rE   replace)r)   urlvalidated_urls      r-   ru   zHttpApi.validate_url   sh    !8#>DDQG%%))&19 ((2QSV)W)])]^_)`bdee  r.   c                 0   | j                  |      }|j                         }| j                  |j                        }t	        |      dk(  rdj                  |      }n%dj                  |j                  t        |            }| j                  |||||      S )z5Process the return code and response object from APICzHTTP Error 400: Bad Requestrn   z{0} ({1} bytes))respond_data)	_get_response_valuerx   ru   r   rw   r>   msgry   rt   )r)   rK   r:   rH   rL   response_valueresponse_coder   s           r-   r}   zHttpApi._verify_response   s    11-@ ((*  .x=99,,x(C#**8<<^9LMC  cP^ __r.   c                 4    t        |j                               S )z9Extract string data from response_data returned from APIC)r   getvalue)r)   rL   s     r-   r   zHttpApi._get_response_value   s    }--/00r.   c                 v    	 |rt        j                  |      S i S # t        $ r dj                  |      cY S w xY w)z$Convert response_text to json formatzInvalid JSON response: {0})r@   loadsrG   r>   )r)   response_texts     r-   _response_to_jsonzHttpApi._response_to_json   s@    	F0=4::m,E2E 	F/66}EE	Fs     88c                 Z    i }||d<   ||d<   ||d<   ||d<   |||d<   ni |d<   |||d<   |S )z;Format success/error data and return with consistent formatstatusr:   r   r   rr   body )r)   r   r:   rH   r   r   rr   infos           r-   rt   zHttpApi._return_info   sW    &XXUU!DMDM#'DLr.   c           	         |d}t               }	 t        rJ| j                  j                  d      j	                         }t        j                  |dt                     }n)t        t        | j                  j                  d            }| j                  j                  d
      (| j.                  j1                  d      | j                  d
<   ||z   |z   }t        rF|j3                  |j	                         t5        j6                         t9        j:                               }nt3        ||d      }dj)                  | j.                  j1                  d      | j                  j                  d
            }ddj)                  |      z   dz   dj)                  t=        t?        j@                  |                  z   |d<   |S # t        $ r t        j                  j                  t        j                  j                  | j                  j                  d      | j                  j                  d                  }t        j                  j!                  |      r_	 d}t        rd}t#        ||      5 }	|	j%                         }
ddd       n# 1 sw Y   nxY wn'# t        $ r t'        dj)                  |            w xY w	 t        r!t        j                  
dt                     }nt        t        
      }n@# t        $ r4 t'        d	j)                  | j                  j                  d                  w xY w| j                  j                  d
      t        j                  j+                  t        j                  j-                  | j                  j                  d            d         | j                  d
<   nt'        dj)                  |            Y Gw xY w)zdPerform APIC signature-based authentication, not the expected SSL client certificate authentication.Nrd   rS   )r   backendworking_directoryrrbz Cannot open private key file {0}z Cannot load private key file {0}rU   r   z]Provided private key {0} does not appear to be a private key or provided file does not exist.r   sha256z!uni/userext/user-{0}/usercert-{1}z!APIC-Certificate-Algorithm=v1.0; zAPIC-Certificate-DN={0}; z*APIC-Certificate-Fingerprint=fingerprint; zAPIC-Request-Signature={0}r;   )!rz   HAS_CRYPTOGRAPHYr%   rE   encoder   load_pem_private_keyr   r   r   rG   osrH   abspathjoinr!   existsopenreadr   r>   basenamesplitextr<   r?   r   r   PKCS1v15r   SHA256r   base64	b64encode)r)   r:   rH   rI   rD   r^   sig_keyprivate_key_file_path
permissionfhprivate_key_contentsig_requestsig_signaturesig_dns                 r-   rs   zHttpApi.cert_auth  s    ?G&!	0044]CJJL'<<!+- *,8R8R8V8VWd8ef2 %%))*<=E=A__=W=WXe=fD&&'9:tmg-#LL););)=w?O?O?QSYS`S`SbcM +x@M4;;DOO<V<VWd<egk  hB  hB  hF  hF  GY  hZ  [/)0089:; +11)F<L<L]<[2\]^ 	 M  	$&GGOOBGGLLQdAegk  hB  hB  hF  hF  GT  hU  5V  %W!ww~~34l!$J'%)
3Z@ 8B.0ggi+8 8 8  l)*L*S*STi*jkklD'"/"D"DEXcg  rA  rC  #D"1,@S"T  D)*L*S*STXTnTnTrTr  tA  UB  +C  D  DD--112DEMEGWWEUEUVXV]V]VfVfgk  hB  hB  hF  hF  GT  hU  WV  WX  WY  FZD../AB%szz  |Q  R +	s\   A9F; ;BOJ+J<	JJ	
JO$J66O:7K21O2=L//BOO)NN)rd   )__name__
__module____qualname__r    r0   rN   r`   r]   r|   r   ru   r}   r   r   rt   rs   __classcell__)r,   s   @r-   r   r   D   sI    	$$#J>:'LT!
`1F 8r.   r   )'
__future__r   r   r   type__metaclass__DOCUMENTATIONre   r   r@   r   rh   ansible.module_utils._textr   r   ansible.module_utils.connectionr   ansible.plugins.httpapir	   r
   r   OpenSSL.cryptor   r   r   HAS_OPENSSLImportErrorcryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   cryptography.hazmat.backendsr   r   rW   rY   rV   r   r   r.   r-   <module>r      s   $ A @
    	 	 9 ; / BBK
DA< ,8TU-
TTk %  K  s$    A? B ?B	B	BB