
    Vh?                     F   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mZ d dlmZmZmZ d dlmZm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l#m$Z$ dZ%dddez  dZ'dZ(dZ)dZ*dZ+dZ,ddgZ-dZ.dZ/ G d de      Z0d!dZ1d  Z2y# e&$ r dZ%Y 7w xY w)"    )absolute_importdivisionprint_functiona  
---
deprecated:
  removed_in: 6.0.0
  why: This collection and all content in it is unmaintained and deprecated.
  alternative: Unknown.
author: Ansible Networking Team (!UNKNOWN)
name: ftd
short_description: HttpApi Plugin for Cisco ASA Firepower device
description:
  - This HttpApi plugin provides methods to connect to Cisco ASA firepower
    devices over a HTTP(S)-based api.
options:
  token_path:
    type: str
    description:
      - Specifies the api token path of the FTD device
    vars:
      - name: ansible_httpapi_ftd_token_path
  spec_path:
    type: str
    description:
      - Specifies the api spec path of the FTD device
    default: '/apispec/ngfw.json'
    vars:
      - name: ansible_httpapi_ftd_spec_path
N)__version__)to_text)AnsibleConnectionFailureAnsibleError)FdmSwaggerParserSpecPropFdmSwaggerValidator)
HTTPMethodResponseParams)	HTTPError)	urlencode)HttpApiBase)ConnectionError)encode_multipart_formdata)RequestFieldTFzapplication/jsonzFTD Ansible/%s)Content-TypeAcceptz
User-Agenti  i  
token_pathz/api/fdm/{0}/fdm/tokenz/api/versionsv2v1zThe API token path is incorrect. Please, check correctness of the `ansible_httpapi_ftd_token_path` variable in the inventory file.zAnsible could not determine the API token path automatically. Please, specify the `ansible_httpapi_ftd_token_path` variable in the inventory file.c                        e Zd Z fdZd Zd Zd Zd Zd ZddZ	d Z
dd	Zd
 ZddZd ZddZed        Zd Zd Zd Zd Zd Zed        Zd Zd Zd Zd Zd Zd Zed        Zed        Z  xZ!S ) HttpApic                     t         t        |   |       || _        d | _        d | _        d | _        d | _        d| _        t        st        d      y )NFzbThe community.network.ftd httpapi plugin requires urllib3. Use `pip install urllib3` to install it)superr   __init__
connectionaccess_tokenrefresh_token	_api_spec_api_validator_ignore_http_errorsHAS_URLLIB3r	   )selfr   	__class__s     i/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/network/plugins/httpapi/ftd.pyr   zHttpApi.__init__^   sZ    gt%j1$ !"#( tv v     c                 B   d }d }| j                   r || j                         }n|r|r
 |||      }nt        d      | j                  |      }	 |d   | _         |d   | _        dd| j                  z  i| j                  _        y # t        $ r t        d|z        w xY w)	Nc                     d| |dS )Npassword)
grant_typeusernamer,    )r.   r,   s     r(   request_token_payloadz,HttpApi.login.<locals>.request_token_payloadk   s    ($$ r)   c                     d| dS )Nr!   )r-   r!   r/   )r!   s    r(   refresh_token_payloadz,HttpApi.login.<locals>.refresh_token_payloadr   s    -!. r)   zHUsername and password are required for login in absence of refresh tokenr!   r    Authorizationz	Bearer %szPServer returned response without token info during connection authentication: %s)r!   r   _lookup_login_urlr    r   _authKeyErrorr   )r&   r.   r,   r0   r2   payloadresponses          r(   loginzHttpApi.loginj   s    		 +D,>,>?G(+Hh?G*+uvv))'2	o!)/!:D ( 8D%4kDDUDU6U$VDOO! 	o!bemmo o	os   4B Bc           
         | j                         }|r|g}n| j                         }|D ]+  }	 | j                  ||      }|s| j                  |       |c S  t	        |r
t              t              # t        $ rI}| j
                  j                  dd|d|d       t        |d      r|j                  dk(  r Y d}~d}~ww xY w)z Try to find correct login URL and get api token using this URL.

        :param payload: Token request payload
        :type payload: dict
        :return: token generation response
        vvvvzREST:request to z% failed because of connection error:  	http_codei  N)_get_api_token_path_get_known_token_paths_send_login_request_set_api_token_pathr   r   queue_messagehasattrr=   INVALID_API_TOKEN_PATH_MSGMISSING_API_TOKEN_PATH_MSG)r&   r7   preconfigured_token_pathtoken_pathsurlr8   es          r(   r4   zHttpApi._lookup_login_url   s     $(#;#;#= #34K557K 	 C 33GSA 0,,S1	 " <T8uuZtuu # --f7 
 1k*q{{c/As   A22	C;?B??Cc                 `   | j                  t        j                  d|       | j                  |t	        j
                  |      t        j                  t              \  }}| j                  t        j                  d|j                                | j                  | j                  |            }|S )Nr9   methodheaderszlogin:status_code)
_displayr   POST_send_auth_requestjsondumpsBASE_HEADERSgetcode_response_to_json_get_response_value)r&   r7   rH   r8   response_datas        r(   r@   zHttpApi._send_login_request   s    joow4"&"9"9G$Z__l #: #
- 	joo':H<L<L<NO))$*B*B=*QRr)   c                    d| j                   | j                  d}| j                         }| j                  t        j
                  d|       | j                  |t        j                  |      t        j
                  t              \  }}| j                  t        j
                  d|j                                d | _        d | _         y )Nrevoke_token)r-   r    token_to_revokelogoutrK   zlogout:status_code)r    r!   r>   rN   r   rO   rP   rQ   rR   rS   rT   )r&   auth_payloadrH   r8   dummys        r(   r[   zHttpApi.logout   s    ( --#11
 &&(joox511#tzz,7OXbXgXg:F 2 H%joo';X=M=M=OP! r)   c                 2    d} | j                   ||fd|i|S )Nz6Server returned an error during authentication requestdata)_send_service_request)r&   pathr_   kwargserror_msg_prefixs        r(   rP   zHttpApi._send_auth_request   s(    S)t))$0@VtVvVVr)   c                    	 d| _          | j                  j                  ||fi |d| _         S # t        $ rI}| j	                  t        |j                                     }t        |d||j                        d }~ww xY w# d| _         w xY w)NTFz: )r=   )	r$   r   sendr   rU   r   readr   code)r&   ra   rc   r_   rb   rI   	error_msgs          r(   r`   zHttpApi._send_service_request   s    		-'+D$'4??''d=f= (-D$  	^ ..wqvvx/@AI!.>	"JVWV\V\]]		^ (-D$s!   $. 	B AA;;B  B 	Bc                      y Nr/   )r&   r8   response_texts      r(   update_authzHttpApi.update_auth   s    r)   c           	         t        |||      }|rt        j                  |      nd }	 | j                  |d|       |r| j                  |d|       | j                  j                  |||t              \  }}	| j                  |	      }
| j                  |d|
       t        j                  dt        j                  |j                         t        j                  | j                  |
      iS # t        $ r}t        |j!                               }| j                  |d|       t        j                  dt        j                  |j"                  t        j                  | j                  |      icY d }~S d }~ww xY w)NrH   r_   rK   r8   TerrorF)construct_url_pathrQ   rR   rN   r   re   rS   rV   r   SUCCESSSTATUS_CODErT   RESPONSErU   r   r   rf   rg   )r&   url_pathhttp_methodbody_paramspath_paramsquery_paramsrH   r_   r8   rW   valuerI   rh   s                r(   send_requestzHttpApi.send_request   s:    ;E*5tzz+&4	MM+uc2k648&*oo&:&:3[bn&:&o#Hm,,];EMM+z59 &&**H,<,<,>'')?)?)F   	)IMM+w	:&&**AFF'')?)?	)J 	s   C C) )	E32A6E.(E3.E3c                    t        |      }| j                  t        j                  d|       t	        |d      5 }t        d|j                         t        j                  j                  |j                              }|j                          t        |g      \  }}t        t              }||d<   t        |      |d<   | j                   j#                  ||t        j                  |      \  }	}
| j%                  |
      }| j                  t        j                  d|       | j'                  |      cd d d        S # 1 sw Y   y xY w)NuploadrbfileToUploadr   zContent-Lengthr_   rL   rM   zupload:response)ro   rN   r   rO   openr   rf   osra   basenamenamemake_multipartr   dictrS   lenr   re   rV   rU   )r&   	from_pathto_urlrH   src_filerfbodycontent_typerM   r]   rW   rx   s               r(   upload_filezHttpApi.upload_file   s    (joox5)T" 	1hnhmmorww?O?OPXP]P]?^_B!:B4!@D,<(G&2GN#(+D	G$%#'??#7#7$zho#7#p E=,,];EMM*//+<eD))%0	1 	1 	1s   C6D99Ec                 :   t        ||      }| j                  t        j                  d|       | j                  j                  |d t        j                  t              \  }}t        j                  j                  |      r9t        |j                               }t        j                  j                  ||      }t        |d      5 }|j                  |j                                d d d        | j                  t        j                  d|       y # 1 sw Y   +xY w)N)rv   downloadr~   wb
downloaded)ro   rN   r   GETr   re   rS   r   ra   isdirextract_filename_from_headersinfojoinr   writegetvalue)	r&   from_urlto_pathrv   rH   r8   rW   filenameoutput_files	            r(   download_filezHttpApi.download_file  s     {Cjnnj#6"&//"6"6sjnnfr"6"s-77==!4X]]_EHggll7H5G'4  	8Km4467	8jnnlG<	8 	8s    DDc                    |j                   t        k(  xs |j                   t        k(  }| j                  sX|rVd | j                  _        | j                  | j                  j                  d      | j                  j                  d             yy)Nremote_userr,   TF)rg   TOKEN_EXPIRATION_STATUS_CODEUNAUTHORIZED_STATUS_CODEr$   r   r5   r9   
get_option)r&   excis_auth_related_codes      r(   handle_httperrorzHttpApi.handle_httperror  sl    "xx+GGo388WoKo'',@$(DOO!JJt11-@$//B\B\]gBhir)   c                 |    | j                   j                  dd|d| j                   j                  d|d|       y )Nr;   zREST::
)r   rB   _url)r&   rt   titlemsgs       r(   rN   zHttpApi._display  s.    %%f[RVRaRaRfRfhmor.str)   c                 4    t        | j                               S rj   )r   r   )rW   s    r(   rV   zHttpApi._get_response_value  s    }--/00r)   c                 $    | j                  d      S )N	spec_path)r   r&   s    r(   _get_api_spec_pathzHttpApi._get_api_spec_path#  s    {++r)   c                     	 | j                         }|D cg c]  }t        j	                  |       c}S # t        $ r	 t        }Y 4w xY wc c}w )zGenerate list of token generation urls based on list of versions supported by device(if exposed via API) or
        default list of API versions.

        :returns: list of token generation urls
        :rtype: generator
        )_get_supported_api_versionsr   DEFAULT_API_VERSIONSTOKEN_PATH_TEMPLATEformat)r&   api_versionsversions      r(   r?   zHttpApi._get_known_token_paths&  sQ    	0;;=L
 DPP#**73PP	  	0/L	0 Qs   5 A
AAc                     t         j                  }| j                  t        d|t              \  }}| j                  |      }| j                  |d|       | j                  |      }|d   S )z
        Fetch list of API versions supported by device.

        :return: list of API versions suitable for device
        :rtype: list
        z*Can't fetch list of supported api versions)ra   rc   rL   rM   r8   supportedVersions)r   r   r`   GET_API_VERSIONS_PATHrS   rV   rN   rU   )r&   rt   r8   rW   rx   api_versions_infos         r(   r   z#HttpApi._get_supported_api_versions5  sr     !nn"&"<"<&I 	 #= #
- ((7k:u5 2259 !455r)   c                 ,    | j                  t              S rj   )r   API_TOKEN_PATH_OPTION_NAMEr   s    r(   r>   zHttpApi._get_api_token_pathJ  s    9::r)   c                 .    | j                  t        |      S rj   )
set_optionr   )r&   rH   s     r(   rA   zHttpApi._set_api_token_pathM  s    93??r)   c                     	 | rt        j                  |       S i S # t        t         j                  dt              $ r t        d| z        w xY w)NJSONDecodeErrorzInvalid JSON response: %s)rQ   loadsgetattrdecoder
ValueErrorr   )rk   s    r(   rU   zHttpApi._response_to_jsonP  sN    	O0=4::m,E2Et||%6
C 	O!"="MNN	Os     1Ac                 \    | j                   t        j                     j                  |d       S rj   )api_specr   
OPERATIONSget)r&   operation_names     r(   get_operation_speczHttpApi.get_operation_specX  s$    }}X00155ndKKr)   c                 b    |r-| j                   t        j                     j                  |d       S y rj   )r   r   MODEL_OPERATIONSr   r&   
model_names     r(   !get_operation_specs_by_model_namez)HttpApi.get_operation_specs_by_model_name[  s*    ==!:!:;??
DQQr)   c                 \    | j                   t        j                     j                  |d       S rj   )r   r   MODELSr   r   s     r(   get_model_speczHttpApi.get_model_speca  s"    }}X__-11*dCCr)   c                 :    | j                   j                  ||      S rj   )api_validatorvalidate_data)r&   r   r_   s      r(   r   zHttpApi.validate_datad  s    !!//EEr)   c                 :    | j                   j                  ||      S rj   )r   validate_query_paramsr&   r   paramss      r(   r   zHttpApi.validate_query_paramsg  s    !!77OOr)   c                 :    | j                   j                  ||      S rj   )r   validate_path_paramsr   s      r(   r   zHttpApi.validate_path_paramsj  s    !!66~vNNr)   c                    | j                   | j                         }| j                  |t        j                        }|t
        j                     r;t               j                  |t
        j                           | _         | j                   S t        d|t
        j                     d|t
        j                           | j                   S )N)rs   rt   z3Failed to download API specification. Status code: z. Response: )r"   r   ry   r   r   r   rp   r
   
parse_specrr   r   rq   )r&   spec_path_urlr8   s      r(   r   zHttpApi.api_specm  s    >>! 335M((-Z^^(\H../!1!3!>!>xH_H_?`!a ~~ &^778(>CZCZ:['] ^ ^~~r)   c                 f    | j                   t        | j                        | _         | j                   S rj   )r#   r   r   r   s    r(   r   zHttpApi.api_validatory  s+    &"5dmm"DD"""r)   rj   )NNN) )"__name__
__module____qualname__r   r9   r4   r@   r[   rP   r`   rl   ry   r   r   r   rN   staticmethodrV   r   r?   r   r>   rA   rU   r   r   r   r   r   r   propertyr   r   __classcell__)r'   s   @r(   r   r   ]   s    
vo>v@!"W
-:1"=u 1 1,Q6*;@ O OLDFPO 	 	 # #r)   r   c                 X    | }|r |j                   di |}|r|dt        |      z   z  }|S )N?r/   )r   r   )ra   rv   rw   rH   s       r(   ro   ro     s9    
Ccjj';'sY|,,,Jr)   c                     d}t        j                  || j                  d            }|r|j                  d      S t	        d      )Nzattachment; ?filename="?([^"]+)zContent-Disposition   z7No appropriate Content-Disposition header is specified.)rematchr   groupr   )response_infocontent_header_regexr   s      r(   r   r     sB    =HH)=+<+<=R+STE{{1~RSSr)   )NN)3
__future__r   r   r   type__metaclass__DOCUMENTATIONrQ   r   r   ansibler   ansible_versionansible.module_utils.basicr   ansible.errorsr   r	   Yansible_collections.community.network.plugins.module_utils.network.ftd.fdm_swagger_clientr
   r   r   Mansible_collections.community.network.plugins.module_utils.network.ftd.commonr   r   +ansible.module_utils.six.moves.urllib.errorr   +ansible.module_utils.six.moves.urllib.parser   ansible.plugins.httpapir   ansible.module_utils.connectionr   urllib3r   urllib3.fieldsr   r%   ImportErrorrS   r   r   r   r   r   r   rD   rE   r   ro   r   r/   r)   r(   <module>r     s   & C B8  	 	 2 . A V  V t A A / ;1+K ' "_4  #  ) . ' d| e m `#k `#F	TG
  Ks   B B B 