
    Vh.                         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
mZ d dlmZ d dlmZ d dlmZ d dlmZ d	d
dZg dZeg dz   Z G d de      Zy)    )absolute_importdivisionprint_functiona  
---
name: mso
short_description: MSO Ansible HTTPAPI Plugin.
description:
  - This MSO plugin provides the HTTPAPI transport methods needed to initiate
    a connection to MSO, send API requests and process the
    response.
version_added: "1.2.0"
options:
  login_domain:
    description:
    - The login domain name to use for authentication.
    - The default value is Local.
    type: string
    env:
    - name: ANSIBLE_HTTPAPI_LOGIN_DOMAIN
    vars:
    - name: ansible_httpapi_login_domain
N)PY3)to_text)ConnectionError)HttpApiBase)copyremote_userpersistent_command_timeout)usernametimeout)r   passwordlogin_domainhostport)	use_proxyuse_sslr   validate_certsc                   b     e Zd Z fdZd Zd Zd Zd Zd ZddZ	d Z
d	 Zd
 Zd Zd Z xZS )HttpApic                     t        t        | 
  |i | d| _        ddi| _        i | _        d | _        d | _        d| _        d | _	        d| _
        d| _        d| _        i | _        i | _        y )Nz	cisco.msozContent-Typezapplication/jsonr   GET )superr   __init__platformheadersparamsauthbackup_hostshost_countererrormethodpathstatusinfoconnection_parameters)selfargskwargs	__class__s      a/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/cisco/mso/plugins/httpapi/mso.pyr   zHttpApi.__init__1   st    gt%t6v6#&(:;	 
		%'"    c                     | j                   S N)r   )r*   s    r.   get_platformzHttpApi.get_platformB   s    }}r/   c                     || _         y r1   )r    )r*   r    s     r.   
set_paramszHttpApi.set_paramsE   s	    r/   c                     	 t        j                  dd| j                  j                  d            j	                  d      }|S # t
        $ r g cY S w xY w)Nz[[\]]r   r   ,)resub
connection
get_optionsplit	Exception)r*   list_of_hostss     r.   set_backup_hostszHttpApi.set_backup_hostsH   sN    	FF8R1K1KF1STZZ[^_M   	I	s   A A AAc                    | j                   j                  ddj                  | j                   j                  d                   d}d}| j                   j                  d      |z   }||d}| j                  d   3| j                  d   d	k7  r!| j                  | j                  d         |d
<   t        j                  |      }	 |j                  d       | j                   j                  ddj                  |||| j                               | j                   j                  |||| j                        \  }}	|j                         | _        | j                  dk7  r| j                   j                  ddj                  | j                               | j                  |	      }
t        | j                  dj                  |
            | _        t!        t        j                  | j#                  ||||	                  ddj                  | j                  |	      j%                  d            i| j                   _        y# t         $ r | j                   j                  dd        t(        $ r|}| j                   j                  dd       t        | j                  dj                  |            | _        t!        t        j                  | j#                  d||d                  d}~ww xY w)zLog in to MSOvvvvzStarting Login to {0}r   POSTz/mso/api/v1/auth/login)r   r   r   NLocaldomainIdr   z-login() - connection.send({0}, {1}, {2}, {3})r%   r      z!login status incorrect status={0}zAuthentication failed: {0}codemessageAuthorizationz
Bearer {0}token#login() - ConnectionError Exceptionzlogin() - Generic Exceptionz*Authentication failed: Request failed: {0})r9   queue_messageformatr:   r)   _get_login_domain_idjsondumpspopr   sendgetcoder'   _response_to_jsondictr$   r   _verify_responseget_authr<   )r*   r   r   r%   r&   	full_pathpayloaddataresponseresponse_datajson_responsees               r.   loginzHttpApi.loginP   s    	%%f.E.L.LT__MgMghnMo.pq'OO..v6=	'X>%%n5AdF`F`aoFpt{F{"&";";D<V<VWe<f"gGJzz'"	dKK
#OO))&2a2h2himovx~  AE  AM  AM  3N  O&*oo&:&:4f^b^j^j&:&k#Hm"**,DK{{c!--f6Y6`6`aealal6mn $ 6 6} E!t{{<X<_<_`m<no
%djj1F1FxQWYbdq1r&stt%4l6I6I$J`J`anJoJsJst{J|6}$~DOO! 	OO))&2WX 	dOO))&2OP4;;8d8k8klm8noDJ!$**T-B-B4QZ\`-a"bcc	ds   E:H? ?.K)-A7K$$K)c                    d}d}	 | j                   j                  |i || j                         d | j                   _        y # t        $ r|}t	        | j
                  dj                  |            | _        t        t        j                  | j                  d || j                   j                  d      |z   d                   d }~ww xY w)NDELETEz/mso/api/v1/auth/logoutrD   z(Error on attempt to logout from MSO. {0}rF   r   )r9   rR   r   r<   rU   r'   rM   r$   r   rO   rP   rV   r:   rX   )r*   r%   r&   r_   s       r.   logoutzHttpApi.logouts   s    (	DOO  r&$,, O !%  	D4;;8b8i8ijk8lmDJ!$**T-B-B4QUQ`Q`QkQklrQsvzQz  }A  .B  #C  D  D	Ds   )A 	C
A7CCc                 ,   d| _         d| _        d| _        i | _        d| _        |i }| j
                  j                  dd       | j                          t        |      }|d   dk7  rLt        | j                  d	
      | _         t        t        j                  | j                  d||d                  | j
                  j                  d      |z   }	 | j
                  j                  ddj                  |||| j                                | j
                  j#                  |||| j                         \  }}| j                  ||||      S # t        $ r | j
                  j                  dd        t$        $ r}| j
                  j                  dd       | j                   >t        | j                  dj                  |t'        j(                               
      | _         t        t        j                  | j                  d||d                  d}~ww xY w)z>This method handles all MSO REST API requests other than loginNr   r   r   r@   zsend_request method calledr   /z7Value of <path> does not appear to be formated properlyrF   r   z4send_request() - connection.send({0}, {1}, {2}, {3})rD   rK   z"send_request() - Generic Exceptionz/MSO HTTPAPI send_request() Exception: {0} - {1})r$   r&   r'   r(   r%   r9   rL   set_connection_parametersstrrU   r   rO   rP   rV   r:   rM   r   rR   r<   	traceback
format_exc)r*   r%   r&   r[   rY   r\   rdatar_   s           r.   send_requestzHttpApi.send_request~   s    
		<D%%f.JK&&( 4y7c>4;;8qrDJ!$**T-B-B4QUW[-\"]^^OO..v6=	
	dOO))&2h2o2optvz  }C  EI  EQ  EQ  3R  S"oo224fVZVbVb2cOHe $$Xvy%HH  	OO))&2WX 	dOO))&2VWzz!!t{{<m<t<tuv  yB  yM  yM  yO  =P  Q
!$**T-B-B4QZ\`-a"bcc		ds   A$E
 
.H8BHHc                    i }t         D ]v  }|dk(  rn| j                  j                  |      | j                  j                  |      n$| j                  t        j                  ||            }| j                  ||       n| j                  j                  |      | j                  j                  |      n.| j                  j                  t        j                  ||            }| j                  j                  t        j                  ||      |       |||<   || j                  j                  |      k7  s1|t        v s;d| j                  _	        | j                  j                  ddj                  |             y | j                  |k7  rOt        |      | _        |j                  d       dj                  |      }| j                  j                  d|       y y )Nr   Fr@   zFset_connection_parameters() - resetting connection due to '{0}' changer   z?set_connection_parameters() - changed connection parameters {0})CONNECTION_KEYSr    rW   r:   CONNECTION_MAP
set_optionr9   r)   
RESET_KEYS
_connectedrL   rM   r
   rQ   )r*   r)   keyvaluemsgs        r.   rf   z!HttpApi.set_connection_parameters   s    "" 	LCn$040D0P,VZVeVeftfxfxy|  B  gC  WDU+040D0P,VZVeVeVpVpq  rD  rD  EH  JM  rN  WO**>+=+=c3+GO).!#&2266s;;z@Q-2*--f6~  7F  7F  GJ  7K  L	L %%)>>)-.C)DD&!%%j1SZZ[pqCOO))&#6	 ?r/   c                    d}d}| j                   j                  t        |             || j                  |      }|j|j	                         }|j                         }| j                   j                  | j                  |             |dvrt        | j                  |      | _        || j                   d<   | j                  | j                  | j                   d<   || j                   d<   | j                   S )	z4Process the return code and response object from MSONr   )url)   rE         rF   r%   r$   body)	r(   updaterU   rT   rS   geturl_get_formated_infor'   r$   )r*   r\   r%   r&   r[   r]   response_codes          r.   rV   zHttpApi._verify_response   s    		$( 2248M$,,.M??$DIIT44X>? $88!t{{MJ
$		(::!!%DIIg)		&yyr/   c                    	 |j                         }t        |      }	 |rt        j                  |      S i S # t        $ r |}Y 2w xY w# t        $ r:}t        ddj                  |            | _        || j                  d<   Y d}~yd}~ww xY w)z$Convert response_data to json formatr   z5Unable to parse output as JSON, see 'raw' output. {0}rF   rawN)	getvaluer<   r   rO   loadsrU   rM   r$   r(   )r*   r]   response_valueresponse_textr_   s        r.   rT   zHttpApi._response_to_json   s    	+*335N  /	0=4::m,E2E	  	+*N	+  	2/f/m/mno/pqDJ,DIIe		s+   7 A A AA	B0BBc                 "   |yd}d}| j                   j                  d      |z   }| j                   j                  |d|| j                        \  }}|;| j	                  |      }|j                  d      }||D ]  }	|	j                  d      |k(  sd|	v r|	j                  d      c S t        d	d
j                  ||	            | _        t        t        j                  | j                  d||d                   t        d	dj                  |            | _        t        t        j                  | j                  d||d                  t        d	d      | _        t        t        j                  | j                  d||d                  y)zGet a domain and return its idNr   z/mso/api/v1/auth/login-domainsr   rD   domainsnameidr   z0Login domain lookup failed for domain '{0}': {1}rF   z.Login domain '{0}' is not a valid domain name.zKey 'domains' missing from data)r9   r:   rR   r   rT   rW   rU   rM   r$   r   rO   rP   rV   )
r*   domain_namer%   r&   rY   r\   r[   r]   r   domains
             r.   rN   zHttpApi._get_login_domain_id   s   /OO..v6=	 --dDQUQ]Q]-^$ 2248M#''	2G"% tFzz&)[86>#)::d#33)-2?q?x?x  zE  GM  @N  *ODJ"1$**T=R=RSWY_ajlp=q2r"sst "r3c3j3jkv3wx
%djj1F1FtVU^`d1e&fgg!r3TU
%djj1F1FtVU^`d1e&fgg r/   c                    t        d|j                  j                  dd      z  |j                         |j	                               }|j                  t        d |j                         j                         D                     t        rhi }|j                  j                         D ]8  \  }}|j                         }||v rdj                  ||   |f      ||<   4|||<   : |j                  |       |S )zThe code in this function is based out of Ansible fetch_url code
        at https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/urls.pyzOK (%s bytes)zContent-Lengthunknown)rt   rv   r'   c              3   F   K   | ]  \  }}|j                         |f  y wr1   )lower).0kvs      r.   	<genexpr>z-HttpApi._get_formated_info.<locals>.<genexpr>   s     LDAq!'')QLs   !z, )rU   r   rW   r|   rS   r{   r(   itemsr   r   join)r*   r\   r(   temp_headersr   rs   s         r.   r}   zHttpApi._get_formated_info   s     (*:*:*>*>?OQZ*[[aiapapar  |D  |L  |L  |N  ODLHMMO4I4I4KLLM L'//557 /ezz|<')-L4F3N)OL&).L&/ KK%r/   r1   )__name__
__module____qualname__r   r2   r4   r>   r`   rc   rk   rf   rV   rT   rN   r}   __classcell__)r-   s   @r.   r   r   0   sD    ("!dF	%!IF7*0 h:r/   r   )
__future__r   r   r   type__metaclass__DOCUMENTATIONrO   r7   rh   ansible.module_utils.sixr   ansible.module_utils._textr   ansible.module_utils.connectionr   ansible.plugins.httpapir	   r
   rn   rp   rm   r    r/   r.   <module>r      s_    A @*  	  ( . ; /  ,8TUE
TT^k ^r/   