Current File : //usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyc
�
oB�]c@s�ddlZddlmZddlZddlZddlZddlZddlmZddl	m
Z
ddl	mZddl	m
Z
ddlmZddl	mZdd	l	mZdd
l	mZddlmZddlmZd
ZdZdZdZeeegZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&ej'e(�Z)idd�fd6dd�fd 6d!d"�fd#6Z*d$d%d&d'd(fZ+ed)e+�e+�Z,d*e-fd+��YZ.d,e-fd-��YZ/d.fd/�Z0e#d0�Z1ed1d2d3d4g�Z2ej3ej4�de5fd5��Y�Z6d6�Z7d7�Z8d8�Z9d9d:�Z:d;�Z;e<d<�Z=d=e>fd>��YZ?d?�Z@dS(@i����N(t
namedtuple(t
write_json(timporter(tlog(tnet(t	EventType(t
type_utils(t	user_data(tutil(tlaunch_index(teventstdisabledtlocalRtpasst
FILESYSTEMtNETWORKt
DataSources|EXPERIMENTAL: The structure and format of content scoped under the 'ds' key may change in subsequent releases of cloud-init.sinstance-data.jsonsinstance-data-sensitive.jsonsredacted for non-root users
cloud-namet_unsettunknowns	aws-chinacCs
|dkS(Ntaws((tc((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyt<lambda>@sscn-saws-govcCs
|dkS(NR((R((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRAssus-gov-sazure-chinacCs
|dkS(Ntazure((R((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRBstchinatcmdlinetdst
system_cfgtfallbackt	initramfstNetworkConfigSourcetDataSourceNotFoundExceptioncBseZRS((t__name__t
__module__(((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRMstInvalidMetaDataExceptioncBseZdZRS(s8Raised when metadata is broken, unavailable or disabled.(RR t__doc__(((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR!QstcCs7tj|�}g|d<g|d<x
|j�D]�\}}|rS|d|}n|}||ksq||kr�|dj|�nt|t�r�|jd�r�|dj|�|jdd�||<nt|t�r0t	|||�}|dj
|jd��|dj
|jd��|||<q0q0W|S(s�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.
    tbase64_encoded_keystsensitive_keyst/sci-b64:R#(tcopytdeepcopytitemstappendt
isinstancetstrt
startswithtreplacetdicttprocess_instance_metadatatextendtpop(tmetadatatkey_pathR%tmd_copytkeytvaltsub_key_patht
return_val((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR0Vs*



cCs�|jdg�s|Stj|�}xw|jd�D]f}|jd�}|}x>|D]6}t||t�rW||dkrW||}qWqWW|||<q5W|S(s�Redact any sensitive keys from to provided metadata dictionary.

    Replace any keys values listed in 'sensitive_keys' with redact_value.
    R%R&i����(tgetR'R(tsplitR+R/(R3tredact_valueR5R4t
path_partstobjtpath((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytredact_sensitive_keysus
#tURLParmstmax_wait_secondsttimeout_secondstnum_retriescBsmeZeZdZdZd5Zd5Zd5Z	d5Z
ejej
ejejfZdZdZdZieejg�d6Zdefdefdifd6d7d8d9fZeZd:Zd5d�Zd�Zd�Zd;d�Z d�Z!d�Z"d�Z#d�Z$ed�Z%d�Z&e'd��Z(e'd��Z)e'd��Z*d�Z+e'd��Z,d�Z-e'd��Z.d�Z/e'd ��Z0d!�Z1d"�Z2d#�Z3d$�Z4d%�Z5d&�Z6d'�Z7d(�Z8e'd)��Z9e'd*��Z:d+�Z;eeed,�Z<d-�Z=d.�Z>d/�Z?e@d5d5d0��ZAe'd1��ZBe'd2��ZCd3�ZDd4�ZERS(<sen_US.UTF-8t_undefi����i
itnetworktec2_metadatatnetwork_jsonR3tuserdatatuserdata_rawt
vendordatatvendordata_rawssecurity-credentialscCs�||_||_||_d|_i|_d|_d|_d|_t	j
|jd|jfi�|_|js�i|_n|s�t
j|j�|_n	||_dS(Nt
datasource(tsys_cfgtdistrotpathstNoneRIR3RJRKRLRtget_cfg_by_pathtdsnametds_cfgtudtUserDataProcessortud_proc(tselfRNRORPRW((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyt__init__�s									cCs
tj|�S(N(Rtobj_name(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyt__str__�scCs�|j�}|j�}|j}ii
dgd6|d6|d6|jd6|jd6|jd6|j�d6|d	6|d
6|d6|d6|jd
6|jd6d6S(s2Return a dictionary of standardized metadata keys.tsubplatformt
_beta_keyssavailability-zonetavailability_zones
cloud-namet
cloud_nametplatformtpublic_ssh_keyssinstance-idtinstance_idslocal-hostnametlocal_hostnametregiontv1(tget_hostnametget_instance_idR^R_t
platform_typetget_public_ssh_keysRdR\(RXRcRbR^((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyt_get_standardized_metadata�s$	





cCst|js
dS|r|}n	|j}x6|D].\}}t||�r,t|||�q,q,W|spt|_ndS(s�Reset any cached metadata attributes to datasource defaults.

        @param attr_defaults: Optional tuple of (attr, value) pairs to
           set instead of cached_attr_defaults.
        N(t_dirty_cachetcached_attr_defaultsthasattrtsetattrtFalse(RXt
attr_defaultstattr_valuest	attributetvalue((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytclear_cached_attrs�s			cCs-t|_|j�}|s|S|j�|S(s�Datasources implement _get_data to setup metadata and userdata_raw.

        Minimally, the datasource should return a boolean True on success.
        (tTrueRkt	_get_datatpersist_instance_data(RXtreturn_value((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytget_datas	
c
Cs�t|d�rWtjt|d��}|jdd
�|jdd
�i|d6}n�ii|jd6d6}t|d�r�t|d�}|tkr�||dd<q�nt|d�r�t|d�}|tkr�||dd<q�n|j|j	��t
|dd<y1tj|�}t
tj|�d	|j�}WnStk
rh}tjd
t|��tStk
r�}tjd
t|��tSXtjj|jjt�}t||�tjj|jjt�}	t|	t|�dd�t S(s�Process and write INSTANCE_JSON_FILE with all instance metadata.

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

        @return True on successful write, False otherwise.
        t_crawled_metadatas	user-datasvendor-dataRt	meta_dataRHRGt_docR%s'Error persisting instance-data.json: %stmodei�N(!RmR'R(tgetattrR2RQR3tUNSETtupdateRjtEXPERIMENTAL_TEXTRt
json_dumpsR0tjsontloadstsensitive_metadata_keyst	TypeErrortLOGtwarningR,RotUnicodeDecodeErrortosR?tjoinRPtrun_dirtINSTANCE_JSON_FILERtINSTANCE_JSON_SENSITIVE_FILER@Ru(
RXtcrawled_metadatat
instance_dataRHRGtcontenttprocessed_datatet	json_filetjson_sensitive_file((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRwsH

	cCstd��dS(s@Walk metadata sources, process crawled data and save attributes.slSubclasses of DataSource must implement _get_data which sets self.metadata, vendordata_raw and userdata_raw.N(tNotImplementedError(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRvIscCsE|j}y"t|jjd|j��}Wn3tk
r`tjtd|jjd�|�nX|j}y+t	dt|jjd|j���}Wn<tk
r�|j}tjtd|jjd�|�nX|j
}y"t|jjd|j
��}Wn3tk
r4tjtd|jjd�|�nXt|||�S(s�Return the Datasource's prefered 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.
        tmax_waits6Config max_wait '%s' is not an int, using default '%s'ittimeouts5Config timeout '%s' is not an int, using default '%s'tretriess5Config retries '%s' is not an int, using default '%s'(
turl_max_waittintRTR:t
ValueErrorRtlogexcR�turl_timeouttmaxturl_retriest	Exceptiont	URLParams(RXR�R�R�((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytget_url_paramsOs0	"
	(
		"
cCsJ|jdkr-|jj|j��|_n|rC|j|j�S|jS(N(RIRQRWtprocesstget_userdata_rawt
_filter_xdata(RXtapply_filter((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytget_userdatass
cCs4|jdkr-|jj|j��|_n|jS(N(RKRQRWR�tget_vendordata_raw(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytget_vendordatazscCsM|jdkrFtj�|_|jdkrFtjd|j�qFn|jS(sADetermine the network interface used during local network config.s(Did not find a fallback interface on %s.N(t_fallback_interfaceRQRtfind_fallback_nicR�R�R_(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytfallback_interfacescCsIt|d�s$|jj�|_n|jsB|jj�|_n|jS(Nt_platform_type(RmRStlowerR�(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRh�s
	cCsCt|d�s!|j�|_n|js<|j�|_n|jS(s�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)
        t_subplatform(Rmt_get_subplatformR�(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR\�s
	cCs$t|d�r dt|d�StS(s?Subclasses should implement to return a "slug (detail)" string.tmetadata_addresss
metadata (%s)(RmR~tMETADATA_UNKNOWN(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR��scCs�|jr|jS|jr�|jjt�r�|jjt�}t|tj�ra|j�|_q�|j�j�|_t	j
dtt|��n|j�j�|_|jS(s�Return lowercase cloud name as determined by the datasource.

        Datasource can determine or define its own cloud product name in
        metadata.
        s5Ignoring metadata provided key %s: non-string type %s(t_cloud_nameR3R:tMETADATA_CLOUD_NAME_KEYR+tsixtstring_typesR�t_get_cloud_nameR�tdebugttype(RXR_((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR_�s	cCs|jS(s�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.
        (RS(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR��scCs+|js
dSd|jkr'|jdSdS(Nslaunch-index(R3RQ(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR	�s
	cCsHtjtj|j��g}|}x|D]}|j|�}q+W|S(N(R	tFilterRtsafe_inttapply(RXtprocessed_udtfilterstnew_udtf((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR��s

cCstS(N(Ro(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytis_disconnected�scCs|jS(N(RJ(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR��scCs|jS(N(RL(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR��scCsiS(N((RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytget_config_obj�scCst|jjd��S(Nspublic-keys(tnormalize_pubkey_dataR3R:(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRi�scCsdS(s5Publish 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...').
        N((RXthostkeys((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytpublish_host_keys�scCs�idd6}xp|j�D]b\}}|j|�s;qnx>|D]6}d||t|�f}tjj|�rB|SqBWqWdS(Ntvdtxvdtvtbtsds	/dev/%s%s(R�R�R�(R)R-tlenR�R?texistsRQ(RXt
short_nametmappingstnfromttlisttntotcand((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyt
_remap_device�s

cCsdS(N(RQ(RXt_name((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytdevice_name_to_devicescCs4|j}y|jj�}Wntk
r/nX|S(s<Default locale is en_US.UTF-8, but allow distros to override(tdefault_localeROt
get_localeR�(RXtlocale((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR�s	
cCsG|jjd|jjd��}|r+|S|jjdi�jd�S(Nsavailability-zoneR^t	placement(R3R:(RXttop_level_az((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR^s
	cCs|jjd�S(NRd(R3R:(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRd!scCs.|jsd|jkrdSt|jd�S(Nsinstance-idsiid-datasource(R3R,(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRg%scCs�d}d}|}|js/|jjd�r�|r9d
Sg}tj�}tj|�}	|	r�|	jd�dkr�t|	�jd�}qg|r�|jd�dkr�t|�jd�}qg|r�||g}qg||g}n�|jd}
tj	|
�rXg}|rtj
|
�}n|r<t|�jd�}qgd|
jdd�g}n|
jd�}t|�dkr�|d}dj
|d�}n
|d}|r�||kr�d	||fS|Sd
S(s;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: hostname or qualified hostname. Optionally return None when
            metadata_only is True and local-hostname data is not available.
        tlocaldomaint	localhostslocal-hostnamet.isip-%st-is%s.%sN(R3R:RQRRftget_fqdn_from_hoststfindR,R;tis_ipv4t
gethostbyaddrR.R�R�(RXtfqdnt
resolve_ipt
metadata_onlyt	defdomaintdefhosttdomainttoksthostnamet
hosts_fqdntlhost((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRf+s@


cCs|jjd|�S(Ntdata_source(ROtget_package_mirror_info(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR�hsc	Csi}xm|D]e}x\|jj�D]K\}}||kr#|j|�sZt�||<n||j|�q#q#Wq
WxP|j�D]B\}}tjd|dj|��|jd|t	ff�q�W|r�|j�|j
�}|r�tSntjd|dj|��tS(s�Refresh cached metadata if the datasource supports this event.

        The datasource has a list of 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.
        s:Update datasource metadata and %s config due to events: %ss, s
_%s_configs(Datasource %s not updated for events: %s(
t
update_eventsR)R:tsettaddR�R�R�RtRRyRuRo(	RXtsource_event_typestsupported_eventsteventtupdate_scopeR�tscopetmatched_eventstresult((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytupdate_metadataks(


cCstS(N(Ro(RXRN((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytcheck_instance_id�scCsx|dkrt}n|dkr*t}nxG|D]?}|dkrIq1n||krY|Stjd||�|Sq1W|S(Ns%invalid dsmode '%s', using default=%s(RQtDSMODE_NETWORKt
VALID_DSMODESR�R�(t
candidatestdefaulttvalidt	candidate((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyt_determine_dsmode�s		
	
cCsdS(N(RQ(RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytnetwork_config�scCsdS(N((RX((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytfirst_instance_boot�scCsdS(s(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.
        N((RXtis_new_instance((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytsetup�s	cCsdS(s�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.
        N((RXtcfgR((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytactivate�sN(suserdataN(suserdata_rawN(s
vendordataN(svendordata_rawN(ssecurity-credentials((FRR R�tdsmodeR�RSRQR�R�R�R�RRRRRtnetwork_config_sourcesR�R�R�R�RtBOOT_NEW_INSTANCER�RRlRoRkR�RYR[RjRtRyRwRvR�R�R�tpropertyR�RhR\R�R_R�R	R�R�R�R�R�RiR�R�R�R�R^RdRgRfR�R�R�tstaticmethodRRRRR(((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR�sx					2		$											
					=		%		cCs�g}|s|St|tj�r2t|�j�St|ttf�rQt|�St|t�r�xz|j�D]i\}}t|tj�r�|g}nt|ttf�rmx'|D]}|r�|j	|�q�q�WqmqmWn|S(N(
R+R�R�R,t
splitlinestlistR�R/R)R*(tpubkey_datatkeyst_keynametklisttpkey((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR��s 

c
Cst|||�}g|D]}tj|�^q}	t|krFdnd}
tjd|
|	�x�t|	|�D]�\}}tjdd|j	dd�dd	|
|fd
d|
|fd|�}
yn|
�btjd
|�||||�}|j
tjg�r*d|
|f|
_
|tj|�fSWdQXWqotk
rWtjtd|�qoXqoWddj|	�}t|��dS(NRFRs#Searching for %s data source in: %stnames	search-%sRR#tdescriptionssearching for %s data from %stmessagesno %s data found from %stparents%Seeing if we can get any data from %ssfound %s data from %ssGetting data from %s faileds4Did not find any data source, searched classes: (%s)s, (tlist_sourcesRRZtDEP_NETWORKR�R�tzipR
tReportEventStackR.R�RR
RR�RR�R�R(RNRORPtds_depstcfg_listtpkg_listtreportertds_listR�tds_namesR}Rtclstmyreptstmsg((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytfind_source�s,"		
cCs�g}tjd|||�x�|D]�}|jt�sKdt|f}ntj||dg�\}}xO|D]G}tj|�}t|d�}	|	|�}
|
rp|j|
�PqpqpWq#W|S(NsLLooking for data source in: %s, via packages %s that matches dependencies %ss%s%stget_datasource_list(	R�R�R-t	DS_PREFIXRtfind_modulet
import_moduleR~R1(RtdependsRtsrc_listtds_nametm_locst_looked_locstm_loctmodtlistertmatches((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRs"	

	

ssystem-uuidcCs9|s
tStj|�}|s#tS|j�|j�kS(N(RoRt
read_dmi_dataR�(Rbtfieldt	dmi_value((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytinstance_id_matches_system_uuidscCs�|st}n|st}n|tkr>|tkr:|S|SxEtj�D]7\}}|\}}|j|�rK||�rK|SqKW|tkr�|S|S(s@Lookup the canonical cloud-id for a given cloud_name and region.(R�tCLOUD_ID_REGION_PREFIX_MAPR)R-(R_RdR`tprefixt
cloud_id_testtcloud_idtvalid_cloud((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytcanonical_cloud_id(s		cCs�|s
dSt|tj�r |St|t�r<tj|�St|t�r|tkrpt	|j
d�dt�Std��ntdt
|���dS(sLdata: 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'))
    s
cloud-inittrecurses'vendordata['cloud-init'] cannot be dicts$Unknown data type for vendordata: %sN(RQR+R�R�RR'R(R/Rutconvert_vendordataR:RoR�R�(tdataR>((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyR?;s
tBrokenMetadatacBseZRS((RR (((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyRATscCsOg}t|�}x6|D].\}}|t|�kr|j|�qqW|S(N(R�R*(R+R tret_listtdepsetR"tdeps((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pytlist_from_depends_s(AtabctcollectionsRR'R�R�R�tcloudinit.atomic_helperRt	cloudinitRRtloggingRtcloudinit.eventRRRRURtcloudinit.filtersR	tcloudinit.reportingR
tDSMODE_DISABLEDtDSMODE_LOCALR�tDSMODE_PASSR�tDEP_FILESYSTEMRR(R�R�R�tREDACT_SENSITIVE_VALUER�RR�t	getLoggerRR�R8t_NETCFG_SOURCE_NAMESRR�RR!R0R@R�t
add_metaclasstABCMetatobjectRR�R&RR7R=RuR?tIOErrorRARE(((s>/usr/lib/python2.7/site-packages/cloudinit/sources/__init__.pyt<module>sp��A