o
    x[hK5  ã                   @   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ƒr›i }d	}d
|v ry|d
  ¡ |d< d}d|v r…|d  ¡ |d< d|v r‘|d pŽg |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 )z¾Convert 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 ]µ\}}}}zŽt 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 s™w   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 |¡|¡ |r„t dd |¡¡ |  |	¡S )	zóRuns 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*    
ÿ