o
    x[h¦  ã                
   @   s¶  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 d dlmZ d dl	m
Z
 d dlmZ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mZmZmZmZm Z  d dl!m"Z"m#Z# d dl$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l0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= e >e?¡Z@dZAdZBdejCdeDde&de%deEf
dd„ZFG dd„ dƒZGdeHfdd„ZIdd œdeHdeDfd!d"„ZJdS )#é    N)Ú
namedtuple)Úsuppress)ÚPath)ÚAnyÚDictÚIterableÚListÚOptionalÚSetÚTupleÚUnion)Úatomic_helperÚcloudÚdistrosÚfeaturesÚhandlersÚhelpersÚimporterÚ	lifecycleÚnetÚsourcesÚ
type_utilsÚutil)ÚNetv1ÚNetv2)Ú
EventScopeÚ	EventTypeÚuserdata_to_events)ÚBootHookPartHandler)ÚCloudConfigPartHandler)ÚJinjaTemplatePartHandler)ÚShellScriptPartHandler)ÚShellScriptByFreqPartHandler)Úcmdline)Úevents)ÚCLOUD_CONFIGÚDEFAULT_RUN_DIRÚ
PER_ALWAYSÚPER_INSTANCEÚPER_ONCE)ÚNetworkConfigSourceÚNO_PREVIOUS_INSTANCE_IDzöAggregated cloud-config created by merging merged_system_cfg (/etc/cloud/cloud.cfg and /etc/cloud/cloud.cfg.d), metadata, vendordata and userdata. The combined_cloud_config represents the aggregated desired configuration acted upon by cloud-init.Ú
datasourceÚcfgÚevent_source_typeÚscopeÚreturnc                 C   s   | j }t| di ¡ƒ}t t |¡t |¡g¡}tj| j	 |t
ƒ ¡v rOt | j¡}|j|d v rOt d|tj| j d¡¡ | |¡sGt
ƒ ||< ||  tj¡ t d|¡ |g}dd„ |D ƒ}	|D ]}
|| |
g ¡v rvt d|
j|¡  d	S qat d
|	|¡ dS )aA  Determine if a particular EventType is enabled.

    For the `event_source_type` passed in, check whether this EventType
    is enabled in the `updates` section of the userdata. If `updates`
    is not enabled in userdata, check if defined as one of the
    `default_events` on the datasource. `scope` may be used to
    narrow the check to a particular `EventScope`.

    Note that on first boot, userdata may NOT be available yet. In this
    case, we only have the data source's `default_update_events`,
    so an event that should be enabled in userdata may be denied.
    ÚupdatesÚscopesz/Adding event: scope=%s EventType=%s found in %szhotplug.enabledzAllowed events: %sc                 S   s   g | ]}|j ‘qS © )Úvalue)Ú.0Úsr3   r3   ú2/usr/lib/python3/dist-packages/cloudinit/stages.pyÚ
<listcomp>v   s    z(update_event_enabled.<locals>.<listcomp>z$Event Allowed: scope=%s EventType=%sTz$Event Denied: scopes=%s EventType=%sF)Údefault_update_eventsr   Úgetr   ÚmergemanydictÚcopyÚdeepcopyr   ÚHOTPLUGÚsupported_update_eventsÚsetÚread_hotplug_enabled_fileÚpathsr4   ÚLOGÚdebugÚ	get_cpathÚadd)r,   r-   r.   r/   Údefault_eventsÚuser_eventsÚallowedÚhotplug_enabled_filer2   Úscope_valuesÚ	evt_scoper3   r3   r7   Úupdate_event_enabledB   sP   ÿ
ÿþÿ
	ÿ
ü

ýúÿrM   c                   @   s"  e Zd Zdhdeee  fdd„Zdd„ Zedd„ ƒZ	ed	d
„ ƒZ
dd„ Zedd„ ƒZdd„ Zdidd„Zdd„ Zedededefdd„ƒZdd„ Zdjdd„Zdd „ Zd!efd"d#„Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zdejfd,d-„Zd.d/„ Zdjd0d1„Z d2efd3d4„Z!d5d6„ Z"d7d8„ Z#d9d:„ Z$dkd<d=„Z%d>d?„ Z&d@dA„ Z'dBdC„ Z(dDdE„ Z)dFdG„ Z*dHdI„ Z+dJdK„ Z,dLdM„ Z-djdee.j/ fdNdO„Z0dPdQ„ Z1dRdS„ Z2	djdTdU„Z3e4fdVdW„Z5e4fdXdY„Z6e4fdZd[„Z7de8e9e:df fd\d]„Z;de<e8e9e:df e8e=ef f fd^d_„Z>d`da„ Z?dbdc„ Z@deAfddde„ZBdfdg„ ZCdS )lÚInitNÚds_depsc                 C   sd   |d ur|| _ ntjtjg| _ i | _d | _d | _d | _d| _d | _	|d u r-t
jdddd�}|| _d S )NFzinit-reporterz	init-desc)ÚnameÚdescriptionÚreporting_enabled)rO   r   ÚDEP_FILESYSTEMÚDEP_NETWORKÚ_cfgÚ_pathsÚ_distror,   Úds_restoredÚ_previous_iidr$   ÚReportEventStackÚreporter)ÚselfrO   r[   r3   r3   r7   Ú__init__ˆ   s    ý
zInit.__init__c                 C   s   i | _ d | _d | _d S ©N)rU   rV   rW   ©r\   r3   r3   r7   Ú_resetž   s   
zInit._resetc                 C   sf   | j s0|  d¡}| dd¡}t |¡}t d|¡ |||| jƒ| _ | jd ur0| j | j_	| j
| j_| j S )NÚsystemÚdistroÚubuntuzUsing distro class %s)rW   Ú_extract_cfgÚpopr   ÚfetchrC   rD   rB   r,   rb   r-   Úsys_cfg)r\   Úsystem_configÚdistro_nameÚ
distro_clsr3   r3   r7   rb   ¤   s   




zInit.distroc                 C   s
   |   d¡S )NÚ
restricted)rd   r_   r3   r3   r7   r-   µ   s   
zInit.cfgc                 C   s`   |   ¡  t | j¡}|dkr| dd ¡ |S |dkr#t |di ¡}|S |dkr.t |di ¡}|S )Nrk   Úsystem_infora   )rl   rB   )rl   rB   )Úread_cfgr<   r=   rU   re   r   Úget_cfg_by_path)r\   ÚrestrictionÚocfgr3   r3   r7   rd   ¹   s   üþzInit._extract_cfgc                 C   s&   | j s|  d¡}t || j¡| _ | j S )NrB   )rV   rd   r   ÚPathsr,   )r\   Ú	path_infor3   r3   r7   rB   Æ   s   
z
Init.pathsc                 C   s¦   | j j}| j j}|tj |d¡tj |dd¡tj |dd¡tj |dd¡tj |dd¡tj |d¡tj |d¡tj |d¡tj |d	¡tj |d
¡tj |d	¡g}|S )NÚscriptszper-instancezper-oncezper-bootÚvendorÚseedÚ	instancesr   ÚsemÚdata)rB   Ú	cloud_dirÚrun_dirÚosÚpathÚjoin)r\   Úc_dirrz   Úinitial_dirsr3   r3   r7   Ú_initial_subdirsÍ   s    ôzInit._initial_subdirsFc                 C   s8   | j jg}|r| | j j¡ |D ]}t |¡ qt|ƒS r^   )rB   Úboot_finishedÚappendÚinstance_linkr   Údel_fileÚlen)r\   Úrm_instance_lnkÚrm_listÚfr3   r3   r7   Úpurge_cacheà   s   
zInit.purge_cachec                 C   s   |   ¡  d S r^   )Ú_initialize_filesystemr_   r3   r3   r7   Ú
initializeè   s   zInit.initializeÚmode_1Úmode_2r0   c                 C   s   | |@ S r^   r3   )rŒ   r�   r3   r3   r7   Ú_get_strictest_modeë   s   zInit._get_strictest_modec           	      C   s
  d}t  |  ¡ ¡ t  | jd¡}|rƒttƒ� |  dt  |¡¡}W d   ƒ n1 s*w   Y  t j	||dd� | j 
d¡}|sAi }t|tƒsI|g}d }|D ](}t  |¡\}}zt  |||¡ W  d S  tyu } z|}W Y d }~qMd }~ww t d|d |¡|¡ d S d S )Ni   Údef_log_fileF)Úpreserve_modeÚsyslog_fix_permsz,Failed changing perms on '%s'. tried: %s. %sú,)r   Úensure_dirsr€   Úget_cfg_option_strr-   r   ÚOSErrorrŽ   Úget_permissionsÚensure_filer:   Ú
isinstanceÚlistÚextract_usergroupÚchownbynamerC   Úwarningr}   )	r\   ÚmodeÚlog_fileÚpermsÚerrorÚpermÚuÚgÚer3   r3   r7   rŠ   ï   s@   

ÿÿ
€ÿüçzInit._initialize_filesystemc                 C   s   | j s|  |¡| _ d S d S r^   )rU   Ú	_read_cfg)r\   Ú	extra_fnsr3   r3   r7   rm     s   ÿzInit.read_cfgc                 C   sB   |   |i ¡}| di ¡ di ¡}| d¡tdfv r|S |   ||¡S )z read and merge our configurationrl   rB   rz   N)Ú_read_bootstrap_cfgr:   r&   )r\   r¦   Úinitial_configrB   r3   r3   r7   r¥     s
   zInit._read_cfgÚbootstrapped_configc                 C   s<   t  || j¡}| d¡}t j|| j|t|j|d�d�}|jS )NÚinstance_data_sensitive©Úinstance_data_file)rB   r,   Úadditional_fnsÚbase_cfg)r   rq   r,   Úget_runpathÚConfigMergerÚfetch_base_configrz   r-   )r\   r¦   r©   Úno_cfg_pathsr¬   Úmergerr3   r3   r7   r§   +  s   ÿÿüzInit._read_bootstrap_cfgc                 C   s   t  | j d¡¡S )NÚobj_pkl)r   Úpkl_loadrB   Úget_ipath_curr_   r3   r3   r7   Ú_restore_from_cache:  s   zInit._restore_from_cachec                 C   sL   | j d u rdS t | jdd¡rtj| j d¡ddd� t | j | j d¡¡S )NFÚmanual_cache_cleanÚmanual_clean_markerÚwÚ )ÚomodeÚcontentr´   )	r,   r   Úget_cfg_option_boolr-   Ú
write_filerB   r¶   r   Ú	pkl_storer_   r3   r3   r7   Ú_write_to_cache@  s   

ýÿzInit._write_to_cachec                 C   sN   | j  d¡pg }dt t¡fD ]}||vr| |¡ q| j  d¡p"g }||fS )NÚdatasource_pkg_listr»   Údatasource_list)r-   r:   r   Úobj_namer   r‚   )r\   Úpkg_listÚnÚcfg_listr3   r3   r7   Ú_get_datasourcesO  s   
€zInit._get_datasourcesc                 C   sª   |dvr
t d| ƒ‚|  ¡ }|sdS | j d¡}tj |¡r&t |¡ 	¡ }nd }|| 
¡ kr4|d| fS |dkr>|d| fS t|dƒrO| | j¡rO|d	| fS d d
| fS )N)ÚcheckÚtrustz!Unexpected value for existing: %s)Nzno cache foundÚinstance_idz&restored from cache with run check: %srÊ   zrestored from cache: %sÚcheck_instance_idzrestored from checked cache: %szcache invalid in datasource: %s)Ú
ValueErrorr·   rB   r¯   r{   r|   Úexistsr   Úload_text_fileÚstripÚget_instance_idÚhasattrrÌ   r-   )r\   ÚexistingÚdsÚ
run_iid_fnÚrun_iidr3   r3   r7   Ú_restore_from_checked_cacheY  s$   ÿz Init._restore_from_checked_cachec           	   
   C   sD  | j d ur| j S tjdd| | jd��}|  |¡\}}||_t|ƒ| _t 	|j¡ W d   ƒ n1 s3w   Y  |s™z+|  
¡ \}}t | j| j| jt | j¡||| j¡\}}t | jj¡ t d||¡ W n3 tjy˜ } z&|dkrt|‚|  ¡ }|r…| ¡ r…t d|¡ n	t | jj¡ |‚W Y d }~nd }~ww || _ |  ¡  |S )Nzcheck-cachez"attempting to read from cache [%s])rP   rQ   ÚparentzLoaded datasource %s - %srÉ   z3Restored fallback datasource from checked cache: %s)r,   r$   rZ   r[   r×   rQ   ÚboolrX   rC   rD   rÈ   r   Úfind_sourcer-   rb   rB   r<   r=   rO   r   r„   rƒ   ÚinfoÚDataSourceNotFoundExceptionr·   Úcheck_if_fallback_is_allowedr`   )	r\   rÓ   ÚmyreprÔ   ÚdescrÇ   rÅ   Údsnamer¤   r3   r3   r7   Ú_get_data_sources  sX   
ý
ø

ù	þú€ûzInit._get_data_sourcec                 C   s   g d¢S )N)r   rs   rw   r3   r_   r3   r3   r7   Ú_get_instance_subdirs£  ó   zInit._get_instance_subdirsc                 C   s   | j  |¡}|stdƒ‚|S )NzCNo instance directory is available. Has a datasource been fetched??)rB   Ú	get_ipathÚRuntimeError)r\   ÚsubnameÚinstance_dirr3   r3   r7   Ú
_get_ipath¦  s   ÿzInit._get_ipathÚnetcfgc                 C   sŽ   t j | jj¡s
dS | j d¡}| j d¡}t j |¡r/|t 	t 
|¡¡kr.tj||dd� ntj||dd� t j |¡sEt ||¡ dS dS )zÀCreate /var/lib/cloud/instance/network-config.json

        Only attempt once /var/lib/cloud/instance exists which is created
        by Init.instancify once a datasource is detected.
        NÚnetwork_configé€  ©r�   )r{   r|   ÚislinkrB   rƒ   r¶   r¯   rÎ   r   Ú	load_jsonrÏ   r   Ú
write_jsonÚsym_link)r\   ré   Úncfg_instance_pathÚnetwork_linkr3   r3   r7   Ú_write_network_config_json²  s    ÿÿ€ÿzInit._write_network_config_jsonc                 C   s¦  |   ¡ }t| jjƒ ¡  ¡ }|t|ƒ ¡ k}|rt d¡ nt 	| jj¡ t 
|| jj¡ g }|  ¡ D ]}| tj ||¡¡ q3t |¡ | j d¡}dt | j¡| jf }d }tj |d¡}	z	t |	¡ ¡ }W n	 tyq   Y nw |sv|}t |	d| ¡ t tj |d¡d| ¡ | j ¡ }
tj |d¡}|  ¡ }t |d|
 ¡ t | j d¡d|
 ¡ t tj |d	¡d| ¡ |  ¡  |rÍ||krÍt d
¡ |
S |  ¡  |
S )Nz0Instance link already exists, not recreating it.rx   z%s: %sr,   z%s
zprevious-datasourceúinstance-idrË   zprevious-instance-idzJNot re-loading configuration, instance id and datasource have not changed.)rè   r   rB   rƒ   ÚresolveÚabsoluterC   rÛ   r   r„   rð   râ   r‚   r{   r|   r}   r“   rE   r   rÄ   r,   rÏ   rÐ   Ú	Exceptionr¿   rÑ   Úprevious_iidr¯   rÁ   r`   )r\   ÚidirÚdestinationÚalready_instancifiedÚdir_listÚdÚdprÔ   Úprevious_dsÚds_fnÚiidÚiid_fnrø   r3   r3   r7   Ú_reflect_cur_instanceÌ  sT   
ÿÿ
ÿÿ	ÿzInit._reflect_cur_instancec                 C   sl   | j d ur| j S | j d¡}tj |d¡}z
t |¡ ¡ | _ W n t	y+   t
| _ Y nw t d| j ¡ | j S )Nrx   rô   zprevious iid found to be %s)rY   rB   rE   r{   r|   r}   r   rÏ   rÐ   r÷   r+   rC   rD   )r\   rþ   r  r3   r3   r7   rø   	  s   

ÿzInit.previous_iidc                 C   s"   |   ¡ }|tkp|| j ¡ k}|S )z˜Return true if this is a new instance.

        If datasource has already been initialized, this will return False,
        even on first boot.
        )rø   r+   r,   rÑ   )r\   ÚpreviousÚretr3   r3   r7   Úis_new_instance  s
   þzInit.is_new_instancerÉ   c                 C   s   | j |d�S )zUoptionally load datasource from cache, otherwise discover
        datasource
        )rÓ   )rá   )r\   rÓ   r3   r3   r7   rf   $  s   z
Init.fetchc                 C   s   |   ¡ S r^   )r  r_   r3   r3   r7   Ú
instancify*  rã   zInit.instancifyc                 C   s(   t j| j| j| j| jt | j¡| jd�S )N)r[   )	r   ÚCloudr,   rB   r-   rb   r   ÚRunnersr[   r_   r3   r3   r7   Úcloudify-  s   
úzInit.cloudifyc                 C   sp   |   | j ¡ d¡ |  | j ¡ d¡ |  | j ¡ d¡ |  | j ¡ d¡ |  | j ¡ d¡ |  | j 	¡ d¡ d S )NÚuserdataÚ
vendordataÚvendordata2)
Ú_store_rawdatar,   Úget_userdata_rawÚ_store_processeddataÚget_userdataÚ_store_raw_vendordataÚget_vendordata_rawÚget_vendordataÚget_vendordata2_rawÚget_vendordata2r_   r3   r3   r7   Úupdate8  s   
ÿ
ÿ
ÿ
ÿzInit.updatec                 C   s\   t jdd| jd�� | jd u rtdƒ‚| jj|  ¡ d� W d   ƒ d S 1 s'w   Y  d S )Nzsetup-datasourcezsetting up datasource©rØ   z!Datasource is None, cannot setup.)r  )r$   rZ   r[   r,   rå   Úsetupr  r_   r3   r3   r7   Úsetup_datasourceH  s   ÿ
"ûzInit.setup_datasourcec                 C   sh   t jdd| jd��! | jd u rtdƒ‚| jj| j|  ¡ d� |  ¡  W d   ƒ d S 1 s-w   Y  d S )Nzactivate-datasourcezactivating datasourcer  z$Datasource is None, cannot activate.)r-   r  )	r$   rZ   r[   r,   rå   Úactivater-   r  rÁ   r_   r3   r3   r7   Úactivate_datasourceP  s   ý

ÿ
"özInit.activate_datasourcec                 C   s(   |d u rd}t  |  d| ¡|d¡ d S )Nó    z%s_rawrë   )r   r¿   rè   ©r\   rx   r,   r3   r3   r7   r  ]  s   zInit._store_rawdatac                 C   sR   |d urt |ƒtttfvrtdtt |ƒƒ ƒ‚t|tƒr!t |¡}|  ||¡ d S )Nz'vendordata_raw is unsupported type '%s')	ÚtypeÚbytesÚstrr™   Ú	TypeErrorr˜   r   Ú
json_dumpsr  r  r3   r3   r7   r  c  s   ÿ

zInit._store_raw_vendordatac                 C   s(   |d u rd}t  |  |¡t|ƒd¡ d S )Nr»   rë   )r   r¿   rè   r!  )r\   Úprocessed_datar,   r3   r3   r7   r  n  s
   ÿzInit._store_processeddatac                 C   sœ   |d u ri }|  | j| jdœ¡ tdi |¤Ž}tdi |¤Ž}tdi |¤Ž}||ttfi |¤Žttfi |¤Žtt	fi |¤Ž|t
di |¤d|||gi¤Žg}|S )N)rB   r,   Úsub_handlersr3   )r  rB   r,   r   r!   r   r"   r'   r(   r)   r    )r\   ÚoptsÚcloudconfig_handlerÚshellscript_handlerÚboothook_handlerÚdef_handlersr3   r3   r7   Ú_default_handlersv  s4   þÿÿýþùzInit._default_handlersc                 C   ó   | j dddœd�S )NÚvendor_scriptsÚvendor_cloud_config©Úscript_pathÚcloud_config_path©r&  ©r+  r_   r3   r3   r7   Ú_default_vendordata_handlers–  ó
   þÿz!Init._default_vendordata_handlersc                 C   r,  )Nr-  Úvendor2_cloud_configr/  r2  r3  r_   r3   r3   r7   Ú_default_vendordata2_handlersž  r5  z"Init._default_vendordata2_handlersc                    sò   |du rg }| j  d¡}|  d¡‰|ˆfD ]}|r%|tjvr%tj d|¡ q‡ fdd„}t ¡ ‰ ||ƒ |D ]}ˆ j|dd�}	|	rHt	 
d|	|¡ q6|  ¡ ‰‡ ‡‡fd	d
„}
‡ ‡‡‡‡fdd„}‡ ‡‡fdd„}z|
ƒ  ||ƒ W |ƒ  dS |ƒ  w )zb
        Generalized handlers suitable for use with either vendordata
        or userdata
        Nr   r   c              	      s¾   | rt j | ¡s
d S t | ¡}| ¡ D ]I\}}z5t |dgddg¡\}}|s0t 	d|||¡ W qt 
|d ¡}t |¡}ˆ  |¡}|rKt d|||¡ W q ty\   t td|¡ Y qw d S )Nr»   Ú
list_typesÚhandle_partzJCould not find a valid user-data handler named %s in file %s (searched %s)r   z(Added custom handler for %s [%s] from %sz"Failed to register handler from %s)r{   r|   Úisdirr   Úget_modules_from_dirÚitemsr   Úfind_modulerC   rœ   Úimport_moduler   Úfixup_handlerÚregisterrD   r÷   Úlogexc)r|   Úpotential_handlersÚfnameÚmod_nameÚmod_locsÚlooked_locsÚmodÚtypes)Ú
c_handlersr3   r7   Úregister_handlers_in_dir»  sB   
ÿû

ü€ÿÿèz3Init._do_handlers.<locals>.register_handlers_in_dirF)Ú	overwritez$Added default handler for %s from %sc                     s<   ˆ   ¡ D ]\} }|ˆ jv rqt |ˆˆ¡ ˆ j |¡ qd S r^   )r<  Úinitializedr   Ú
call_beginr‚   ©Ú_ctyperG  ©rI  rx   Ú	frequencyr3   r7   Úinit_handlersî  s   
úz(Init._do_handlers.<locals>.init_handlersc                    s(   ˆ ˆˆˆd| dœ}t jˆt j|d� d S )Nr   )r   Ú
handlerdirrx   rQ  ÚhandlercountÚexcluded)rx   )r   ÚwalkÚwalker_callback)rU  Ú	part_data©rI  rx   Údata_msgrQ  rù   r3   r7   Úwalk_handlersø  s   õz(Init._do_handlers.<locals>.walk_handlersc               	      s`   ˆ   ¡ D ])\} }|ˆ jvrqˆ j |¡ z	t |ˆˆ¡ W q ty-   t td|¡ Y qw d S )NzFailed to finalize handler: %s)	r<  rL  Úremover   Úcall_endr÷   r   rA  rC   rN  rP  r3   r7   Úfinalize_handlers	  s   
ÿøz,Init._do_handlers.<locals>.finalize_handlers)rB   rE   rè   Úsysr|   Úinsertr   ÚContentHandlersr@  rC   rD   r
  )r\   rZ  Úc_handlers_listrQ  rU  Úcdirrý   rJ  rG  rH  rR  r[  r^  r3   rY  r7   Ú_do_handlers¦  s0   
€#€

zInit._do_handlersc              
   C   sà  t jdd| jd�� t | jdd¡r|  |¡ nt d¡ W d   ƒ n1 s'w   Y  t jdd| jd�� |  	d	|¡ W d   ƒ n1 sFw   Y  t jd
d| jd�� |  	d|¡ W d   ƒ n1 sew   Y  |  
¡  t | j¡}t|d< |  d¡|d< t ¡ |d< tj| j d¡|dd� | j d¡}z
t t |¡¡}W n8 ttfy½ } zt d||¡ W Y d }~d S d }~w tjtfyÙ } zt d||¡ W Y d }~d S d }~ww |d |d< |d |d< tj||dd� d S )Nzconsume-user-datazreading and applying user-datar  Úallow_userdataTz,allow_userdata = False: discarding user-datazconsume-vendor-dataz reading and applying vendor-datar  zconsume-vendor-data2z!reading and applying vendor-data2r  Ú_docra   rl   r   Úcombined_cloud_configrë   rì   rª   zESkipping write of system_info/features to %s. Unable to read file: %szDSkipping write of system_info/features to %s. Invalid JSON found: %s)r$   rZ   r[   r   r¾   r-   Ú_consume_userdatarC   rD   Ú_consume_vendordatar`   r<   r=   ÚCOMBINED_CLOUD_CONFIG_DOCrd   r   Úget_featuresr   rï   rB   r¯   rî   rÏ   r•   ÚIOErrorrœ   ÚjsonÚJSONDecodeErrorr"  )r\   rQ  Úcombined_cloud_cfgÚjson_sensitive_fileÚinstance_jsonr¤   r3   r3   r7   Úconsume_data  s~   ý
€ø
ýûýû
ýÿü€ü€ù
ýzInit.consume_datac           
      C   s@  |dkr| j  ¡ st d¡ dS d}n|dkr&| j  ¡ s#t d¡ dS d}ntdƒ‚tj| j| j g | j	d	d
�}|j	 
|i ¡}t|tƒsNdd	i}t d||¡ | 
d¡}| 
dd¡}t |¡sft d|¡ dS t|tƒrwtjd|› d�ddd� t d||¡ |dkrŒ| j  ¡ }|  ¡ }	n	| j  ¡ }|  ¡ }	| j||	||d� dS )zH
        Consume the vendordata and run the part handlers on it
        r  zno vendordata from datasourceNÚvendor_datar  zno vendordata2 from datasourceÚvendor_data2z>vendor_source arg must be either 'vendordata' or 'vendordata2'F)rB   r,   r­   r®   Úinclude_vendorÚenabledz$invalid %s setting. resetting to: %sÚdisabled_handlersz%s consumption is disabled.zUse of string 'z!' for 'vendor_data:enabled' fieldz23.1zUse boolean value instead.)Ú
deprecatedÚdeprecated_versionÚextra_messagez)%s will be consumed. disabled_handlers=%s)rU  )r,   r  rC   rD   r  rå   r   r°   rV   r-   r:   r˜   Údictrœ   r   Úis_truer!  r   Ú	deprecater  r4  r  r7  rd  )
r\   Úvendor_sourcerQ  Úcfg_nameÚ
_cc_mergerÚvdcfgrv  Úno_handlersÚvendor_data_msgrb  r3   r3   r7   ri  l  sd   	



ÿû
ÿ



üý



ÿzInit._consume_vendordatac                 C   s&   | j  d¡}|  ¡ }|  |||¡ dS )z@
        Consume the userdata and run the part handlers
        TN)r,   r  r+  rd  )r\   rQ  Úuser_data_msgrb  r3   r3   r7   rh  º  s   zInit._consume_userdatac                 C   s   |r
d|v r
|d S |S )z 
        Network configuration can be passed as a dict under a "network" key, or
        optionally at the top level. In both cases, return the config.
        Únetworkr3   )r\   r-   r3   r3   r7   Ú_get_network_key_contentsÈ  s   zInit._get_network_key_contentsc              
   C   s.  t j | j d¡d¡}t j |¡rd |fS tjt 	¡ tj
t ¡ tjd tj| j d¡i}| jr;t| jdƒr;| jj|tj< | jrC| jj}ntjj}|D ]9}t|tƒsWt d|¡ qI||vrbt d|¡ qI|  || ¡}t |¡rzt d|¡ d |f  S |r‚||f  S qI| j dd¡s�t d	¡ | j ¡ tjfS )
Nrx   zupgraded-networkr…  rê   z7data source specifies an invalid network cfg_source: %sz;data source specifies an unavailable network cfg_source: %sznetwork config disabled by %sTzEmpty network config found) r{   r|   r}   rB   rE   rÎ   r*   ÚCMD_LINEr#   Úread_kernel_cmdline_configÚ	INITRAMFSÚread_initramfs_configÚDSÚ
SYSTEM_CFGr-   r:   r,   rÒ   rê   Únetwork_config_sourcesr   Ú
DataSourcer˜   rC   rœ   r†  r   Úis_disabled_cfgrD   rb   Úgenerate_fallback_configÚFALLBACK)r\   Údisable_fileÚavailable_cfgsÚorderÚ
cfg_sourceÚncfgr3   r3   r7   Ú_find_networking_configÑ  sR   ÿ

üÿ

þý
ÿ
þzInit._find_networking_configc              
   C   sT   zt  d|¡ | jj |¡ W d S  ty) } zt  d|¡ W Y d }~d S d }~ww )Nz applying net config names for %szFailed to rename devices: %s)rC   rD   rb   Ú
networkingÚapply_network_config_namesr÷   rœ   )r\   ré   r¤   r3   r3   r7   Ú_apply_netcfg_names  s   €ÿzInit._apply_netcfg_namesc                 C   s"   t ddƒt | j d¡¡dtfƒS )NÚ	Semaphorezsemaphore argsrw   Úapply_network_config)r   r   ÚFileSemaphoresrB   r¯   r)   r_   r3   r3   r7   Ú_get_per_boot_network_semaphore  s   þz$Init._get_per_boot_network_semaphorec                 C   s   |   ¡ }|jj|jŽ S r^   )rž  Ú	semaphoreÚhas_runÚargs)r\   rw   r3   r3   r7   Ú_network_already_configured  s   z Init._network_already_configuredc           	   
      s‚  ddl m}m} ˆ ¡ \}}|du rt d|¡ dS ‡fdd„‰ ‡ ‡fdd„}ˆjdurDˆ ¡ sD|ƒ sDˆ tj	ƒsDt 
d	¡ ˆ |¡ dS ˆ ¡ \}}ˆ |¡ |r[|||jd
d
dd� ˆjj |¡ ˆ |¡ t d|||¡ ˆ ¡ }z#|jj|jŽ � ˆjj||d�W  d  ƒ W S 1 s�w   Y  W dS  tjy° } zt d|¡ W Y d}~dS d}~w tyÀ   t dˆj¡ Y dS w )z—Apply the network config.

        Find the config, determine whether to apply it, apply it via
        the distro, and optionally bring it up
        r   )Ú
SchemaTypeÚvalidate_cloudconfig_schemaNz network config is disabled by %sc                    s$   t ˆ jˆ j| tjd�oˆ j | g¡S )N)r,   r-   r.   r/   )rM   r,   r-   r   ÚNETWORKÚupdate_metadata_if_supported)Ú
event_typer_   r3   r7   Ú"event_enabled_and_metadata_updated(  s   üûzEInit.apply_network_config.<locals>.event_enabled_and_metadata_updatedc                      s   ˆ  ¡  o	ˆ tjƒS r^   )r¢  r   ÚBOOTr3   ©r¨  r\   r3   r7   Úshould_run_on_boot_event0  s   
þz;Init.apply_network_config.<locals>.should_run_on_boot_eventzWNo network config applied. Neither a new instance nor datasource network update allowedFT)ÚconfigÚschema_typeÚstrictÚlog_detailsÚlog_deprecationsz5Applying network configuration from %s bringup=%s: %s)Úbring_upz@Unable to render networking. Network config is likely broken: %sz_distro '%s' does not implement apply_network_config. networking may not be configured properly.)Úcloudinit.config.schemar£  r¤  r—  rC   rÛ   r,   r  r   ÚBOOT_LEGACYrD   rš  ró   ÚNETWORK_CONFIGrb   r˜  Úwait_for_physdevsrž  rŸ  Úlockr¡  rœ  r   ÚRendererNotFoundErrorr    ÚNotImplementedErrorrœ   )	r\   r±  r£  r¤  ré   Úsrcr«  rw   r¤   r3   rª  r7   rœ    st   
ÿþýÿ

û
üÿ(ÿý€ýúzInit.apply_network_config)NN)Fr^   )rÉ   )DÚ__name__Ú
__module__Ú__qualname__r	   r   r!  r]   r`   Úpropertyrb   r-   rd   rB   r€   r‰   r‹   ÚstaticmethodÚintrŽ   rŠ   rm   r¥   r{  r§   r·   rÁ   rÈ   r×   r   rŽ  rá   râ   rè   ró   r  rø   r  rf   r  r
  r  r  r  r  r  r  r   ÚHandlerr+  r4  r7  rd  r(   rr  ri  rh  r   r   r   r†  r   r*   r—  rš  rž  rÙ   r¢  rœ  r3   r3   r3   r7   rN   ‡   sn    




%
0
=
 	
ÿvPN	
þ6rN   rz   c                 C   s   t  tj | d¡¡S )Nz	cloud.cfg)r   Ú	read_confr{   r|   r}   )rz   r3   r3   r7   Úread_runtime_configt  s   rÂ  r«   c                C   s,   t jt  ¡ t jt|d�t| ƒt  ¡ gdd�S )Nr«   T)Úreverse)r   r;   Úget_builtin_cfgÚread_conf_with_confdr%   rÂ  Úread_conf_from_cmdline)rz   r¬   r3   r3   r7   r±   x  s   ÿöór±   )Kr<   rm  Úloggingr{   r_  Úcollectionsr   Ú
contextlibr   Úpathlibr   Útypingr   r   r   r   r	   r
   r   r   Ú	cloudinitr   r   r   r   r   r   r   r   r   r   r   r   Úcloudinit.configr   r   Úcloudinit.eventr   r   r   Úcloudinit.handlers.boot_hookr   Úcloudinit.handlers.cloud_configr   Ú!cloudinit.handlers.jinja_templater    Úcloudinit.handlers.shell_scriptr!   Ú,cloudinit.handlers.shell_script_by_frequencyr"   Úcloudinit.netr#   Úcloudinit.reportingr$   Úcloudinit.settingsr%   r&   r'   r(   r)   Úcloudinit.sourcesr*   Ú	getLoggerrº  rC   r+   rj  rŽ  r{  rÙ   rM   rN   r!  rÂ  r±   r3   r3   r3   r7   Ú<module>   s\   (8
ÿÿþýü
ûE       t