ó
    x[hç:  ã                   ó–  • S SK r S SKrS SKrS SKrS SKrS SKJr  S SKrS SKJ	r	  S SK
Jr  S SKJr  S SKJrJrJrJrJr  S SKJrJr  S SKJr  S S	KJrJr  S S
KJr  S SKJr  \R@                  " \!5      r"SS/r#Sr$Sr%Sr& " S S\RN                  RP                  5      r)S r*S r+ " S S\RX                  5      r-\-\R\                  44/r/S r0g)é    N)Úurlparse)ÚConnectionError)ÚHTTPConnection)ÚPoolManager)ÚdmiÚperformanceÚsourcesÚ
url_helperÚutil)Ú
EventScopeÚ	EventType)ÚNoDHCPLeaseError)ÚEphemeralDHCPv4ÚEphemeralIPv6Network)ÚDataSourceHostname)ÚProcessExecutionErrorzhttp://169.254.42.42zhttp://[fd00:42::42]é   é   é
   c                   ó6   ^ • \ rS rSrSrU 4S jrSS jrSrU =r$ )ÚSourceAddressAdapteré&   z>
Adapter for requests to choose the local address to bind to.
c                 ó:   >• Xl         [        [        U ]  " S0 UD6  g )N© )Úsource_addressÚsuperr   Ú__init__)Úselfr   ÚkwargsÚ	__class__s      €ÚF/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceScaleway.pyr   ÚSourceAddressAdapter.__init__+   s   ø€ Ø,ÔÜÔ" DÒ2Ñ<°VÓ<ó    c                 ó¢   • [         R                  [        R                  [        R                  S4/-   n[        UUUU R                  US9U l        g )Né   )Ú	num_poolsÚmaxsizeÚblockr   Úsocket_options)r   Údefault_socket_optionsÚsocketÚ
SOL_SOCKETÚSO_REUSEPORTr   r   Úpoolmanager)r   Úconnectionsr'   r(   r)   s        r!   Úinit_poolmanagerÚ%SourceAddressAdapter.init_poolmanager/   sR   € Ü'×>Ñ>Ü×Ñ¤× 3Ñ 3°QÐ7ðB
ñ 
ˆô 'Ø!ØØØ×.Ñ.Ø)ñ
ˆÕr#   )r.   r   )F)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r0   Ú__static_attributes__Ú__classcell__©r    s   @r!   r   r   &   s   ø† ñõ=÷

ò 

r#   r   c           	      óÜ   •  [         R                  " U SUSUS S9n[        R                  " UR                  5      $ ! [         R
                   a  nUR                  S:X  a   SnAge SnAff = f)a%  
Retrieve user data or vendor data.

Scaleway user/vendor data API returns HTTP/404 if user/vendor data is not
set.

This function calls `url_helper.readurl` but instead of considering
HTTP/404 as an error that requires a retry, it considers it as empty
user/vendor data.

Also, be aware the user data/vendor API requires the source port to be
below 1024 to ensure the client is root (since non-root users can't bind
ports below 1024). If requests raises ConnectionError (EADDRINUSE), the
caller should retry to call this function on an other port.
Nr   c                 ó”   • U R                   S:g  =(       a3    [        U R                  [        R                  R
                  5      (       + $ )Né”  )ÚcodeÚ
isinstanceÚcauseÚrequestsÚ
exceptionsr   )Úexcs    r!   Ú<lambda>Ú%query_data_api_once.<locals>.<lambda>W   s3   €  S§X¡X°¡_÷ &ä˜sŸy™y¬(×*=Ñ*=×*MÑ*MÓNÔNð&r#   )ÚdataÚtimeoutÚretriesÚsessionÚexception_cbr<   )r
   Úreadurlr   Údecode_binaryÚcontentsÚUrlErrorr=   )Úapi_addressrF   Úrequests_sessionÚresprB   s        r!   Úquery_data_api_oncerQ   <   sk   € ð Ü×!Ò!ØØØð Ø$ññ
ˆô ×!Ò! $§-¡-Ó0Ð0øÜ×Ñó à�8‰8�s‹?ÜØûð	ús   ‚9< ¼A+ÁA&Á%A&Á&A+c                 ó¢  • [        S[        US5      5       HÓ  n [        R                  SX5        [        R
                  " 5       nSn [        U5      R                  nUnUS   S:X  a  USS n[        R                  " US[        R                  S	9S   S   n	U	[        R                  :X  a  S
nUR                  S[        Xd4S95        [        XUS9n
[        R                  SU 5        U
s  $    We! [         a     NNf = f! [         R"                   a:  n[        R%                  SX5        [&        R(                  " S5        Un SnAGM2  SnAff = f)a  Get user or vendor data.

Handle the retrying logic in case the source port is used.

Scaleway metadata service requires the source port of the client to
be a privileged port (<1024).  This is done to ensure that only a
privileged user on the system can access the metadata service.
r%   r   z*Trying to get %s data (bind on port %d)...z0.0.0.0r   Ú[éÿÿÿÿN)Úprotoz0::zhttp://)r   )rF   rO   z%s-data downloadedz%Error while trying to get %s data: %sé   )ÚrangeÚmaxÚLOGÚdebugr@   ÚSessionr   Únetlocr+   ÚgetaddrinfoÚIPPROTO_TCPÚAF_INET6Ú
ValueErrorÚmountr   rQ   r
   rM   ÚwarningÚtimeÚsleep)Úapi_typerN   rG   rF   ÚportrO   Ú	localhostÚurl_addressÚaddressÚ
addr_protorE   rB   Úlast_excs                r!   Úquery_data_apirl   d   sT  € ô �aœ˜W a›Ö)ˆð"	Ü�I‰IØ<¸hôô  (×/Ò/Ó1Ðà!ˆIðÜ& {Ó3×:Ñ:�Ø%�Ø˜q‘> SÓ(Ø)¨!¨BÐ/�GÜ#×/Ò/Ø˜T¬×);Ñ);ñàñàñ�
ð ¤§¡Ó0Ø %�Ið ×"Ñ"ØÜ$°YÐ4EÑFôô 'ØÐ?OñˆDô �I‰IÐ*¨HÔ5ØŠKñ9 *ðL €Nøô) ó Ùðûô ×"Ñ"ó 	ä�K‰KÐ?ÀÔOÜ�JŠJ�qŒMØˆHÞûð	ús<   ›-D Á	A%C0Â.;D Ã0
C=Ã:D Ã<C=Ã=D Ä EÄ.E	Å	Ec                   ó  ^ • \ rS rSrSr\R                  \R                  \R                  \R                  10rU 4S jrS\SS4U 4S jjrS rS	 r\S
 5       rS r\S 5       r\S 5       rS rS rSS jr\S 5       r\S 5       rSrU =r$ )ÚDataSourceScalewayé˜   ÚScalewayc                 ó²  >• [         [        U ]  XU5        [        R                  " [        R
                  " USS/0 5      /5      U l        [        U R                  R                  S[        5      5      U l
        [        U R                  R                  S[        5      5      U l        [        U R                  R                  S[        5      5      U l        [        R                   U l        [$        U l        S U l        S U l        S U l        S U l        SU l        SU R                  R3                  5       ;   a#  U =R&                  U R                  S   -  sl        g g )NÚ
datasourcerp   rG   rF   Úmax_waitTÚmetadata_urls)r   rn   r   r   ÚmergemanydictÚget_cfg_by_pathÚds_cfgÚintÚgetÚDEF_MD_RETRIESrG   ÚDEF_MD_TIMEOUTrF   ÚDEF_MD_MAX_WAITrs   r	   ÚUNSETÚ_network_configÚDS_BASE_URLSrt   Úmetadata_urlÚuserdata_urlÚvendordata_urlÚephemeral_fixed_addressÚhas_ipv4Úkeys)r   Úsys_cfgÚdistroÚpathsr    s       €r!   r   ÚDataSourceScaleway.__init__¢   s  ø€ ÜÔ  $Ñ0°À%ÔHä×(Ò(ä×$Ò$ W¨|¸ZÐ.HÈ"ÓMðó
ˆŒô ˜4Ÿ;™;Ÿ?™?¨9´nÓEÓFˆŒÜ˜4Ÿ;™;Ÿ?™?¨9´nÓEÓFˆŒÜ˜DŸK™KŸO™O¨J¼ÓHÓIˆŒÜ&Ÿ}™}ˆÔÜ)ˆÔØ ˆÔØ ˆÔØ"ˆÔØ'+ˆÔ$ØˆŒØ˜dŸk™k×.Ñ.Ó0Ó0Ø×Ò $§+¡+¨oÑ">Ñ>Öð 1r#   Úci_pkl_versionÚreturnNc                 ó˜   >• [         TU ]  U5        S S[        [        S S S.nU H#  n[	        X5      (       a  M  [        XX#   5        M%     g )NT)rƒ   r„   rs   rt   r�   r‚   )r   Ú	_unpickler|   r   ÚhasattrÚsetattr)r   rŠ   Úattr_defaultsÚattrr    s       €r!   r�   ÚDataSourceScaleway._unpickle¸   sM   ø€ Ü‰Ñ˜.Ô)à'+ØÜ'Ü)Ø Ø"ñ
ˆó "ˆDÜ˜4×&Ó&Ü˜ MÑ$7Ö8ò "r#   c                 óv  • [         R                  " 5       n[        R                  " UU R                  U R
                  SS9u  p4U(       a5  [        R                  SU5        U S3U l        U S3U l	        U S3U l
        g[        R                  SU[        [         R                  " 5       U-
  5      5        [        e)	z?
Define metadata_url based upon api-metadata URL availability.
F)Úurlsrs   rF   Úconnect_synchronouslyz%s is reachablez/conf?format=jsonz/user_data/cloud-initz/vendor_data/cloud-initNz3Unable to reach api-metadata at %s after %s seconds)rc   Ú	monotonicr
   Úwait_for_urlrs   rF   rY   rZ   r€   r�   r‚   rx   r   )r   r”   Ú
start_timeÚ	avail_urlÚ_s        r!   Ú_set_metadata_urlÚ$DataSourceScaleway._set_metadata_urlÆ   s«   € ô
 —^’^Ó%ˆ
Ü!×.Ò.ØØ—]‘]Ø—L‘LØ"'ñ	
‰ˆ	ö Ü�I‰IÐ'¨Ô3Ø#, +Ð->Ð ?ˆDÔØ#, +Ð-BÐ CˆDÔØ%. KÐ/FÐ"GˆDÔØä�I‰IØEØÜ”D—N’NÓ$ zÑ1Ó2ôô
 "Ð!r#   c                 ó¢  • [         R                  " U R                  U R                  U R                  S9n[
        R                  " [        R                  " UR                  5      5      U l
        [        SU R                  U R                  U R                  5      U l        [        SU R                  U R                  U R                  5      U l        g )N)rF   rG   z	user-datazvendor-data)r
   rJ   r€   rF   rG   ÚjsonÚloadsr   rK   rL   Úmetadatarl   r�   Úuserdata_rawr‚   Úvendordata_raw)r   rP   s     r!   Ú_crawl_metadataÚ"DataSourceScaleway._crawl_metadataà   s’   € Ü×!Ò!Ø×Ñ t§|¡|¸T¿\¹\ñ
ˆô Ÿ
š
¤4×#5Ò#5°d·m±mÓ#DÓEˆŒä*Ø˜×*Ñ*¨D¯L©L¸$¿,¹,ó
ˆÔô -Ø˜4×.Ñ.°·±¸d¿l¹ló
ˆÕr#   c                  óÀ   • [         R                  " S5      n U S:X  a  g[        R                  R	                  S5      (       a  g[
        R                  " 5       nSU;   a  gg)zð
There are three ways to detect if you are on Scaleway:

* check DMI data: not yet implemented by Scaleway, but the check is
  made to be future-proof.
* the initrd created the file /var/run/scaleway.
* "scaleway" is in the kernel cmdline.
zsystem-manufacturerrp   Tz/var/run/scalewayÚscalewayN)r   Úread_dmi_dataÚosÚpathÚexistsr   Úget_cmdline)Úvendor_nameÚcmdlines     r!   Ú	ds_detectÚDataSourceScaleway.ds_detectí   sU   € ô ×'Ò'Ð(=Ó>ˆØ˜*Ó$Øä�7‰7�>‰>Ð-×.Ñ.Øä×"Ò"Ó$ˆØ˜Ó Øð !r#   c                 óÖ  • U R                   (       a—   [        U R                  U R                  R                  5       n[        R
                  " S5         U R                  U R                  5        S S S 5        U R                  5         US   U l	        SU R                  S'   S S S 5        U R                   (       dŽ   [%        U R                  U R                  R                  5         [        R
                  " S5         U R                  U R                  5        S S S 5        U R                  5         SU R                  S'   S S S 5        gg! , (       d  f       Nß= f! , (       d  f       N¿= f! [        [        [        4 a6  n[        R                  " [         [#        U5      5        SU l          S nAGNS nAff = f! , (       d  f       N§= f! , (       d  f       g= f! [         a     gf = f)	Nz7Setting api-metadata URL depending on IPv4 availabilityzfixed-addressÚipv4Ú
net_in_useFz7Setting api-metadata URL depending on IPv6 availabilityÚipv6T)r„   r   r‡   Úfallback_interfacer   ÚTimedr›   rt   r£   rƒ   r    r   r   r   r   ÚlogexcrY   Ústrr   )r   r±   Úes      r!   Ú	_get_dataÚDataSourceScaleway._get_data  s�  € ð
 �=�=ð&ô %Ø—K‘KØ—K‘K×2Ñ2ôð Ü$×*Ò*ð9õð ×.Ñ.¨t×/AÑ/AÔB÷	ð
 ×(Ñ(Ô*Ø37¸Ñ3H�DÔ0Ø28�D—M‘M ,Ñ/÷ð. �}�}ðÜ)Ø—K‘KØ—K‘K×2Ñ2õô %×*Ò*ð,õð ×.Ñ.¨t×/AÑ/AÔB÷	ð
 ×(Ñ(Ô*Ø28�D—M‘M ,Ñ/÷ñ ÷Eõ ú÷	õ ûô !ÜÜ%ðó &ô
 —’œC¤ Q£Ô(ð !&�—’ûð&ú÷"õ ú÷	ô ð ûô #ó Ùðús”   “*E+ ½EÁE	Á01EÂ!E+ Â;*G Ã%G
Ã<F9Ä'G
Ä?G Å	
E	ÅEÅ
E(Å$E+ Å(E+ Å+F6Æ +F1Æ1F6Æ9
G	ÇG
Ç

GÇG ÇG Ç
G(Ç'G(c           	      ó|  • U R                   c9  [        R                  S[        R                  5        [        R                  U l         U R                   [        R                  :w  a  U R                   $ U R
                  S   Gc  0 n0 nU R
                  S    HÉ  nUS   U R                  :X  a7  SUS'   SSSS	.nS
UR                  5       ;   a  US
==   U/-  ss'   ME  U/US
'   MM  SUR                  5       ;   a  US==   US    SUS    34-  ss'   OUS    SUS    34US'   US   S:X  d  M—  US   SS.nS
UR                  5       ;   a  US
==   U/-  ss'   MÃ  U/US
'   MË     X!U R                  R                  '   SUS.U l         O�SSU R                  R                  -  S.nSS0/nU R
                  S   (       aI  USSU R
                  S   S   -  SU R
                  S   S   -  SSSU R
                  S   S   -  S./S./-  nXQS'   S U/S!.U l         [        R                  S"U R                   5        U R                   $ )#zH
Configure networking according to data received from the
metadata API.
z5Found None as cached _network_config. Resetting to %sÚ
private_ipÚ
public_ipsri   TÚdhcp4z169.254.42.42/32z
62.210.0.1)zon-linkÚtoÚviaÚroutesÚ	addressesÚ/ÚnetmaskÚfamilyÚinet6Úgatewayz::/0)rÀ   r¿   r   )ÚversionÚ	ethernetsÚphysicalz%s)ÚtypeÚnamerË   r³   Ústaticz::Ú0)ÚnetworkÚprefixrÇ   )rË   ri   rÄ   rÁ   Úsubnetsr%   )rÈ   Úconfigznetwork_config : %s)r~   rY   rb   r	   r}   r    rƒ   r…   r‡   r´   rZ   )r   ÚnetcfgÚip_cfgÚipÚrouterÑ   s         r!   Únetwork_configÚ!DataSourceScaleway.network_config4  sƒ  € ð ×ÑÑ'Ü�K‰KØGÜ—‘ôô $+§=¡=ˆDÔ à×Ñ¤7§=¡=Ó0Ø×'Ñ'Ð'à�=‰=˜Ñ&Ò.ð ˆFØˆFØ—m‘m LÔ1�à�i‘= D×$@Ñ$@Ó@Ø&*�F˜7‘Oð $(Ø0Ø+ñ�Eð
   6§;¡;£=Ó0Ø˜xÓ(¨U¨GÑ3Õ(à,1¨7˜˜xÓ(à" f§k¡k£mÓ3Ø˜{Ó+Ø! )™}˜o¨Q¨r°)©}¨oÐ>ð0ñ Ô+ð
  " )™}˜o¨Q¨r°)©}¨oÐ>ð/˜˜{Ñ+ð ˜(‘| wÕ.Ø(*¨9©¸VÑ D˜Ø# v§{¡{£}Ó4Ø" 8Ó,°°Ñ7Õ,à05¨w˜F 8Ó,ñ9 2ð: 6<�4—;‘;×1Ñ1Ñ2Ø/0¸vÑ#FˆDÕ ð #Ø˜tŸ{™{×=Ñ=Ñ=ñˆFð  Ð(Ð)ˆGØ�}‰}˜V×$Øà (Ø#'¨$¯-©-¸Ñ*?À	Ñ*JÑ#JØ#'¨$¯-©-¸Ñ*?À	Ñ*JÑ#Jð ,0Ø*-Ø+/Ø"&§-¡-°Ñ"7¸	Ñ"Bñ,Cñð#ñ	ðñ �ð !(�9ÑØ/0¸V¸HÑ#EˆDÔ Ü�	‰	Ð'¨×)=Ñ)=Ô>Ø×#Ñ#Ð#r#   c                 ó   • g ©Nr   ©r   s    r!   Úlaunch_indexÚDataSourceScaleway.launch_index„  ó   € àr#   c                 ó    • U R                   S   $ )NÚid)r    rÛ   s    r!   Úget_instance_idÚ"DataSourceScaleway.get_instance_idˆ  s   € Ø�}‰}˜TÑ"Ð"r#   c                 ó(  • U R                   S    Vs/ s H  oS   PM	     nnSn[        U5      nU R                   R                  S/ 5       H>  nUR                  U5      (       d  M  UR	                  XTS  R                  SS5      5        M@     U$ s  snf )NÚssh_public_keysÚkeyzAUTHORIZED_KEY=Útagsrš   Ú )r    Úlenry   Ú
startswithÚappendÚreplace)r   rå   Ússh_keysÚakeypreÚplenÚtags         r!   Úget_public_ssh_keysÚ&DataSourceScaleway.get_public_ssh_keys‹  s‰   € Ø*.¯-©-Ð8IÒ*JÓKÒ*J 3˜”JÑ*JˆÐKà#ˆÜ�7‹|ˆØ—=‘=×$Ñ$ V¨RÖ0ˆCØ—>‘> '×*Ñ*ÙØ�O‰O˜C ˜J×.Ñ.¨s°CÓ8Ö9ñ 1ð
 ˆùò Ls   ’Bc                 ó4   • [        U R                  S   S5      $ )NÚhostnameF)r   r    )r   ÚfqdnÚ
resolve_ipÚmetadata_onlys       r!   Úget_hostnameÚDataSourceScaleway.get_hostname—  s   € Ü! $§-¡-°
Ñ";¸UÓCÐCr#   c                 ó   • g rÚ   r   rÛ   s    r!   Úavailability_zoneÚ$DataSourceScaleway.availability_zoneš  rÞ   r#   c                 ó   • g rÚ   r   rÛ   s    r!   ÚregionÚDataSourceScaleway.regionž  rÞ   r#   )r~   rw   rƒ   r„   rs   r    r€   rt   rG   rF   r¡   r�   r¢   r‚   )FFF)r2   r3   r4   r5   Údsnamer   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚdefault_update_eventsr   rx   r�   r›   r£   Ústaticmethodr®   r¹   Úpropertyr×   rÜ   rá   rð   r÷   rú   rý   r7   r8   r9   s   @r!   rn   rn   ˜   sÖ   ø† Ø€Fà×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!ð
ðÐõ?ð,9¨ð 9°÷ 9ò"ò4
ð ñó ðò(0ðd ñM$ó ðM$ð^ ñó ðò#ò
ôDð ñó ðð ñó ör#   rn   c                 ó8   • [         R                  " U [        5      $ rÚ   )r	   Úlist_from_dependsÚdatasources)Údependss    r!   Úget_datasource_listr  ¨  s   € Ü×$Ò$ W¬kÓ:Ð:r#   )1rž   Úloggingr¨   r+   rc   Úurllib.parser   r@   Úrequests.exceptionsr   Úurllib3.connectionr   Úurllib3.poolmanagerr   Ú	cloudinitr   r   r	   r
   r   Úcloudinit.eventr   r   Úcloudinit.net.dhcpr   Úcloudinit.net.ephemeralr   r   Úcloudinit.sourcesr   Úcloudinit.subpr   Ú	getLoggerr2   rY   r   rz   r|   r{   ÚadaptersÚHTTPAdapterr   rQ   rl   Ú
DataSourcern   ÚDEP_FILESYSTEMr	  r  r   r#   r!   Ú<module>r     s¾   ðó Û Û 	Û Û Ý !ã Ý /õ .Ý +ç AÕ Aß 1Ý /ß IÝ 0Ý 0à×Ò˜Ó!€à&Ð(>Ð?€à€Ø€Ø€ô
˜8×,Ñ,×8Ñ8ô 
ò,%òP1ôhH˜×+Ñ+ô HðX ˜'×0Ñ0Ð2Ð3ð€ó
;r#   