Ë
    x[hó°  ã                   ó   — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlm Z  d d	l!m"Z"m#Z# d d
l$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ dZ,dZ-dZ.dZ/e,e-e.gZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8 ejr                  e:«      Z;dd„ fdd„ fdd„ fd œZ<e	 G d!„ d"e«      «       Z= G d#„ d$e«      Z> G d%„ d&e?«      Z@ G d'„ d(e?«      ZA G d)„ d*e?«      ZBdGd+„ZCe5fd,„ZD G d-„ d.e«      ZE G d/„ d0e«      ZF G d1„ d2e«      ZG G d3„ de)e j�                  ¬4«      ZId5„ ZJd6eeIeKf   fd7„ZLd8„ ZM	 dHd9eKd6eNfd:„ZOd;„ ZPdId<„ZQ G d=„ d>eR«      ZSd?„ ZTd@eIdAeKd6eNfdB„ZUdAeKd6eeI   fdC„ZVd6eKfdD„ZWdEeKd6eKfdF„ZXy)Jé    N)ÚEnumÚunique)ÚAnyÚDictÚListÚ
NamedTupleÚOptionalÚTupleÚUnion)Úatomic_helperÚdmiÚimporterÚ	lifecycleÚnetÚperformanceÚ
type_utils)Ú	user_data)Úutil)Ú
write_json)ÚDistro)Ú
EventScopeÚ	EventType)Úlaunch_index)ÚPaths)ÚCloudInitPickleMixin)ÚeventsÚdisabledÚlocalr   ÚpassÚ
FILESYSTEMÚNETWORKÚ
DataSourcez|EXPERIMENTAL: The structure and format of content scoped under the 'ds' key may change in subsequent releases of cloud-init.zredacted for non-root userú
cloud-nameÚ_unsetÚunknownz	aws-chinac                 ó   — | dk(  S ©NÚaws© ©Úcs    ú</usr/lib/python3/dist-packages/cloudinit/sources/__init__.pyú<lambda>r-   F   s
   €  1¨¡:€ ó    zaws-govc                 ó   — | dk(  S r'   r)   r*   s    r,   r-   r-   G   s
   €  Q¨%¡Z€ r.   zazure-chinac                 ó   — | dk(  S )NÚazurer)   r*   s    r,   r-   r-   H   s
   €  q¨G¡|€ r.   )zcn-zus-gov-Úchinac                   ó0   — e Zd ZdZdZdZdZdZdZde	fd„Z
y	)
ÚNetworkConfigSourcezb
    Represents the canonical list of network config sources that cloud-init
    knows about.
    ÚcmdlineÚdsÚ
system_cfgÚfallbackÚ	initramfsÚreturnc                 ó   — | j                   S ©N©Úvalue©Úselfs    r,   Ú__str__zNetworkConfigSource.__str__Y   ó   € Ø�z‰zÐr.   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCMD_LINEÚDSÚ
SYSTEM_CFGÚFALLBACKÚ	INITRAMFSÚstrrA   r)   r.   r,   r4   r4   L   s.   „ ñð
 €HØ	€BØ€JØ€HØ€Ið˜ô r.   r4   c                   ó$   — e Zd ZdZdZdZdefd„Zy)ÚNicOrderzRepresents ways to sort NICsÚmacÚnic_namer:   c                 ó   — | j                   S r<   r=   r?   s    r,   rA   zNicOrder.__str__c   rB   r.   N)rC   rD   rE   rF   ÚMACÚNIC_NAMErL   rA   r)   r.   r,   rN   rN   ]   s   „ Ù&à
€CØ€Hð˜ô r.   rN   c                   ó   — e Zd ZdZy)ÚDatasourceUnpickleUserDataErrorzERaised when userdata is unable to be unpickled due to python upgradesN©rC   rD   rE   rF   r)   r.   r,   rU   rU   g   s   „ ÚOr.   rU   c                   ó   — e Zd Zy)ÚDataSourceNotFoundExceptionN©rC   rD   rE   r)   r.   r,   rX   rX   k   ó   „ Ør.   rX   c                   ó   — e Zd ZdZy)ÚInvalidMetaDataExceptionz8Raised when metadata is broken, unavailable or disabled.NrV   r)   r.   r,   r\   r\   o   s   „ ÚBr.   r\   c                 óx  — t        j                  | «      }g }g }| j                  «       D ]ñ  \  }}|r	|dz   |z   }n|}|j                  «       |v s|j                  «       |v r|j	                  |«       t        |t        «      r7|j                  d«      r&|j	                  |«       |j                  dd«      ||<   t        |t        «      sŒ t        |||«      }	|j                  |	j                  d«      «       |j                  |	j                  d«      «       |	||<   Œó t        |«      |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.
    ú/zci-b64:Ú Úbase64_encoded_keysÚsensitive_keys)ÚcopyÚdeepcopyÚitemsÚlowerÚappendÚ
isinstancerL   Ú
startswithÚreplaceÚdictÚprocess_instance_metadataÚextendÚpopÚsorted)
ÚmetadataÚkey_pathra   Úmd_copyr`   Ú	sens_keysÚkeyÚvalÚsub_key_pathÚ
return_vals
             r,   rk   rk   s   s/  € ô �m‰m˜HÓ%€GØÐØ€IØ—N‘NÓ$ò &‰ˆˆSÙØ# c™>¨CÑ/‰LàˆLà�I‰I‹K˜>Ñ)Ø×!Ñ!Ó# ~Ñ5à×Ñ˜\Ô*Ü�cœ3Ô C§N¡N°9Ô$=Ø×&Ñ& |Ô4ØŸ;™; y°"Ó5ˆG�C‰LÜ�cœ4Õ Ü2Ø�\ >óˆJð  ×&Ñ& z§~¡~Ð6KÓ'LÔMØ×Ñ˜ZŸ^™^Ð,<Ó=Ô>Ø%ˆG�CŠLð'&ô( &,Ð,?Ó%@€GÐ!Ñ"Ü & yÓ 1€GÐÑØ€Nr.   c                 ó  — | j                  dg «      s| S t        j                  | «      }| j                  d«      D ]M  }|j                  d«      }|}|D ])  }||v sŒt	        ||   t
        «      sŒ||d   k7  sŒ%||   }Œ+ |v sŒI|||<   ŒO |S )z�Redact any sensitive keys from to provided metadata dictionary.

    Replace any keys values listed in 'sensitive_keys' with redact_value.
    ra   r^   éÿÿÿÿ)Úgetrb   rc   Úsplitrg   rj   )ro   Úredact_valuerq   rp   Ú
path_partsÚobjÚpaths          r,   Úredact_sensitive_keysr   –   s¤   € ð �<‰<Ð(¨"Ô-ØˆÜ�m‰m˜HÓ%€GØ—L‘LÐ!1Ó2ò %ˆØ—^‘^ CÓ(ˆ
ØˆØò 	 ˆDà˜’Ü˜s 4™y¬$Õ/Ø˜J r™NÓ*à˜$‘i‘ð	 ð �3Š;Ø$ˆC�ŠIð%ð €Nr.   c                   ó6   — e Zd ZU eed<   eed<   eed<   eed<   y)Ú	URLParamsÚmax_wait_secondsÚtimeout_secondsÚnum_retriesÚsec_between_retriesN)rC   rD   rE   ÚintÚ__annotations__r)   r.   r,   r�   r�   ³   s   … ØÓØÓØÓØÔr.   r�   c                   ó(   — e Zd ZU ee   ed<   eed<   y)ÚDataSourceHostnameÚhostnameÚ
is_defaultN)rC   rD   rE   r	   rL   r‡   Úboolr)   r.   r,   r‰   r‰   º   s   … Ø�s‰mÓØÔr.   r‰   c                   ó0   — e Zd ZU dZeed<   eed<   eed<   y)ÚHotplugRetrySettingsz
in secondsÚforce_retryÚsleep_periodÚsleep_totalN)rC   rD   rE   rF   rŒ   r‡   r†   r)   r.   r,   rŽ   rŽ   ¿   s   … ÙàÓØÓØÔr.   rŽ   c            	       óà  — e Zd ZU eZdZdZdZee	   e
d<   dZdZdZeeee	f      e
d<   ej"                  ej$                  ej&                  ej(                  fZeedf   e
d<   dZd	Zd
ZdZej8                  ej<                  ej>                  ej@                  ejB                  hiZ"ej8                  ej<                  hiZ#de$fde$fdi fddddddf	Z%eee	e&f   df   e
d<   dZ'dZ(ee	df   e
d<   dZ) e*ddd«      Z+dZ,ee	   e
d<   dZ-dOde.de/fd„Z0de1ddfd „Z2d!„ Z3de4fd"„Z5de4fd#„Z6d$„ Z7d%„ Z8dPd&„Z9 e:jv                  d'd(¬)«      de4fd*„«       Z<dQd+„Z=de4fd,„Z>d-„ Z?dRd.„Z@d/„ ZAd0„ ZBeCd1„ «       ZDeCd2„ «       ZEd3„ ZFeCd4„ «       ZGd5„ ZHeCd6„ «       ZId7„ ZJd8„ ZKd9„ ZLd:„ ZMd;„ ZNd<„ ZOd=„ ZPd>„ ZQd?„ ZRd@„ ZSeCdA„ «       ZTeCdB„ «       ZUdC„ ZVdSdD„ZWdE„ ZXdFeYe   fdG„ZZdFeYe   de4fdH„Z[dI„ Z\dJ„ Z]e^dTdK„«       Z_eCdL„ «       Z`dM„ ZadN„ Zby)Ur"   zen_US.UTF-8Ú_undefNÚ_cloud_nameÚ_crawled_metadata.Únetwork_config_sourcesrx   é
   é   é   Úec2_metadataÚnetwork_jsonro   )ÚuserdataN)Úuserdata_rawN)Ú
vendordataN)Úvendordata_rawN)Úvendordata2N)Úvendordata2_rawNÚcached_attr_defaultsF)
Úcombined_cloud_configÚ
merged_cfgÚmerged_system_cfgzsecurity-credentialsrœ   ú	user-datar   rž   úvendor-datazds/vendor_dataÚsensitive_metadata_keysr   Úextra_hotplug_udev_rulesÚdistroÚpathsc                 ó°  — || _         || _        || _        d | _        i | _        d | _        d | _        d | _        d | _        d | _	        d | _
        t        | _        t        | _        t        j                  | j                   d| j                   fi «      | _        | j"                  si | _        |s%t%        j&                  | j                  «      | _        y || _        y )NÚ
datasource)Úsys_cfgrª   r«   rœ   ro   r�   rž   r    rŸ   r¡   Úmetadata_addressÚUNSETr›   rš   r   Úget_cfg_by_pathÚdsnameÚds_cfgÚudÚUserDataProcessorÚud_proc)r@   r®   rª   r«   r¶   s        r,   Ú__init__zDataSource.__init__O  sº   € ØˆŒØˆŒØˆŒ
Ø'+ˆŒØ ˆŒØ9=ˆÔØˆŒØˆÔØ"ˆÔØ#ˆÔØ/3ˆÔÜ+0ˆÔÜ!ˆÔä×*Ñ*Ø�L‰L˜<¨¯©Ð5°ró
ˆŒð �{Š{ØˆDŒKáÜ×/Ñ/°·
±
Ó;ˆD�Là"ˆD�Lr.   Úci_pkl_versionr:   c                 ó¢  — dddt         ddt         dddt        ddd«      dœ}|j                  «       D ]  \  }}t        | |«      rŒt	        | ||«       Œ! t        | d«      st	        | dd„ «       t        | d«      r$| j
                  �	 t        | j
                  «       yyy# t        $ r&}t        j                  d|«       t        «       |‚d}~ww xY w)	z(Perform deserialization fixes for Paths.NFr   )r•   Ú_platform_typeÚ_subplatformrš   r©   r¯   r›   Úskip_hotplug_detectr    r¡   Úhotplug_retry_settingsÚcheck_if_fallback_is_allowedc                   ó   — y©NFr)   r)   r.   r,   r-   z&DataSource._unpickle.<locals>.<lambda>}  ó   � r.   rœ   z:Unable to unpickle datasource: %s. Ignoring current cache.)r°   rŽ   rd   ÚhasattrÚsetattrrœ   rL   ÚAttributeErrorÚLOGÚdebugrU   )r@   r¸   Úexpected_attrsrs   r>   Úes         r,   Ú	_unpicklezDataSource._unpicklei  sã   € ð "&Ø"Ø Ü!Ø(,Ø $Ü!Ø#(ØØ#Ü&:¸5À!ÀQÓ&Gñ
ˆð )×.Ñ.Ó0ò 	*‰JˆC�Ü˜4 Õ%Ü˜˜c 5Õ)ð	*ô �tÐ;Ô<Ü�DÐ8¹-ÔHÜ�4˜Ô$¨¯©Ð)Bð?Ü�D—M‘MÕ"ð *CÐ$øô "ò ?Ü—	‘	ð/àôô
 6Ó7¸QÐ>ûð?ús   ÂB Â	CÂ(!C	Ã	Cc                 ó,   — t        j                  | «      S r<   )r   Úobj_namer?   s    r,   rA   zDataSource.__str__Ž  s   € Ü×"Ñ" 4Ó(Ð(r.   c                  ó   — y)z#Check if running on this datasourceTr)   r?   s    r,   Ú	ds_detectzDataSource.ds_detect‘  ó   € àr.   c                 ó  — | j                   j                  «       t        «       j                  «       k(  rt        j	                  d| «       y| j
                  j                  dg «      | j                   gk(  rt        j	                  d| «       yy)aJ  Override if either:
        - only a single datasource defined (nothing to fall back to)
        - command line argument is used (ci.ds=OpenStack)

        Note: get_cmdline() is required for the general case - when ds-identify
        does not run, _something_ needs to detect the kernel command line
        definition.
        z6Kernel command line set to use a single datasource %s.TÚdatasource_listz2Datasource list set to use a single datasource %s.F)r²   re   Úparse_cmdlinerÅ   rÆ   r®   ry   r?   s    r,   Úoverride_ds_detectzDataSource.override_ds_detect•  st   € ð �;‰;×ÑÓ¤-£/×"7Ñ"7Ó"9Ò9Ü�I‰IØHØôð Ø�\‰\×ÑÐ/°Ó4¸¿¹¸ÒEÜ�I‰IØDÀdôð Ør.   c                 óÜ   — | j                  «       r| j                  «       S | j                  «       r&t        j	                  d| «       | j                  «       S t        j	                  d| «       y)z&Overrides runtime datasource detectionzDetected %szDid not detect %sF)rÒ   Ú	_get_datarÍ   rÅ   rÆ   r?   s    r,   Ú_check_and_get_datazDataSource._check_and_get_data«  sX   € à×"Ñ"Ô$Ø—>‘>Ó#Ð#Ø�^‰^ÔÜ�I‰IØØôð —>‘>Ó#Ð#ä�I‰IÐ)¨4Ô0Ør.   c                 ó  — | j                  «       j                  }| j                  «       }| j                  }|d   }di ddg“d|“d|“dt	        | j
                  | j                  | j                  «      “d| j
                  “d	| j
                  “d
|d   d   “d|d   d   “d|d   d   “d| j                  “d| j                  «       “d|d   “d|“d|“d|d   d   “d|“d|“|d   d   | j                  | j                  |d   |d   dœ¥iS )z2Return a dictionary of standardized metadata keys.Úsys_infoÚv1Ú
_beta_keysÚsubplatformúavailability-zoneÚavailability_zoneÚcloud_idr#   Ú
cloud_namerª   Údistr   Údistro_versionr™   Údistro_releaseé   ÚplatformÚpublic_ssh_keysÚpython_versionÚpythonúinstance-idÚinstance_idÚkernel_releaseÚunameúlocal-hostnameÚlocal_hostnameé   Úvariant)ÚmachineÚregionrÚ   Úsystem_platformrî   )
Úget_hostnamerŠ   Úget_instance_idrÜ   Úcanonical_cloud_idrÞ   rð   Úplatform_typeÚget_public_ssh_keysrÚ   )r@   Úinstance_datarì   rè   rÜ   Úsysinfos         r,   Ú_get_standardized_metadataz%DataSource._get_standardized_metadata¹  sª  € à×*Ñ*Ó,×5Ñ5ˆØ×*Ñ*Ó,ˆØ ×2Ñ2Ðð   
Ñ+ˆàð Ø˜}˜oðà#Ð%6ðð $Ð%6ðð Ô.Ø—O‘O T§[¡[°$×2DÑ2Dóð	ð ˜dŸo™oðð ˜dŸo™oðð ˜' &™/¨!Ñ,ðð ! '¨&¡/°!Ñ"4ðð ! '¨&¡/°!Ñ"4ðð ˜D×.Ñ.ðð " 4×#;Ñ#;Ó#=ðð ! '¨(Ñ"3ðð ˜{ðð  ˜{ð!ð" ! '¨'Ñ"2°1Ñ"5ð#ð$ ! .ð%ð& ! .ð'ð( # 7Ñ+¨AÑ.ØŸ+™+Ø#×/Ñ/Ø#*¨:Ñ#6Ø" 9Ñ-ò1ð
ð 	
r.   c                 óœ   — | j                   sy|r|}n| j                  }|D ]  \  }}t        | |«      sŒt        | ||«       Œ! |sd| _         yy)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_cacher¢   rÂ   rÃ   )r@   Úattr_defaultsÚattr_valuesÚ	attributer>   s        r,   Úclear_cached_attrszDataSource.clear_cached_attrsß  s_   € ð × Ò ØÙØ'‰Kà×3Ñ3ˆKà +ò 	0ÑˆI�uÜ�t˜YÕ'Ü˜˜i¨Õ/ð	0ñ Ø %ˆDÕð r.   zGetting metadataÚalways)Úlog_modec                 ó\   — d| _         | j                  «       }|s|S | j                  «        |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@   Úreturn_values     r,   Úget_datazDataSource.get_dataò  s7   € ð !ˆÔØ×/Ñ/Ó1ˆñ ØÐØ×"Ñ"Ô$ØÐr.   c                 óô  — |rXt         j                  j                  | j                  j                  «      r%t        | | j                  j                  d«      «       | j                  �Ht        j                  | j                  «      }|j                  dd«       |j                  dd«       d|i}nZdd| j                  ii}| j                  t        k7  r| j                  |d   d<   | j                  t        k7  r| j                  |d   d<   t        |d   d	<   t        j                  | j                   «      |d
<   d|d
   d	<   t        j                  |d
   «      |d<   d|d   d	<   t#        j$                  «       |d<   |j'                  | j)                  |«      «       	 t+        j,                  |«      }t/        t1        j2                  |«      | j4                  ¬«      }| j                  jA                  d«      }|d   jC                  dd«      }t         j                  jE                  | j                  jF                  d«      }	t#        jH                  |	› d|› �|› d�«       d}
|	› d|› �}t         j                  jK                  |	«      rt         j                  jM                  |	«      }
t#        jN                  ||	d¬«       |
r|
|k7  rt#        jP                  |
«       tS        ||d¬«       | j                  jA                  d«      }tS        |tU        |«      «       y# t6        $ r)}t8        j;                  dt=        |«      «       Y d}~yd}~wt>        $ r)}t8        j;                  dt=        |«      «       Y d}~yd}~ww xY w)aP  Process 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.
        Úobj_pklNr¦   r§   r6   Ú	meta_datar›   rš   Ú_docr¤   z<DEPRECATED: Use merged_system_cfg. Will be dropped from 24.1r¥   zUMerged cloud-init system config from /etc/cloud/cloud.cfg and /etc/cloud/cloud.cfg.d/r×   )ra   z'Error persisting instance-data.json: %sFÚinstance_data_sensitiverØ   rÝ   Únonezcloud-idú-ú
T)Úforcei€  )Úmoder÷   )+Úosr~   Úlexistsr«   Úinstance_linkÚ	pkl_storeÚget_ipath_curr•   rb   rc   rm   ro   r›   r°   rš   ÚEXPERIMENTAL_TEXTr®   r   Úsystem_infoÚupdaterù   r   Ú
json_dumpsrk   ÚjsonÚloadsr¨   Ú	TypeErrorrÅ   ÚwarningrL   ÚUnicodeDecodeErrorÚget_runpathry   ÚjoinÚrun_dirÚ
write_fileÚexistsÚrealpathÚsym_linkÚdel_filer   r   )r@   Úwrite_cacheÚcrawled_metadatar÷   ÚcontentÚprocessed_datarÈ   Újson_sensitive_filerÝ   Úcloud_id_fileÚprev_cloud_id_fileÚnew_cloud_id_fileÚ	json_files                r,   r  z DataSource.persist_instance_data  s   € ñ œ2Ÿ7™7Ÿ?™?¨4¯:©:×+CÑ+CÔDÜ�d˜DŸJ™J×4Ñ4°YÓ?Ô@Ø×!Ñ!Ð-ô  $Ÿ}™}¨T×-CÑ-CÓDÐØ× Ñ  ¨dÔ3Ø× Ñ  °Ô5Ø!Ð#3Ð4‰Mà! K°·±Ð#?Ð@ˆMØ× Ñ ¤EÒ)Ø6:×6GÑ6G�˜dÑ# NÑ3Ø× Ñ ¤EÒ)Ø6:×6GÑ6G�˜dÑ# NÑ3Ü&7ˆ�dÑ˜FÑ#ä&*§m¡m°D·L±LÓ&Aˆ�lÑ#ð Kð 	�lÑ#Øñ	
ô .2¯]©]Ø˜,Ñ'ó.
ˆÐ)Ñ*ð'ð 	Ð)Ñ*¨6Ñ2ô %)×$4Ñ$4Ó$6ˆ�jÑ!Ø×Ñ˜T×<Ñ<¸]ÓKÔLð	ä#×.Ñ.¨}Ó=ˆGä6Ü—
‘
˜7Ó#Ø#×;Ñ;ôˆNð #Ÿj™j×4Ñ4Ð5NÓOÐØ  Ñ&×*Ñ*¨:°vÓ>ˆÜŸ™Ÿ™ T§Z¡Z×%7Ñ%7¸ÓDˆÜ�‰˜=˜/¨¨8¨*Ð5¸(¸À2°ÔGà!ÐØ,˜o¨Q¨x¨jÐ9Ðä�7‰7�>‰>˜-Ô(Ü!#§¡×!1Ñ!1°-Ó!@Ðä�‰Ð'¨¸dÕCÙÐ"4Ð8IÒ"IÜ�M‰MÐ,Ô-ÜÐ&¨¸UÕCØ—J‘J×*Ñ*¨?Ó;ˆ	ä�9Ô3°NÓCÔDØøô1 ò 	Ü�K‰KÐAÄ3ÀqÃ6ÔJÜûÜ!ò 	Ü�K‰KÐAÄ3ÀqÃ6ÔJÜûð	ús$   Æ?L Ì	M7ÌMÍM7ÍM2Í2M7c                 ó   — t        d«      ‚)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.)ÚNotImplementedErrorr?   s    r,   rÔ   zDataSource._get_dataQ  s   € ä!ðDó
ð 	
r.   c           	      óR  — | j                   }	 t        | j                  j                  d| j                   «      «      }| j                  }	 t        dt        | j                  j                  d| j                  «      «      «      }| j                  }	 t        | j                  j                  d| j                  «      «      }| j                  }	 t        | j                  j                  d| j                  «      «      }t        ||||«      S # t        $ r9 t        j                  t        d| j                  j                  d«      |«       Y �Œw xY w# t        $ rE | j                  }t        j                  t        d| j                  j                  d«      |«       Y �Œw xY w# t        $ r9 t        j                  t        d| j                  j                  d«      |«       Y �Œ!w xY w# t        $ r9 t        j                  t        d	| j                  j                  d«      |«       Y �Œ*w xY w)
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_waitr†   r³   ry   Ú
ValueErrorr   ÚlogexcrÅ   Úurl_timeoutÚmaxÚurl_retriesÚ	ExceptionÚurl_sec_between_retriesr�   )r@   r2  r3  r4  r…   s        r,   Úget_url_paramszDataSource.get_url_paramsX  sÍ  € ð ×$Ñ$ˆð	Ü˜4Ÿ;™;Ÿ?™?¨:°t×7HÑ7HÓIÓJˆHð ×"Ñ"ˆð		Ü˜!œS §¡§¡°¸D×<LÑ<LÓ!MÓNÓOˆGð ×"Ñ"ˆð	Ü˜$Ÿ+™+Ÿ/™/¨)°T×5EÑ5EÓFÓGˆGð #×:Ñ:Ðð	Ü"%Ø—‘—‘Ø)¨4×+GÑ+Góó#Ðô ˜ 7¨GÐ5HÓIÐIøô_ ò 	Ü�K‰KÜØHØ—‘—‘ 
Ó+Ø÷	ð	ûô ò 	Ø×&Ñ&ˆGÜ�K‰KÜØGØ—‘—‘ 	Ó*Ø÷	ð	ûô ò 	Ü�K‰KÜØGØ—‘—‘ 	Ó*Ø÷	ð	ûô ò 	Ü�K‰KÜð&à—‘—‘Ð 5Ó6Ø#÷ð	úsH   Ž/D	 Á
9E Â/F Ã/G$ Ä	>EÅ
EÅA
FÆFÆ>G!Ç G!Ç$>H&È%H&c                 óÈ   — | j                   €.| j                  j                  | j                  «       «      | _         |r| j	                  | j                   «      S | j                   S r<   )rœ   r¶   ÚprocessÚget_userdata_rawÚ_filter_xdata)r@   Úapply_filters     r,   Úget_userdatazDataSource.get_userdata”  sM   € Ø�=‰=Ð Ø ŸL™L×0Ñ0°×1FÑ1FÓ1HÓIˆDŒMÙØ×%Ñ% d§m¡mÓ4Ð4Ø�}‰}Ðr.   c                 óŽ   — | j                   €.| j                  j                  | j                  «       «      | _         | j                   S r<   )rž   r¶   r?  Úget_vendordata_rawr?   s    r,   Úget_vendordatazDataSource.get_vendordata›  s5   € Ø�?‰?Ð"Ø"Ÿl™l×2Ñ2°4×3JÑ3JÓ3LÓMˆDŒOØ�‰Ðr.   c                 óŽ   — | j                   €.| j                  j                  | j                  «       «      | _         | j                   S r<   )r    r¶   r?  Úget_vendordata2_rawr?   s    r,   Úget_vendordata2zDataSource.get_vendordata2   s:   € Ø×ÑÐ#Ø#Ÿ|™|×3Ñ3°D×4LÑ4LÓ4NÓOˆDÔØ×ÑÐr.   c                 óp   — | j                   s| j                  j                  «       | _         | j                   S r<   )rº   r²   re   r?   s    r,   rõ   zDataSource.platform_type¥  s,   € à×"Ò"Ø"&§+¡+×"3Ñ"3Ó"5ˆDÔØ×"Ñ"Ð"r.   c                 ó\   — | j                   s| j                  «       | _         | j                   S )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)
        )r»   Ú_get_subplatformr?   s    r,   rÚ   zDataSource.subplatform«  s*   € ð × Ò Ø $× 5Ñ 5Ó 7ˆDÔØ× Ñ Ð r.   c                 óF   — | j                   rd| j                   › d�S t        S )z?Subclasses should implement to return a "slug (detail)" string.z
metadata (ú))r¯   ÚMETADATA_UNKNOWNr?   s    r,   rL  zDataSource._get_subplatform»  s'   € à× Ò Ø × 5Ñ 5Ð6°aÐ8Ð8ÜÐr.   c                 ó,  — | j                   r| j                   S | j                  rÂ| j                  j                  t        «      r£| j                  j                  t        «      }t	        |t
        «      r!|j                  «       | _         | j                   S | j                  «       j                  «       | _         t        j                  dt        t        |«      «       | j                   S | j                  «       j                  «       | _         | j                   S )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)r”   ro   ry   ÚMETADATA_CLOUD_NAME_KEYrg   rL   re   Ú_get_cloud_namerÅ   rÆ   Útype)r@   rÞ   s     r,   rÞ   zDataSource.cloud_nameÁ  sÜ   € ð ×ÒØ×#Ñ#Ð#Ø�=Š=˜TŸ]™]×.Ñ.Ô/FÔGØŸ™×*Ñ*Ô+BÓCˆJÜ˜*¤cÔ*Ø#-×#3Ñ#3Ó#5�Ô ð ×ÑÐð $(×#7Ñ#7Ó#9×#?Ñ#?Ó#A�Ô Ü—	‘	ØKÜ+Ü˜Ó$ôð ×ÑÐð  $×3Ñ3Ó5×;Ñ;Ó=ˆDÔØ×ÑÐr.   c                 ó   — | j                   S )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.
        )r²   r?   s    r,   rR  zDataSource._get_cloud_nameÙ  s   € ð �{‰{Ðr.   c                 óX   — | j                   sy d| j                   v r| j                   d   S y )Nzlaunch-index)ro   r?   s    r,   r   zDataSource.launch_indexá  s*   € à�}Š}ØØ˜TŸ]™]Ñ*Ø—=‘= Ñ0Ð0Ør.   c                 ó    — t        j                  t        j                  | j                   «      «      g}|}|D ]  }|j	                  |«      }Œ |S r<   )r   ÚFilterr   Úsafe_intÚapply)r@   Úprocessed_udÚfiltersÚnew_udÚfs        r,   rA  zDataSource._filter_xdataé  sN   € ä×Ñ¤§¡¨d×.?Ñ.?Ó @ÓAð
ˆð ˆØò 	%ˆAØ—W‘W˜V“_‰Fð	%àˆr.   c                 ó   — | j                   S r<   )r�   r?   s    r,   r@  zDataSource.get_userdata_rawò  s   € Ø× Ñ Ð r.   c                 ó   — | j                   S r<   )rŸ   r?   s    r,   rE  zDataSource.get_vendordata_rawõ  s   € Ø×"Ñ"Ð"r.   c                 ó   — | j                   S r<   )r¡   r?   s    r,   rH  zDataSource.get_vendordata2_rawø  s   € Ø×#Ñ#Ð#r.   c                 ó   — i S r<   r)   r?   s    r,   Úget_config_objzDataSource.get_config_objþ  s   € Øˆ	r.   c                 óJ   — t        | j                  j                  d«      «      S )Nzpublic-keys)Únormalize_pubkey_dataro   ry   r?   s    r,   rö   zDataSource.get_public_ssh_keys  s   € Ü$ T§]¡]×%6Ñ%6°}Ó%EÓFÐFr.   c                  ó   — y)a5  Publish 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@   Úhostkeyss     r,   Úpublish_host_keyszDataSource.publish_host_keys  rÁ   r.   c                 óÞ   — ddi}|j                  «       D ]V  \  }}|j                  |«      sŒ|D ]:  }d|›|t        |«      d  ›�}t        j                  j                  |«      sŒ6|c c S  ŒX y )NÚsd)ÚvdÚxvdÚvtbz/dev/)rd   rh   Úlenr  r~   r"  )r@   Ú
short_nameÚmappingsÚnfromÚtlistÚntoÚcands          r,   Ú_remap_devicezDataSource._remap_device  sx   € ð Ð.Ð/ˆØ$ŸN™NÓ,ò 	 ‰LˆE�5Ø×(Ñ(¨Ô/ØØò  ‘Ù&)¨:´c¸%³j°lÑ+CÐD�Ü—7‘7—>‘> $Õ'Ø”Kñ ð	 ð r.   c                  ó   — y r<   r)   )r@   Ú_names     r,   Údevice_name_to_devicez DataSource.device_name_to_device  s   € ð r.   c                 ót   — | j                   }	 | j                  j                  «       }|S # t        $ r Y |S w xY w)z<Default locale is en_US.UTF-8, but allow distros to override)Údefault_localerª   Ú
get_localer0  )r@   Úlocales     r,   rz  zDataSource.get_locale%  sD   € à×$Ñ$ˆð	Ø—[‘[×+Ñ+Ó-ˆFð ˆøô #ò 	ØØˆð	ús   Ž* ª	7¶7c                 óÊ   — | j                   j                  d| j                   j                  d«      «      }|r|S | j                   j                  di «      j                  d«      S )NrÛ   rÜ   Ú	placement©ro   ry   )r@   Útop_level_azs     r,   rÜ   zDataSource.availability_zone.  sY   € à—}‘}×(Ñ(Ø §¡×!2Ñ!2Ð3FÓ!Gó
ˆñ ØÐØ�}‰}× Ñ  ¨bÓ1×5Ñ5Ð6IÓJÐJr.   c                 ó8   — | j                   j                  d«      S )Nrð   r~  r?   s    r,   rð   zDataSource.region7  s   € à�}‰}× Ñ  Ó*Ð*r.   c                 óh   — | j                   rd| j                   vryt        | j                   d   «      S )Nrç   ziid-datasource)ro   rL   r?   s    r,   ró   zDataSource.get_instance_id;  s+   € Ø�}Š} °T·]±]Ñ Bà#Ü�4—=‘= Ñ/Ó0Ð0r.   c                 óN  — d}d}|}d}| j                   r| j                   j                  d«      s®|rt        d|«      S g }t        j                  «       }	|	dk(  rd}t        j
                  |	«      }
|
r/|
j                  d«      dkD  rt        |
«      j                  d«      }n¿|	r/|	j                  d«      dkD  rt        |	«      j                  d«      }nŽ|	r|	|g}n‡||g}n‚| j                   d   }t        j                  |«      rMg }|rt        j                  |«      }|rt        |«      j                  d«      }n(d	|j                  dd
«      z  g}n|j                  d«      }t        |«      dkD  r|d   }	dj                  |dd «      }n|d   }	|r||k7  r|	›d|›�}	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.
        ÚlocaldomainÚ	localhostFrë   NTú.r   zip-%sr  r™   )ro   ry   r‰   r   rò   Úget_fqdn_from_hostsÚfindrL   rz   r   Úis_ipv4_addressÚgethostbyaddrri   rm  r  )r@   ÚfqdnÚ
resolve_ipÚmetadata_onlyÚ	defdomainÚdefhostÚdomainr‹   ÚtoksrŠ   Ú
hosts_fqdnÚlhosts               r,   rò   zDataSource.get_hostnameA  sœ  € ð& "ˆ	ØˆØˆØˆ
à�}Š} D§M¡M×$5Ñ$5Ð6FÔ$GÙÜ)¨$°
Ó;Ð;ð
 ˆDÜ×(Ñ(Ó*ˆHØ˜;Ò&à!�
Ü×1Ñ1°(Ó;ˆJÙ˜jŸo™o¨cÓ2°QÒ6Ü˜:“×,Ñ,¨SÓ1‘Ù˜hŸm™m¨CÓ0°1Ò4Ü˜8“}×*Ñ*¨3Ó/‘ÙØ  )Ð,‘à Ð+‘ð —M‘MÐ"2Ñ3ˆEÜ×"Ñ" 5Ô)Ø�ÙÜ×-Ñ-¨eÓ4�DáÜ˜t›9Ÿ?™?¨3Ó/‘Dà# e§m¡m°C¸Ó&=Ñ=Ð>‘Dà—{‘{ 3Ó'�äˆt‹9�qŠ=Ø˜A‘wˆHØ—X‘X˜d 1 2˜hÓ'‰Fà˜A‘wˆHá�F˜iÒ'Ú"*©FÐ3ˆHä! (¨JÓ7Ð7r.   c                 ó:   — | j                   j                  | ¬«      S )N)Údata_source)rª   Úget_package_mirror_infor?   s    r,   r•  z"DataSource.get_package_mirror_info‰  s   € Ø�{‰{×2Ñ2¸tÐ2ÓDÐDr.   Úsource_event_typesc                 óÊ   — i }|D ][  }| j                   j                  «       D ]<  \  }}||v sŒ|j                  |«      st        «       ||<   ||   j	                  |«       Œ> Œ] |S r<   )Úsupported_update_eventsrd   ry   ÚsetÚadd)r@   r–  Úsupported_eventsÚeventÚupdate_scopeÚupdate_eventss         r,   Úget_supported_eventszDataSource.get_supported_eventsŒ  s~   € Ø24ÐØ'ò 	>ˆEð ×-Ñ-×3Ñ3Ó5ò>ñ ØØà˜MÒ)Ø+×/Ñ/°Ô=Ü9<»Ð(¨Ñ6Ø$ \Ñ2×6Ñ6°uÕ=ñ>ð	>ð  Ðr.   c                 óö  — | j                  |«      }|j                  «       D ]h  \  }}t        j                  d|j                  dj                  |D �cg c]  }|j                  ‘Œ c}«      «       | j                  d|z  t        ff«       Œj |r#| j                  «        | j                  «       }|ryt        j                  d| dj                  |D �cg c]  }|j                  ‘Œ c}«      «       yc c}w c c}w )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ú, z
_%s_configTz(Datasource %s not updated for events: %sF)	rŸ  rd   rÅ   rÆ   r>   r  rÿ   r°   r  )r@   r–  r›  ÚscopeÚmatched_eventsrœ  Úresults          r,   Úupdate_metadata_if_supportedz'DataSource.update_metadata_if_supported™  sä   € ð  ×4Ñ4Ð5GÓHÐØ%5×%;Ñ%;Ó%=ò 		FÑ!ˆE�>Ü�I‰IØLØ—‘Ø—	‘	°NÖC¨5˜5Ÿ;›;ÒCÓDôð ×#Ñ# l°UÑ&:¼EÐ%BÐ$DÕEð		Fñ Ø×#Ñ#Ô%Ø—]‘]“_ˆFÙØÜ�	‰	Ø6ØØ�I‰IÐ0BÖC u�u—{“{ÒCÓDô	
ð
 ùò! Dùò Ds   ÁC1ÃC6c                  ó   — yrÀ   r)   )r@   r®   s     r,   Úcheck_instance_idzDataSource.check_instance_id¿  s   € àr.   c                  ó   — y)a  check_if_fallback_is_allowed()
        Checks if a cached ds is allowed to be restored when no valid ds is
        found in local mode by checking instance-id and searching valid data
        through ds list.

        @return True if a ds allows fallback, False otherwise.
        Fr)   r?   s    r,   r¾   z'DataSource.check_if_fallback_is_allowedÃ  s   € ð r.   c                 ó~   — |€t         }|€t        }| D ]'  }|€Œ||v r|c S t        j                  d||«       |c S  |S )Nz%invalid dsmode '%s', using default=%s)ÚDSMODE_NETWORKÚVALID_DSMODESrÅ   r  )Ú
candidatesÚdefaultÚvalidÚ	candidates       r,   Ú_determine_dsmodezDataSource._determine_dsmodeÍ  s_   € ð ˆ?Ü$ˆGàˆ=Ü!ˆEà#ò 		ˆIØÐ ØØ˜EÑ!Ø Ò ä—‘Ø;¸YÈôð ’ð		ð ˆr.   c                  ó   — y r<   r)   r?   s    r,   Únetwork_configzDataSource.network_configã  rÎ   r.   c                  ó   — y)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_instances     r,   ÚsetupzDataSource.setupç  s   € ð 	r.   c                  ó   — y)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@   Úcfgr´  s      r,   ÚactivatezDataSource.activateò  s   € ð 	r.   r<   )r)   ©T)F)FFF)NN)crC   rD   rE   rª  Údsmodery  r²   r”   r	   rL   r‡   rº   r»   r•   r   r   r4   rG   rK   rI   rH   r–   r
   r5  r8  r:  r<  r   r!   r   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚHOTPLUGr˜  Údefault_update_eventsr°   r¢   r   rû   r¨   r¼   rŽ   r½   r©   Ú_ci_pkl_versionr   r   r·   r†   rÉ   rA   rŒ   rÍ   rÒ   rÕ   rù   rÿ   r   Útimedr  r  rÔ   r=  rC  rF  rI  Úpropertyrõ   rÚ   rL  rÞ   rR  r   rA  r@  rE  rH  rb  rö   rg  rt  rw  rz  rÜ   rð   ró   rò   r•  r   rŸ  r¥  r§  r¾   Ústaticmethodr°  r²  rµ  r¸  r)   r.   r,   r"   r"   Ç   sn  … à€FØ"€Nð €Fð "&€K�˜#‘Ó%ð €Nð
 €Là48Ð�x  d¨C iÑ 0Ñ1Ó8ð 	×$Ñ$Ø×%Ñ%Ø×&Ñ&Ø×Ñð	?Ð˜EÐ"5°sÐ":Ñ;ó ð €LØ€KØ€KØÐð@ 	×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!Ø×Ñð	
ðÐð 	×ÑØ×'Ñ'ð
ðÐð 
˜ÐØ	˜ÐØ	�RÐØØØØ ØØ!ð
9Ð˜%  c¨3 h¡°Ð 4Ñ5ó 
ð €Lð0Ð˜U 3¨ 8™_ó ð"  Ðñ 2°%¸¸AÓ>Ðð /3Ð˜h s™mÓ2à€Oñ#¨ð #°uó #ð4#?¨ð #?°ó #?òJ)ð˜4ó ð Dó ò,ò$
óL&ð& €[×ÑÐ)°HÔ=ð˜$ò ó >ðó$JðX
˜4ó 
ò:Jóxòò
 ð
 ñ#ó ð#ð
 ñ!ó ð!ò ð ñ ó ð ò.ð ñó ðòò!ò#ò$òòGòòò òð ñKó ðKð ñ+ó ð+ò1óF8òPEð °t¸I±ó  ð$Ø"& y¡/ð$à	ó$òLòð òó ðð* ñó ðò	ór.   )Ú	metaclassc                 ón  — g }| s|S t        | t        «      r| j                  «       S t        | t        t        f«      rt        | «      S t        | t
        «      r]| j                  «       D ]J  \  }}t        |t        «      r|g}t        |t        t        f«      sŒ0|D ]  }|sŒ|j                  |«       Œ ŒL |S r<   )rg   rL   Ú
splitlinesÚlistr™  rj   rd   rf   )Úpubkey_dataÚkeysÚ_keynameÚklistÚpkeys        r,   rd  rd    s¯   € Ø€DáØˆä�+œsÔ#Ø×%Ñ%Ó'Ð'ä�+¤¤c˜{Ô+Ü�KÓ Ð ä�+¤Ô&Ø*×0Ñ0Ó2ò 	*‰OˆH�eô ˜%¤Ô%Ø˜�Ü˜%¤$¬ Õ-Ø!ò *�Dò ØŸ™ DÕ)ñ	*ð	*ð €Kr.   r:   c           	      óì  — t        |||«      }|D �cg c]  }t        j                  |«      ‘Œ }	}t        |v rdnd}
t        j                  d|
|	«       t        |	|«      D ]¹  \  }}t        j                  d|j                  dd«      z  d|
›d|›�d	|
›d
|›�|¬«      }	 |5  t        j                  d|«        || ||«      }|j                  t        j                  g«      r/d|
›d|›�|_        |t        j                  |«      fcd d d «       c S 	 d d d «       Œ» ddj#                  |	«      z  }t%        |«      ‚c c}w # 1 sw Y   Œ/xY w# t        $ r t        j                   t        d|«       Y �Œw xY w)NÚnetworkr   z#Searching for %s data source in: %sz	search-%sr"   r_   zsearching for z data from zno z data found from )ÚnameÚdescriptionÚmessageÚparentz%Seeing if we can get any data from %szfound zGetting data from %s failedz4Did not find any data source, searched classes: (%s)r¡  )Úlist_sourcesr   rË   ÚDEP_NETWORKrÅ   rÆ   Úzipr   ÚReportEventStackri   r¥  r   r»  rÑ  r;  r   r7  r  rX   )r®   rª   r«   Úds_depsÚcfg_listÚpkg_listÚreporterÚds_listr]  Úds_namesr  rÏ  ÚclsÚmyrepÚsÚmsgs                   r,   Úfind_sourcerá    sz  € ô ˜8 W¨hÓ7€GØ07Ö8¨1”
×#Ñ# AÕ&Ð8€HÐ8Ü# wÑ.‰9°G€DÜ‡I�IÐ3°T¸8ÔDä˜ 7Ó+ò A‰	ˆˆcÜ×'Ñ'Ø˜tŸ|™|¨L¸"Ó=Ò=Ú;?ÁÑFÚ26¹Ð=Øô	
ˆð
	AØñ 9Ü—	‘	ÐAÀ3ÔGÙ˜ ¨Ó/�Ø×1Ñ1Ü×0Ñ0Ð1õò @DÁTÐ$J�E”MØœz×2Ñ2°3Ó7Ð8÷9ó 9ð÷9øðAð& AÀ4Ç9Á9ØóDñ €Cô & cÓ
*Ð*ùò5 9÷9ð 9ûô ò 	AÜ�K‰KœÐ:¸C×@ð	Aús6   ’D:ÂEÂ A$D?Ä	EÄEÄ?E	ÅEÅ$E3Å2E3c                 ób  — g }t         j                  d| ||«       | D ]�  }t        j                  |«      }t        j                  ||dg«      \  }}|st         j                  d|«       |D ]@  }t        j                  |«      }	t        |	d«      }
 |
|«      }|sŒ/|j                  |«        Œ� Œ‘ |S )zèReturn a list of classes that have the same depends as 'depends'
    iterate through cfg_list, loading "DataSource*" modules
    and calling their "get_datasource_list".
    Return an ordered list of classes that match (if any)
    zLLooking for data source in: %s, via packages %s that matches dependencies %sÚget_datasource_listzDCould not import %s. Does the DataSource exist and is it importable?)	rÅ   rÆ   r   Ú"match_case_insensitive_module_nameÚfind_moduleÚerrorÚimport_moduleÚgetattrrl   )rØ  ÚdependsrÙ  Úsrc_listr6   Úds_nameÚm_locsÚ_looked_locsÚm_locÚmodÚlisterÚmatchess               r,   rÓ  rÓ  ?  sÍ   € ð €HÜ‡I�Ið	8àØØôð ò ˆÜ×=Ñ=¸bÓAˆÜ'×3Ñ3Ø�XÐ 5Ð6ó 
Ñˆ�ñ Ü�I‰Ið$àôð
 ò 	ˆEÜ×(Ñ(¨Ó/ˆCÜ˜SÐ"7Ó8ˆFÙ˜W“oˆGÚØ—‘ Ô(Ùñ	ðð$ €Or.   Úfieldc                 óz   — | syt        j                  |«      }|sy| j                  «       |j                  «       k(  S rÀ   )r   Úread_dmi_datare   )rè   rò  Ú	dmi_values      r,   Úinstance_id_matches_system_uuidrö  c  s;   € ñ
 Øä×!Ñ! %Ó(€IÙØØ×ÑÓ )§/¡/Ó"3Ñ3Ð3r.   c                 óæ   — | st         } |st         }|t         k(  r| t         k7  r| S |S t        j                  «       D ](  \  }}|\  }}|j                  |«      sŒ || «      sŒ&|c S  | t         k7  r| S |S )z@Lookup the canonical cloud-id for a given cloud_name and region.)rO  ÚCLOUD_ID_REGION_PREFIX_MAPrd   rh   )rÞ   rð   rã   ÚprefixÚcloud_id_testrÝ   Úvalid_clouds          r,   rô   rô   q  s†   € áÜ%ˆ
ÙÜ!ˆØÔ!Ò!ØÔ)Ò)ØÐØˆÜ!;×!AÑ!AÓ!Cò Ñˆ�Ø"/Ñˆ�;Ø×Ñ˜VÕ$©°ZÕ)@ØŠOðð Ô%Ò%ØÐØ€Or.   c                 ó  — | syt        | t        «      r| S t        | t        «      rt        j                  | «      S t        | t
        «      r+|du rt        | j                  d«      d¬«      S t        d«      ‚t        dt        | «      z  «      ‚)aL  data: 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)
rg   rL   rÇ  rb   rc   rj   Úconvert_vendordatary   r6  rS  )Údatarý  s     r,   rþ  rþ  „  sz   € ñ ØÜ�$œÔØˆÜ�$œÔÜ�}‰}˜TÓ"Ð"Ü�$œÔØ�d‰?Ü% d§h¡h¨|Ó&<ÀeÔLÐLÜÐBÓCÐCÜ
Ð;¼dÀ4»jÑHÓ
IÐIr.   c                   ó   — e Zd Zy)ÚBrokenMetadataNrY   r)   r.   r,   r  r  œ  rZ   r.   r  c                 ót   — g }t        | «      }|D ]%  \  }}|t        |«      k(  sŒ|j                  |«       Œ' |S r<   )r™  rf   )ré  rÛ  Úret_listÚdepsetrÝ  Údepss         r,   Úlist_from_dependsr  §  sB   € Ø€HÜ�‹\€FØò !‰	ˆˆTØ”S˜“YÓØ�O‰O˜CÕ ð!ð €Or.   r}   Úfnamec                 ó  — 	 t        j                  | «      }	 t        j                  ||dd¬«       y# t        $ r t        j                  t
        d| «       Y yw xY w# t        $ r t        j                  t
        d|«       Y yw xY w)z[Use pickle to serialize Datasource to a file as a cache.

    :return: True on success
    zFailed pickling datasource %sFÚwbé   )Úomoder  z Failed pickling datasource to %sT)ÚpickleÚdumpsr;  r   r7  rÅ   r!  )r}   r  Úpk_contentss      r,   r  r  °  sz   € ð
Ü—l‘l 3Ó'ˆðÜ�‰˜˜{°$¸UÕCð øô ò Ü�‰”CÐ8¸#Ô>Ùðûô
 ò Ü�‰”CÐ;¸UÔCÙðús    ‚2 ˜A ²$AÁAÁ$BÂBc                 ód  — d}	 t        j                  | «      }|sy	 t        j                  |«      S # t        $ r@}t        j                  j                  | «      rt        j                  d| |«       Y d}~Œ]d}~ww xY w# t        $ r Y yt        $ r t        j                  t        d| «       Y yw xY w)zBUse pickle to deserialize a instance Datasource from a cache file.Nzfailed loading pickle in %s: %sz#Failed loading pickled blob from %s)r   Úload_binary_filer;  r  r~   ÚisfilerÅ   r  r  r  rU   r7  )r  Úpickle_contentsrÈ   s      r,   Úpkl_loadr  Â  sž   € à€OðEÜ×/Ñ/°Ó6ˆñ ØðÜ�|‰|˜OÓ,Ð,øô ò EÜ�7‰7�>‰>˜%Ô Ü�K‰KÐ9¸5À!ÔDÿøðEûô +ò ÙÜò Ü�‰”CÐ>ÀÔFÙðús+   „2 �A> ²	A;»6A6Á6A;Á>	B/Â	#B/Â.B/c                  ó<   — t        t        j                  «       «      S )z…Check if command line argument for this datasource was passed
    Passing by command line overrides runtime datasource detection
    )Úparse_cmdline_or_dmir   Úget_cmdliner)   r.   r,   rÑ   rÑ   ×  s   € ô  ¤× 0Ñ 0Ó 2Ó3Ð3r.   Úinputc                 óv  — t        j                  d| «      }t        j                  d| «      }t        j                  d| «      }|xs |xs |}|xs |}|rA|j                  d«      j                  «       }t	        j
                  d|› d|› �dd|› d	�¬
«       |r"|j                  d«      r|j                  d«      S y)Nz(?:^|\s)ds=([^\s;]+)z(?:^|\s)ci\.ds=([^\s;]+)z (?:^|\s)ci\.datasource=([^\s;]+)r™   z8Defining the datasource on the command line using ci.ds=z or ci.datasource=z23.2zUse ds=z instead)Ú
deprecatedÚdeprecated_versionÚextra_messager_   )ÚreÚsearchÚgroupÚstripr   Ú	deprecate)r  Ú
ds_parse_0Ú
ds_parse_1Ú
ds_parse_2r6   r  r²   s          r,   r  r  Þ  sÂ   € Ü—‘Ð2°EÓ:€JÜ—‘Ð6¸Ó>€JÜ—‘Ð>ÀÓF€JØ	Ò	/�zÒ	/ Z€BØÒ)˜z€JÙØ×!Ñ! !Ó$×*Ñ*Ó,ˆÜ×ÑðØ˜ð !!Ø!' ð*ð  &Ø# F 8¨8Ð4õ	
ñ 
ˆb�h‰h�qŒkØ�x‰x˜‹{ÐØr.   )r_   r)   )zsystem-uuidr¹  )YÚabcrb   r  Úloggingr  r  r  Úenumr   r   Útypingr   r   r   r   r	   r
   r   Ú	cloudinitr   r   r   r   r   r   r   r   r´   r   Úcloudinit.atomic_helperr   Úcloudinit.distrosr   Úcloudinit.eventr   r   Úcloudinit.filtersr   Úcloudinit.helpersr   Úcloudinit.persistencer   Úcloudinit.reportingr   ÚDSMODE_DISABLEDÚDSMODE_LOCALrª  ÚDSMODE_PASSr«  ÚDEP_FILESYSTEMrÔ  Ú	DS_PREFIXr  ÚREDACT_SENSITIVE_VALUErQ  r°   rO  Ú	getLoggerrC   rÅ   rø  r4   rN   r;  rU   rX   r\   rk   r   r�   r‰   rŽ   ÚABCMetar"   rd  rL   rá  rÓ  rŒ   rö  rô   rþ  ÚIOErrorr  r  r  r  rÑ   r  r)   r.   r,   ú<module>r9     s"  ðó Û Û Û Û 	Û Û 	ß ß F× FÑ F÷÷ ñ õ &Ý Ý .Ý $ß 1Ý *Ý #Ý 6Ý &à€Ø€Ø€Ø€à  ,°Ð?€à€Ø€Ø€	ð<ð ð 6Ð ð 'Ð à€ØÐ à€g×Ñ˜Ó!€ð
 Ñ-Ð.ØÑ/Ð0ØÑ3Ð4ñÐ ð ô˜$ó ó ðô ˆtô ôP iô Pô	 )ô 	ôC˜yô Có ðF 2Hó ô:�
ô ô˜ô ô
˜:ô ôwÐ%°·±õ wòtð:+à
ˆ:�sˆ?Ñó+òB!ðJ ,ñ4Øð4à	ó4òó&Jô0	�Wô 	òð�:ð  cð ¨dó ð$�Cð ˜H ZÑ0ó ð*4�só 4ð ð ¨ô r.   