HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/cloudinit/sources/__pycache__/DataSourceMAAS.cpython-310.pyc
o

�Ad�9�@s�ddlZddlZddlZddlmZddlmZmZmZe�	e
�ZdZgd�Z
Gdd�dej�Zdd	�Zd
d�Zdd
�Zddeddfdd�Zdd�ZGdd�de�ZGdd�de�ZeejejffgZdd�Ze
dkrtdd�Ze�dSdS)�N)�log)�sources�
url_helper�utilz
2012-03-01))�meta-data/instance-idrFF)�meta-data/local-hostnamerFF)�meta-data/public-keysrFT)zmeta-data/vendor-data�vendor-dataTT)�	user-datar
TTc@s`eZdZdZdZdZdZdd�Zedd��Z	dd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�ZdS)�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
    �MAASNcCs:tj�||||�d|_tj�|jd�|_t|j	�|_
dS)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�paths�r�B/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceMAAS.pyr,szDataSourceMAAS.__init__cCs|js	t|j�|_|jS�N)�
_oauth_helper�get_oauth_helperr�rrrr�oauth_helper2szDataSourceMAAS.oauth_helpercCstj�|�}d||jfS)Nz%s [%s])rr�__str__r)r�rootrrrr#8szDataSourceMAAS.__str__c
Cs�|j}z
|�|jt|j��WdStyYnty-}z	t�d|j|��d}~ww|�dd�}|s8dSz|�	|�sAWdS|�|t
||jj|j
dd��WdStyct�td|�YdSw)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�urlrrr�	_get_data<s>��
��	�zDataSourceMAAS._get_datac
Csv||_|\}}}||_||_||_|r9z	t�|�|_WdSty8}zt�	d|�d|_WYd}~dSd}~wwdS)Nz"Invalid content in vendor-data: %s)
r�userdata_raw�metadata�vendordata_purer�convert_vendordata�vendordata_raw�
ValueErrorr-r.)rr7�data�ud�md�vd�errrr)cs
���zDataSourceMAAS._set_datacCs
d|jS)z/Return the subplatform metadata source details.z
seed-dir (%s))rr!rrr�_get_subplatformqs
zDataSourceMAAS._get_subplatformc	Cs|j}d}z
t|�d|��}Wntyt�td|�Ynw|dkr&dSd}z||vr5t|�d|��}WntyEt�d|�Ynwt��}|�	d	�rU|dd
�}d|t
f}|g}|jj|||d�\}}|rut�
d
|�t|�St�d|tt��|��t|�S)N�x�max_waitz Failed to get max wait. using %srF�2�timeoutzFailed to get timeout, using %s�/���z%s/%s/meta-data/instance-id)�urlsrFrHzUsing metadata source: '%s'z(Giving up on md from %s after %i seconds)r�intr/r3rr4r-r.�time�endswith�
MD_VERSIONr"�wait_for_url�debug�critical�bool)	rr7r5rFrH�	starttime�	check_urlrK�	_responserrrr0usD���

���z(DataSourceMAAS.wait_for_metadata_servicecCs0|jdurdSt�|d|jfi�}|jt|�kS)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.NF�
datasource)rr�get_cfg_by_path�dsnamer)rr�ncfgrrr�check_instance_id�s
z DataSourceMAAS.check_instance_id)�__name__�
__module__�__qualname__�__doc__rYrrr�propertyr"r#r8r)rDr0r[rrrrrs

'&rcs*d}t�fdd�|D��}tjdi|��S)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_secretcsg|]	}|��|�f�qSr�r/)�.0�r��cfgrr�
<listcomp>�sz$get_oauth_helper.<locals>.<listcomp>Nr)�dictr�OauthUrlHelper)ri�keys�kwargsrrhrr �sr cs4d}d��fdd�|D��}dt�|�d����S)z;Given a config, generate a unique identifier for this node.)rarcrd�csg|]}��|d��qS)�re)rf�f�rrrrj�sz&get_id_from_ds_cfg.<locals>.<listcomp>zv1:zutf-8)r�hashlib�sha256�encode�	hexdigest)r�fields�idstrrrrrr�srcCsL|�d�r|dd�}tj�|�rtt�|��dkrtd��td|dd�S)N�file://�rz%s: not a directoryz	file://%s)�version)�
startswithrr�isdir�len�listdirr+r1)�seed_drrrr*�s

r*cCs|durtj}|�d�r|dd�}i}tD]n\}}}	}
|dur'd||f}nd|||f}z,t�|�}|||||d�}
|
��rQ|	rH|
j||<nt�|
j�||<nt	�
d||
j�Wqtjy�}z|jdkrs|
sst
d	||f�|�|jdkrz|�WYd}~qd}~wwt||�S)
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.
    NrIrJz%s/%sz%s/%s/%s)r(rH�ssl_detailsz4Fetching from %s resulted in an invalid http code %si�zMissing required %s: %s)rr'rN�	DS_FIELDSr�fetch_ssl_details�ok�contents�
decode_binaryr-r.�code�UrlErrorr,�check_seed_contents)�seed_urlr'rHr{rr(rAr�	_dictname�binary�optionalr7r��resprCrrrr1�sJ

���
��
���
r1c
Cs�i}g}tD]5\}}}}||vr|s|�|�qd|vr5|�d�\}}	}
||vr,i||<|||||
<q||||<qt|�dkrHtd|��|rRtd||f��d}|�d�rot�}tj	|�d�|td�}||urotd��|�d	�|�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
    rIrz%s: no data files foundz%s: missing files %sNr	)�default�allowedz%vendor-data was not loadable as yaml.r
�	meta-data)
r��append�	partitionr~r+r,r/�objectr�	load_yaml)
�content�seed�ret�missing�spath�dpath�_binaryr��top�_�p�vd_data�errrrrr��s4

�r�c@�eZdZdS)r+N�r\r]r^rrrrr+%�r+c@r�)r,Nr�rrrrr,)r�r,cCst�|t�Sr)r�list_from_depends�datasources)�dependsrrr�get_datasource_list4sr��__main__csddl}ddl}ddl}|jdd�}|jddddd�|jd	d
ddd�|jdd
d
dd�|jddddd�|jddddd�|jdddtd�|jddd�}dD]\}}|j||d�}|jddddd�qQ|��}|j	|j
|j|jd �}	|j
dur�d!D] }
d"|
d#}tj�|�r�t�|tj�r�|j�d$|�||_
q||j
r�t�|j
�}d%|vr�|d%d&}|	��D]}
|
|vr�|	|
dur�||
|	|
<q�|jdur�d'|vr�|d'|_|jdur�|j�d(�|�d)�t|	���fd*d+���fd,d-�����fd.d/��|jd0k�rc|j�d1|j��j}|jdd2k�s|j�d3��r't|j�\}}}n
t|j|j |d4d5�\}}}t!d6�t!|du�r@d7n|�"��t!d8�|�|�t!d9�|�|du�r^d7�dS|�dS|jd:k�rp�|j�dS|jd;k�r�|j�#d2��s�d<|j|_�|j�dSdS)=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 '')rpz--tseczthe token secret to auth withz--apiverr{z the apiver to use ( can be used)�subcommands�subcmd)�title�dest))�crawlzcrawl the datasource)r/zdo a single GET of provided url)�
check-seedzread and verify seed at url)r�r7zthe datasource url�?)r��nargsr�)rarcrdrb)�91_kernel_cmdline_url�90_dpkg_maasz/etc/cloud/cloud.cfg.d/z.cfgzUsed config in %s.
rWrr%z)Must provide a url or a config with url.
r&cs�j|dd�jS)Nr&)r()r2r��r7)r"rr�geturl�szmain.<locals>.geturlcstd|�|���f�dS)Nz== %s ==
%s
)�print�decoder�)r�rr�printurl�szmain.<locals>.printurlcsv|�d�r5�|�����D]%}|�d�r�d||f�q
|dkr*�d|df�q
�d||f�q
dS�|�dS)NrIz%s%sr�z
meta-data/)rNr��
splitlines)r7�line)r�r�r�rrr��s

�	zmain.<locals>.crawlr�zChecking seed at %s
rIry�)r{r'r(z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===r/r�z%s/)$�argparse�pprint�sys�ArgumentParser�add_argumentrO�add_subparsers�
add_parser�
parse_args�ckey�tkey�tsec�csec�configrr�exists�access�R_OK�stderr�writer�	read_confrmr7�exitr r�r2r|r*r1�apiverr�r�rN)r�r�r��parser�subcmds�namer�r��args�creds�fname�fpathrir�r2�userdatar:rBr)r�r�r"r�r�main:s���������
��



�
"�r�)rsrrM�	cloudinitr�loggingrrr�	getLoggerr\r-rOr�rrr rr*r1r�r3r+r,�DEP_FILESYSTEM�DEP_NETWORKr�r�r�rrrr�<module>s>


	
�:'�
��