Current File : //usr/lib/python3/dist-packages/cloudinit/sources/__pycache__/DataSourceMAAS.cpython-312.pyc
�

Ӈgi;���ddlZddlZddlZddlZddlmZmZmZddlm	Z	ddl
mZeje
�ZdZgd�ZGd�dej"�ZGd	�d
e�Zd�Zd�Zd
�Zddeddfd�Zd�ZGd�de�ZGd�de�Zeej8ffeej8ej:ffgZd�Ze
dk(rd�Z e �yy)�N)�sources�
url_helper�util)�KlibcNetworkConfigSource)�NetworkConfigSourcez
2012-03-01))�meta-data/instance-idrFF)�meta-data/local-hostnamer	FF)�meta-data/public-keysr
FT)zmeta-data/vendor-data�vendor-dataTT)�	user-datarTTc�^�eZdZdZdZdZdZdZdZd�Z	e
d��Zd�Zd	�Z
d
�Zd�Zd�Zd
�Zy)�DataSourceMAASz�
    DataSourceMAAS reads instance information from MAAS.
    Given a config metadata_url, and oauth tokens, it expects to find
    files under the root named:
      instance-id
      user-data
      hostname
      vendor-data
    �MAASN�x�2c���tjj||||�d|_tj
j
|jd�|_t|j�|_
y)N�maas)r�
DataSource�__init__�base_url�os�path�join�seed_dir�get_id_from_ds_cfg�ds_cfg�id_hash)�self�sys_cfg�distro�pathss    �B/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceMAAS.pyrzDataSourceMAAS.__init__2sM�����#�#�D�'�6�5�A���
������U�^�^�V�<��
�)�$�+�+�6���c�f�|jst|j�|_|jS�N)�
_oauth_helper�get_oauth_helperr�rs r"�oauth_helperzDataSourceMAAS.oauth_helper8s(���!�!�!1�$�+�+�!>�D���!�!�!r#c�d�tjj|�}|�d|j�d�S)Nz [�])rr�__str__r)r�roots  r"r,zDataSourceMAAS.__str__>s'���!�!�)�)�$�/�� �$�-�-�0�0r#c	��|j}	|j|jt|j��y#t$rYn2t
$r'}tjd|j|��d}~wwxYw|jdd�}|sy	|j|�sy|j|t||jj|jd���y#t$rtj td|�YywxYw)NTz%s was malformed: %s�metadata_urlF�)�read_file_or_urlr!�retriesz$Failed fetching metadata from url %s)r�	_set_datar�read_maas_seed_dir�MAASSeedDirNone�MAASSeedDirMalformed�LOG�warning�get�wait_for_metadata_service�read_maas_seed_urlr)�readurlr!�	Exceptionr�logexc)r�mcfg�exc�urls    r"�	_get_datazDataSourceMAAS._get_dataBs����{�{��	��N�N�4�=�=�*<�T�]�]�*K�L����	��#�	��K�K�.��
�
�s�C���	��
�h�h�~�t�,����	�
�1�1�#�6���N�N��"��%)�%6�%6�%>�%>��*�*��	�
����	��K�K��C�S�I��	�s3�/>�	A8�	A8�"A3�3A8�C!�#=C!�!$D�Dc���||_|\}}}||_||_|r	tj|�|_yy#t$r'}tjd|�d|_Yd}~yd}~wwxYw)Nz"Invalid content in vendor-data: %s)	r�userdata_raw�metadatar�convert_vendordata�vendordata_raw�
ValueErrorr7r8)rrA�data�ud�md�vd�es       r"r3zDataSourceMAAS._set_dataiso����
��
��B�������
�
�
+�&-�&@�&@��&D��#����
+����@�!�D�&*��#�#��
+�s�;�	A+�A&�&A+c� �d|jzS)z/Return the subplatform metadata source details.z
seed-dir (%s))rr(s r"�_get_subplatformzDataSourceMAAS._get_subplatformvs������.�.r#c���|j�}|jdk(rytj�}|j	d�}|�dt
�d�}|g}|jj||j|j��\}}|r!tjd|�t|�Stjd|ttj�|z
��t|�S)NrF�/z/meta-data/instance-id)�urls�max_wait�timeoutzUsing metadata source: '%s'z(Giving up on md from %s after %i seconds)�get_url_params�max_wait_seconds�time�	monotonic�rstrip�
MD_VERSIONr)�wait_for_url�timeout_secondsr7�debug�critical�int�bool)rrA�
url_params�	starttime�	check_urlrR�	_responses       r"r:z(DataSourceMAAS.wait_for_metadata_servicezs����(�(�*�
��&�&�!�+���N�N�$�	��j�j��o��58�*�E�	��{���*�*�7�7���0�0��.�.�8�
���Y���I�I�3�S�9��C�y��

�L�L�:���D�N�N�$�y�0�1�
��C�y�r#c��|j�ytj|d|jfi�}|jt	|�k(S)alocally check if the current system is the same instance.

        MAAS doesn't provide a real instance-id, and if it did, it is
        still only available over the network.  We need to check based
        only on local resources.  So compute a hash based on Oauth tokens.F�
datasource)rr�get_cfg_by_path�dsnamer)rr�ncfgs   r"�check_instance_idz DataSourceMAAS.check_instance_id�sC���<�<����#�#�G�l�D�K�K�-H�"�M���|�|�1�$�7�7�7r#)�__name__�
__module__�__qualname__�__doc__rhrr&�url_max_wait�url_timeoutr�propertyr)r,rBr3rOr:rj�r#r"rrs\����F��G��M��L��K�7��"��"�
1�%�N+�/��4	8r#rc�z��eZdZejej
ejejfZ�fd�Z	�xZ
S)�DataSourceMAASLocalc���t�j�stjd�ytjd�t�|��S)NzNo initramfs applicable configFz!Found initramfs applicable config)r�
is_applicabler7r]�superrB)r�	__class__s �r"rBzDataSourceMAASLocal._get_data�s?���'�)�7�7�9�
�I�I�6�7���	�	�5�6��w� �"�"r#)rkrlrmr�CMD_LINE�
SYSTEM_CFG�DS�	INITRAMFS�network_config_sourcesrB�
__classcell__)rxs@r"rtrt�s9����$�$��&�&�����%�%�	��#�#r#rtc	��d}t|D�cgc]}||j|�f��c}�}tjdi|��Scc}w)z�Return an oauth helper instance for values in cfg.

    @raises ValueError from OauthUrlHelper if some required fields have
    true-ish values but others do not.)�consumer_key�consumer_secret�	token_key�token_secretrr)�dictr9r�OauthUrlHelper)�cfg�keys�r�kwargss    r"r'r'�sD��
L�D�
�D�1�q�A�s�w�w�q�z�?�1�
2�F��$�$�.�v�.�.��2s�Ac	���d}dj|D�cgc]}|j|d���c}�}dtj|j	d��j�zScc}w)z;Given a config, generate a unique identifier for this node.)r�r�r���zv1:zutf-8)rr9�hashlib�sha256�encode�	hexdigest)r�fields�f�idstrs    r"rr�sX��
:�F��I�I�&�9�Q�v�z�z�!�R�(�9�:�E��7�>�>�%�,�,�w�"7�8�B�B�D�D�D��:s�A'c���|jd�r|dd}tjj|�r!t	tj
|��dk(rt
d��td|zd��S)N�file://�rz%s: not a directoryz	file://%s)�version)�
startswithrr�isdir�len�listdirr5r;)�seed_ds r"r4r4�s`��
����#������
�7�7�=�=�� �C��
�
�6�(:�$;�q�$@��3�4�4��k�F�2�D�A�Ar#c�n�|�tj}|jd�r|dd}i}tD]�\}}}	}
|�|�d|��}n
|�d|�d|��}	t	j
|�}|||||��}
|
j
�r5|	r|
j||<nDt	j|
j�||<n!tjd||
j���t||�S#tj$r>}|jdk(r|
std|�d|���|�|jdk7r|�Yd}~��d}~wwxYw)	a�
    Read the maas datasource at seed_url.
      read_file_or_url is a method that should provide an interface
      like util.read_file_or_url

    Expected format of seed_url is are the following files:
      * <seed_url>/<version>/meta-data/instance-id
      * <seed_url>/<version>/meta-data/local-hostname
      * <seed_url>/<version>/user-data
    If version is None, then <version>/ will not be used.
    NrQ���)r2rT�ssl_detailsz4Fetching from %s resulted in an invalid http code %si�zMissing required z: )rr1�endswith�	DS_FIELDSr�fetch_ssl_details�ok�contents�
decode_binaryr7r8�code�UrlErrorr6�check_seed_contents)�seed_urlr1rTr�r!r2rKr�	_dictname�binary�optionalrAr��resprMs               r"r;r;�s?��&��%�6�6��������C�R�=��	�B�-6��)��i����?�%�t�,�C� (�'�4�8�C�	��0�0��7�K�#��W�g�;��D��w�w�y��#�}�}�B�t�H�#�1�1�$�-�-�@�B�t�H����J���I�I���!�:�r�8�,�,���"�"�	��v�v��}�X�*�15�q�9�������3������	�s�BC#�#D4�64D/�/D4c��i}g}tD]U\}}}}||vr|s|j|�� d|vr*|jd�\}}	}
||vri||<|||||
<�N||||<�Wt|�dk(rt	d|z��|rt|�d|����d}|j
d�rDt�}tj|j
d�|t��}||urtd��|j
d	�|j
d
�|fS)z�Validate if dictionary content valid as a return for a datasource.
    Either return a (userdata, metadata, vendordata) tuple or
    Raise MAASSeedDirMalformed or MAASSeedDirNone
    rQrz%s: no data files foundz: missing files Nr)�default�allowedz%vendor-data was not loadable as yaml.r�	meta-data)
r��append�	partitionr�r5r6r9�objectr�	load_yaml)
�content�seed�ret�missing�spath�dpath�_binaryr��top�_�p�vd_data�errs
             r"r�r�	s$��

�C��G�+4�(�'��u�g�x��������u�%���%�<�����,�I�C��A��#�~���C��!�%�.�C��H�Q�K� ���C��J�(��3�x�1�}��7�$�>�?�?��"�T�7�#K�L�L��G�
�w�w�}���h���.�.��G�G�M�"�C�&�
���c�>�&�'N�O�O��7�7�;������!5�w�>�>r#c��eZdZy)r5N�rkrlrmrrr#r"r5r50���r#r5c��eZdZy)r6Nr�rrr#r"r6r64r�r#r6c�6�tj|t�Sr%)r�list_from_depends�datasources)�dependss r"�get_datasource_listr�@s���$�$�W�k�:�:r#�__main__c������ddl}ddl}ddl}|jd��}|j	dddd��|j	d	d
dd��|j	dd
d
d��|j	dddd��|j	dddd��|j	dddt
��|j
dd��}dD]-\}}|j||��}|j	dddd���/|j�}|j|j|j|jd �}	|j�yd!D]t}
d"|
zd#z}tjj!|�s�+tj"|tj$�s�P|j&j)d$|z�||_
�v|jrmt+j,|j�}d%|vr|d%d&}|	j/�D]}
|
|vs�|	|
��||
|	|
<�|j0�d'|vr
|d'|_|j0�,|j&j)d(�|j3d)�t5|	���fd*���fd+�����fd,��|j6d-k(�r|j&j)d.|j0z��j8}|j0dd/k(s|j0j;d0�rt=|j0�\}}}n't?|j0|j@|d1�2�\}}}tCd3�tC|�d4n|jE��tCd5�|j|�tCd6�|j|�d4�y|�y|j6d7k(r�|j0�y|j6d8k(rB|j0jGd/�sd9|j0z|_�|j0�yy):z�
        Call with single argument of directory or http or https url.
        If url is given additional arguments are allowed, which will be
        interpreted as consumer_key, token_key, token_secret, consumer_secret
        rNzInteract with MAAS DS)�descriptionz--config�filezspecify DS config file)�metavar�helpr�z--ckey�keyzthe consumer key to auth withz--tkeyzthe token key to auth withz--csec�secretzthe consumer secret (likely '')r�z--tseczthe token secret to auth withz--apiverr�z the apiver to use ( can be used)�subcommands�subcmd)�title�dest))�crawlzcrawl the datasource)r9zdo a single GET of provided url)�
check-seedzread and verify seed at url)r�rAzthe datasource url�?)r��nargsr�)r�r�r�r�)�91_kernel_cmdline_url�90_dpkg_maasz/etc/cloud/cloud.cfg.d/z.cfgzUsed config in %s.
rfrr/z)Must provide a url or a config with url.
r0c�>���j|d��jS)Nr0)r2)r<r�)rAr)s �r"�geturlzmain.<locals>.geturl�s����'�'��Q�'�7�@�@�@r#c�R��td|�d�|�j��d��y)Nz== z ==
�
)�print�decode)rAr�s �r"�printurlzmain.<locals>.printurl�s����c�6�#�;�+=�+=�+?�@�Ar#c���|jd�rf�|�j�j�D]>}|jd�r
�|�|����!|dk(r
�|�d����3�|�|����@y�|�y)NrQr�z
meta-data/)r�r��
splitlines)rA�liner�r�r�s  ���r"r�zmain.<locals>.crawl�sx����|�|�C� �"�3�K�.�.�0�;�;�=�7�D��}�}�S�)���T�2�3���,���\�:�;� �3��!5�6�7���
r#r�zChecking seed at %s
rQr��)r�r1r2z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===r9r�z%s/)$�argparse�pprint�sys�ArgumentParser�add_argumentrZ�add_subparsers�
add_parser�
parse_args�ckey�tkey�tsec�csec�configrr�exists�access�R_OK�stderr�writer�	read_confr�rA�exitr'r�r<r�r4r;�apiverr�r�r�)r�r�r��parser�subcmds�namer�r��args�creds�fname�fpathr�r�r<�userdatarErLr�r�r)r�s                  @@@@r"�mainrFs����	����(�(�5L�(�M�������)��		�	
�	�����0��		�	
�	�����-��		�	
�	�����2��		�	
�	�����0��		�	
�	�����3��		�	
��'�'�m�(�'�K��
�	�J�D�$�
�"�"�4�d�"�3�A�
�N�N��0��T�
�
�
	�� � �"��!�I�I���� �I�I�#�y�y�	
���;�;��B�
(��1�E�9�F�B���7�7�>�>�%�(�R�Y�Y�u�b�g�g�-F��J�J�$�$�%;�e�%C�D�"'�D�K�	
(��;�;��.�.����-�C��s�"��,�'��/���z�z�|�
*���#�:�%��*�"4�!$�S��E�#�J�
*��x�x��N�c�$9��~�.����8�8���J�J���I�J��H�H�Q�K�'��.��	A�	B�	��;�;�,�&��J�J���4�t�x�x�?�@�"�*�*�G��x�x��{�c�!�T�X�X�%8�%8��%C�+=�d�h�h�+G�(��8�R�+=��H�H� �K�K�%,��	,�(��8�R�
�%�&��8�+�%����1B�C��%�&��M�M�(�#��'�(��M�M�2�:�%�6�2�6�
�[�[�E�
!��T�X�X��
�[�[�G�
#��8�8�$�$�S�)� �4�8�8�+����$�(�(�O�$r#)!r��loggingrrW�	cloudinitrrr�cloudinit.net.cmdliner�cloudinit.sourcesr�	getLoggerrkr7rZr�rrrtr'rr4r;r�r=r5r6�DEP_FILESYSTEM�DEP_NETWORKr�r�rrrr#r"�<module>r
s�����	��/�/�:�1��g����!��
�
�
�	�~8�W�'�'�~8�B#�.�#�$/�E�B����
��
7-�t$?�N	�i�	�	�9�	��7�1�1�3�4��g�,�,�g�.A�.A�B�C���;��z��H�T	�F�Yr#