ó
    x[hé<  ã                   ó\  • S SK r S SKrS SKJrJr  S SKJrJr  S SKJr	  S SKJ
r
  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  \R.                  " \5      rSr " S S\R6                  5      rS rS r " S S\5      r\\R@                  44\\R@                  \RB                  44/r"S r#g)é    N)ÚListÚUnion)ÚdmiÚsources)Ú
url_helper)Úutil)Ú
EventScopeÚ	EventType)ÚNoDHCPLeaseError)ÚEphemeralIPNetwork)ÚDataSourceHostname)ÚaliyunÚec2zAlibaba Cloud ECSc                   ót  ^ • \ rS rSr% SrS/rSr/ r\\	   \
S'   SrSrSr\R                  r\\	\4   \
S	'   S
r\S 5       rU 4S jrS\SS4U 4S jjrS%S jrS rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r \S 5       r!S r"S r#S r$S r%S r&S r'S r(S  r)S&S! jr*S'S" jr+S&S# jr,S$r-U =r.$ )(ÚDataSourceAliYuné   ÚAliYunzhttp://100.100.100.200z
2016-01-01Úextended_metadata_versionséð   é2   NÚ_network_configFc                 ó   • g)NzX-aliyun-ecs-metadata-token© ©Úselfs    ÚD/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceAliYun.pyÚimdsv2_token_put_headerÚ(DataSourceAliYun.imdsv2_token_put_header+   s   € à,ó    c                 óì   >• [         [        U ]  XU5        [        R                  " U R
                  5      U l        U R
                  [        R                     R                  [        R                  5        g ©N)Úsuperr   Ú__init__ÚcopyÚdeepcopyÚdefault_update_eventsr	   ÚNETWORKÚaddr
   ÚBOOT)r   Úsys_cfgÚdistroÚpathsÚ	__class__s       €r   r#   ÚDataSourceAliYun.__init__/   sO   ø€ ÜÔ Ñ.¨wÀÔFÜ%)§]¢]°4×3MÑ3MÓ%NˆÔ"Ø×"Ñ"¤:×#5Ñ#5Ñ6×:Ñ:¼9¿>¹>ÕJr   Úci_pkl_versionÚreturnc                 ó$   >• [         TU ]  U5        g r!   )r"   Ú	_unpickle)r   r/   r-   s     €r   r2   ÚDataSourceAliYun._unpickle4   s   ø€ Ü‰Ñ˜.Õ)r   c                 ó`   • U R                   R                  S5      nSnUc  SnSn[        XE5      $ )NÚhostnameFzlocalhost.localdomainT)ÚmetadataÚgetr   )r   ÚfqdnÚ
resolve_ipÚmetadata_onlyr5   Ú
is_defaults         r   Úget_hostnameÚDataSourceAliYun.get_hostname7   s6   € Ø—=‘=×$Ñ$ ZÓ0ˆØˆ
ØÑØ.ˆHØˆJÜ! (Ó7Ð7r   c                 óL   • [        U R                  R                  S0 5      5      $ )Nzpublic-keys)Úparse_public_keysr6   r7   r   s    r   Úget_public_ssh_keysÚ$DataSourceAliYun.get_public_ssh_keys?   s   € Ü  §¡×!2Ñ!2°=À"Ó!EÓFÐFr   c                 óV   • [        5       (       a  U R                  R                  5       $ g)NÚNO_ALIYUN_METADATA)Ú
_is_aliyunÚdsnameÚlowerr   s    r   Ú_get_cloud_nameÚ DataSourceAliYun._get_cloud_nameB   s   € Ü�<‰<Ø—;‘;×$Ñ$Ó&Ð&Ø#r   c                 ó6   • U R                   R                  5       $ r!   )rE   rF   r   s    r   ÚplatformÚDataSourceAliYun.platformG   s   € à�{‰{× Ñ Ó"Ð"r   c                 ó   • g)Nzlatest/api/tokenr   r   s    r   Úapi_token_routeÚ DataSourceAliYun.api_token_routeL   s   € à!r   c                 ó   • g)NÚ21600r   r   s    r   Úimdsv2_token_ttl_secondsÚ)DataSourceAliYun.imdsv2_token_ttl_secondsP   s   € àr   c                 ó2   • U R                   U R                  /$ r!   )r   Úimdsv2_token_req_headerr   s    r   Úimdsv2_token_redactÚ$DataSourceAliYun.imdsv2_token_redactT   s   € à×,Ñ,¨d×.JÑ.JÐKÐKr   c                 ó    • U R                   S-   $ )Nz-ttl-seconds)r   r   s    r   rT   Ú(DataSourceAliYun.imdsv2_token_req_headerX   s   € à×+Ñ+¨nÑ<Ð<r   c           	      ó¨  • U R                   [        R                  :w  a  U R                   $ 0 nU R                  R                  nU R
                  R                  S5      n[        U[        5      (       a7  [        R                  " UU[        R                  " U R                  SS5      S9nO[        R                  SU5        U$ Xl         U R                   $ )z@Return a network config dict for rendering ENI or netplan files.ÚnetworkÚapply_full_imds_network_configT)Úfallback_nicÚfull_network_configz%Metadata 'network' key not valid: %s.)r   r   ÚUNSETr+   Úfallback_interfacer6   r7   Ú
isinstanceÚdictr   Ú#convert_ecs_metadata_network_configr   Úget_cfg_option_boolÚds_cfgÚLOGÚwarning)r   ÚresultÚifaceÚnet_mds       r   Únetwork_configÚDataSourceAliYun.network_config\   s¯   € ð ×Ñ¤7§=¡=Ó0Ø×'Ñ'Ð'àˆØ—‘×.Ñ.ˆØ—‘×"Ñ" 9Ó-ˆÜ�fœd×#Ñ#Ü×?Ò?ØØ"Ü$(×$<Ò$<Ø—K‘KÐ!AÀ4ó%ñ‰Fô �K‰KÐ?ÀÔHØˆMØ%ÔØ×#Ñ#Ð#r   c                 óú  • / n0 nU R                   nSnU H)  nSR                  Xd5      nUR                  U5        XcU'   M+     [        R	                  S5        SnSnU R                  5       n	 [        R                  " UU	R                  U	R                  [        R                  U R                  U R                  UU R                  SS9	u  phU(       a  U(       a
  X€l        X6   $ g! [        R                   a     N/f = f)a  Get an API token for ECS Instance Metadata Service.

On ECS. IMDS will always answer an API token, set
HttpTokens=optional (default) when create instance will not forcefully
use the security-enhanced mode (IMDSv2).

https://api.alibabacloud.com/api/Ecs/2014-05-26/RunInstances
ÚPUTz{0}/{1}zFetching Ecs IMDSv2 API TokenNF)	ÚurlsÚmax_waitÚtimeoutÚ	status_cbÚ
headers_cbÚexception_cbÚrequest_methodÚheaders_redactÚconnect_synchronously)rM   ÚformatÚappendre   ÚdebugÚget_url_paramsÚuhelpÚwait_for_urlÚmax_wait_secondsÚtimeout_secondsrf   Ú_get_headersÚ_imds_exception_cbrU   ÚUrlErrorÚ
_api_token)
r   Úmdurlsrn   Úurl2baseÚurl_pathrt   ÚurlÚcurÚresponseÚ
url_paramss
             r   Ú_maybe_fetch_api_tokenÚ'DataSourceAliYun._maybe_fetch_api_tokens   sù   € ð ˆØˆØ×'Ñ'ˆØˆÛˆCØ×"Ñ" 3Ó1ˆCØ�K‰K˜ÔØ�S‹Mñ ô 	�	‰	Ð1Ô2àˆØˆØ×(Ñ(Ó*ˆ
ð	Ü!×.Ò.ØØ#×4Ñ4Ø"×2Ñ2ÜŸ+™+Ø×,Ñ,Ø!×4Ñ4Ø-Ø#×7Ñ7Ø&+ñ
‰MˆCö  –8Ø&ŒOØ‘=Ð ð øô �~‰~ó 	ñ ð	ús   Á,AC# Ã#C:Ã9C:c                 ó  • U R                   nUR                  SU R                  5      nU R                  U5      nU(       a'  X0l        [
        R                  SU R                  5        O[
        R                  S5        [        U5      $ )NÚmetadata_urlszUsing metadata source: '%s'z)IMDS's HTTP endpoint is probably disabled)	rd   r7   r�   rŠ   Úmetadata_addressre   ry   rf   Úbool)r   Úmcfgrƒ   rŽ   s       r   Úwait_for_metadata_serviceÚ*DataSourceAliYun.wait_for_metadata_service¥   sk   € Ø�{‰{ˆØ—‘˜/¨4×+=Ñ+=Ó>ˆð  ×6Ñ6°vÓ>ÐæØ$4Ô!Ü�I‰IÐ3°T×5JÑ5JÕKä�K‰KÐCÔDÜÐ$Ó%Ð%r   c           
      óN  • U R                  5       (       d  0 $ U R                  n0 nU R                  nU R                  nSnU R                  n [
        R                  " U R                  U R                  U R                  UUSS9US'   [
        R                  " U R                  U R                  U R                  UUSS9US'    [
        R                  " U R                  U R                  U R                  UUS9nXrS'   U$ ! [         ad    [        R                  " [        SU R                  5        [        R                   " U R                  U R                  U R                  UUUS9US'    U$ f = f! [         a+    [        R                  " [        S	U R                  5        0 s $ f = f)
zŸCrawl metadata service when available.

@returns: Dictionary of crawled metadata content containing the keys:
  meta-data, user-data, vendor-data and dynamic.
Nú	user-data)rr   ru   rs   Ú	item_nameúvendor-data)rr   ru   rs   ú	meta-dataz@Faild read json meta-data from %s fall back directory tree style)rr   ru   rs   Úretrieval_exception_ignore_cbz'Failed reading from metadata address %s)r‘   rU   Ú_refresh_stale_aliyun_token_cbÚ&_skip_or_refresh_stale_aliyun_token_cbÚ#_skip_json_path_meta_path_aliyun_cbr   Úget_instance_dataÚmin_metadata_versionrŽ   r   Úget_instance_meta_dataÚ	Exceptionr   Úlogexcre   r   Úget_instance_metadata)r   ÚredactÚcrawled_metadataÚexc_cbÚ	exc_cb_udÚskip_cbÚexe_cb_whole_metarg   s           r   Úcrawl_metadataÚDataSourceAliYun.crawl_metadata³   s·  € ð ×-Ñ-×/Ñ/ØˆIØ×)Ñ)ˆØÐØ×4Ñ4ˆØ×?Ñ?ˆ	ØˆØ ×DÑDÐð/	Ü,2×,DÒ,DØ×)Ñ)Ø×%Ñ%Ø×,Ñ,Ø%Ø&Ø%ñ-Ð˜[Ñ)ô /5×.FÒ.FØ×)Ñ)Ø×%Ñ%Ø×,Ñ,Ø%Ø&Ø'ñ/Ð˜]Ñ+ðÜ×6Ò6Ø×-Ñ-Ø×)Ñ)Ø#×0Ñ0Ø#)Ø!2ñ�ð 17 Ñ-ð.  Ðøô- ó Ü—’Üð5à×)Ñ)ô	ô 14×0IÒ0IØ×-Ñ-Ø×)Ñ)Ø#×0Ñ0Ø#)Ø!'Ø29ñ1Ð  Ò-ð  Ðð-ûô ó 	Ü�KŠKÜØ9Ø×%Ñ%ôð
 ŠIð	ús2   ÁA4E/ Ã:C> Ã>A*E,Å(E/ Å+E,Å,E/ Å/2F$Æ#F$c                 óš   • [        U[        R                  5      (       a,  UR                  S:X  a  [        R                  S5        SU l        g)z=Exception handler for Ecs to refresh token if token is stale.i‘  z+Clearing cached Ecs API token due to expiryNT)r`   r{   r�   Úcodere   ry   r‚   ©r   ÚmsgÚ	exceptions      r   r™   Ú/DataSourceAliYun._refresh_stale_aliyun_token_cbó   s5   € ä�i¤§¡×0Ñ0°Y·^±^ÀsÓ5Jä�I‰IÐCÔDØ"ˆDŒOØr   c                 ó    • UR                   U;  $ )z/Returns False if cause.code is in status_codes.)r«   )r   Ústatus_codesÚcauses      r   Ú_skip_retry_on_codesÚ%DataSourceAliYun._skip_retry_on_codesû   s   € à�z‰z Ñ-Ð-r   c                 ót   • U R                  [        R                  U5      nU(       d  gU R                  X5      $ )zVCallback will not retry on SKIP_USERDATA_VENDORDATA_CODES or
if no token is available.F)r³   r   ÚSKIP_USERDATA_CODESr™   )r   r­   r®   Úretrys       r   rš   Ú7DataSourceAliYun._skip_or_refresh_stale_aliyun_token_cbÿ   s3   € ð ×)Ñ)¬#×*AÑ*AÀ9ÓMˆÞØØ×2Ñ2°3ÓBÐBr   c                 ó®   • [        U[        R                  5      (       a&  UR                  S:X  a  [        R                  S5        gU R                  X5      $ )z7Callback will not retry of whole meta_path is not foundi”  z&whole meta_path is not found, skippingF)r`   r{   r�   r«   re   rf   r™   r¬   s      r   r›   Ú4DataSourceAliYun._skip_json_path_meta_path_aliyun_cb  s?   € ä�i¤§¡×0Ñ0°Y·^±^ÀsÓ5JÜ�K‰KÐ@ÔAØØ×2Ñ2°3ÓBÐBr   c                 ól  • U R                   U R                  R                  5       :w  a  gU R                  (       a°  [        R
                  " 5       (       a  [        R                  S5        g [        U R                  U R                  R                  SSS9 nU R                  5       U l        [        R                  SUR                  (       a  SUR                   3OS5        S S S 5        OU R                  5       U l        U R                  (       a  [        U R                  [         5      (       d  gU R                  R#                  S0 5      U l        U R                  R#                  S	0 5      U l        U R                  R#                  S
0 5      U l        g! , (       d  f       N£= f! [         a     gf = f)NFz1FreeBSD doesn't support running dhclient with -sfT)Úipv4Úipv6zCrawled metadata service%sÚ Ú r—   r”   r–   )Ú
cloud_namerE   rF   Úperform_dhcp_setupr   Ú
is_FreeBSDre   ry   r   r+   r_   r¨   Ú_crawled_metadataÚ	state_msgr   r`   ra   r7   r6   Úuserdata_rawÚvendordata_raw)r   Únetws     r   Ú	_get_dataÚDataSourceAliYun._get_data  sZ  € Ø�?‰?˜dŸk™k×/Ñ/Ó1Ó1ØØ×"×"Ü�Š× Ñ Ü—	‘	ÐMÔNØðÜ'Ø—K‘KØ—K‘K×2Ñ2ØØò	ð
 Ø-1×-@Ñ-@Ó-B�DÔ*Ü—I‘IØ4Ø04··˜!˜DŸN™NÐ+Ñ,ÀBô÷ð ð &*×%8Ñ%8Ó%:ˆDÔ"Ø×%×%¬ZØ×"Ñ"¤D÷.
ñ .
ð Ø×.Ñ.×2Ñ2°;ÀÓCˆŒØ ×2Ñ2×6Ñ6°{ÀBÓGˆÔØ"×4Ñ4×8Ñ8¸ÈÓKˆÔØ÷/õ ûô $ó Ùðús1   Á,*F& ÂAFÃ"F& Æ
F#ÆF& Æ#F& Æ&
F3Æ2F3c                 ó|  • Uc  U R                   n[        R                  S5        U R                  U0nSR	                  U R
                  U R                  5      n [        R                  " UUU R                  SS9nUR                  $ ! [        R                   a   n[        R                  SX55         SnAgSnAff = f)z…Request new metadata API token.
@param seconds: The lifetime of the token in seconds

@return: The API token or None if unavailable.
Nz!Refreshing Ecs metadata API tokenz{}/{}rm   )Úheadersru   rt   z/Unable to get API token: %s raised exception %s)rQ   re   ry   rT   rw   rŽ   rM   r{   ÚreadurlrU   r�   rf   Úcontents)r   ÚsecondsÚrequest_headerÚ	token_urlrˆ   Úes         r   Ú_refresh_api_tokenÚ#DataSourceAliYun._refresh_api_token/  s¬   € ð ‰?Ø×3Ñ3ˆGä�	‰	Ð5Ô6Ø×6Ñ6¸Ð@ˆØ—N‘N 4×#8Ñ#8¸$×:NÑ:NÓOˆ	ð	Ü—}’}ØØ&Ø#×7Ñ7Ø$ñ	ˆHð × Ñ Ð øô �~‰~ó 	Ü�K‰KØAÀ9ôô ûð		ús   Á!B ÂB;ÂB6Â6B;c                 óø   • U R                   U R                  0nU R                  U;   a  U$ U R                  (       d(  U R	                  5       U l        U R                  (       d  0 $ U R
                  U R                  0$ )zŸReturn a dict of headers for accessing a url.

If _api_token is unset on AWS, attempt to refresh the token via a PUT
and then return the updated token header.
)rT   rQ   rM   r‚   rÒ   r   )r   r†   Úrequest_token_headers      r   r   ÚDataSourceAliYun._get_headersJ  sm   € ð ×(Ñ(¨$×*GÑ*Gð 
Ðð ×Ñ 3Ó&Ø'Ð'Ø��ð #×5Ñ5Ó7ˆDŒOØ—?—?Ø�	Ø×,Ñ,¨d¯o©oÐ>Ð>r   c                 ó   • [        U[        R                  5      (       a_  UR                  (       aN  UR                  S:¼  a>  UR                  S:X  a  [        R                  S5        Ue[        R                  S5        Ueg)aê  Fail quickly on proper AWS if IMDSv2 rejects API token request

Guidance from Amazon is that if IMDSv2 had disabled token requests
by returning a 403, or cloud-init malformed requests resulting in
other 40X errors, we want the datasource detection to fail quickly
without retries as those symptoms will likely not be resolved by
retries.

Exceptions such as requests.ConnectionError due to IMDS being
temporarily unroutable or unavailable will still retry due to the
callsite wait_for_url.
é�  i“  zLEcs IMDS endpoint returned a 403 error. HTTP endpoint is disabled. Aborting.z2Fatal error while requesting Ecs IMDSv2 API tokensT)r`   r{   r�   r«   re   rf   )r   r®   s     r   r€   Ú#DataSourceAliYun._imds_exception_cb_  sf   € ô �i¤§¡×0Ñ0à�~�~ )§.¡.°CÓ"7Ø—>‘> SÓ(Ü—K‘Kð?ôð  �ô —K‘KØLôð  �Ør   )r‚   rÃ   r   r&   r6   rŽ   rÅ   rÆ   )FFFr!   )r¿   )/Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rE   r�   r�   r   r   ÚstrÚ__annotations__Úurl_max_waitÚurl_timeoutr‚   r   r^   r   r   ra   rÁ   Úpropertyr   r#   Úintr2   r<   r@   rG   rJ   rM   rQ   rU   rT   rj   rŠ   r‘   r¨   r™   r³   rš   r›   rÈ   rÒ   r   r€   Ú__static_attributes__Ú__classcell__)r-   s   @r   r   r      sQ  ø‡ à€FØ-Ð.€Mð (ÐØ,.Ð  S¡	Ó.ð €LØ€Kð €Jà(/¯©€O�U˜3 ˜9Ñ%Ó5ð Ðð ñ-ó ð-õKð
*¨ð *°÷ *ô8òGò$ð
 ñ#ó ð#ð ñ"ó ð"ð ñó ðð ñLó ðLð ñ=ó ð=ð ñ$ó ð$ò,0òd&ò> ò@ò.òCòCòôB!ô6?÷*ò r   r   c                  ó<   • [         R                  " S5      [        :H  $ )Nzsystem-product-name)r   Úread_dmi_dataÚALIYUN_PRODUCTr   r   r   rD   rD   |  s   € Ü×ÒÐ2Ó3´~ÑEÐEr   c                 ó  • / nU R                  5        Hê  u  p#[        U[        5      (       a!  UR                  UR	                  5       5        M;  [        U[
        5      (       a  UR                  U5        Mc  [        U[        5      (       d  Mz  UR                  S/ 5      n[        U[        5      (       a!  UR                  UR	                  5       5        MÂ  [        U[
        5      (       d  MÙ  UR                  U5        Mì     U$ )Nzopenssh-key)	Úitemsr`   rÞ   rx   ÚstripÚlistÚextendra   r7   )Úpublic_keysÚkeysÚ_key_idÚkey_bodyÚkeys        r   r?   r?   €  s²   € Ø€DØ(×.Ñ.Ö0ÑˆÜ�h¤×$Ñ$Ø�K‰K˜Ÿ™Ó(Ö)Ü˜¤$×'Ñ'Ø�K‰K˜Ö!Ü˜¤$×'Ó'Ø—,‘,˜}¨bÓ1ˆCÜ˜#œs×#Ñ#Ø—‘˜CŸI™I›KÖ(Ü˜C¤×&Ó&Ø—‘˜CÖ ñ 1ð €Kr   c                   ó   • \ rS rSrSrSrSrg)ÚDataSourceAliYunLocalrØ   ae  Datasource run at init-local which sets up network to query metadata.

In init-local, no network is available. This subclass sets up minimal
networking with dhclient on a viable nic so that it can talk to the
metadata service. If the metadata service provides network configuration
then render the network configuration for that instance based on metadata.
Tr   N)rÚ   rÛ   rÜ   rÝ   Ú__doc__rÁ   rä   r   r   r   rô   rô   �  s   † ñð Ór   rô   c                 ó8   • [         R                  " U [        5      $ r!   )r   Úlist_from_dependsÚdatasources)Údependss    r   Úget_datasource_listrú   ¤  s   € Ü×$Ò$ W¬kÓ:Ð:r   )$r$   ÚloggingÚtypingr   r   Ú	cloudinitr   r   r   r{   r   Úcloudinit.eventr	   r
   Úcloudinit.net.dhcpr   Úcloudinit.net.ephemeralr   Úcloudinit.sourcesr   Úcloudinit.sources.helpersr   r   Ú	getLoggerrÚ   re   rè   Ú
DataSourcer   rD   r?   rô   ÚDEP_FILESYSTEMÚDEP_NETWORKrø   rú   r   r   r   Ú<module>r     s¢   ðó Û ß ç "Ý )Ý ß 1Ý /Ý 6Ý 0ß 1à×Ò˜Ó!€à$€ôd�w×)Ñ)ô dòNFòô 	Ð,ô 	ð ˜W×3Ñ3Ð5Ð6Ø˜×.Ñ.°×0CÑ0CÐDÐEð€ó;r   