+
    i                        ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
HtHtHtHtHtHtHtHt ^ RIHtHtHtHtHtHtHtHtHt ^ RIHt ^ RIH t  ^ RI!H"t"H#t# ^ RI$H%t% ^ R	I&H't' ^ R
I(H)t) ^ RI*H+t+ Rt,Rt-Rt.Rt/],]-]..t0Rt1Rt2Rt3Rt4Rt5Rt6Rt7Rt8]Pr                  ! ]:4      t;RRR 3RRR 3RRR  3/t<]	 ! R! R"]4      4       t= ! R# R$]4      t> ! R% R&]?4      t@ ! R' R(]?4      tA ! R) R*]?4      tBRHR+ ltC]53R, ltD ! R- R.]4      tE ! R/ R0]4      tF ! R1 R2]4      tG ! R3 R])] P                  R47      tIR5 tJR6 R7 ltKR8 tLRIR9 R: lltMR; tNRJR< ltO ! R= R>]P4      tQR? tRR@ RA ltSRB RC ltTRD RE ltURF RG ltVR# )K    N)Enumunique)AnyDictList
NamedTupleOptionalTupleUnioncast)	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cn-z	aws-chinac                     V R 8H  # aws cs   &</usr/lib/python3/dist-packages/cloudinit/sources/__init__.py<lambda>r.   F   s    1:    zus-gov-zaws-govc                     V R 8H  # r(   r*   r+   s   &r-   r.   r.   G   s    Q%Zr/   chinazazure-chinac                     V R 8H  # )azurer*   r+   s   &r-   r.   r.   H   s    qG|r/   c                   J   a  ] tR t^Lt o RtRtRtRtRtRt	V 3R lR lt
R	tV tR
# )NetworkConfigSourcezV
Represents the canonical list of network config sources that cloud-init
knows about.
cmdlineds
system_cfgfallback	initramfsc                    < V ^8  d   QhRS[ /#    returnstr)format__classdict__s   "r-   __annotate__ NetworkConfigSource.__annotate__Y          r/   c                    V P                   # Nvalueselfs   &r-   __str__NetworkConfigSource.__str__Y       zzr/   r*   N)__name__
__module____qualname____firstlineno____doc__CMD_LINEDS
SYSTEM_CFGFALLBACK	INITRAMFSrL   __static_attributes____classdictcell__rB   s   @r-   r5   r5   L   s/     
 H	BJHI r/   r5   c                   >   a  ] tR t^]t o RtRtRtV 3R lR ltRtV t	R# )NicOrderzRepresents ways to sort NICsmacnic_namec                    < V ^8  d   QhRS[ /# r<   r?   )rA   rB   s   "r-   rC   NicOrder.__annotate__c   rE   r/   c                    V P                   # rG   rH   rJ   s   &r-   rL   NicOrder.__str__c   rN   r/   r*   N)
rO   rP   rQ   rR   rS   MACNIC_NAMErL   rY   rZ   r[   s   @r-   r]   r]   ]   s     &
CH r/   r]   c                       ] tR t^gtRtRtR# )DatasourceUnpickleUserDataErrorzERaised when userdata is unable to be unpickled due to python upgradesr*   NrO   rP   rQ   rR   rS   rY   r*   r/   r-   rg   rg   g   s    Or/   rg   c                       ] tR t^ktRtR# )DataSourceNotFoundExceptionr*   NrO   rP   rQ   rR   rY   r*   r/   r-   rj   rj   k       r/   rj   c                       ] tR t^otRtRtR# )InvalidMetaDataExceptionz8Raised when metadata is broken, unavailable or disabled.r*   Nrh   r*   r/   r-   rn   rn   o   s    Br/   rn   c                   \         P                  ! V 4      p. p. pV P                  4        EF  w  rgV'       d   VR,           V,           pMTpVP                  4       V9   g   VP                  4       V9   d   VP	                  V4       \        V\        4      '       d=   VP                  R4      '       d&   VP	                  V4       VP                  RR4      W6&   \        V\        4      '       g   K  \        WxV4      p	VP                  V	P                  R4      4       VP                  V	P                  R4      4       WV&   EK  	  \        V4      VR&   \        V4      VR&   V# )zProcess 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
isinstancer@   
startswithreplacedictprocess_instance_metadataextendpopsorted)
metadatakey_pathrs   md_copyrr   	sens_keyskeyvalsub_key_path
return_vals
   &&&       r-   r}   r}   s   s+    mmH%GINN$#c>C/LLIIK>)!!#~5\*c3CNN9$=$=&&|4;;y"5GLc4  2>J  &&z~~6K'LMZ^^,<=>%CL' %( &,,?%@G!" &y 1GNr/   c                b   V P                  R. 4      '       g   V # \        P                  ! V 4      pV P                  R4       Fi  pVP                  R4      pTpV F@  pWe9   g   K  \	        WV,          \
        4      '       g   K)  WdR,          8w  g   K8  WV,          pKB  	  XV9   g   Ke  WV&   Kk  	  V# )zRedact any sensitive keys from to provided metadata dictionary.

Replace any keys values listed in 'sensitive_keys' with redact_value.
rs   rp   )getrt   ru   splitry   r|   )r   redact_valuer   r   
path_partsobjpaths   &&     r-   redact_sensitive_keysr      s     <<("--mmH%GLL!12^^C(
Dsy$//rN*i  3;$I 3 Nr/   c                   ,   a  ] tR t^t o V 3R ltRtV tR# )	URLParamsc                J   < V ^8  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[ ;R&   # )r=   max_wait_secondstimeout_secondsnum_retriessec_between_retriesint)rA   rB   s   "r-   rC   URLParams.__annotate__   s5          	 r/   r*   NrO   rP   rQ   rR   __annotate_func__rY   rZ   r[   s   @r-   r   r            r/   r   c                   ,   a  ] tR t^t o V 3R ltRtV tR# )DataSourceHostnamec                B   < V ^8  d   Qh/ S[ S[,          ;R&   S[;R&   # )r=   hostname
is_default)r	   r@   bool)rA   rB   s   "r-   rC   DataSourceHostname.__annotate__   s     sm  r/   r*   Nr   r[   s   @r-   r   r      r   r/   r   c                   0   a  ] tR t^t o RtV 3R ltRtV tR# )HotplugRetrySettingsz
in secondsc                >   < V ^8  d   Qh/ S[ ;R&   S[;R&   S[;R&   # )r=   force_retrysleep_periodsleep_total)r   r   )rA   rB   s   "r-   rC   !HotplugRetrySettings.__annotate__   s,        	 
  r/   r*   N)rO   rP   rQ   rR   rS   r   rY   rZ   r[   s   @r-   r   r      s       r/   r   c            	         a  ] tR t^t o ]tRtRtRtRt	Rt
Rt]P                  ]P                  ]P                  ]P                   3tRBt^
t^t^t]P.                  ]P2                  ]P4                  ]P6                  ]P8                  0/t]P.                  ]P2                  0/tR]3R]3R/ 3RCRDRERFRGRH3	t Rt!RIt"Rt#]$! R^ ^ 4      t%Rt&^t'RJV 3R lR	 llt(V 3R
 lR lt)R t*V 3R lR lt+V 3R lR lt,R t-R t.RKR lt/]0Pb                  ! RRR7      V 3R lR l4       t2RLR lt3V 3R lR lt4R t5RMR lt6R t7R t8]9R  4       t:]9R! 4       t;R" t<]9R# 4       t=R$ t>]9R% 4       t?R& t@R' tAR( tBR) tCR* tDR+ tER, tFR- tGR. tHR/ tI]9R0 4       tJ]9R1 4       tKR2 tLRNR3 ltMR4 tNV 3R5 lR6 ltOV 3R7 lR8 ltPR9 tQR: tR]SROR; l4       tT]9R< 4       tUR= tVR> tWR? tXV 3R@ ltYRAtZV t[R# )Pr#   zen_US.UTF-8_undefNec2_metadatanetwork_jsonr   Fc                &   < V ^8  d   QhRS[ RS[/# )r=   distropaths)r   r   )rA   rB   s   "r-   rC   DataSource.__annotate__O  s     # # #u #r/   c                   Wn         W n        W0n        R V n        / V n        R V n        R V n        R V n        R V n        R V n	        R V n
        \        V n        \        V n        \        P                  ! V P                   RV P                   3/ 4      V n        V P"                  '       g   / V n        V'       g(   \$        P&                  ! V P                  4      V n        R # W@n        R # )N
datasource)sys_cfgr   r   userdatar   userdata_raw
vendordatavendordata2vendordata_rawvendordata2_rawmetadata_addressUNSETr   r   r   get_cfg_by_pathdsnameds_cfgr   UserDataProcessorud_proc)rK   r   r   r   r   s   &&&&&r-   __init__DataSource.__init__O  s    
'+ 9="#/3+0!**LL<5r
 {{{DK$66tzzBDL"Lr/   c                $   < V ^8  d   QhRS[ RR/# )r=   ci_pkl_versionr>   Nr   )rA   rB   s   "r-   rC   r   i  s     #? #? #? #?r/   c                   RRRRRRR\         RRRRR\         R	R
RRRRR\        R
^ ^ 4      /pVP                  4        F$  w  r4\        W4      '       d   K  \	        WV4       K&  	  \        V R4      '       g   \	        V RR 4       \        V R4      '       d)   V P
                  e    \        V P
                  4       R# R# R#   \         d'   p\        P                  RT4       \        4       ThRp?ii ; i)z(Perform deserialization fixes for Paths._crawled_metadataN_platform_type_subplatformr   extra_hotplug_udev_rulesr   r   skip_hotplug_detectFr   r   hotplug_retry_settingscheck_if_fallback_is_allowedc                      R # Fr*   r*   r/   r-   r.   &DataSource._unpickle.<locals>.<lambda>}  s    %r/   r   z:Unable to unpickle datasource: %s. Ignoring current cache.)r   r   rv   hasattrsetattrr   r@   AttributeErrorLOGdebugrg   )rK   r   expected_attrsr   rI   es   &&    r-   	_unpickleDataSource._unpicklei  s      dDE&E!54t$&:5!Q&G
 )..0JC4%%5) 1 t;<<D8-H4$$)B?DMM" *C$ " ?		/
 67Q>?s   %C   C1!C,,C1c                .    \         P                  ! V 4      # rG   )r   obj_namerJ   s   &r-   rL   DataSource.__str__  s    ""4((r/   c                    < V ^8  d   QhRS[ /# r<   r   )rA   rB   s   "r-   rC   r     s      4 r/   c                    R# )z#Check if running on this datasourceTr*   rJ   s   &r-   	ds_detectDataSource.ds_detect      r/   c                    < V ^8  d   QhRS[ /# r<   r   )rA   rB   s   "r-   rC   r     s      D r/   c                (   V P                   P                  4       \        4       P                  4       8X  d   \        P	                  RV 4       R# V P
                  P                  R. 4      V P                   .8X  d   \        P	                  RV 4       R# R# )a  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   rw   parse_cmdliner   r   r   r   rJ   s   &r-   override_ds_detectDataSource.override_ds_detect  st     ;;-/"7"7"99IIH \\/4EIIDd r/   c                    V P                  4       '       d   V P                  4       # V P                  4       '       d'   \        P	                  RV 4       V P                  4       # \        P	                  RV 4       R# )z&Overrides runtime datasource detectionzDetected %szDid not detect %sF)r   	_get_datar   r   r   rJ   s   &r-   _check_and_get_dataDataSource._check_and_get_data  s^    ""$$>>##^^II >>##II)40r/   c                   V P                  4       P                  pV P                  4       pV P                  pVR,          pR/ RR.bRVbRVbR\	        V P
                  V P                  V P                  4      bRV P
                  bR	V P
                  bR
VR,          ^ ,          bRVR,          ^,          bRVR,          ^,          bRV P                  bRV P                  4       bRVR,          bRVbRVbRVR,          ^,          bRVbRVbRVR,          ^,          RV P                  RV P                  RVR,          RVR,          /C/# )z2Return a dictionary of standardized metadata keys.sys_infov1
_beta_keyssubplatformavailability-zoneavailability_zonecloud_idr$   
cloud_namer   distdistro_versiondistro_releaseplatformpublic_ssh_keyspython_versionpythoninstance-idinstance_idkernel_releaseunamelocal-hostnamelocal_hostnamemachineregionsystem_platformvariant)
get_hostnamer   get_instance_idr   canonical_cloud_idr   r  platform_typeget_public_ssh_keysr   )rK   instance_datar  r  r   sysinfos   &&    r-   _get_standardized_metadata%DataSource._get_standardized_metadata  s   **,55**, 22  
+ }o#%6 $%6 .OOT[[$2D2D	 doo doo '&/!, !'&/!"4 !'&/!"4 D.. "4#;#;#= !'("3 {  {!" !''"21"5#$ !.%& !.'( 77+A.$++t//!7:#679-1
 	
r/   c                    V P                   '       g   R# V'       d   TpMV P                  pV F$  w  r4\        W4      '       g   K  \        WV4       K&  	  V'       g
   RV n         R# R# )zReset 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_cachecached_attr_defaultsr   r   )rK   attr_defaultsattr_values	attributerI   s   &&   r-   clear_cached_attrsDataSource.clear_cached_attrs  sZ        'K33K +It''/ !,  %D r/   zGetting metadataalways)log_modec                    < V ^8  d   QhRS[ /# r<   r   )rA   rB   s   "r-   rC   r     s      $ r/   c                h    RV n         V P                  4       pV'       g   V# V P                  4        V# )zDatasources 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)rK   return_values   & r-   get_dataDataSource.get_data  s7     !//1 ""$r/   c                   V'       d^   \         P                  P                  V P                  P                  4      '       d%   \        W P                  P                  R4      4       V P                  eX   \        \        \        P                  ! V P                  4      4      pVP                  RR4       VP                  RR4       RV/pMfRRV P                  //pV P                  \        8w  d   V P                  VR,          R&   V P                   \        8w  d   V P                   VR,          R&   \"        VR,          R	&   \        P                  ! V P$                  4      VR
&   RVR
,          R	&   \        P                  ! VR
,          4      VR&   RVR,          R	&   \&        P(                  ! 4       VR&   VP+                  V P-                  V4      4        \.        P0                  ! V4      p\3        \4        P6                  ! V4      V P8                  R7      pT P                  PE                  R4      pTR,          PG                  RR4      p\         P                  PI                  T P                  PJ                  R4      p	\&        PL                  ! T	 RT 2T R24       Rp
T	 RT 2p\         P                  PO                  T	4      '       d    \         P                  PQ                  T	4      p
\&        PR                  ! YRR7       T
'       d   Y8w  d   \&        PT                  ! T
4       \W        YuRR7       T P                  PE                  R4      p\W        T\Y        T4      4       R#   \:         d+   p\<        P?                  R\A        T4      4        Rp?R# Rp?i\B         d+   p\<        P?                  R\A        T4      4        Rp?R# Rp?ii ; i)a   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_pklN	user-datavendor-datar7   	meta_datar   r   _doc
merged_cfgz<DEPRECATED: Use merged_system_cfg. Will be dropped from 24.1merged_system_cfgzUMerged cloud-init system config from /etc/cloud/cloud.cfg and /etc/cloud/cloud.cfg.d/r   )rs   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   r   r|   rt   ru   r   r   r   r   r   EXPERIMENTAL_TEXTr   r   system_infoupdater  r   
json_dumpsr}   jsonloadssensitive_metadata_keys	TypeErrorr   warningr@   UnicodeDecodeErrorget_runpathr   joinrun_dir
write_fileexistsrealpathsym_linkdel_filer   r   )rK   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   DataSource.persist_instance_data  s	    277??4::+C+CDDdJJ44Y?@!!-  $dmmD$:$:;    d3  5!#34M!K#?@M  E)6:6G6Gd#N3  E)6:6G6Gd#N3&7dF#&*mmDLL&Al# K 	l#	
 .2]],'.
)*' 	)*62 %)$4$4$6j!T<<]KL	#..}=G6

7##;;N #jj445NO &**:v>TZZ%7%7D=/8*5(2G!,oQxj977>>-((!#!1!1-!@'dC"4"IMM,-&UCJJ**?;	93NCD1  	KKA3q6J! 	KKA3q6J	s+   AM% %O0NO"O#OOc                    < V ^8  d   QhRS[ /# r<   r   )rA   rB   s   "r-   rC   r   [  s     
 
4 
r/   c                    \        R4      h)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.)NotImplementedErrorrJ   s   &r-   r   DataSource._get_data[  s    !D
 	
r/   c           	     f   V P                   p \        V P                  P                  RV P                   4      4      pV P                  p \        ^ \        V P                  P                  RV P                  4      4      4      pV P                  p \        V P                  P                  RV P                  4      4      pV P                  p \        V P                  P                  RV P                  4      4      p\        WW44      #   \         d;    \
        P                  ! \        RT P                  P                  R4      T4        ELi ; i  \         dG    T P                  p\
        P                  ! \        RT P                  P                  R4      T4        ELi ; i  \         d;    \
        P                  ! \        RT P                  P                  R4      T4        EL(i ; i  \         d;    \
        P                  ! \        RT P                  P                  R4      T4        EL4i ; i)	zReturn 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'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   r   
ValueErrorr   logexcr   url_timeoutmaxurl_retries	Exceptionurl_sec_between_retriesr   )rK   rW  rX  rY  r   s   &    r-   get_url_paramsDataSource.get_url_paramsb  s    $$	4;;??:t7H7HIJH ""		!SD<L<L!MNOG ""	$++//)T5E5EFGG #::	"%)4+G+G# GII_  	KKH
+		  	&&GKKG	*		  	KKG	*		  	KK& 56#	sK   /D 
9E /F# /G+ AEEAF F #AG('G(+AH0/H0c                    V P                   f/   V P                  P                  V P                  4       4      V n         V'       d   V P	                  V P                   4      # V P                   # rG   )r   r   processget_userdata_raw_filter_xdata)rK   apply_filters   &&r-   get_userdataDataSource.get_userdata  sM    ==  LL001F1F1HIDM%%dmm44}}r/   c                    V P                   f/   V P                  P                  V P                  4       4      V n         V P                   # rG   )r   r   re  get_vendordata_rawrJ   s   &r-   get_vendordataDataSource.get_vendordata  s5    ??""ll2243J3J3LMDOr/   c                    V P                   f/   V P                  P                  V P                  4       4      V n         V P                   # rG   )r   r   re  get_vendordata2_rawrJ   s   &r-   get_vendordata2DataSource.get_vendordata2  s:    ##||33D4L4L4NODr/   c                |    V P                   '       g    V P                  P                  4       V n         V P                   # rG   )r   r   rw   rJ   s   &r-   r  DataSource.platform_type  s/    """"&++"3"3"5D"""r/   c                h    V P                   '       g   V P                  4       V n         V P                   # )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_subplatformrJ   s   &r-   r   DataSource.subplatform  s-         $ 5 5 7D   r/   c                R    V P                   '       d   RV P                    R2# \        # )z?Subclasses should implement to return a "slug (detail)" string.z
metadata ())r   METADATA_UNKNOWNrJ   s   &r-   rv  DataSource._get_subplatform  s*        5 56a88r/   c                ^   V P                   '       d   V P                   # V P                  '       d   V P                  P                  \        4      '       d   V P                  P                  \        4      p\	        V\
        4      '       d"   VP                  4       V n         V P                   # V P                  4       P                  4       V n         \        P                  R\        \        V4      4        V P                   # V P                  4       P                  4       V n         V P                   # )zReturn 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_namer   r   METADATA_CLOUD_NAME_KEYry   r@   rw   _get_cloud_namer   r   type)rK   r   s   & r-   r   DataSource.cloud_name  s     ###===T]]../FGG**+BCJ*c**#-#3#3#5   $(#7#7#9#?#?#A 		K+$   $335;;=Dr/   c                    V P                   # )zReturn 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   rJ   s   &r-   r  DataSource._get_cloud_name  s     {{r/   c                v    V P                   '       g   R # RV P                   9   d   V P                   R,          # R # )Nzlaunch-index)r   rJ   s   &r-   r   DataSource.launch_index  s,    }}}T]]*==00r/   c                    \         P                  ! \        P                  ! V P                   4      4      .pTpV F  pVP	                  V4      pK  	  V# rG   )r   Filterr   safe_intapply)rK   processed_udfiltersnew_udfs   &&   r-   rg  DataSource._filter_xdata  sI    d.?.? @A
 AWWV_F r/   c                    V P                   # rG   )r   rJ   s   &r-   rf  DataSource.get_userdata_raw  s       r/   c                    V P                   # rG   )r   rJ   s   &r-   rl  DataSource.get_vendordata_raw  s    """r/   c                    V P                   # rG   )r   rJ   s   &r-   rp  DataSource.get_vendordata2_raw  s    ###r/   c                    / # rG   r*   rJ   s   &r-   get_config_objDataSource.get_config_obj  s    	r/   c                J    \        V P                  P                  R 4      4      # )zpublic-keys)normalize_pubkey_datar   r   rJ   s   &r-   r  DataSource.get_public_ssh_keys  s    $T]]%6%6}%EFFr/   c                    R# )a  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*   )rK   hostkeyss   &&r-   publish_host_keysDataSource.publish_host_keys  s    r/   c                   R R/pVP                  4        Fg  w  r4VP                  V4      '       g   K  V FC  pRV: V\        V4      R : 2p\        P                  P                  V4      '       g   K?  Vu u # 	  Ki  	  R# )sdz/dev/N)vdxvdvtb)rv   rz   lenr1  r   rD  )rK   
short_namemappingsnfromtlistntocands   &&     r-   _remap_deviceDataSource._remap_device  sr     ./$NN,LE((//&):c%jl+CD77>>$''K  - r/   c                    R # rG   r*   )rK   _names   &&r-   device_name_to_device DataSource.device_name_to_device'  s     r/   c                x    V P                   p V P                  P                  4       pV#   \         d     T# i ; i)z<Default locale is en_US.UTF-8, but allow distros to override)default_localer   
get_localerT  )rK   locales   & r-   r  DataSource.get_locale/  sD    $$	[[++-F  # 		s   * 99c                    V P                   P                  R V P                   P                  R4      4      pV'       d   V# V P                   P                  R/ 4      P                  R 4      # )r   r   	placementr   r   )rK   top_level_azs   & r-   r   DataSource.availability_zone8  sY    }}((!2!23F!G
 }}  b1556IJJr/   c                8    V P                   P                  R 4      # )r  r  rJ   s   &r-   r  DataSource.regionA  s    }}  **r/   c                    V P                   '       d   R V P                   9  d   R# \        V P                   R ,          4      # )r   ziid-datasource)r   r@   rJ   s   &r-   r  DataSource.get_instance_idE  s-    }}}T]] B#4==/00r/   c                   RpRpTpRpV P                   '       d"   V P                   P                  R4      '       g   V'       d   \        RV4      # . p\        P                  ! 4       p	V	R8X  d   Rp\        P
                  ! V	4      p
V
'       d2   V
P                  R4      ^ 8  d   \        V
4      P                  R4      pMV	'       d2   V	P                  R4      ^ 8  d   \        V	4      P                  R4      pMV	'       d   W.pMWT.pMV P                   R,          p\        P                  ! V4      '       d_   . pV'       d   \        P                  ! V4      pV'       d   \        V4      P                  R4      pM,RVP                  RR	4      ,          .pMVP                  R4      p\        V4      ^8  d#   V^ ,          p	RP                  VR
,          4      pM	V^ ,          p	V'       d   Wd8w  d
   V	: RV: 2p	\        W4      # )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.zip-%sr-  :   NN)r   r   r   r   r
  get_fqdn_from_hostsfindr@   r   r   is_ipv4_addressgethostbyaddrr{   r  rA  )rK   fqdn
resolve_ipmetadata_only	defdomaindefhostdomainr   toksr   
hosts_fqdnlhosts   &&&&        r-   r
  DataSource.get_hostnameK  s   & "	
}}}DMM$5$56F$G$G)$
;;
 D((*H;&!
11(;Jjooc2Q6:,,S1hmmC0148}**3/ ,+ MM"23E""5))--e4Dt9??3/D#emmC&==>D{{3't9q=AwHXXd2h'FAwHF'"*F3H!(77r/   c                :    V P                   P                  V R 7      # ))data_source)r   get_package_mirror_inforJ   s   &r-   r  "DataSource.get_package_mirror_info  s    {{22t2DDr/   c                0   < V ^8  d   QhRS[ S[,          /# )r=   source_event_types)r   r   )rA   rB   s   "r-   rC   r     s        tI  r/   c                    / pV Fi  pV P                   P                  4        FH  w  ppW59   g   K  VP                  V4      '       g   \        4       W$&   W$,          P	                  V4       KJ  	  Kk  	  V# rG   )supported_update_eventsrv   r   setadd)rK   r  supported_eventseventupdate_scopeupdate_eventss   &&    r-   get_supported_eventsDataSource.get_supported_events  sq    24'E --335)+//==9<(6$266u=	 6	 (  r/   c                6   < V ^8  d   QhRS[ S[,          RS[/# )r=   r  r>   )r   r   r   )rA   rB   s   "r-   rC   r     s!     $ $"&y/$	$r/   c                    V P                  V4      pVP                  4        Fm  w  r4\        P                  RVP                  RP                  V Uu. uF  qUP                  NK  	  up4      4       V P                  RV,          \        334       Ko  	  V'       d+   V P                  4        V P                  4       pV'       d   R# \        P                  RT RP                  V Uu. uF  qUP                  NK  	  up4      4       R# u upi u upi )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  rv   r   r   rI   rA  r  r   r!  )rK   r  r  scopematched_eventsr  results   &&     r-   update_metadata_if_supported'DataSource.update_metadata_if_supported  s      445GH%5%;%;%=!EIIL		NCN5;;NCD ##lU&:E%B$DE &> ##%]]_F		6II0BC0Bu{{0BCD	

 ! D Ds   D%Dc                    R # r   r*   )rK   r   s   &&r-   check_instance_idDataSource.check_instance_id  s    r/   c                    R# )zcheck_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*   rJ   s   &r-   r   'DataSource.check_if_fallback_is_allowed  s     r/   c                    Vf   \         pVf   \        pV  F+  pVf   K	  W29   d   Vu # \        P                  RW14       Vu # 	  V# )Nz%invalid dsmode '%s', using default=%s)DSMODE_NETWORKVALID_DSMODESr   r>  )
candidatesdefaultvalid	candidates   &&& r-   _determine_dsmodeDataSource._determine_dsmode  sV     ?$G=!E#I !  ;Y  $ r/   c                    R # rG   r*   rJ   s   &r-   network_configDataSource.network_config  r   r/   c                    R# )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*   )rK   is_new_instances   &&r-   setupDataSource.setup  s     	r/   c                    R# )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*   )rK   cfgr  s   &&&r-   activateDataSource.activate  s     	r/   c                    R# )z
Called when the user issues 'cloud-init clean -c datasource'
command.
Individual data sources should implement their own cleanup handler.
Nr*   rJ   s   &r-   cleanDataSource.clean
  s     	r/   c                   < V ^8  d   Qh/ S[ S[,          ;R&   S[ S[S[S[3,          ,          ;R&   S[S[R3,          ;R&   S[S[S[S[3,          R3,          ;R&   S[S[R3,          ;R&   S[ S[,          ;R&   # )r=   r}  r   .network_config_sourcesr  r<  r   )r	   r@   r   r   r
   r5   r   )rA   rB   s   "r-   rC   r      s      #% (  dCi 018) 6 ""5s":; 7 p  c3h 45 
q P #38_ Q H 'sm2I r/   )r}  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   N)r   N)r   N)r   N)r   N)r   N)
combined_cloud_configr)  r*  zsecurity-credentialsr   r%  r   r   r&  zds/vendor_datarG   )r*   Tr   )FFF)NN)\rO   rP   rQ   rR   r  dsmoder  r   r}  r   r   r   r5   rT   rX   rV   rU   r  rZ  r]  r_  ra  r   r"   r   BOOT_NEW_INSTANCEBOOTBOOT_LEGACYHOTPLUGr  default_update_eventsr   r  r  r<  r   r   r   r   _ci_pkl_versionr   r   rL   r   r   r   r  r  r   timedr!  r  r   rb  ri  rm  rq  propertyr  r   rv  r   r  r   rg  rf  rl  rp  r  r  r  r  r  r  r   r  r  r
  r  r  r  r  r   staticmethodr  r  r  r  r  r   rY   rZ   r[   s   @r-   r#   r#      s    F"N F "&K N
 L48 	$$%%&&	? LKK@ 	''NN!!	
 	''
 
		R !
9 L0"   2%A> /3O# #4#? #?J)  ,$
L&& )H= >$Tl
 
:Jx
 
 # #
 ! !     .  !#$G  K K + +1F8PE   $ $L  *  	G  r/   )	metaclassc                    V '       g   . # \        V \        4      '       d   V P                  4       # \        V \        \        34      '       d   \        V 4      # \        V \
        4      '       dy   . pV P                  4        F`  w  r#\        V\        4      '       d   V.p\        V\        \        34      '       g   K<  V F  pV'       g   K  VP                  V4       K   	  Kb  	  V# . # rG   )ry   r@   
splitlineslistr  r|   rv   rx   )pubkey_datakeys_keynameklistpkeys   &    r-   r  r    s    	+s##%%''+c{++K  +&&*002OH %%%%$--!D tD)	 "  3 Ir/   c                F    V ^8  d   QhR\         \        \        3,          /# r<   )r
   r#   r@   )rA   s   "r-   rC   rC   0  s     + +
:s?+r/   c           	      J   \        WCV4      pV Uu. uF  p\        P                  ! V4      NK  	  p	p\        V9   d   R MRp
\        P                  RW4       \        W4       F  w  r\        P                  ! RVP                  RR4      ,          RV
: RV: 2RV
: R	V: 2VR
7      p T;_uu_ 4        \        P                  RV4       V! WV4      pVP                  \        P                  .4      '       d4   RV
: RV: 2Vn        V\        P                  ! V4      3uuRRR4       u #  RRR4       K  	  RRP#                  V	4      ,          p\%        V4      hu upi   + '       g   i     EK  ; i  \         d"    \        P                   ! \        RT4        EK?  i ; i)networkr   z#Searching for %s data source in: %sz	search-%sr#   rq   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 NzGetting data from %s failedz4Did not find any data source, searched classes: (%s)r  )list_sourcesr   r   DEP_NETWORKr   r   zipr   ReportEventStackr{   r  r   r  r"  r`  r   r\  rA  rj   )r   r   r   ds_depscfg_listpkg_listreporterds_listr  ds_namesr0  r   clsmyrepsmsgs   &&&&&&&         r-   find_sourcer2  0  sl    8h7G0781
##A&H8#w.9GDII3TD+	''t||L"==;?F26=	

	A		A3G/11001  @DT$JEMz22378   ,& A499D C &c
**5 9   	AKK:C@@	As<   E)
E63A,E!
E6-E6!E3,E63E66'F"!F"c                   . p\         P                  RV VV4       V  F  p\        P                  ! V4      p\        P                  ! WRR.4      w  rgV'       g   \         P                  RV4       V FI  p\        P                  ! V4      p	\        V	R4      p
V
! V4      pV'       g   K7  VP                  V4        K  	  K  	  V# )zReturn 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getattrr~   )r)  dependsr*  src_listr7   ds_namem_locs_looked_locsm_locmodlistermatchess   &&&         r-   r$  r$  Q  s     HII	8 ==bA'33 56 
 II$
 E((/CS"78FWoGw(  $ Or/   c                0    V ^8  d   QhR\         R\        /# )r=   fieldr>   )r@   r   )rA   s   "r-   rC   rC   u  s     4 44	4r/   c                     V '       g   R # \         P                  ! V4      pV'       g   R # V P                  4       VP                  4       8H  # r   )r   read_dmi_datarw   )r  rD  	dmi_values   && r-   instance_id_matches_system_uuidrH  u  s;    
 !!%(I)//"333r/   c                $   V '       g   \         p V'       g   \         pV\         8X  d   V \         8w  d   V # V# \        P                  4        F4  w  r4Vw  rVVP                  V4      '       g   K"  V! V 4      '       g   K2  Vu # 	  V \         8w  d   V # V# )z@Lookup the canonical cloud-id for a given cloud_name and region.)rz  CLOUD_ID_REGION_PREFIX_MAPrv   rz   )r   r  r   prefixcloud_id_testr   valid_clouds   &&&    r-   r  r    s    %
!!!))!;!A!A!C"/V$$Z)@)@O "D %%Or/   c                Z   V '       g   R# \        V \        4      '       d   V # \        V \        4      '       d   \        P                  ! V 4      # \        V \
        4      '       d.   VRJ d   \        V P                  R4      RR7      # \        R4      h\        R\        V 4      ,          4      h)a,  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)
ry   r@   r  rt   ru   r|   convert_vendordatar   r[  r  )datarO  s   &&r-   rP  rP    s     $$}}T""$d?%dhh|&<eLLBCC
;d4jH
IIr/   c                       ] tR tRtRtR# )BrokenMetadatai  r*   Nrk   r*   r/   r-   rS  rS    rl   r/   rS  c                 |    . p\        V 4      pV F(  w  rEV\        V4      8X  g   K  VP                  V4       K*  	  V# rG   )r  rx   )r:  r,  ret_listdepsetr.  depss   &&    r-   list_from_dependsrX    s;    H\F	SYOOC   Or/   c                <    V ^8  d   QhR\         R\        R\        /# )r=   r   fnamer>   )r#   r@   r   )rA   s   "r-   rC   rC     s!      : c d r/   c                     \         P                  ! V 4      p \        P                  ! YRRR7       R#   \         d!    \        P                  ! \
        RT 4        R# i ; i  \         d!    \        P                  ! \
        RT4        R# i ; i)zSUse pickle to serialize Datasource to a file as a cache.

:return: True on success
zFailed pickling datasource %sFwb   )omoder0  z Failed pickling datasource to %sT)pickledumpsr`  r   r\  r   rC  )r   rZ  pk_contentss   && r-   r4  r4    sx    
ll3'$UC   C8#>
  C;UCs    4 A" 'AA"'BBc                F    V ^8  d   QhR\         R\        \        ,          /# )r=   rZ  r>   )r@   r	   r#   )rA   s   "r-   rC   rC     s      C HZ0 r/   c                   Rp \         P                  ! V 4      pV'       g   R#  \        P                  ! V4      #   \         dF   p\        P                  P                  T 4      '       d   \        P                  RY4        Rp?LlRp?ii ; i  \         d     R# \         d!    \         P                  ! \        RT 4        R# i ; i)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`  r1  r   isfiler   r>  r_  r;  rg   r\  )rZ  pickle_contentsr   s   &  r-   pkl_loadrg    s    OE//6 ||O,,  E77>>%  KK95DE +  C>Fs2   ; B B;BBCC%CCc                $    V ^8  d   QhR\         /# r<   r?   )rA   s   "r-   rC   rC     s     4 4s 4r/   c                 >    \        \        P                  ! 4       4      # )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/   c                0    V ^8  d   QhR\         R\         /# )r=   inputr>   r?   )rA   s   "r-   rC   rC     s        r/   c                    \         P                  ! R V 4      p\         P                  ! RV 4      p\         P                  ! RV 4      pT;'       g    T;'       g    TpT;'       g    TpV'       dC   VP                  ^4      P                  4       p\        P
                  ! RV RV 2RRV R2R7       V'       d)   VP                  ^4      '       d   VP                  ^4      # R	# )
z(?:^|\s)ds=([^\s;]+)z(?:^|\s)ci\.ds=([^\s;]+)z (?:^|\s)ci\.datasource=([^\s;]+)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_messagerq   )researchgroupstripr   	deprecate)rm  
ds_parse_0
ds_parse_1
ds_parse_2r7   ro  r   s   &      r-   rj  rj    s    2E:J6>J>FJ		/	/z	/	/ZB))zJ!!!$**, !!!'*  &#F884	
 
bhhqkkxx{r/   )rq   r*   )zsystem-uuidr	  )Wabcrt   r:  loggingr1  r_  rr  enumr   r   typingr   r   r   r   r	   r
   r   r   	cloudinitr   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_PREFIXr6  REDACT_SENSITIVE_VALUEr~  r   rz  	getLoggerrO   r   rJ  r5   r]   r`  rg   rj   rn   r}   r   r   r   r   ABCMetar#   r  r2  r$  rH  r  rP  IOErrorrS  rX  r4  rg  r   rj  r*   r/   r-   <module>r     s       	  	  L L L
 
 
 / $ 1 * # 6 & ,?	<  6  '  !
 
K-.	/0m34  $   t Pi P	) 	Cy C F 2H :
  
: I% IX:+B!H4&J0	W 	$*4r/   