Your IP : 216.73.216.31


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

U

�Ad+��@s�ddlZddlZddlZddlZddlZddlmZddlmZm	Z	ddl
mZmZm
Z
mZmZddlmZmZddlmZddlmZmZddlmZdd	lmZdd
lmZddlmZddlmZm Z dd
l!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(dZ)dZ*dZ+dZ,e)e*e+gZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5e�6e7�Z8ddd�fd d!d�fd"d#d�fd$�Z9e	Gd%d&�d&e��Z:Gd'd(�d(e;�Z<Gd)d*�d*e;�Z=Gd+d,�d,e;�Z>dWd/d0�Z?e2fd1d2�Z@ed3d4d5d6d7g�ZAed8d9d:g�ZBGd;d�de&ejCd<�ZDd=d>�ZEeeDeFfd?�d@dA�ZGdBdC�ZHdXeFeIdE�dFdG�ZJdHdI�ZKdYdKdL�ZLGdMdN�dNeM�ZNdOdP�ZOeDeFeIdQ�dRdS�ZPeFeeDdT�dUdV�ZQdS)Z�N)�
namedtuple)�Enum�unique)�Any�Dict�List�Optional�Tuple)�dmi�importer)�log)�net�
type_utils)�	user_data)�util)�
write_json)�Distro)�
EventScope�	EventType)�launch_index)�Paths)�CloudInitPickleMixin)�eventsZdisabled�localr
�passZ
FILESYSTEM�NETWORK�
DataSourcez|EXPERIMENTAL: The structure and format of content scoped under the 'ds' key may change in subsequent releases of cloud-init.zredacted for non-root user�
cloud-nameZ_unset�unknownz	aws-chinacCs|dkS�NZaws���cr r �</usr/lib/python3/dist-packages/cloudinit/sources/__init__.py�<lambda>?�r$zaws-govcCs|dkSrr r!r r r#r$@r%zazure-chinacCs|dkS)NZazurer r!r r r#r$Ar%)zcn-zus-gov-Zchinac@s2eZdZdZdZdZdZdZdZe	d�dd	�Z
d
S)�NetworkConfigSourcezb
    Represents the canonical list of network config sources that cloud-init
    knows about.
    Zcmdline�dsZ
system_cfgZfallbackZ	initramfs��returncCs|jS�N��value��selfr r r#�__str__RszNetworkConfigSource.__str__N)�__name__�
__module__�__qualname__�__doc__�CMD_LINE�DS�
SYSTEM_CFGZFALLBACK�	INITRAMFS�strr/r r r r#r&Esr&c@seZdZdZdS)�DatasourceUnpickleUserDataErrorzERaised when userdata is unable to be unpickled due to python upgradesN�r0r1r2r3r r r r#r9Vsr9c@seZdZdS)�DataSourceNotFoundExceptionN�r0r1r2r r r r#r;Zsr;c@seZdZdZdS)�InvalidMetaDataExceptionz8Raised when metadata is broken, unavailable or disabled.Nr:r r r r#r=^sr=�r c
Cs�t�|�}g}g}|��D]�\}}|r4|d|}n|}|��|ksP|��|krZ|�|�t|t�r�|�d�r�|�|�|�dd�||<t|t	�rt
|||�}	|�|	�d��|�|	�d��|	||<qt
|�|d<t
|�|d<|S)z�Process all instance metadata cleaning it up for persisting as json.

    Strip ci-b64 prefix and catalog any 'base64_encoded_keys' as a list

    @return Dict copy of processed metadata.
    �/zci-b64:r>�base64_encoded_keys�sensitive_keys)�copy�deepcopy�items�lower�append�
isinstancer8�
startswith�replace�dict�process_instance_metadata�extend�pop�sorted)
�metadata�key_pathrA�md_copyr@Z	sens_keys�key�valZsub_key_pathZ
return_valr r r#rKbs6

�
�


�
rKcCs�|�dg�s|St�|�}|�d�D]V}|�d�}|}|D].}||kr:t||t�r:||dkr:||}q:||kr$|||<q$|S)z�Redact any sensitive keys from to provided metadata dictionary.

    Replace any keys values listed in 'sensitive_keys' with redact_value.
    rAr?���)�getrBrC�splitrGrJ)rOZredact_valuerQrP�
path_parts�obj�pathr r r#�redact_sensitive_keys�s"

��
�

rZ�	URLParamsZmax_wait_secondsZtimeout_secondsZnum_retries�sec_between_retries�DataSourceHostname�hostname�
is_defaultc	@s�eZdZUeZdZdZdZdZdZ	dZ
ejej
ejejfZeedfed<dZdZdZd	ZejejejejejhiZejejhiZd
e fde fdifd
dddddf	Z!eee"e#fdfed<dZ$dZ%ee"dfed<dZ&d	Z'dze(e)d�dd�Z*e+dd�dd�Z,dd�Z-e.d�d d!�Z/d"d#�Z0d$d%�Z1d&d'�Z2d{d)d*�Z3e.d�d+d,�Z4d|d.d/�Z5e.d�d0d1�Z6d2d3�Z7d}d4d5�Z8d6d7�Z9d8d9�Z:e;d:d;��Z<e;d<d=��Z=e;d>d?��Z>d@dA�Z?e;dBdC��Z@dDdE�ZAe;dFdG��ZBdHdI�ZCe;dJdK��ZDdLdM�ZEdNdO�ZFdPdQ�ZGdRdS�ZHdTdU�ZIdVdW�ZJdXdY�ZKdZd[�ZLd\d]�ZMe;d^d_��ZNe;d`da��ZOdbdc�ZPd~ddde�ZQdfdg�ZReSedh�didj�ZTeSee.dk�dldm�ZUdndo�ZVeWddpdq��ZXe;drds��ZYe;dtdu��ZZdvdw�Z[dxdy�Z\dS)�rzen_US.UTF-8Z_undefN.�network_config_sourcesrT�
���ec2_metadata�network_jsonrO)�userdataN)�userdata_rawN)�
vendordataN)�vendordata_rawN)�vendordata2N)�vendordata2_rawN�cached_attr_defaultsF)�
merged_cfgzsecurity-credentialsrf�	user-datarrh�vendor-datazds/vendor_data�sensitive_metadata_keys)�distro�pathscCs~||_||_||_d|_i|_d|_d|_d|_d|_d|_	t
�|jd|jfi�|_
|j
s`i|_
|stt�|j�|_n||_dS)NZ
datasource)�sys_cfgrqrrrfrOrgrhrjrirkrZget_cfg_by_path�dsname�ds_cfg�udZUserDataProcessor�ud_proc)r.rsrqrrrwr r r#�__init__s(�zDataSource.__init__)�ci_pkl_versionr)c
Cs�t|d�sd|_t|d�s d|_t|d�s0d|_t|d�r�|jdk	r�zt|j�Wn6tk
r�}zt�d|�t	�|�W5d}~XYnXdS)z(Perform deserialization fixes for Paths.rjNrk�skip_hotplug_detectFrfz:Unable to unpickle datasource: %s. Ignoring current cache.)
�hasattrrjrkrzrfr8�AttributeError�LOG�debugr9)r.ry�er r r#�	_unpickle1s


�zDataSource._unpicklecCs
t�|�Sr*�r�obj_namer-r r r#r/IszDataSource.__str__r(cCsdS)z#Check if running on this datasourceTr r-r r r#�	ds_detectLszDataSource.ds_detectcCs |j�dg�|jg|jdgfkS)z�Override if either:
        - only a single datasource defined (nothing to fall back to)
        - TODO: commandline argument is used (ci.ds=OpenStack)
        Zdatasource_list�None)rsrUrtr-r r r#�override_ds_detectPs�zDataSource.override_ds_detectcCsD|��rt�d|�n&|��r,t�d|�nt�d|�dS|��S)z&Overrides runtime datasource detectionz5Machine is configured to run on single datasource %s.zMachine is running on %s.z#Datasource type %s is not detected.F)r�r}r~r��	_get_datar-r r r#�_check_and_get_dataZs�zDataSource._check_and_get_datacCs�|��j}|��}|j}|d}ddg||t|j|j|j�|j|j|dd|dd|dd|j|��|d|||d	d|||d	d
|j|j	|d|dd
�iS)z2Return a dictionary of standardized metadata keys.�sys_info�v1�subplatformZdistrrc��python�uname��platform�variant)Z
_beta_keys�availability-zone�availability_zone�cloud_idr�
cloud_namerqZdistro_versionZdistro_releaser�Zpublic_ssh_keysZpython_version�instance-id�instance_idZkernel_release�local-hostname�local_hostname�machine�regionr�Zsystem_platformr�)
�get_hostnamer^�get_instance_idr��canonical_cloud_idr�r��
platform_type�get_public_ssh_keysr�)r.�
instance_datar�r�r�Zsysinfor r r#�_get_standardized_metadatagsB
�




��z%DataSource._get_standardized_metadatar cCsL|js
dS|r|}n|j}|D]\}}t||�rt|||�q|sHd|_dS)z�Reset any cached metadata attributes to datasource defaults.

        @param attr_defaults: Optional tuple of (attr, value) pairs to
           set instead of cached_attr_defaults.
        NF)�_dirty_cacherlr{�setattr)r.Z
attr_defaultsZattr_valuesZ	attributer,r r r#�clear_cached_attrs�s
zDataSource.clear_cached_attrscCs"d|_|��}|s|S|��|S)z�Datasources implement _get_data to setup metadata and userdata_raw.

        Minimally, the datasource should return a boolean True on success.
        T)r�r��persist_instance_data)r.Zreturn_valuer r r#�get_data�szDataSource.get_dataTc
Csf|r&tj�|jj�r&t||j�d��t|d�rbt�	t
|d��}|�dd�|�dd�d|i}n^dd|jii}t|d�r�t
|d�}|t
kr�||dd<t|d	�r�t
|d	�}|t
kr�||dd	<t|dd
<t�	|j�|d<d|dd
<t��|d
<|�|�|��z"t�|�}tt�|�|jd�}Wnrtk
�r`}zt�dt|��WY�dSd}~XYn:tk
�r�}zt�dt|��WY�dSd}~XYnX|j�d�}	|d�dd�}
tj� |jj!d�}t�"|�d|
��|
�d��d}|�d|
��}
tj�#|��rtj�$|�}tj%|
|dd�|�r:||
k�r:t�&|�t'|	|dd�|j�d�}t'|t(|��dS)aPProcess and write INSTANCE_JSON_FILE with all instance metadata.

        Replace any hyphens with underscores in key names for use in template
        processing.

        :param write_cache: boolean set True to persist obj.pkl when
            instance_link exists.

        @return True on successful write, False otherwise.
        Zobj_pklZ_crawled_metadatarnNror'Z	meta_datarerdZ_docrmzUMerged cloud-init system config from /etc/cloud/cloud.cfg and /etc/cloud/cloud.cfg.d/r�)rAz'Error persisting instance-data.json: %sFZinstance_data_sensitiver�r�Znonezcloud-id�-�
T)Zforcei�)�moder�))�osrY�lexistsrrZ
instance_link�	pkl_storeZ
get_ipath_curr{rBrC�getattrrMrO�UNSET�EXPERIMENTAL_TEXTrsrZsystem_info�updater�Z
json_dumpsrK�json�loadsrp�	TypeErrorr}�warningr8�UnicodeDecodeErrorZget_runpathrU�joinZrun_dir�
write_file�exists�realpathZsym_linkZdel_filerrZ)r.Zwrite_cacheZcrawled_metadatar�rerdZcontentZprocessed_datarZjson_sensitive_filer�Z
cloud_id_fileZprev_cloud_id_fileZnew_cloud_id_fileZ	json_filer r r#r��sf
�




�

�

z DataSource.persist_instance_datacCstd��dS)z@Walk metadata sources, process crawled data and save attributes.zlSubclasses of DataSource must implement _get_data which sets self.metadata, vendordata_raw and userdata_raw.N)�NotImplementedErrorr-r r r#r��s�zDataSource._get_datac
CsL|j}zt|j�d|j��}Wn,tk
rJt�td|j�d�|�YnX|j}zt	dt|j�d|j���}Wn2tk
r�|j}t�td|j�d�|�YnX|j
}zt|j�d|j
��}Wn,tk
r�t�td|j�d�|�YnX|j}zt|j�d|j��}Wn.tk
�r<t�td	|j�d�|�YnXt
||||�S)
z�Return the Datasource's preferred url_read parameters.

        Subclasses may override url_max_wait, url_timeout, url_retries.

        @return: A URLParams object with max_wait_seconds, timeout_seconds,
            num_retries.
        �max_waitz6Config max_wait '%s' is not an int, using default '%s'r�timeoutz5Config timeout '%s' is not an int, using default '%s'�retriesz5Config retries '%s' is not an int, using default '%s'r\zAConfig sec_between_retries '%s' is not an int, using default '%s')�url_max_wait�intrurU�
ValueErrorr�logexcr}�url_timeout�max�url_retries�	Exception�url_sec_between_retriesr[)r.r�r�r�r\r r r#�get_url_params�s^
�

�

�
��
�
zDataSource.get_url_paramscCs2|jdkr|j�|���|_|r,|�|j�S|jSr*)rfrw�process�get_userdata_raw�
_filter_xdata)r.Zapply_filterr r r#�get_userdata:s

zDataSource.get_userdatacCs"|jdkr|j�|���|_|jSr*)rhrwr��get_vendordata_rawr-r r r#�get_vendordataAs
zDataSource.get_vendordatacCs"|jdkr|j�|���|_|jSr*)rjrwr��get_vendordata2_rawr-r r r#�get_vendordata2Fs
zDataSource.get_vendordata2cCs2|jdkr,t��|_|jdkr,t�d|j�|jS)zADetermine the network interface used during local network config.Nz(Did not find a fallback interface on %s.)�_fallback_interfacer
Zfind_fallback_nicr}r�r�r-r r r#�fallback_interfaceKs


�zDataSource.fallback_interfacecCs.t|d�s|j��|_|js(|j��|_|jS)N�_platform_type)r{rtrEr�r-r r r#r�Vs

zDataSource.platform_typecCs*t|d�s|��|_|js$|��|_|jS)a�Return a string representing subplatform details for the datasource.

        This should be guidance for where the metadata is sourced.
        Examples of this on different clouds:
            ec2:       metadata (http://169.254.169.254)
            openstack: configdrive (/dev/path)
            openstack: metadata (http://169.254.169.254)
            nocloud:   seed-dir (/seed/dir/path)
            lxd:   nocloud (/seed/dir/path)
        �_subplatform)r{�_get_subplatformr�r-r r r#r�_s



zDataSource.subplatformcCst|d�rdt|d�StS)z?Subclasses should implement to return a "slug (detail)" string.Zmetadata_addressz
metadata (%s))r{r��METADATA_UNKNOWNr-r r r#r�rs
zDataSource._get_subplatformcCsv|jr|jS|jrb|j�t�rb|j�t�}t|t�r@|��|_qp|����|_t�	dtt
|��n|����|_|jS)z�Return lowercase cloud name as determined by the datasource.

        Datasource can determine or define its own cloud product name in
        metadata.
        z5Ignoring metadata provided key %s: non-string type %s)�_cloud_namerOrU�METADATA_CLOUD_NAME_KEYrGr8rE�_get_cloud_namer}r~�type)r.r�r r r#r�xs
�zDataSource.cloud_namecCs|jS)z�Return the datasource name as it frequently matches cloud name.

        Should be overridden in subclasses which can run on multiple
        cloud names, such as DatasourceEc2.
        )rtr-r r r#r��szDataSource._get_cloud_namecCs"|js
dSd|jkr|jdSdS)Nzlaunch-index)rOr-r r r#r�s


zDataSource.launch_indexcCs0t�t�|j��g}|}|D]}|�|�}q|Sr*)rZFilterrZsafe_intZapply)r.Zprocessed_ud�filtersZnew_ud�fr r r#r��s�zDataSource._filter_xdatacCsdS�NFr r-r r r#�is_disconnected�szDataSource.is_disconnectedcCs|jSr*)rgr-r r r#r��szDataSource.get_userdata_rawcCs|jSr*)rir-r r r#r��szDataSource.get_vendordata_rawcCs|jSr*)rkr-r r r#r��szDataSource.get_vendordata2_rawcCsiSr*r r-r r r#�get_config_obj�szDataSource.get_config_objcCst|j�d��S)Nzpublic-keys)�normalize_pubkey_datarOrUr-r r r#r��szDataSource.get_public_ssh_keyscCsdS)a5Publish the public SSH host keys (found in /etc/ssh/*.pub).

        @param hostkeys: List of host key tuples (key_type, key_value),
            where key_type is the first field in the public key file
            (e.g. 'ssh-rsa') and key_value is the key itself
            (e.g. 'AAAAB3NzaC1y...').
        Nr )r.Zhostkeysr r r#�publish_host_keys�szDataSource.publish_host_keyscCsdddi}|��D]N\}}|�|�s$q|D]4}d||t|�d�f}tj�|�r(|Sq(qdS)NZsd)ZvdZxvdZvtbz	/dev/%s%s)rDrH�lenr�rYr�)r.Z
short_nameZmappingsZnfromZtlistZntoZcandr r r#�
_remap_device�s
zDataSource._remap_devicecCsdSr*r )r.�_namer r r#�device_name_to_device�sz DataSource.device_name_to_devicecCs.|j}z|j��}Wntk
r(YnX|S)z<Default locale is en_US.UTF-8, but allow distros to override)�default_localerq�
get_localer�)r.Zlocaler r r#r��szDataSource.get_localecCs2|j�d|j�d��}|r|S|j�di��d�S)Nr�r�Z	placement�rOrU)r.Ztop_level_azr r r#r��s
�zDataSource.availability_zonecCs|j�d�S)Nr�r�r-r r r#r��szDataSource.regioncCs"|jrd|jkrdSt|jd�S)Nr�ziid-datasource)rOr8r-r r r#r��szDataSource.get_instance_idcCs^d}d}|}d}|jr"|j�d�s�|r0td|�Sg}t��}	|	dkrHd}t�|	�}
|
rt|
�d�dkrtt|
��d�}n8|	r�|	�d�dkr�t|	��d�}n|	r�|	|g}n||g}nX|jd}t	�
|�r�g}|r�t�|�}|r�t|��d�}nd	|�dd
�g}n
|�d�}t
|�dk�r0|d}	d�|dd��}n|d}	|�rT||k�rTd|	|f}	t|	|�S)
a�Get hostname or fqdn from the datasource. Look it up if desired.

        @param fqdn: Boolean, set True to return hostname with domain.
        @param resolve_ip: Boolean, set True to attempt to resolve an ipv4
            address provided in local-hostname meta-data.
        @param metadata_only: Boolean, set True to avoid looking up hostname
            if meta-data doesn't have local-hostname present.

        @return: a DataSourceHostname namedtuple
            <hostname or qualified hostname>, <is_default> (str, bool).
            is_default is a bool and
            it's true only if hostname is localhost and was
            returned by util.get_hostname() as a default.
            This is used to differentiate with a user-defined
            localhost hostname.
            Optionally return (None, False) when
            metadata_only is True and local-hostname data is not available.
        ZlocaldomainZ	localhostFr�NT�.rzip-%sr�rcz%s.%s)rOrUr]rr�Zget_fqdn_from_hosts�findr8rVr
Zis_ipv4_addressZ
gethostbyaddrrIr�r�)r.ZfqdnZ
resolve_ipZ
metadata_onlyZ	defdomainZdefhostZdomainr_Ztoksr^Z
hosts_fqdnZlhostr r r#r��sF







zDataSource.get_hostnamecCs|jj|d�S)N)Zdata_source)rq�get_package_mirror_infor-r r r#r�Dsz"DataSource.get_package_mirror_info)�source_event_typescCsPi}|D]B}|j��D]2\}}||kr|�|�s:t�||<||�|�qq|Sr*)�supported_update_eventsrDrU�set�add)r.r��supported_events�eventZupdate_scopeZ
update_eventsr r r#�get_supported_eventsGs�

zDataSource.get_supported_events)r�r)c	Cs�|�|�}|��D]<\}}t�d|jd�dd�|D���|�d|tff�q|rl|��|��}|rldSt�d|d�dd�|D���d	S)
a�Refresh cached metadata if the datasource supports this event.

        The datasource has a list of supported_update_events which
        trigger refreshing all cached metadata as well as refreshing the
        network configuration.

        @param source_event_types: List of EventTypes which may trigger a
            metadata update.

        @return True if the datasource did successfully update cached metadata
            due to source_event_type.
        z:Update datasource metadata and %s config due to events: %s�, cSsg|]
}|j�qSr r+��.0r�r r r#�
<listcomp>hsz;DataSource.update_metadata_if_supported.<locals>.<listcomp>z
_%s_configTz(Datasource %s not updated for events: %scSsg|]
}|j�qSr r+r�r r r#r�vsF)	r�rDr}r~r,r�r�r�r�)r.r�r�ZscopeZmatched_events�resultr r r#�update_metadata_if_supportedTs&
��z'DataSource.update_metadata_if_supportedcCsdSr�r )r.rsr r r#�check_instance_idzszDataSource.check_instance_idcCsV|dkrt}|dkrt}|D]4}|dkr*q||kr:|St�d||�|Sq|S)Nz%invalid dsmode '%s', using default=%s)�DSMODE_NETWORK�
VALID_DSMODESr}r�)Z
candidates�defaultZvalid�	candidater r r#�_determine_dsmode~s �
zDataSource._determine_dsmodecCsdSr*r r-r r r#�network_config�szDataSource.network_configcCsdSr*r r-r r r#�first_instance_boot�szDataSource.first_instance_bootcCsdS)a(setup(is_new_instance)

        This is called before user-data and vendor-data have been processed.

        Unless the datasource has set mode to 'local', then networking
        per 'fallback' or per 'network_config' will have been written and
        brought up the OS at this point.
        Nr )r.�is_new_instancer r r#�setup�s	zDataSource.setupcCsdS)a�activate(cfg, is_new_instance)

        This is called before the init_modules will be called but after
        the user-data and vendor-data have been fully processed.

        The cfg is fully up to date config, it contains a merged view of
           system config, datasource config, user config, vendor config.
        It should be used rather than the sys_cfg passed to __init__.

        is_new_instance is a boolean indicating if this is a new instance.
        Nr )r.Zcfgrr r r#�activate�szDataSource.activate)N)r )T)F)FFF)NN)]r0r1r2r�Zdsmoder�rtr�r�r�r�r&r4r7r6r5r`r	�__annotations__r�r�r�r�rrr�BOOT_NEW_INSTANCEZBOOTZBOOT_LEGACYZHOTPLUGr�Zdefault_update_eventsr�rlr8rr�rprzZ_ci_pkl_versionrrrxr�r�r/�boolr�r�r�r�r�r�r�r�r�r�r�r��propertyr�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r��staticmethodr�r�r�rrr r r r#r�s�
���	��
�

&

K<






	
		


H�&

)�	metaclasscCs�g}|s|St|t�r|��St|ttf�r4t|�St|t�r�|��D]>\}}t|t�r^|g}t|ttf�rF|D]}|rp|�|�qpqF|Sr*)rGr8�
splitlines�listr�rJrDrF)Zpubkey_data�keysZ_keynameZklistZpkeyr r r#r��s 


r�r(cCs"t|||�}dd�|D�}t|kr&dnd}	t�d|	|�t||�D]�\}
}tjd|
�dd�d	|	|
fd
|	|
f|d�}zh|�Zt�d|�||||�}
|
�t	j
g�r�d
|	|
f|_|
t�
|�fW5QR�WSW5QRXWqBtk
�rt�td|�YqBXqBdd�|�}t|��dS)NcSsg|]}t�|��qSr r�)r�r�r r r#r��szfind_source.<locals>.<listcomp>Znetworkrz#Searching for %s data source in: %sz	search-%srr>zsearching for %s data from %szno %s data found from %s)�nameZdescription�message�parentz%Seeing if we can get any data from %szfound %s data from %szGetting data from %s failedz4Did not find any data source, searched classes: (%s)r�)�list_sources�DEP_NETWORKr}r~�ziprZReportEventStackrIr�rrr
rr�r�rr�r�r;)rsrqrrZds_deps�cfg_list�pkg_listZreporter�ds_listZds_namesr�r�clsZmyrep�s�msgr r r#�find_source�s4

��.�rcCs�g}t�d|||�|D]v}|�t�s2dt|f}t�||dg�\}}|sVt�d|�|D]2}t�|�}t|d�}	|	|�}
|
rZ|�	|
�qqZq|S)NzLLooking for data source in: %s, via packages %s that matches dependencies %sz%s%sZget_datasource_listzDCould not import %s. Does the DataSource exist and is it importable?)
r}r~rH�	DS_PREFIXr�find_module�error�
import_moduler�rL)r�dependsrZsrc_listZds_nameZm_locsZ_looked_locsZm_loc�modZlisterZmatchesr r r#r�s8�
��


r�system-uuid)�fieldr)cCs*|sdSt�|�}|sdS|��|��kSr�)r
Z
read_dmi_datarE)r�r Z	dmi_valuer r r#�instance_id_matches_system_uuids
r!cCsl|st}|st}|tkr(|tkr$|S|St��D]*\}}|\}}|�|�r0||�r0|Sq0|tkrh|S|S)z@Lookup the canonical cloud-id for a given cloud_name and region.)r��CLOUD_ID_REGION_PREFIX_MAPrDrH)r�r�r��prefixZ
cloud_id_testr�Zvalid_cloudr r r#r�%s
r�TcCsj|sdSt|t�r|St|t�r*t�|�St|t�rV|dkrNt|�d�dd�Std��tdt	|���dS)aLdata: a loaded object (strings, arrays, dicts).
    return something suitable for cloudinit vendordata_raw.

    if data is:
       None: return None
       string: return string
       list: return data
             the list is then processed in UserDataProcessor
       dict: return convert_vendordata(data.get('cloud-init'))
    NTz
cloud-initF)�recursez'vendordata['cloud-init'] cannot be dictz$Unknown data type for vendordata: %s)
rGr8r
rBrCrJ�convert_vendordatarUr�r�)�datar$r r r#r%8s



r%c@seZdZdS)�BrokenMetadataNr<r r r r#r'Psr'cCs4g}t|�}|D]\}}|t|�kr|�|�q|Sr*)r�rF)rrZret_listZdepsetrZdepsr r r#�list_from_depends[sr()rX�fnamer)cCstzt�|�}Wn$tk
r2t�td|�YdSXztj||ddd�Wn$tk
rnt�td|�YdSXdS)z[Use pickle to serialize Datasource to a file as a cache.

    :return: True on success
    zFailed pickling datasource %sF�wb�)Zomoder�z Failed pickling datasource to %sT)�pickle�dumpsr�rr�r}r�)rXr)Zpk_contentsr r r#r�dsr�)r)r)c
Cs�d}ztj|dd�}Wn<tk
rR}ztj�|�rBt�d||�W5d}~XYnX|s\dSzt�	|�WSt
k
r~YdStk
r�t�td|�YdSXdS)zBUse pickle to deserialize a instance Datasource from a cache file.NF)�decodezfailed loading pickle in %s: %sz#Failed loading pickled blob from %s)rZ	load_filer�r�rY�isfiler}r�r,r�r9r�)r)Zpickle_contentsrr r r#�pkl_loadvs r0)r>r )r)T)R�abcrBr�r�r,�collectionsr�enumrr�typingrrrrr	Z	cloudinitr
rrZloggingr
rrrvrZcloudinit.atomic_helperrZcloudinit.distrosrZcloudinit.eventrrZcloudinit.filtersrZcloudinit.helpersrZcloudinit.persistencerZcloudinit.reportingrZDSMODE_DISABLEDZDSMODE_LOCALr�ZDSMODE_PASSr�ZDEP_FILESYSTEMrrr�ZREDACT_SENSITIVE_VALUEr�r�r�Z	getLoggerr0r}r"r&r�r9r;r=rKrZr[r]�ABCMetarr�r8rrrr!r�r%�IOErrorr'r(r�r0r r r r#�<module>s�
�



�
#��
�

�% ��