o
    thK5                     @   s  d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ eeZdZg dZ ddiZ!G dd de	Z"dd Z#dd Z$de"de%de&fddZ'G dd dZ(dS )    N)	signature)
ModuleType)DictList
NamedTupleOptional)configimporter	lifecycleperformance
type_utilsutil)ALL_DISTROS)ConfigMerger)ReportEventStack)FREQUENCIES)Initcc_)cc_emit_upstartzcc_refresh_rmc_and_interface.pycc_migratorcc_rightscale_userdatacc_ubuntu_advantagecc_ubuntu_proc                   @   s2   e Zd ZU eed< eed< eed< ee ed< dS )ModuleDetailsmodulename	frequencyrun_argsN)__name__
__module____qualname__r   __annotations__strr    r#   r#   :/usr/lib/python3/dist-packages/cloudinit/config/modules.pyr   4   s
   
 r   c                 C   sX   |  dd}| dr|dt|d  }| }|sd S |ts*dt|f }|S )N-_z.pyr      z%s%s)replacelowerendswithlenstrip
startswith
MOD_PREFIX)r   
canon_namer#   r#   r$   form_module_name;   s   
r0   c                 C   s   t | drd| jvsd| jvrtd|  d| d| jd tvr2td|  d| d| jd  dt | d	rBtd|  d| d
d S )Nmetar   distroszModule 'z' with name 'z4' MUST have a 'meta' attribute of type 'MetaSchema'.z' has an invalid frequency .schemazX' has a JSON 'schema' attribute defined. Please define schema in cloud-init-schema,json.)hasattrr1   
ValueErrorr   )modr   r#   r#   r$   validate_moduleG   s$   


r8   module_detailscfgreturnc                 C   s2   t | jjdi }|sdS || sdS dS )Nactivate_by_schema_keysTF)	frozensetr   r1   getintersectionkeys)r9   r:   activate_by_schema_keys_keysr#   r#   r$   
_is_active]   s   rB   c                   @   sx   e Zd ZddefddZedejfddZde	e
 fdd	Zde	e fd
dZde	e fddZdddZdd ZdS )ModulesNinitc                 C   s2   || _ || _d | _|d u rtdddd}|| _d S )Nzmodule-reporterzmodule-descF)r   descriptionreporting_enabled)rD   	cfg_files_cached_cfgr   reporter)selfrD   rG   rI   r#   r#   r$   __init__i   s   
zModules.__init__r;   c                 C   s<   | j d u rt| jj| jj| j| jjd}|j| _ t| j S )N)paths
datasourceadditional_fnsbase_cfg)	rH   r   rD   rL   rM   rG   r:   copydeepcopy)rJ   mergerr#   r#   r$   r:   v   s   
zModules.cfgc                 C   sP  g }|| j vr	|S | j |}|s|S |D ]}|sqt|tr)|d| i qt|trbi }t|dkr>|d  |d< t|dkrL|d  |d< t|dkrZ|dd |d< |ra|| qt|tri }d	}d
|v ry|d
  |d< d}d|v r|d  |d< d|v r|d pg |d< |r|r|| qt	d|t
|f |S )aU  Read the modules from the config file given the specified name.

        Returns a list of module definitions. E.g.,
        [
            {
                "mod": "bootcmd",
                "freq": "always",
                "args": "some_arg",
            }
        ]

        Note that in the default case, only "mod" will be set.
        r7      r      freqr'   NargsFr   Tr   z3Failed to read '%s' item in config, unknown type %s)r:   r>   
isinstancer"   appendr,   listr+   dict	TypeErrorr   obj_name)rJ   r   module_listcfg_modsitemcontentsvalidr#   r#   r$   _read_modules   sX   





zModules._read_modulesc              	   C   s*  g }|D ]}|d }| d}| dpg }t|}|sq|r2|tvr2tjd| d| dd d}|tv rJtjd	| d
t|  ddd t| }t|dt	t
gdg\}}	|sr|tv rjtd|dd  ntd||	 qt|d }
t|
| |du r|
jd }|t|
|||d q|S )zConvert list of returned from _read_modules() into new format.

        Invalid modules and arguments are ignored.
        Also ensures that the module has the required meta fields.
        r7   rU   rV   zConfig specified module z has an unknown frequency z22.1
deprecateddeprecated_versionNzModule has been renamed from z to z/. Update any references in /etc/cloud/cloud.cfgz24.1 handlez\Module `%s` has been removed from cloud-init. It may be removed from `/etc/cloud/cloud.cfg`.r'   z,Could not find module named %s (searched %s)r   r   )r   r   r   r   )r>   r0   r   r
   	deprecateRENAMED_MODULESr	   find_moduler   r\   r   REMOVED_MODULESLOGinfowarningimport_moduler8   r1   rX   r   )rJ   raw_modsmostly_modsraw_modraw_namerU   r   mod_namemod_locslooked_locsr7   r#   r#   r$   _fixup_modules   sh   
	


zModules._fixup_modulesrq   c                 C   s  | j  }g }g }|D ]\}}}}ztd||| || d| }	d|	|f }
t|	|
| jd}|| j||d}|Z t|j	}|j
}t|dkrYtjddd	 |d
ti tjddd}|j|	|j	||d\}}W d    n1 sww   Y  |r|	 d|jdd|_nd|	 |_W d    n1 sw   Y  W q ty } zttd|| |||f W Y d }~qd }~ww ||fS )Nz(Running module %s (%s) with frequency %szconfig-zrunning %s with frequency %s)r   rE   parent)r   r:   cloudrV      z%Config modules with a `log` parameterz23.2rc   logrf   skip)log_mode)rU   z ran successfully and took z.3fz secondsz%s previously ranzRunning module %s (%s) failed)rD   cloudifyrl   debugrX   r   rI   r:   r   rg   
parametersr+   r
   rh   updater   Timedrundeltamessage	Exceptionr   logexc)rJ   rq   ccfailures	which_ranr7   r   rU   rV   run_namedescmyrep	func_argsfunc_signaturefunc_paramstimerran_rer#   r#   r$   _run_modules  s`   





zModules._run_modulesc                 C   s&   |||d}|g}|  |}| |S )N)r7   rV   rU   )rw   r   )rJ   rt   rV   rU   	mod_to_berp   rq   r#   r#   r$   
run_single9  s   

zModules.run_singlec                 C   s  |  |}| |}| jjj}g }g }| jdg }g }g }	|D ]A}
|
\}}}}|du r-q |jd }t|
| js>|	| q |rX|t
gkrX||vrX||vrS|	| q |	| |		||||g q |rmtdd| |rytdd|| |rtdd| | |	S )	zRuns all modules in the given section.

        section_name - One of the modules lists as defined in
          /etc/cloud/cloud.cfg. One of:
         - cloud_init_modules
         - cloud_config_modules
         - cloud_final_modules
        unverified_modulesNr2   z?Skipping modules '%s' because no applicable config is provided.,zSkipping modules '%s' because they are not verified on distro '%s'.  To run anyway, add them to 'unverified_modules' in config.z running unverified_modules: '%s'z, )rb   rw   rD   distror   r:   r>   r1   rB   rX   r   rl   rm   joinr   )rJ   section_namerp   rq   distro_nameskippedforced
overriddeninapplicable_modsactive_modsr9   r7   r   _freq_argsworked_distrosr#   r#   r$   run_sectionE  sJ   
	






zModules.run_section)NN)r   r   r    r   rK   propertyr   Configr:   r   r   rb   r   rw   r   r   r   r#   r#   r#   r$   rC   h   s    ;C
7rC   ))rP   logginginspectr   typesr   typingr   r   r   r   	cloudinitr   r	   r
   r   r   r   cloudinit.distrosr   cloudinit.helpersr   cloudinit.reporting.eventsr   cloudinit.settingsr   cloudinit.stagesr   	getLoggerr   rl   r.   rk   ri   r   r0   r8   rZ   boolrB   rC   r#   r#   r#   r$   <module>   s*    
