o
    th                  
   @   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_IDzAggregated 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}|rt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  |sz+| 
 \}}t| j| j| jt| j||| j\}}t| jj td|| W n3 tjy } z&|dkrt||  }|r| rt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 )zCreate /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rt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 )zReturn 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st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 sw   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 )zApply 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