Ë
    x[hç:  ã                   ó–  — d dl Z d dlZd dlZd dlZd dlZd dlm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mZmZmZmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ  ej@                  e!«      Z"ddgZ#dZ$dZ%dZ& G d„ dejN                  jP                  «      Z)d„ Z*d„ Z+ G d„ dejX                  «      Z-e-ej\                  ffgZ/d„ Z0y)é    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                   ó*   ‡ — e Zd ZdZˆ fd„Zdd„Zˆ xZS )ÚSourceAddressAdapterzF
    Adapter for requests to choose the local address to bind to.
    c                 ó:   •— || _         t        t        | �  di |¤Ž y )N© )Úsource_addressÚsuperr   Ú__init__)Úselfr   ÚkwargsÚ	__class__s      €úF/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceScaleway.pyr   zSourceAddressAdapter.__init__+   s   ø€ Ø,ˆÔÜÔ" DÑ2Ñ<°VÓ<ó    c                 ó¨   — t         j                  t        j                  t        j                  dfgz   }t        |||| j                  |¬«      | _        y )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_poolmanagerz%SourceAddressAdapter.init_poolmanager/   sR   € Ü'×>Ñ>Ü×Ñ¤× 3Ñ 3°QÐ7ðB
ñ 
ˆô 'Ø!ØØØ×.Ñ.Ø)ô
ˆÕr!   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r.   Ú__classcell__©r   s   @r    r   r   &   s   ø„ ñô=÷

r!   r   c                 óÚ   — 	 t        j                  | d|d|d„ ¬«      }t        j                  |j                  «      S # t         j
                  $ r}|j                  dk(  rY d}~y‚ d}~ww xY w)aQ  
    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                 ó‚   — | j                   dk7  xr/ t        | j                  t        j                  j
                  «       S )Né”  )ÚcodeÚ
isinstanceÚcauseÚrequestsÚ
exceptionsr   )Úexcs    r    ú<lambda>z%query_data_api_once.<locals>.<lambda>W   s3   €  S§X¡X°¡_ò &ä˜sŸy™y¬(×*=Ñ*=×*MÑ*MÓNÐNð r!   )ÚdataÚtimeoutÚretriesÚsessionÚexception_cbr7   )r
   Úreadurlr   Údecode_binaryÚcontentsÚUrlErrorr8   )Úapi_addressr@   Úrequests_sessionÚrespr=   s        r    Úquery_data_api_oncerK   <   sk   € ð Ü×!Ñ!ØØØð Ø$ñô
ˆô ×!Ñ! $§-¡-Ó0Ð0øÜ×Ñò à�8‰8�sŠ?ÜØûð	ús   ‚:= ½A*ÁA%Á$A%Á%A*c                 óª  — t        dt        |d«      «      D ]Û  }	 t        j                  d| |«       t	        j
                  «       }d}	 t        |«      j                  }|}|d   dk(  r|dd }t        j                  |dt        j                  ¬	«      d   d   }	|	t        j                  k(  rd
}|j                  dt        ||f¬«      «       t        |||¬«      }
t        j                  d| «       |
c S  ‚# t        $ r Y ŒTw xY w# t         j"                  $ r9}t        j%                  d| |«       t'        j(                  d«       |}Y d}~�Œ6d}~ww xY w)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   )r@   rI   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   rK   r
   rG   ÚwarningÚtimeÚsleep)Úapi_typerH   rA   r@   ÚportrI   Ú	localhostÚurl_addressÚaddressÚ
addr_protor?   r=   Úlast_excs                r    Úquery_data_apirf   d   sa  € ô �aœ˜W a›Ó)ò #ˆð"	Ü�I‰IØ<¸hÈôô  (×/Ñ/Ó1Ðà!ˆIðÜ& {Ó3×:Ñ:�Ø%�Ø˜q‘> SÒ(Ø)¨!¨BÐ/�GÜ#×/Ñ/Ø˜T¬×);Ñ);ôàñàñ�
ð ¤§¡Ò0Ø %�Ið ×"Ñ"ØÜ$°YÀÐ4EÔFôô 'Ø WÐ?OôˆDô �I‰IÐ*¨HÔ5ØŠKð9#ðL €Nøô) ò Ùðûô ×"Ñ"ò 	ä�K‰KÐ?ÀÈ3ÔOÜ�J‰J�qŒMØˆHÝûð	ús=   ›-DÁ	A%C7Â.ADÃ7	DÄ DÄDÄDÄEÄ.EÅEc                   ó
  ‡ — e Zd ZdZej
                  ej                  ej                  ej                  hiZ
ˆ fd„Zdeddfˆ fd„Zd„ Zd„ Zed	„ «       Zd
„ Zed„ «       Zed„ «       Zd„ Zd„ Zdd„Zed„ «       Zed„ «       Zˆ xZS )ÚDataSourceScalewayÚScalewayc                 ó¬  •— t         t        | �  |||«       t        j                  t        j
                  |ddgi «      g«      | _        t        | j                  j                  dt        «      «      | _
        t        | j                  j                  dt        «      «      | _        t        | j                  j                  dt        «      «      | _        t        j                   | _        t$        | _        d | _        d | _        d | _        d | _        d| _        d| j                  j3                  «       v r#| xj&                  | j                  d   z  c_        y y )NÚ
datasourceri   rA   r@   Úmax_waitTÚmetadata_urls)r   rh   r   r   ÚmergemanydictÚget_cfg_by_pathÚds_cfgÚintÚgetÚDEF_MD_RETRIESrA   ÚDEF_MD_TIMEOUTr@   ÚDEF_MD_MAX_WAITrl   r	   ÚUNSETÚ_network_configÚDS_BASE_URLSrm   Úmetadata_urlÚuserdata_urlÚvendordata_urlÚephemeral_fixed_addressÚhas_ipv4Úkeys)r   Úsys_cfgÚdistroÚpathsr   s       €r    r   z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         ‰| �  |«       d dt        t        d d dœ}|D ]  }t	        | |«      rŒt        | |||   «       Œ! y )NT)r|   r}   rl   rm   rz   r{   )r   Ú	_unpickleru   rx   ÚhasattrÚsetattr)r   r‚   Úattr_defaultsÚattrr   s       €r    r…   zDataSourceScaleway._unpickle¸   sU   ø€ Ü‰Ñ˜.Ô)à'+ØÜ'Ü)Ø Ø"ñ
ˆð "ò 	9ˆDÜ˜4 Õ&Ü˜˜d M°$Ñ$7Õ8ñ	9r!   c                 ón  — t        j                  «       }t        j                  || j                  | j
                  d¬«      \  }}|r5t        j                  d|«       |› d�| _        |› d�| _	        |› d�| _
        yt        j                  d|t        t        j                  «       |z
  «      «       t        ‚)	zO
        Define metadata_url based upon api-metadata URL availability.
        F)Úurlsrl   r@   Ú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)r]   Ú	monotonicr
   Úwait_for_urlrl   r@   rS   rT   ry   rz   r{   rq   r   )r   r‹   Ú
start_timeÚ	avail_urlÚ_s        r    Ú_set_metadata_urlz$DataSourceScaleway._set_metadata_urlÆ   s­   € ô
 —^‘^Ó%ˆ
Ü!×.Ñ.ØØ—]‘]Ø—L‘LØ"'ô	
‰ˆ	�1ñ Ü�I‰IÐ'¨Ô3Ø#, +Ð->Ð ?ˆDÔØ#, +Ð-BÐ CˆDÔØ%. KÐ/FÐ"GˆDÔØä�I‰IØEØÜ”D—N‘NÓ$ zÑ1Ó2ôô
 "Ð!r!   c                 ó¢  — t        j                  | j                  | j                  | j                  ¬«      }t        j                  t        j                  |j                  «      «      | _
        t        d| j                  | j                  | j                  «      | _        t        d| j                  | j                  | j                  «      | _        y )N)r@   rA   z	user-datazvendor-data)r
   rD   ry   r@   rA   ÚjsonÚloadsr   rE   rF   Úmetadatarf   rz   Úuserdata_rawr{   Úvendordata_raw)r   rJ   s     r    Ú_crawl_metadataz"DataSourceScaleway._crawl_metadataà   s’   € Ü×!Ñ!Ø×Ñ t§|¡|¸T¿\¹\ô
ˆô Ÿ
™
¤4×#5Ñ#5°d·m±mÓ#DÓEˆŒä*Ø˜×*Ñ*¨D¯L©L¸$¿,¹,ó
ˆÔô -Ø˜4×.Ñ.°·±¸d¿l¹ló
ˆÕr!   c                  ó¬   — t        j                  d«      } | dk(  ryt        j                  j	                  d«      ryt        j                  «       }d|v ryy)a   
        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-manufacturerri   Tz/var/run/scalewayÚscalewayN)r   Úread_dmi_dataÚosÚpathÚexistsr   Úget_cmdline)Úvendor_nameÚcmdlines     r    Ú	ds_detectzDataSourceScaleway.ds_detectí   sR   € ô ×'Ñ'Ð(=Ó>ˆØ˜*Ò$Øä�7‰7�>‰>Ð-Ô.Øä×"Ñ"Ó$ˆØ˜Ñ Øð !r!   c                 óŽ  — | j                   r–	 t        | j                  | j                  j                  «      5 }t	        j
                  d«      5  | j                  | j                  «       d d d «       | j                  «        |d   | _	        d| j                  d<   d d d «       | j                   s�	 t%        | j                  | j                  j                  «      5  t	        j
                  d«      5  | j                  | j                  «       d d d «       | j                  «        d| j                  d<   d d d «       yy# 1 sw Y   ŒÔxY w# 1 sw Y   Œ¯xY w# t        t        t        f$ r4}t        j                  t         t#        |«      «       d| _         Y d }~Œõd }~ww xY w# 1 sw Y   Œ•xY w# 1 sw Y   yxY w# t        $ r Y yw xY w)	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’   rm   r™   r|   r–   r   r   r   r   ÚlogexcrS   Ústrr   )r   r¥   Úes      r    Ú	_get_datazDataSourceScaleway._get_data  s¦  € ð
 �=Š=ð&ô %Ø—K‘KØ—K‘K×2Ñ2óð 9ð Ü$×*Ñ*ð9óñ Cð ×.Ñ.¨t×/AÑ/AÔB÷	Cð
 ×(Ñ(Ô*Ø37¸Ñ3H�DÔ0Ø28�D—M‘M ,Ñ/÷9ð. �}Š}ðÜ)Ø—K‘KØ—K‘K×2Ñ2óñ 
9ô %×*Ñ*ð,óñ Cð ×.Ñ.¨t×/AÑ/AÔB÷	Cð
 ×(Ñ(Ô*Ø28�D—M‘M ,Ñ/÷
9ñ ÷ECð Cú÷	9ð 9ûô !ÜÜ%ðò &ô
 —‘œC¤ Q£Ô(ð !&�—‘ûð&ú÷"Cð Cú÷	
9ð ûô #ò ÙðúsŽ   Ž*E ¸E	ÁD=Á*1E	ÂE Â0*F8 ÃF,Ã0F Ä'F,Ä3F8 Ä=E	ÅE	Å	EÅE ÅFÅ)*FÆFÆ F)	Æ%F,Æ,F5Æ1F8 Æ5F8 Æ8	GÇGc           	      óR  — | j                   €9t        j                  dt        j                  «       t        j                  | _         | j                   t        j                  k7  r| j                   S | j
                  d   €öi }i }| j
                  d   D ]¼  }|d   | j                  k(  r3d|d<   dddd	œ}d
|j                  «       v r|d
xx   |gz  cc<   ŒA|g|d
<   ŒHd|j                  «       v r|dxx   |d   › d|d   › �fz  cc<   n|d   › d|d   › �f|d<   |d   dk(  sŒŽ|d   ddœ}d
|j                  «       v r|d
xx   |gz  cc<   Œ·|g|d
<   Œ¾ ||| j                  j                  <   d|dœ| _         n‰dd| j                  j                  z  dœ}ddig}| j
                  d   rI|dd| j
                  d   d   z  d| j
                  d   d   z  ddd| j
                  d   d   z  dœgdœgz  }||d<   d |gd!œ| _         t        j                  d"| j                   «       | j                   S )#z`
        Configure networking according to data received from the
        metadata API.
        z5Found None as cached _network_config. Resetting to %sÚ
private_ipÚ
public_ipsrc   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¾   rc   r·   r´   Úsubnetsr#   )r»   Úconfigznetwork_config : %s)rw   rS   r\   r	   rv   r–   r|   r~   r€   r¨   rT   )r   ÚnetcfgÚip_cfgÚipÚrouterÄ   s         r    Únetwork_configz!DataSourceScaleway.network_config4  sŒ  € ð ×ÑÐ'Ü�K‰KØGÜ—‘ôô $+§=¡=ˆDÔ à×Ñ¤7§=¡=Ò0Ø×'Ñ'Ð'à�=‰=˜Ñ&Ð.ð ˆFØˆFØ—m‘m LÑ1ò 7�à�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7ð: 6<ˆF�4—;‘;×1Ñ1Ñ2Ø/0¸vÑ#FˆDÕ ð #Ø˜tŸ{™{×=Ñ=Ñ=ñˆFð  Ð(Ð)ˆGØ�}‰}˜VÒ$Øà (Ø#'¨$¯-©-¸Ñ*?À	Ñ*JÑ#JØ#'¨$¯-©-¸Ñ*?À	Ñ*JÑ#Jð ,0Ø*-Ø+/Ø"&§-¡-°Ñ"7¸	Ñ"Bñ,Cñð#ñ	ðñ �ð !(ˆF�9ÑØ/0¸V¸HÑ#EˆDÔ Ü�	‰	Ð'¨×)=Ñ)=Ô>Ø×#Ñ#Ð#r!   c                  ó   — y ©Nr   ©r   s    r    Úlaunch_indexzDataSourceScaleway.launch_index„  ó   € àr!   c                 ó    — | j                   d   S )NÚid)r–   rÍ   s    r    Úget_instance_idz"DataSourceScaleway.get_instance_idˆ  s   € Ø�}‰}˜TÑ"Ð"r!   c                 ó  — | j                   d   D �cg c]  }|d   ‘Œ	 }}d}t        |«      }| j                   j                  dg «      D ]8  }|j                  |«      sŒ|j	                  ||d  j                  dd«      «       Œ: |S c c}w )NÚssh_public_keysÚkeyzAUTHORIZED_KEY=Útagsr‘   ú )r–   Úlenrr   Ú
startswithÚappendÚreplace)r   rÕ   Ússh_keysÚakeypreÚplenÚtags         r    Úget_public_ssh_keysz&DataSourceScaleway.get_public_ssh_keys‹  sŒ   € Ø*.¯-©-Ð8IÑ*JÖK 3�C˜“JÐKˆÐKà#ˆÜ�7‹|ˆØ—=‘=×$Ñ$ V¨RÓ0ò 	:ˆCØ—>‘> 'Ô*ØØ�O‰O˜C  ˜J×.Ñ.¨s°CÓ8Õ9ð	:ð
 ˆùò Ls   ’Bc                 ó4   — t        | j                  d   d«      S )NÚhostnameF)r   r–   )r   ÚfqdnÚ
resolve_ipÚmetadata_onlys       r    Úget_hostnamezDataSourceScaleway.get_hostname—  s   € Ü! $§-¡-°
Ñ";¸UÓCÐCr!   c                  ó   — y rÌ   r   rÍ   s    r    Úavailability_zonez$DataSourceScaleway.availability_zoneš  rÏ   r!   c                  ó   — y rÌ   r   rÍ   s    r    ÚregionzDataSourceScaleway.regionž  rÏ   r!   )FFF)r/   r0   r1   Údsnamer   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚdefault_update_eventsr   rq   r…   r’   r™   Ústaticmethodr£   r­   ÚpropertyrÊ   rÎ   rÒ   rà   ræ   rè   rê   r3   r4   s   @r    rh   rh   ˜   sÖ   ø„ Ø€Fà×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!ð
ðÐô?ð,9¨ð 9°õ 9ò"ò4
ð ñó ðò(0ðd ñM$ó ðM$ð^ ñó ðò#ò
óDð ñó ðð ñó ôr!   rh   c                 ó6   — t        j                  | t        «      S rÌ   )r	   Úlist_from_dependsÚdatasources)Údependss    r    Úget_datasource_listr÷   ¨  s   € Ü×$Ñ$ W¬kÓ:Ð:r!   )1r”   Úloggingr�   r)   r]   Ú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   Ú	getLoggerr/   rS   rx   rs   ru   rt   ÚadaptersÚHTTPAdapterr   rK   rf   Ú
DataSourcerh   ÚDEP_FILESYSTEMrõ   r÷   r   r!   r    ú<module>r     sÀ   ðó Û Û 	Û Û Ý !ã Ý /õ .Ý +ç AÕ Aß 1Ý /ß IÝ 0Ý 0à€g×Ñ˜Ó!€à&Ð(>Ð?€à€Ø€Ø€ô
˜8×,Ñ,×8Ñ8ô 
ò,%òP1ôhH˜×+Ñ+ô HðX ˜'×0Ñ0Ð2Ð3ð€ó
;r!   