Your IP : 216.73.217.13


Current Path : /lib/python3/dist-packages/cloudinit/sources/__pycache__/
Upload File :
Current File : //lib/python3/dist-packages/cloudinit/sources/__pycache__/DataSourceLXD.cpython-38.pyc

U

�Ad�D�@s:dZddlZddlZddlZddlZddlmZmZddlm	Z	ddl
mZmZm
Z
mZmZmZmZddlZddlmZddlmZddlmZdd	lmZdd
lmZmZmZmZddl m!Z!e�"e#�Z$dZ%d
Z&dZ'ddddddd�Z(e)d�dd�Z*d:ee
e)ee)efd�dd�Z+Gdd�de�Z,Gdd�de�Z-Gdd�de�Z.e)e/d�d d!�Z0Gd"d#�d#ej1�Z2e3d�d$d%�Z4d;ej5e)e3d'�d(d)�Z6d<ej5e)e3ej7d*�d+d,�Z8Gd-d.�d.e�Z9Gd/d0�d0�Z:e&e9j;fe)e9e/d1�d2d3�Z<e2ej=ffgZ>d4d5�Z?e#d6k�r6ddl@Z@d7ZAe@jBeAd8�ZCeC�D�eEe�Fe<e9j;d9���dS)=a�Datasource for LXD, reads /dev/lxd/sock representation of instance data.

Notes:
 * This datasource replaces previous NoCloud datasource for LXD.
 * Older LXD images may not have updates for cloud-init so NoCloud may
   still be detected on those images.
 * Detect LXD datasource when /dev/lxd/sock is an active socket file.
 * Info on dev-lxd API: https://linuxcontainers.org/lxd/docs/master/dev-lxd
�N)�Flag�auto)�JSONDecodeError)�Any�Dict�List�Optional�Tuple�Union�cast)�HTTPAdapter)�HTTPConnection)�HTTPConnectionPool)�log)�sources�subp�
url_helper�util)�find_fallback_nicz
/dev/lxd/sockz1.0z
http://lxd�	user-data�network-config�vendor-data)�cloud-init.user-datazcloud-init.network-config�cloud-init.vendor-data�user.user-datazuser.network-config�user.vendor-data��returnc
Cs�d}t�d�r�zt�dg�\}}Wn8tjk
rZ}zt�d|�|WY�Sd}~XYnX|��dkr�t��dd}|dkr�dS|d	kr�d
SdS|S)NZeth0zsystemd-detect-virtzHUnable to run systemd-detect-virt: %s. Rendering default network config.)ZkvmZqemu�uname�Zppc64leZenp0s5Zs390xZenc9Zenp5s0)rZwhichZProcessExecutionError�LOG�warning�striprZsystem_info)Zdefault_nameZ	virt_type�_�errZarch�r%�A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceLXD.py�_get_fallback_interface_name/s$
�r')�nicsrcCsFt�}|rt�d|�nt�}t�d|�dd|ddd�gd�gd	�S)
zCReturn network config V1 dict representing instance network config.zCLXD datasource generating network from discovered active device: %szVLXD datasource generating network from systemd-detect-virt platform default device: %s�ZphysicalZdhcpr)�typeZcontrol)r*�nameZsubnets)�version�config)rr �debugr')r(Zprimary_nicr%r%r&�generate_network_configIs$��
���r/cs$eZdZ�fdd�Zdd�Z�ZS)�SocketHTTPConnectioncst��d�||_dS�NZ	localhost)�super�__init__�socket_path��selfr4��	__class__r%r&r3pszSocketHTTPConnection.__init__cCs$t�tjtj�|_|j�|j�dS�N)�socketZAF_UNIXZSOCK_STREAMZsock�connectr4�r6r%r%r&r;tszSocketHTTPConnection.connect)�__name__�
__module__�__qualname__r3r;�
__classcell__r%r%r7r&r0osr0cs$eZdZ�fdd�Zdd�Z�ZS)�SocketConnectionPoolcs||_t��d�dSr1)r4r2r3r5r7r%r&r3zszSocketConnectionPool.__init__cCs
t|j�Sr9)r0r4r<r%r%r&�	_new_conn~szSocketConnectionPool._new_conn)r=r>r?r3rBr@r%r%r7r&rAysrAc@seZdZddd�ZdS)�LXDSocketAdapterNcCstt�Sr9)rA�LXD_SOCKET_PATH)r6�urlZproxiesr%r%r&�get_connection�szLXDSocketAdapter.get_connection)N)r=r>r?rFr%r%r%r&rC�srC)�
metadata_typerc
Cs�t|t�r|S|dkriSzt�|�}Wn8tk
r`}zt�dj||d��|�W5d}~XYnX|dkr~t�dj||d���|S)a6Convert raw instance data from str, bytes, YAML to dict

    :param metadata_type: string, one of as: meta-data, vendor-data, user-data
        network-config

    :param metadata_value: str, bytes or dict representing or instance-data.

    :raises: InvalidMetaDataError on invalid instance-data content.
    NzAInvalid {md_type}. Expected str, bytes or dict but found: {value})Zmd_type�valuez:Invalid {md_type} format. Expected YAML but found: {value})�
isinstance�dictr�	load_yaml�AttributeErrorr�InvalidMetaDataException�format)rGZmetadata_valueZparsed_metadata�excr%r%r&�_raw_instance_data_to_dict�s.

�����rPcs�eZdZUdZejZeee	fe
d<ejZeee	fe
d<ejj
dZ
ee	dfe
d<dZedd	��fd
d�Zed�d
d�Zed�dd�Ze	d�dd�Ze	d�dd�Zeed�dd��Z�ZS)�
DataSourceLXDZLXD�_network_config�_crawled_metadata)�user.meta-datarrrr.�sensitive_metadata_keysTN)�ci_pkl_versionrcst��|�d|_dS)NT)r2�	_unpickle�skip_hotplug_detect)r6rVr7r%r&rW�szDataSourceLXD._unpicklercCst�S)z@Check platform environment to report if this datasource may run.)�is_platform_viabler<r%r%r&�_is_platform_viable�sz!DataSourceLXD._is_platform_viablecCs�|��st�d�dStjtjdtd�|_td|j�d��|_	|j�di�}|�di�}|rftd|�}t
|j	t�s�t�t�
|j	�|g�|_	d|jkr�|jd|_d	|jkr�td	|jd	�|_d
|jkr�|jd
|_dS)z=Crawl LXD socket API instance data and return True on successz+Not an LXD datasource: No LXD socket found.FzCrawl of metadata service)Zlogfunc�msg�func�	meta-datar-rTrrrT)rZr r.rZlog_time�
read_metadatarSrP�get�metadatarIrJZ
mergemanydictrKZuserdata_rawrRZvendordata_raw)r6r-Z
user_metadatar%r%r&�	_get_data�sB
�
���

�
zDataSourceLXD._get_datacCsdjttd�S)z.Return subplatform details for this datasourcez"LXD socket API v. {ver} ({socket}))Zverr:)rN�LXD_SOCKET_API_VERSIONrDr<r%r%r&�_get_subplatform�s�zDataSourceLXD._get_subplatformcCsBttjd�}|�di�}t|t�s,t�|�}|�d�|j�d�kS)z%Return True if instance_id unchanged.��
metadata_keysr]zinstance-id)	r^�MetaDataKeys�	META_DATAr_rIrJrrKr`)r6Zsys_cfg�response�mdr%r%r&�check_instance_id�s


zDataSourceLXD.check_instance_idcCs�|jtjkr~|jtjkr |��t|jt�r~|j�d�rPt�	d�|jd|_n.|j�d�r~dd�|jd�
�D�}t|�|_|jtjkr�t�	d�t�|_tt|j�S)z�Network config read from LXD socket config/user.network-config.

        If none is present, then we generate fallback configuration.
        rz,LXD datasource using provided network config�devicescSs g|]\}}|ddkr|�qS)r*Znicr%)�.0�k�vr%r%r&�
<listcomp>s�z0DataSourceLXD.network_config.<locals>.<listcomp>z8LXD datasource generating network config using fallback.)
rRr�UNSETrSrarIrJr_r r.�itemsr/r)r6rkr%r%r&�network_config�s(
��
�zDataSourceLXD.network_config)r=r>r?ZdsnamerrprRr
r�str�__annotations__rS�
DataSourcerUr	rX�intrW�boolrZrarcrj�propertyrJrrr@r%r%r7r&rQ�s

��
"rQcCs"tj�t�rt�t�t�j�SdS)z=Return True when this platform appears to have an LXD socket.F)�os�path�existsrD�stat�S_ISSOCK�lstat�st_moder%r%r%r&rYsrYT)�sessionrE�do_raisec
Cstt|||�}|js*t�d||j|j�iSz
|��WStk
rn}zt�	dj
||jd��|�W5d}~XYnXdS)N�Skipping %s on [HTTP:%d]:%szFUnable to process LXD config at {url}. Expected JSON but found: {resp})rE�resp)�_do_request�okr r.�status_code�textZjsonrrrMrN)r�rEr�Zurl_responserOr%r%r&�_get_json_responses(�
���r�)r�rEr�rcCs�tddd�D]:}|�|�}d|jkrBt�d�t�d|j||�qqHqt�d|j|�|r||js|t	�
dj|j||jd	���|S)
N�r���i�g�������?z,[GET] [HTTP:%d] %s, retrying %d more time(s)z[GET] [HTTP:%d] %sz3Invalid HTTP response [{code}] from {route}: {resp})�codeZrouter�)
�ranger_r��time�sleepr r!r.r�rrMrNr�)r�rEr�Zretriesrhr%r%r&r�/s*


�
��r�c@s0eZdZe�Ze�Ze�Ze�ZeeBeBZdS)rfN)	r=r>r?rZNONE�CONFIG�DEVICESrg�ALLr%r%r%r&rfLs
rfc@s@eZdZefed�dd�Zejed�dd�Z	e
ed�dd	�Zd
S)�_MetaDataReader��api_versioncCs||_t�t|j�|_dSr9)r�r�combine_url�LXD_URL�_version_url)r6r�r%r%r&r3Usz_MetaDataReader.__init__)r�rc	
Cs�dii}t�|jd�}t||�}t|�D]�}t�t|�}t||dd�}|jsbt�	d||j
|j�q(|�d�d}|j|d|<|t
kr(t
||kr�|j|t
|<q(t�d||�dd	d
��q(|S)a�Iterate on LXD API config items. Promoting CONFIG_KEY_ALIASES

        Any CONFIG_KEY_ALIASES which affect cloud-init behavior are promoted
        as top-level configuration keys: user-data, network-data, vendor-data.

        LXD's cloud-init.* config keys override any user.* config keys.
        Log debug messages if any user.* keys are overridden by the related
        cloud-init.* key.
        r-F�r�r��/r�z,Ignoring LXD config %s in favor of %s value.�userz
cloud-initr))rr�r�r��sortedr�r�r�r r.r�r��
rpartition�CONFIG_KEY_ALIASESr!�replace)	r6r�r-Z
config_urlZ
config_routesZconfig_routeZconfig_route_urlZconfig_route_responseZcfg_keyr%r%r&�_process_configYs@

�����z_MetaDataReader._process_config)rerc
Cs�t����}|�|jt��d|ji}tj|krLt�	|jd�}t
||�j|d<tj|krf|�
|�|��tj|kr�t�	|jd�}t||dd�}|r�||d<|W5QR�SQRXdS)NZ_metadata_api_versionr]rkFr�)�requests�SessionZmountr�rCr�rfrgrr�r�r�r��updater�r�r�)r6rer�riZmd_routerErkr%r%r&�__call__�s"


�

z_MetaDataReader.__call__N)r=r>r?rbrsr3r�r�rJr�rfr�r%r%r%r&r�Ts7r�)r�rercCst|d�|d�S)a8Fetch metadata from the /dev/lxd/socket routes.

    Perform a number of HTTP GETs on known routes on the devlxd socket API.
    Minimally all containers must respond to <LXD_SOCKET_API_VERSION>/meta-data
    when the LXD configuration setting `security.devlxd` is true.

    When `security.devlxd` is false, no /dev/lxd/socket file exists. This
    datasource will return False from `is_platform_viable` in that case.

    Perform a GET of <LXD_SOCKET_API_VERSION>/config` and walk all `user.*`
    configuration keys, storing all keys and values under a dict key
        LXD_SOCKET_API_VERSION: config {...}.

    In the presence of the following optional user config keys,
    create top level aliases:
      - user.user-data -> user-data
      - user.vendor-data -> vendor-data
      - user.network-config -> network-config

    :param api_version:
        LXD API version to operated with.
    :param metadata_keys:
        Instance of `MetaDataKeys` indicating what keys to fetch.
    :return:
        A dict with the following optional keys: meta-data, user-data,
        vendor-data, network-config, network_mode, devices.

        Below <LXD_SOCKET_API_VERSION> is a dict representation of all raw
        configuration keys and values provided to the container surfaced by
        the socket under the /1.0/config/ route.
    r�rd)r�)r�rer%r%r&r^�s#�r^cCst�|t�Sr9)rZlist_from_depends�datasources)Zdependsr%r%r&�get_datasource_list�sr��__main__z*Query LXD metadata and emit a JSON object.)�descriptionrd)N)T)T)G�__doc__ryr:r|r��enumrrZjson.decoderr�typingrrrrr	r
rr�Zrequests.adaptersrZurllib3.connectionr
Zurllib3.connectionpoolrZ	cloudinitrZloggingrrrrZ
cloudinit.netrZ	getLoggerr=r rDrbr�r�rsr'r/r0rArCrJrPrurQrwrYr�r�ZResponser�rfr�r�r^ZDEP_FILESYSTEMr�r��argparser��ArgumentParser�parser�
parse_args�printZ
json_dumpsr%r%r%r&�<module>s�
$
�
�

�&
	m����Q��*
�