name : DataSourceScaleway.cpython-39.opt-1.pyc
a

'�Dg�:�@s.ddlZddlZddlZddlZddlZddlmZddlZddlm	Z	ddl
mZddlm
Z
ddlmZmZmZmZmZddlmZmZddlmZdd	lmZmZdd
lmZddlmZe� e!�Z"dd
gZ#dZ$dZ%dZ&Gdd�dej'j(�Z)dd�Z*dd�Z+Gdd�dej,�Z-e-ej.ffgZ/dd�Z0dS)�N)�urlparse)�ConnectionError)�HTTPConnection)�PoolManager)�dmi�performance�sources�
url_helper�util)�
EventScope�	EventType)�NoDHCPLeaseError)�EphemeralDHCPv4�EphemeralIPv6Network)�DataSourceHostname)�ProcessExecutionErrorzhttp://169.254.42.42zhttp://[fd00:42::42]���
cs*eZdZdZ�fdd�Zddd�Z�ZS)�SourceAddressAdapterzF
    Adapter for requests to choose the local address to bind to.
    cs ||_tt|�jfi|��dS�N)�source_address�superr�__init__)�selfr�kwargs��	__class__��H/usr/lib/python3.9/site-packages/cloudinit/sources/DataSourceScaleway.pyr+szSourceAddressAdapter.__init__FcCs0tjtjtjdfg}t||||j|d�|_dS)N�)Z	num_pools�maxsize�blockr�socket_options)rZdefault_socket_options�socketZ
SOL_SOCKETZSO_REUSEPORTrrZpoolmanager)rZconnectionsr!r"r#rrr�init_poolmanager/s��z%SourceAddressAdapter.init_poolmanager)F)�__name__�
__module__�__qualname__�__doc__rr%�
__classcell__rrrrr&src
Csnz(tj|d|d|dd�d�}t�|j�WStjyh}z&|jdkrRWYd}~dS�WYd}~n
d}~00dS)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.
    NrcSs|jdkot|jtjj�S)N�)�code�
isinstance�cause�requests�
exceptionsr)�_�excrrr�<lambda>Ws
z%query_data_api_once.<locals>.<lambda>)�data�timeout�retriesZsessionZexception_cbr+)r	�readurlr
�
decode_binary�contents�UrlErrorr,)�api_addressr5�requests_session�respr2rrr�query_data_api_once<s�
r>c
Cs,tdt|d��D�]}z�t�d||�t��}d}zRt|�j}|}|ddkrZ|dd�}tj	|dtj
d	�dd}	|	tjkr�d
}Wnty�Yn0|�
dt||fd��t|||d
�}
t�d|�|
WStj�y }z4t�d||�t�d�|}WYd}~qWYd}~qd}~00q|�dS)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 rz*Trying to get %s data (bind on port %d)...z0.0.0.0r�[���N)�protoz0::zhttp://)r)r5r<z%s-data downloadedz%Error while trying to get %s data: %s�)�range�max�LOG�debugr/ZSessionr�netlocr$ZgetaddrinfoZIPPROTO_TCPZAF_INET6�
ValueErrorZmountrr>r	r:�warning�time�sleep)
Zapi_typer;r6r5�portr<Z	localhostZurl_address�addressZ
addr_protor4r2�last_excrrr�query_data_apidsL�
���
��

$rOcs�eZdZdZejejejej	hiZ
�fdd�Zedd��fdd�Z
dd	�Zd
d�Zedd
��Zdd�Zedd��Zedd��Zdd�Zdd�Zddd�Zedd��Zedd��Z�ZS) �DataSourceScaleway�Scalewaycs�tt|��|||�t�t�|ddgi�g�|_t|j�dt	��|_
t|j�dt��|_t|j�dt
��|_tj|_t|_d|_d|_d|_d|_d|_d|j��vr�|j|jd7_dS)NZ
datasourcerQr6r5�max_waitT�
metadata_urls)rrPrr
Z
mergemanydictZget_cfg_by_pathZds_cfg�int�get�DEF_MD_RETRIESr6�DEF_MD_TIMEOUTr5�DEF_MD_MAX_WAITrRr�UNSET�_network_config�DS_BASE_URLSrS�metadata_url�userdata_url�vendordata_url�ephemeral_fixed_address�has_ipv4�keys)rZsys_cfg�distro�pathsrrrr�s"��zDataSourceScaleway.__init__N)�ci_pkl_version�returncsFt��|�ddttddd�}|D]}t||�s"t||||�q"dS)NT)r_r`rRrSr]r^)r�	_unpicklerXr[�hasattr�setattr)rrdZ
attr_defaults�attrrrrrf�s�
zDataSourceScaleway._unpicklecCs|t��}tj||j|jdd�\}}|rZt�d|�|�d�|_|�d�|_	|�d�|_
dSt�d|tt��|��t�dS)	zO
        Define metadata_url based upon api-metadata URL availability.
        F)�urlsrRr5Zconnect_synchronouslyz%s is reachablez/conf?format=jsonz/user_data/cloud-initz/vendor_data/cloud-initNz3Unable to reach api-metadata at %s after %s seconds)
rJ�	monotonicr	Zwait_for_urlrRr5rErFr\r]r^rTr)rrjZ
start_timeZ	avail_urlr1rrr�_set_metadata_url�s&�
�z$DataSourceScaleway._set_metadata_urlcCsZtj|j|j|jd�}t�t�|j	��|_
td|j|j|j�|_
td|j|j|j�|_dS)N)r5r6z	user-datazvendor-data)r	r7r\r5r6�json�loadsr
r8r9�metadatarOr]Zuserdata_rawr^Zvendordata_raw)rr=rrr�_crawl_metadata�s���z"DataSourceScaleway._crawl_metadatacCs>t�d�}|dkrdStj�d�r&dSt��}d|vr:dSdS)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.
        zsystem-manufacturerrQTz/var/run/scalewayZscalewayN)rZ
read_dmi_data�os�path�existsr
Zget_cmdline)Zvendor_nameZcmdlinerrr�	ds_detect�s

zDataSourceScaleway.ds_detectc
Csr|jr�z�t|j|jj��b}t�d��|�|j�Wd�n1sF0Y|��|d|_	d|j
d<Wd�n1s�0YWn@ttt
fy�}z"t�tt|��d|_WYd}~n
d}~00|j�snz�t|j|jj��Zt�d��|�|j�Wd�n1�s0Y|��d|j
d<Wd�n1�sJ0YWnt�ylYdS0dS)	Nz7Setting api-metadata URL depending on IPv4 availabilityz
fixed-address�ipv4Z
net_in_useFz7Setting api-metadata URL depending on IPv6 availability�ipv6T)r`rrb�fallback_interfacerZTimedrlrSrpr_ror
rrr
ZlogexcrE�strr)rru�errr�	_get_datasH��*
,���,.zDataSourceScaleway._get_datac	Cs�|jdur t�dtj�tj|_|jtjkr2|jS|jddu�rVi}i}|jdD]�}|d|jkr�d|d<ddd	d
�}d|��vr�|d|g7<n
|g|d<qTd|��vr�|d|d�d
|d��f7<n|d�d
|d��f|d<|ddkrT|ddd�}d|��v�r0|d|g7<qT|g|d<qT|||jj	<d|d�|_n�dd|jj	d�}ddig}|jd�r�|dd|jddd|jddddd|jddd�gd�g7}||d <d!|gd"�|_t�
d#|j�|jS)$z`
        Configure networking according to data received from the
        metadata API.
        Nz5Found None as cached _network_config. Resetting to %sZ
private_ipZ
public_ipsrMTZdhcp4z169.254.42.42/32z
62.210.0.1)zon-link�to�via�routes�	addresses�/�netmaskZfamilyZinet6�gatewayz::/0)r|r{r)�versionZ	ethernetsZphysicalz%s)�type�namer�rvZstaticz::�0)�network�prefixr�)r�rMr�r}�subnetsr )r�Zconfigznetwork_config : %s)rZrErIrrYror_rarbrwrF)rZnetcfgZip_cfg�ipZrouter�rrr�network_config4sp
���
�
�
�����z!DataSourceScaleway.network_configcCsdSrr�rrrr�launch_index�szDataSourceScaleway.launch_indexcCs
|jdS)N�id)ror�rrr�get_instance_id�sz"DataSourceScaleway.get_instance_idcCs^dd�|jdD�}d}t|�}|j�dg�D]*}|�|�s>q.|�||d��dd��q.|S)NcSsg|]}|d�qS)�keyr)�.0r�rrr�
<listcomp>��z:DataSourceScaleway.get_public_ssh_keys.<locals>.<listcomp>Zssh_public_keyszAUTHORIZED_KEY=�tagsr1� )ro�lenrU�
startswith�append�replace)rZssh_keysZakeypre�plen�tagrrr�get_public_ssh_keys�s
z&DataSourceScaleway.get_public_ssh_keysFcCst|jdd�S)N�hostnameF)rro)rZfqdnZ
resolve_ipZ
metadata_onlyrrr�get_hostname�szDataSourceScaleway.get_hostnamecCsdSrrr�rrr�availability_zone�sz$DataSourceScaleway.availability_zonecCsdSrrr�rrr�region�szDataSourceScaleway.region)FFF)r&r'r(ZdsnamerZNETWORKrZBOOT_NEW_INSTANCEZBOOTZBOOT_LEGACYZdefault_update_eventsrrTrfrlrp�staticmethodrtrz�propertyr�r�r�r�r�r�r�r*rrrrrP�s2��

2
O


rPcCst�|t�Sr)rZlist_from_depends�datasources)Zdependsrrr�get_datasource_list�sr�)1rmZloggingrqr$rJ�urllib.parserr/Zrequests.exceptionsrZurllib3.connectionrZurllib3.poolmanagerrZ	cloudinitrrrr	r
Zcloudinit.eventrrZcloudinit.net.dhcpr
Zcloudinit.net.ephemeralrrZcloudinit.sourcesrZcloudinit.subprZ	getLoggerr&rEr[rVrXrWZadaptersZHTTPAdapterrr>rOZ
DataSourcerPZDEP_FILESYSTEMr�r�rrrr�<module>s:
(4
�

© 2025 Cubjrnet7