BYPASS SHELL BY ./RAZORGANZ
Server: nginx/1.20.1
System: Linux iZdzfnv9mwfppeZ 5.10.134-19.2.al8.x86_64 #1 SMP Wed Oct 29 22:47:09 CST 2025 x86_64
User: apache (48)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: //lib/python3.6/site-packages/cloudinit/sources/__pycache__/DataSourceApsara.cpython-36.pyc
3

�q�h�?�@s�ddlZddlZddlmZmZddlmZmZddlmZ	ddlm
Z
ddlmZm
Z
ddlmZddlmZdd	lmZdd
lmZmZeje�ZdZGdd
�d
ej�Zdd�Zdd�ZGdd�de�Zeej ffeej ej!ffgZ"dd�Z#dS)�N)�List�Union)�dmi�sources)�
url_helper)�util)�
EventScope�	EventType)�NoDHCPLeaseError)�EphemeralIPNetwork)�DataSourceHostname)�apsara�ec2zApsara Cloud ECScsJeZdZUdZdgZdZgZeedZ	dZ
dZej
ZeeefdZedd	��Z�fd
d�Zedd��fd
d�Zd:dd�Zdd�Zdd�Zedd��Zedd��Zedd��Zedd��Zedd��Zedd ��Zd!d"�Z d#d$�Z!e�fd%d&��Z"d'd(�Z#d)d*�Z$d+d,�Z%d-d.�Z&d/d0�Z'd1d2�Z(d;d3d4�Z)d<d6d7�Z*d=d8d9�Z+�Z,S)>�DataSourceApsaraZApsarazhttp://100.100.100.200z
2016-01-01���2NFcCsdS)NzX-apsara-ecs-metadata-token�)�selfrr�&/usr/lib/python3.6/DataSourceApsara.py�imdsv2_token_put_header*sz(DataSourceApsara.imdsv2_token_put_headercs:tt|�j|||�tj|j�|_|jtjjt	j
�dS)N)�superr�__init__�copy�deepcopyZdefault_update_eventsrZNETWORK�addr	ZBOOT)rZsys_cfg�distro�paths)�	__class__rrr.szDataSourceApsara.__init__)�ci_pkl_version�returncst�j|�dS)N)r�	_unpickle)rr)rrrr 3szDataSourceApsara._unpicklecCs*|jjd�}d}|dkr d}d}t||�S)N�hostnameFzlocalhost.localdomainT)�metadata�getr)rZfqdnZ
resolve_ipZ
metadata_onlyr!Z
is_defaultrrr�get_hostname6szDataSourceApsara.get_hostnamecCst|jjdi��S)Nzpublic-keys)�parse_public_keysr"r#)rrrr�get_public_ssh_keys>sz$DataSourceApsara.get_public_ssh_keyscCst�r|jj�SdS)NZNO_APSARA_METADATA)�
_is_apsara�dsname�lower)rrrr�_get_cloud_nameAs
z DataSourceApsara._get_cloud_namecCs
|jj�S)N)r(r))rrrr�platformFszDataSourceApsara.platformcCsdS)Nzlatest/api/tokenr)rrrr�api_token_routeKsz DataSourceApsara.api_token_routecCsdS)NZ21600r)rrrr�imdsv2_token_ttl_secondsOsz)DataSourceApsara.imdsv2_token_ttl_secondscCs|j|jgS)N)r�imdsv2_token_req_header)rrrr�imdsv2_token_redactSsz$DataSourceApsara.imdsv2_token_redactcCs
|jdS)Nz-ttl-seconds)r)rrrrr.Wsz(DataSourceApsara.imdsv2_token_req_headercCsl|jtjkr|jSi}|j}|jjd�}t|t�rPtj	||t
j|jdd�d�}nt
jd|�|S||_|jS)z@Return a network config dict for rendering ENI or netplan files.ZnetworkZapply_full_imds_network_configT)�fallback_nicZfull_network_configz%Metadata 'network' key not valid: %s.)�_network_configr�UNSET�fallback_interfacer"r#�
isinstance�dictr
Z#convert_ecs_metadata_network_configrZget_cfg_option_bool�ds_cfg�LOG�warning)r�resultZifaceZnet_mdrrr�network_config[s
zDataSourceApsara.network_configc
Cs�g}i}|j}d}x*|D]"}dj||�}|j|�|||<qWtjd�d}d}|j�}	y0tj||	j|	j	tj
|j|j||j
dd�	\}}Wntjk
r�YnX|r�|r�||_||SdS)aGet an API token for EC2 Instance Metadata Service.

        On EC2. IMDS will always answer an API token, unless
        the instance owner has disabled the IMDS HTTP endpoint or
        the network topology conflicts with the configured hop-limit.
        �PUTz{0}/{1}zFetching Ecs IMDSv2 API TokenNF)	�urlsZmax_waitZtimeoutZ	status_cb�
headers_cb�exception_cb�request_method�headers_redactZconnect_synchronously)r,�format�appendr7�debugZget_url_params�uhelpZwait_for_urlZmax_wait_secondsZtimeout_secondsr8�_get_headers�_imds_exception_cbr/�UrlError�
_api_token)
r�mdurlsr<Zurl2baseZurl_pathr?�urlZcur�responseZ
url_paramsrrr�_maybe_fetch_api_tokenss:


z'DataSourceApsara._maybe_fetch_api_tokencCsJ|j}|jd|j�}|j|�}|r8||_tjd|j�n
tjd�t|�S)N�
metadata_urlszUsing metadata source: '%s'z)IMDS's HTTP endpoint is probably disabled)	r6r#rMrL�metadata_addressr7rCr8�bool)rZmcfgrIrNrrr�wait_for_metadata_service�s

z*DataSourceApsara.wait_for_metadata_servicecs:|jdkr4t|dd�}|r(||_d|_ntt|�jS|jS)Nr0)Z_fallback_interface�getattrr0rrr3)rZ
_legacy_fbnic)rrrr3�s
z#DataSourceApsara.fallback_interfacecCs|j�siS|j}i}|j}|j}d}|j}y�tj|j|j|j	||dd�|d<tj|j|j|j	||dd�|d<y&tj
|j|j|j	||d�}||d<WnDtk
r�tj
td|j�tj|j|j|j	|||d�|d<YnXWn&tk
�rtj
td	|j�iSX|S)
z�Crawl metadata service when available.

        @returns: Dictionary of crawled metadata content containing the keys:
          meta-data, user-data, vendor-data and dynamic.
        Nz	user-data)r=r@r>Z	item_namezvendor-data)r=r@r>z	meta-datazWFailed reading from instance metadata address %s, try fall back to directory tree style)r=r@r>Zretrieval_exception_ignore_cbz'Failed reading from metadata address %s)rPr/�_refresh_stale_apsara_token_cb�&_skip_or_refresh_stale_apsara_token_cb�_skip_whole_meta_path_apsara_cbr
Zget_instance_data�min_metadata_versionrNrEZget_instance_meta_data�	ExceptionrZlogexcr7rZget_instance_metadata)rZredactZcrawled_metadataZexc_cbZ	exc_cb_udZskip_cbZexe_cb_whole_metar9rrr�crawl_metadata�sdzDataSourceApsara.crawl_metadatacCs*t|tj�r&|jdkr&tjd�d|_dS)z=Exception handler for Ec2 to refresh token if token is stale.i�z+Clearing cached Ec2 API token due to expiryNT)r4rDrG�coder7rCrH)r�msg�	exceptionrrrrR�s
z/DataSourceApsara._refresh_stale_apsara_token_cbcCs
|j|kS)z/Returns False if cause.code is in status_codes.)rX)rZstatus_codes�causerrr�_skip_retry_on_codessz%DataSourceApsara._skip_retry_on_codescCs"|jtj|�}|sdS|j||�S)z^Callback will not retry on SKIP_USERDATA_VENDORDATA_CODES or if no token
        is available.F)r\rZSKIP_USERDATA_VENDORDATA_CODESrR)rrYrZZretryrrrrSsz7DataSourceApsara._skip_or_refresh_stale_apsara_token_cbcCs0t|tj�r$|jdkr$tjd�dS|j||�S)z7Callback will not retry of whole meta_path is not foundi�z&whole meta_path is not found, skippingF)r4rDrGrXr7r8rR)rrYrZrrrrTs
z0DataSourceApsara._skip_whole_meta_path_apsara_cbcCs�|j|jj�krdS|jr�tj�r0tjd�dSyLt|j	|j
ddd��.}|j�|_tjd|j
rjd|j
��nd�WdQRXWq�tk
r�dSXn
|j�|_|js�t|jt�r�dS|jjdi�|_|jjd	i�|_|jjd
i�|_dS)NFz1FreeBSD doesn't support running dhclient with -sfT)Zipv4Zipv6zCrawled metadata service%s� �z	meta-dataz	user-datazvendor-data)Z
cloud_namer(r)�perform_dhcp_setuprZ
is_FreeBSDr7rCrrr3rWZ_crawled_metadataZ	state_msgr
r4r5r#r"Zuserdata_rawZvendordata_raw)rZnetwrrr�	_get_datas6

&

zDataSourceApsara._get_datacCs�|dkr|j}tjd�|j|i}dj|j|j�}ytj|||j	dd�}Wn0tj
k
rz}ztjd||�dSd}~XnX|jS)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 Ec2 metadata API tokenz{}/{}r;)Zheadersr@r?z/Unable to get API token: %s raised exception %s)
r-r7rCr.rArNr,rDZreadurlr/rGr8�contents)rZsecondsZrequest_headerZ	token_urlrK�errr�_refresh_api_token8s 	


z#DataSourceApsara._refresh_api_tokenr^cCs@|j|ji}|j|kr|S|js4|j�|_|js4iS|j|jiS)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.
        )r.r-r,rHrcr)rrJZrequest_token_headerrrrrEUs


zDataSourceApsara._get_headerscCsDt|tj�r@|jr@|jdkr@|jdkr2tjd�n
tjd�|�dS)a2Fail 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�i�zLEcs IMDS endpoint returned a 403 error. HTTP endpoint is disabled. Aborting.z2Fatal error while requesting Ecs IMDSv2 API tokensN)r4rDrGrXr7r8)rrYrZrrrrFls

z#DataSourceApsara._imds_exception_cb)FFF)N)r^)N)-�__name__�
__module__�__qualname__r(rMrUZextended_metadata_versionsr�strZurl_max_waitZurl_timeoutrHrr2r1rr5r_�propertyrr�intr r$r&r*r+r,r-r/r.r:rLrPr3rWrRr\rSrTr`rcrErF�
__classcell__rr)rrrsB

0?!

rcCstjd�tkS)Nzsystem-product-name)rZ
read_dmi_data�APSARA_PRODUCTrrrrr'�sr'cCs�g}x�|j�D]|\}}t|t�r0|j|j��qt|t�rF|j|�qt|t�r|jdg�}t|t�rv|j|j��qt|t�r|j|�qW|S)Nzopenssh-key)	�itemsr4rgrB�strip�list�extendr5r#)Zpublic_keys�keysZ_key_idZkey_body�keyrrrr%�s




r%c@seZdZdZdZdS)�DataSourceApsaraLocalayDatasource 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.
    TN)rdrerf�__doc__r_rrrrrr�srrcCstj|t�S)N)rZlist_from_depends�datasources)Zdependsrrr�get_datasource_list�sru)$rZloggingZtypingrrZ	cloudinitrrrrDrZcloudinit.eventrr	Zcloudinit.net.dhcpr
Zcloudinit.net.ephemeralrZcloudinit.sourcesrZcloudinit.sources.helpersr
rZ	getLoggerrdr7rkZ
DataSourcerr'r%rrZDEP_FILESYSTEMZDEP_NETWORKrtrurrrr�<module>s*
u