
    Vh{J              
          d dl mZmZmZ eZd dlmZ d dlm	Z	 d dl
Z
d dlZd dlZd dlm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 d dlmZ dZ e  e edgfddd       e edgfdd       e edgfdd       e dd       e dd            Z!d Z"d Z#d Z$d Z%d Z& G d d       Z'y# e$ r dZY ew xY w)!    )absolute_importdivisionprint_function)	b64encode
formatdateN)	iteritems)urlparse	urlencode)	fetch_url)env_fallback)serializationhashes)paddingec)default_backendTFINTERSIGHT_API_PRIVATE_KEYpath)fallbacktyperequiredno_logINTERSIGHT_API_URIstrzhttps://intersight.com/api/v1)r   r   defaultINTERSIGHT_API_KEY_ID)r   r   r   bool)r   r   )api_private_keyapi_uri
api_key_idvalidate_certs	use_proxyc                 l    t        j                         }|j                  | j                                |S )z
    Generates a SHA256 digest from a String.

    :param data: data string set by user
    :return: instance of digest object
    )hashlibsha256updateencode)datadigests     t/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/cisco/intersight/plugins/module_utils/intersight.pyget_sha256_digestr+   ?   s'     ^^F
MM$++- M    c                     d}|dz   | z   dz   }t        |j                               }d}|j                         D ]0  \  }}||j                         z   dz   |z   }||dz
  k  r|dz   }|dz  }2 |S )z
    Concatenates Intersight headers in preparation to be signed

    :param req_tgt : http method plus endpoint
    :param hdrs: dict with header keys
    :return: concatenated header authorization string
     z(request-target): 
r   z:    )lenitemslower)req_tgthdrssslengthikeyvalues          r*   prepare_str_to_signr;   M   s     
B	"	"W	,t	3BF	Ajjl 
U#))+$u,vz>dB	Q	 Ir,   c                      t        ddd      S )zC
    Generated a GMT formatted Date

    :return: current date
    NFT)timeval	localtimeusegmtr    r,   r*   get_gmt_daterA   d   s     deDAAr,   c                 x    t        |       t        |      k7  ryt        | |      D ]  \  }}t        ||      r y y)NFT)r1   zipcompare_values)expected_listactual_listexpectedactuals       r*   compare_listsrI   n   sD    
=S--{; &h/
 r,   c                    	 t        | t              rt        |t              rt        | |      S t        |       D ]1  \  }}t	        j
                  d|      s||vr!t        |||         r1 y y# t        t        f$ r
 || k7  rY yY yw xY w)NzP(ass)?w(or)?dFT)	
isinstancelistrI   r	   researchrD   AttributeError	TypeError)rG   rH   r9   r:   s       r*   rD   rD   z   s    h%*VT*B 622%h/ 	LS%yy*C0Cv4E!%5	 I& X	s"   +A. ;A. *A. ,A. .BBc                   N    e Zd Zd Zd Zd Zd Zd ZddZddZ	dd	Z
d
 Zd Zy)IntersightModulec                    || _         t        d      | _        t        s| j                   j	                  d       | j                   j
                  d   | _        | j                   j
                  d   | _        	 t        | j                   j
                  d   d      5 }|j                         | _
        d d d        d	| _        g | _        d	| _        y # 1 sw Y   xY w# t        t        f$ r! | j                   j
                  d   | _
        Y Qw xY w)
NF)changedz(cryptography is required for this modulemsgr   r    r   rr.   )moduledictresultHAS_CRYPTOGRAPHY	fail_jsonparamshost
public_keyopenreadprivate_keyFileNotFoundErrorOSErrordigest_algorithmresponse_listupdate_method)selfrX   fs      r*   __init__zIntersightModule.__init__   s    5)KK!!&P!QKK&&y1	++,,\:	Edkk(():;SA ,Q#$668 , !#, ,!7+ 	E#{{112CDD	Es*   8#C C1C CC -D
Dc                    t        j                  d      }|j                  | j                        }|st	        d      |j                  d      }t        j                  | j                  j                         dt                     }|dk(  rW|j                  |j                         t        j                         t        j                               }d| _        t)        |      S |dk(  rW|j                  |j                         t!        j"                  t        j                                     }d| _        t)        |      S t%        d	j'                  |            )
z
        Generates a signed digest from a String

        :param digest: string to be signed & hashed
        :return: instance of digest object
        z\s*-----BEGIN (.*)-----\s+zNot a valid PEM pre boundaryr0   NzRSA PRIVATE KEYz
rsa-sha256zEC PRIVATE KEYhs2019zUnsupported key: {0})rM   compilematchrb   
ValueErrorgroupr   load_pem_private_keyr'   r   signr   PKCS1v15r   SHA256re   r   ECDSA	Exceptionformatr   )rh   r(   rW   m
pem_headerr9   rr   s          r*   get_sig_b64encodez"IntersightModule.get_sig_b64encode   s    JJ45GGD$$%;<<WWQZ
001A1A1H1H1JDRaRcd**88DKKM7+;+;+=v}}OD$0D!  ++88DKKM288FMMO+DED$,D!  299*EFFr,   c                 
   d}|dz   dz   | j                   z   dz   dz   | j                  z   dz   }|dz   }|j                         D ]  \  }}|dz   |j                         z   } |dz   }|dz   d	z   |j	                  d
      z   dz   }|S )z
        Assmebled an Intersight formatted authorization header

        :param hdrs : object with header keys
        :param signed_msg: base64 encoded sha256 hashed body
        :return: concatenated authorization header
        	Signature zkeyId="z",zalgorithm="zheaders="(request-target)",zsignature="ascii)r_   re   r2   r3   decode)rh   r5   
signed_msgauth_strr9   dummys         r*   get_auth_headerz IntersightModule.get_auth_header   s     c>J.@5H>Y\`\q\qqtyy::**, 	4JC#~		3H	4d?c>N2Z5F5Fw5OORVVr,   c                     ddj                  |      i}d||d} | j                  d	i |}|j                         d   |j                         d   d   d   }|S t        dj                  |            )
z
        Retrieve an Intersight object moid by name

        :param resource_path: intersight resource path e.g. '/ntp/Policies'
        :param target_name: intersight object name
        :return: json http response object
        $filterzName eq '{0}'GEThttp_methodresource_pathquery_paramsResultsr   Moidz,Intersight object with name "{0}" not found!r@   )rw   intersight_calljsonKeyError)rh   r   target_namer   optionsget_moidlocated_moids          r*   get_moid_by_namez!IntersightModule.get_moid_by_name   s     --k:

 !*(
 (4''2'2==?9%1#==?95a8@L  IPPQ\]^^r,   c                    	  | j                   di |\  }}t        j                  dt        |d               st	        |d   |d   |d         	 j                         }t        |      dkD  r+t        j                  |      }j                  d	      |d
<   |S i S # t
        $ r2}| j                  j                  dt        |      z         Y d}~d}~ww xY w)z
        Call the Intersight API and check for success status
        :param options: options dict with method and other params for API call
        :return: json http response object
        z2..statusrV   bodyzCode exception: %s rU   Nr   zx-starship-traceidtrace_idr@   )r   rM   rn   r   RuntimeErrorrv   rX   r\   ra   r1   r   loadsget)rh   r   responseinfoeresponse_data	resp_jsons          r*   call_apizIntersightModule.call_api   s    	F1T11<G<NHd88FCX$78"4>4;VMM 9
 !}!

=1I$(HH-A$BIj!	  	FKK!!&;c!f&D!EE	Fs   AB 	C$(CCNc           	      2   t        | j                        j                  }t        | j                        j                  }d}	|j	                         }
d}|
dvrt        d      |dk7  r|t        fst        d      |t        |t              st        d      |(t        |j                  d            dk7  rt        d      |
d	k7  r| j                  d
k(  rt        d      |rdt        |      z   }	|
dv r=|;|.t        |t              r| j                  ||      }nt        d      t        d      ||d|z   z  }|
dk7  rt        j                   |      }| j                  |z   |	z   }|
j#                         dz   |z   |z   |	z   }t%               }t'        |      }t)        |j+                               }||d|j-                  d      z   d}t/        ||      }| j1                  |      }| j3                  ||      }| j                  d
k(  rd}nd}d|dj5                  |      dj5                  |      dj5                  |j-                  d            dj5                  |      d}t7        | j8                  ||||
| j8                  j:                  d         \  }}||fS )a  
        Invoke the Intersight API

        :param resource_path: intersight resource path e.g. '/ntp/Policies'
        :param query_params: dictionary object with query string parameters as key/value pairs
        :param body: dictionary object with intersight data
        :param moid: intersight object moid
        :param name: intersight object name
        :return: json http response object
        r.   )r   POSTPATCHDELETEz7Please select a valid HTTP verb (GET/POST/PATCH/DELETE)zAThe *resource_path* value is required and must be of type "<str>"z1The *query_params* value must be of type "<dict>"zutf-8   zInvalid *moid* value!r   z
json-patchz<json-patch is only supported with PATCH on existing resource?)r   r   z(The *name* value must be of type "<str>"z5Must set either *moid* or *name* with "PATCH/DELETE!"/r   r}   zSHA-256=r   )HostDateDigestzapplication/json-patch+jsonzapplication/jsonz{0}zSHA-256={0})AcceptzContent-Typer   r   r   Authorizationr"   )r(   headersmethodr"   )r
   r^   netlocr   upperro   r   rP   rK   rY   r1   r'   rg   r   r   r   dumpsr3   rA   r+   r   r)   r   r;   rz   r   rw   r   rX   r]   )rh   r   r   r   r   moidnametarget_hosttarget_path
query_pathr   
bodyString
target_urlrequest_targetcdatebody_digestb64_body_digestauth_headerstring_to_signb64_signed_msgcontent_typerequest_headerr   r   s                           r*   r   z IntersightModule.intersight_call   s    tyy)00tyy)..
""$
 <<VWW R(<_`` $Zd-KOPP T[[%9!:b!@455g$"4"4"D[\\ y66J ((|#!$,#44]DI'(RSS$%\]] S4Z'M U?D)J YY.;
#-;mKjX  (
3#K$6$6$89   ?#9#9'#BB
 -^[I//?**;G -8L-L((LL-LL'#**?+A+A'+JK"\\+6
 #4;;
Uclr  C  J  J  Q  Q  R]  ^  _$~r,   c                 z   d||d} | j                   di |}|j                  d      rV|r|d   | j                  d<   nAt        |d         dkD  r| j                  j                  d       |d   d   | j                  d<   |j                  d      | j                  d	<   |j                  d
      | j                  d
<   y)z
        GET a resource and return the 1st element found or the full Results list
        If return_list is False and more than 1 element is returned, a warning is raised
        r   r   r   api_responser0   z1More than 1 resource found, returning the 1st oner   Countcountr   Nr@   )r   r   rZ   r1   rX   warn)rh   r   r   return_listr   r   s         r*   get_resourcezIntersightModule.get_resourcec  s     !*(

 !4==+7+<<	".6y.AN+x	*+a/KK$$%XY.6y.A!.DN+'||G4G"*,,z":Jr,   c                    || _         | j                  j                  s|rc|dk7  r^d|||d} | j                  di |}|j	                  d      r|d   d   | j
                  d<   |j	                  d      | j
                  d<   n]d||d} | j                  di |}|r.|| j
                  d<   |j	                  d      | j
                  d<   n|r| j                  ||	       d
| j
                  d<   y )Npostpatch)r   r   r   r   r   r   r   r   )r   r   r   r   r   TrT   r@   )rg   rX   
check_moder   r   rZ   r   )rh   r   r   r   r   rg   r   response_dicts           r*   configure_resourcez#IntersightModule.configure_resourcey  s	   *{{%%/ $+%2  	 !. 8 8 $$Y/2?	2J12MDKK/.;.?.?
.KDKK
+ $*%2 
 !. 8 8 2?DKK/.;.?.?
.KDKK
+! %%&3%1 &  "&Ir,   c                     | j                   j                  sEd||d} | j                  di |}i | j                  d<   |j	                  d      | j                  d<   d| j                  d<   y )Ndelete)r   r   r   r   r   TrT   r@   )rX   r   r   rZ   r   )rh   r   r   r   resps        r*   delete_resourcez IntersightModule.delete_resource  sg    {{%%'!.G
 !4==+7+D*,DKK'&*hhz&:DKK
#!%Ir,   c                    d }| j                  dd| j                  j                  d   z   dz   dd       | j                  d   j	                  d      r| j                  d   d   }i | j                  d<   d| j                  j                  d	   z   dz   }|d
|z   dz   z  }| j                  ||dd       d }d}| j                  d   j	                  d      rg| j                  d   d   }| j                  j                  d   dk(  r$t        | j                  | j                  d         }n| j                  ||       d }| j                  j                  d   dk(  r|s| j                  j                  d       |sd|i| j                  d<   | j                  ||| j                  d|i       | j                  d   j	                  d      r| j                  d   d   }|S )Nz/organization/Organizationsz	Name eq 'organization'r   )r   z$selectr   r   r   zand Organization.Moid eq 'Organization)r   z$expandFstatepresent)r   r   r   )r   r   r   r   )
r   rX   r]   rZ   r   rD   api_bodyr   popr   )rh   r   organization_moid
filter_strr   resource_values_matchs         r*   configure_policy_or_profilez,IntersightModule.configure_policy_or_profile  s    7&););N)KKcQ! 	 	
 ;;~&**62 $N ;F C&(N# 4;;#5#5f#==C
25FFLL
'%) 	 	
  %;;~&**62;;~.v6D{{!!'*i7(6t}}dkkR`Fa(b%$$"/ %  ;;g&)3<QMMn- -1n- ##+]]z	 $  {{>*..v6{{>26:r,   )r.   r.   NNNN)F)r.   )__name__
__module____qualname__rj   rz   r   r   r   r   r   r   r   r   r@   r,   r*   rR   rR      s7      2.6*bH;,"&H&=r,   rR   )(
__future__r   r   r   r   __metaclass__base64r   email.utilsr   rM   r   r$   ansible.module_utils.sixr	   +ansible.module_utils.six.moves.urllib.parser
   r   ansible.module_utils.urlsr   ansible.module_utils.basicr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   cryptography.hazmat.backendsr   r[   ImportErrorrY   intersight_argument_specr+   r;   rA   rI   rD   rR   r@   r,   r*   <module>r      s   B C B  " 	   . K / 3DE<  <2N1O"PW]hluyz<*>)?@uVuvl-D,EFU]abVT2- .B	&Z Zu  s    B4 4B>=B>