HOME


Mini Shell 1.0
DIR: /usr/lib/python3/dist-packages/cloudinit/sources/__pycache__/
Upload File :
Current File : //usr/lib/python3/dist-packages/cloudinit/sources/__pycache__/DataSourceLXD.cpython-312.pyc
�

�f7D�	�b�dZddlZddlZddlZddlZddlZddlmZmZddl	m
Z
ddlmZm
Z
mZmZmZmZmZddlZddlmZddlmZddlmZdd	lmZmZmZmZmZdd
l m!Z!ejDe#�Z$dZ%dZ&d
Z'ddddddd�Z(de)fd�Z*	d2deee)de
e)effd�Z+Gd�de�Z,Gd�de�Z-Gd�de�Z.de)de/fd�Z0Gd�dejb�Z2de3fd �Z4	d3d!ejjd"e)d#e3fd$�Z6	d3d!ejjd"e)d#e3dejnfd%�Z8Gd&�d'e�Z9Gd(�d)�Z:e&e9jvfd*e)d+e9de/fd,�Z<e2ejzffgZ>d-�Z?e#d.k(rSddl@Z@d/ZAe@j�eA�0�ZCeCj��eEej�e<e9jv�1���yy)4a�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://documentation.ubuntu.com/lxd/en/latest/dev-lxd/
�N)�Flag�auto)�JSONDecodeError)�Any�Dict�List�Optional�Tuple�Union�cast)�HTTPAdapter)�HTTPConnection)�HTTPConnectionPool)�
atomic_helper�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�J�d}tjd�rS	tjdg�\}}|j�dvr't
j�dd}|dk(ry|d	k(ry
y|S#tj$r"}tj	d|�|cYd}~Sd}~wwxYw)N�eth0zsystemd-detect-virtzHUnable to run systemd-detect-virt: %s. Rendering default network config.)�kvm�qemu�uname��ppc64le�enp0s5�s390x�enc9�enp5s0)r�which�ProcessExecutionError�LOG�warning�stripr�system_info)�default_name�	virt_type�_�err�archs     �A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceLXD.py�_get_fallback_interface_namer5/s����L��z�z�'�(�	 ��9�9�&;�%<�=�L�I�q��?�?��!
�
��#�#�%�g�.�q�1�D��y� ����������%�)�)�	 ��K�K�5��
�
 ���
	 �s�A-�-B"�B�B"�B"�nicsc��t�}|rtjd|�n t�}tjd|�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��physical�dhcpr)�type�control)r;�name�subnets)�version�config)rr+�debugr5)r6�primary_nics  r4�generate_network_configrCIsm��$�%�K���	�	�
��	
�3�4���	�	�
+��	
��#�#�%+��?�@�
�
�	�	�c�$��eZdZ�fd�Zd�Z�xZS)�SocketHTTPConnectionc�2��t�|�d�||_y�N�	localhost)�super�__init__�socket_path��selfrL�	__class__s  �r4rKzSocketHTTPConnection.__init__ps���
����%�&��rDc��tjtjtj�|_|jj	|j
�y�N)�socket�AF_UNIX�SOCK_STREAM�sock�connectrL�rNs r4rVzSocketHTTPConnection.connectts6���M�M�&�.�.�&�2D�2D�E��	��	�	���$�*�*�+rD)�__name__�
__module__�__qualname__rKrV�
__classcell__�rOs@r4rFrFos
���'�,rDrFc�$��eZdZ�fd�Zd�Z�xZS)�SocketConnectionPoolc�2��||_t�|�	d�yrH)rLrJrKrMs  �r4rKzSocketConnectionPool.__init__zs���&���
����%rDc�,�t|j�SrQ)rFrLrWs r4�	_new_connzSocketConnectionPool._new_conn~s��#�D�$4�$4�5�5rD)rXrYrZrKrar[r\s@r4r^r^ys
���&�6rDr^c��eZdZdd�Zy)�LXDSocketAdapterNc� �tt�SrQ)r^�LXD_SOCKET_PATH)rN�url�proxiess   r4�get_connectionzLXDSocketAdapter.get_connection�s
��#�O�4�4rDrQ)rXrYrZrh�rDr4rcrc�s��5rDrc�
metadata_typec��t|t�r|S|�iS	tj|�}|�&tjdj||����|S#t$r,}tjdj||���|�d}~wwxYw)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})�md_type�valuez:Invalid {md_type} format. Expected YAML but found: {value})�
isinstance�dictr�	load_yaml�AttributeErrorr�InvalidMetaDataException�format)rj�metadata_value�parsed_metadata�excs    r4�_raw_instance_data_to_dictrw�s����.�$�'������	���.�.��8�����.�.�
��v�m�>�v�J�
�	
�������.�.�
��v�m�>�v�J�
��	���s�A�	B� 'B�Bc� ��eZdZUdZej
Zeee	fe
d<ej
Zeee	fe
d<ejjdzZ
ee	dfe
d<dZded	d
f�fd�Zed	efd��Zd	efd
�Zd	e	fd�Zd	e	fd�Zed	efd��Z�xZS)�
DataSourceLXD�LXD�_network_config�_crawled_metadata)�user.meta-datarrrr.�sensitive_metadata_keysT�ci_pkl_versionrNc�2��t�|�|�d|_y)NT)rJ�	_unpickle�skip_hotplug_detect)rNrrOs  �r4r�zDataSourceLXD._unpickle�s���
���.�)�#'�� rDc��t�S)z@Check platform environment to report if this datasource may run.)�is_platform_viablerirDr4�	ds_detectzDataSourceLXD.ds_detect�s
��"�#�#rDc��tjtjdt��|_t
d|j
jd��|_|j
jdi�}|jdi�}|rt
d|�}t|jt�s9tjtj|j�|g�|_d|j
vr|j
d|_
d|j
vrt
d|j
d�|_d|j
vr|j
d|_y	)
z=Crawl LXD socket API instance data and return True on successzCrawl of metadata service)�logfunc�msg�func�	meta-datar@r}rrrT)r�log_timer+rA�
read_metadatar|rw�get�metadatarnro�
mergemanydictrp�userdata_rawr{�vendordata_raw)rNr@�
user_metadatas   r4�	_get_datazDataSourceLXD._get_data�s-��!%����I�I�+��"
���
3���/�/�3�3�K�@�
��
��'�'�+�+�H�b�9���
�
�#3�R�8�
��6� �-��M��$�-�-��.� �.�.�����
�
�.�
�>��D�M��$�0�0�0� $� 6� 6�{� C�D���t�5�5�5�#=� �$�"8�"8�9I�"J�$�D� ��D�2�2�2�"&�"8�"8��"G�D��rDc�8�djtt��S)z.Return subplatform details for this datasourcez"LXD socket API v. {ver} ({socket}))�verrR)rs�LXD_SOCKET_API_VERSIONrerWs r4�_get_subplatformzDataSourceLXD._get_subplatform�s��3�:�:�&��;�
�	
rDc��ttj��}|jdi�}t	|t
�st
j|�}|jd�|jjd�k(S)z%Return True if instance_id unchanged.��
metadata_keysr�zinstance-id)	r��MetaDataKeys�	META_DATAr�rnrorrpr�)rN�sys_cfg�response�mds    r4�check_instance_idzDataSourceLXD.check_instance_id�s]�� �|�/E�/E�F��
�\�\�+�r�
*���"�d�#�����#�B��v�v�m�$��
�
�(9�(9�-�(H�H�HrDc���|jtjk(r�|jtjk(r|j	�t|jt�r�|jjd�r*tjd�|jd|_nb|jjd�rG|jdj�D��cgc]\}}|ddk(r|��}}}t|�|_|jtjk(r$tjd�t�|_tt|j�Scc}}w)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�devicesr;�nicz8LXD datasource generating network config using fallback.)
r{r�UNSETr|r�rnror�r+rA�itemsrCr)rN�k�vr�s    r4�network_configzDataSourceLXD.network_config�s)�����7�=�=�0��%�%����6���� ��$�0�0�$�7��)�)�-�-�.>�?��I�I�L�M�+/�+A�+A�(�,�D�(��+�+�/�/�	�:�
%)�$:�$:�9�$E�$K�$K�$M�*� �A�q��V�9��-��*�G�*�
,C�7�+K�D�(����7�=�=�0��I�I�J�
�$;�#<�D� ��D�$�.�.�/�/��*s�%E')rXrYrZ�dsnamerr�r{rr�str�__annotations__r|�
DataSourcer~r
r��intr��staticmethod�boolr�r�r�r��propertyror�r[r\s@r4ryry�s����
�F�(/�
�
�O�U�4��9�%�5�*1�-�-��u�T�3�Y�'�7�	���2�2�6�	��U��S������(��(��(��$�t�$��$��4��<
�#�
�I�C�I��0��0��0rDryc��tjjt�r6t	j
tjt�j�Sy)z=Return True when this platform appears to have an LXD socket.F)�os�path�existsre�stat�S_ISSOCK�lstat�st_moderirDr4r�r�s3��	�w�w�~�~�o�&��}�}�R�X�X�o�6�>�>�?�?�rD�sessionrf�do_raisec�6�t|||�}|js.tjd||j|j
�iS	|j
�S#t$r6}tjdj||j
���|�d}~wwxYw)N�Skipping %s on [HTTP:%d]:%szFUnable to process LXD config at {url}. Expected JSON but found: {resp})rf�resp)�_do_request�okr+rA�status_code�text�jsonrrrrrs)r�rfr��url_responservs     r4�_get_json_responser�s����w��X�6�L��?�?��	�	�)���$�$����		
��	��� � �"�"�����.�.�
/�/5�v��l�/�/�06�0�
�
�	���s�	A�	B�"1B�Bc��tddd�D][}|j|�}d|jk(r8tjd�t
j
d|j||��[nt
jdj|�|rG|js;tjdj|j||j�	���|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})�code�router�)
�ranger�r��time�sleepr+r,rAr�rrrrsr�)r�rfr��retriesr�s     r4r�r�,s�����Q��#�
���;�;�s�#���(�&�&�&�
�J�J�s�O��K�K�>��$�$���	
�
�
��I�I�"�H�$8�$8�#�>������.�.�A�H�H��)�)���]�]�
I�
�
�	
��OrDc�T�eZdZe�Ze�Ze�Ze�ZeezezZy)r�N)	rXrYrZr�NONE�CONFIG�DEVICESr��ALLrirDr4r�r�Is-���6�D�
�V�F��f�G���I�
�7�
�Y�
&�CrDr�c�P�eZdZefdefd�Zdejdefd�Z	de
defd�Zy)	�_MetaDataReader�api_versionc�d�||_tjt|j�|_yrQ)r�r�combine_url�LXD_URL�_version_url)rNr�s  r4rKz_MetaDataReader.__init__Rs%��&���&�2�2�7�D�<L�<L�M��rDr�rc
�:�dii}tj|jd�}t||�}t	|�D]�}tjt
|�}t
||d��}|js-tjd||j|j��d|jd�d}|j|d|<|tvs��t||vr|j|t|<��tjd||jdd	d
����|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-initr8)rr�r�r��sortedr�r�r�r+rAr�r��
rpartition�CONFIG_KEY_ALIASESr,�replace)	rNr�r@�
config_url�
config_routes�config_route�config_route_url�config_route_response�cfg_keys	         r4�_process_configz_MetaDataReader._process_configVs0��!�"�~���+�+�D�,=�,=�x�H�
�+�7�J�?�
�
#�=�1�!	�L�)�5�5�g�|�L��$/��)�E�%�!�)�+�+��	�	�1�$�)�5�5�)�.�.�	��"�-�-�c�2�2�6�G�)>�(B�(B�F�8��W�%��,�,�&�g�.�f�<�.�2�2��*�7�3���K�K�F�������a�@��;!	�D�
rDr�c�F�tj�5}|j|jt	��d|j
i}tj|vr9tj|jd�}t||�j|d<tj|vr |j|j|��tj|vr5tj|jd�}t!||d��}|r||d<|cddd�S#1swYyxYw)N�_metadata_api_versionr�r�Fr�)�requests�Session�mountr�rcr�r�r�rr�r�r�r��updater�r�r�)rNr�r�r��md_routerfr�s       r4�__call__z_MetaDataReader.__call__�s���
�
�
�
�	�7��M�M�$�+�+�-=�-?�@�/��1A�1A�B�B��%�%��6�%�1�1��%�%�{���#.�g�x�"@�"E�"E��;���"�"�m�3��	�	�$�.�.�w�7�8��#�#�}�4� �,�,�T�->�->�	�J��,�W�c�E�J���$+�B�y�M��!	�	�	�s�C8D�D N)rXrYrZr�r�rKr�r�ror�r�r�rirDr4r�r�Qs@��*@�N�C�N�5�x�'7�'7�5�D�5�n���$�rDr�r�r�c�(�t|��|��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�r�)r�)r�r�s  r4r�r��s��F4�?�{�3�#��rDc�6�tj|t�SrQ)r�list_from_depends�datasources)�dependss r4�get_datasource_listr��s���$�$�W�k�:�:rD�__main__z*Query LXD metadata and emit a JSON object.)�descriptionr�rQ)T)G�__doc__�loggingr�rRr�r��enumrr�json.decoderr�typingrrrr	r
rrr��requests.adaptersr
�urllib3.connectionr�urllib3.connectionpoolr�	cloudinitrrrrr�
cloudinit.netr�	getLoggerrXr+rer�r�r�r�r5rCrFr^rcrorwr�ryr�r�r�r��Responser�r�r�r�r��DEP_FILESYSTEMr�r��argparser��ArgumentParser�parser�
parse_args�print�
json_dumpsrirDr4�<module>rs,����	�
����(�@�@�@��)�.�5�D�D�+��g����!��!����
��(�!1�+�!�+�%�
���c��6!%�#�
�4��9�
�#�	�#�s�(�^�#�L,�>�,�6�-�6�5�{�5�
�c��d��:g0�G�&�&�g0�T�D��;?��
�
�
��$'��37��0;?��
�
�
��$'��37��
����:'�4�'�M�M�b.�".�"2�"2�%��%��%�
�%�T�W�+�+�-�.���;��z���B�K�
$�X�
$�
$��
=�F�
����	� �
� � ��\�=M�=M�!N�O��
rD