o
    x[h£@  ã                   @   s  d dl Z d dlZd dl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mZmZmZ d dlmZmZmZmZ e e¡ZG dd„ deƒZG d	d
„ d
ƒZG dd„ dƒZG dd„ dƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZ G dd„ dej!ƒZ"G dd„ deƒZ#dS )é    N)ÚNoOptionErrorÚNoSectionErrorÚRawConfigParser)ÚStringIO)Útime)ÚpersistenceÚsettingsÚ
type_utilsÚutil)ÚCFG_ENV_NAMEÚ
PER_ALWAYSÚPER_INSTANCEÚPER_ONCEc                   @   ó   e Zd ZdS )ÚLockFailureN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú3/usr/lib/python3/dist-packages/cloudinit/helpers.pyr      ó    r   c                   @   r   )Ú	DummyLockNr   r   r   r   r   r      r   r   c                   @   s4   e Zd Zdd„ Zejddd„ƒZdd„ Zdd	„ Zd
S )ÚDummySemaphoresc                 C   s   d S ©Nr   ©Úselfr   r   r   Ú__init__!   ó   zDummySemaphores.__init__Fc                 c   s   � t ƒ V  d S r   )r   )r   Ú_nameÚ_freqÚ_clear_on_failr   r   r   Úlock$   s   €zDummySemaphores.lockc                 C   ó   dS ©NFr   ©r   r   r    r   r   r   Úhas_run(   r   zDummySemaphores.has_runc                 C   r#   )NTr   r%   r   r   r   Úclear+   r   zDummySemaphores.clearN©F)	r   r   r   r   Ú
contextlibÚcontextmanagerr"   r&   r'   r   r   r   r   r       s    r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFileLockc                 C   ó
   || _ d S r   )Úfn)r   r-   r   r   r   r   0   ó   
zFileLock.__init__c                 C   s   dt  | ¡| jf S )Nz<%s using file %r>)r	   Úobj_namer-   r   r   r   r   Ú__str__3   s   zFileLock.__str__N)r   r   r   r   r0   r   r   r   r   r+   /   s    r+   c                 C   s   |   dd¡S )Nú-Ú_)Úreplace)Únamer   r   r   Úcanon_sem_name7   s   r5   c                   @   sD   e Zd Zdd„ Zejddd„ƒZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )ÚFileSemaphoresc                 C   r,   r   )Úsem_path)r   r7   r   r   r   r   <   r.   zFileSemaphores.__init__Fc                 c   s@   � t |ƒ}z
|  ||¡V  W d S  ty   |r|  ||¡ ‚ w r   )r5   Ú_acquireÚ	Exceptionr'   )r   r4   ÚfreqÚclear_on_failr   r   r   r"   ?   s   €ýzFileSemaphores.lockc              	   C   sL   t |ƒ}|  ||¡}zt |¡ W dS  ttfy%   t td|¡ Y dS w )NzFailed deleting semaphore %sFT)r5   Ú	_get_pathr
   Údel_fileÚIOErrorÚOSErrorÚlogexcÚLOG)r   r4   r:   Úsem_filer   r   r   r'   I   s   ýþzFileSemaphores.clearc              	   C   sl   |   ||¡rd S |  ||¡}dt ¡ tƒ f }zt ||¡ W t|ƒS  ttfy5   t 	t
d|¡ Y d S w )Nz%s: %s
z Failed writing semaphore file %s)r&   r<   ÚosÚgetpidr   r
   Ú
write_filer>   r?   r@   rA   r+   )r   r4   r:   rB   Úcontentsr   r   r   r8   S   s   ýþzFileSemaphores._acquirec                 C   s0   |r|t krdS t|ƒ}|  ||¡}tj |¡S r$   )r   r5   r<   rC   ÚpathÚexists)r   r4   r:   ÚcnamerB   r   r   r   r&   c   s
   zFileSemaphores.has_runc                 C   s6   | j }|r	|tkrtj ||¡S tj |d||f ¡S )Nz%s.%s)r7   r   rC   rG   Újoin)r   r4   r:   r7   r   r   r   r<   m   s   zFileSemaphores._get_pathNr(   )r   r   r   r   r)   r*   r"   r'   r8   r&   r<   r   r   r   r   r6   ;   s    	

r6   c                   @   s&   e Zd Zdd„ Zdd„ Zd	dd„ZdS )
ÚRunnersc                 C   s   || _ i | _d S r   )ÚpathsÚsems)r   rL   r   r   r   r   v   ó   
zRunners.__init__c                 C   sh   |t ks|sd S d }|tkr| j d¡}n
|tkr| j d¡}|s#d S || jvr/t|ƒ| j|< | j| S )NÚsem)r   r   rL   Ú	get_ipathr   Ú	get_cpathrM   r6   )r   r:   r7   r   r   r   Ú_get_semz   s   

zRunners._get_semNFc           	      C   s´   |   |¡}|s
tƒ }|sg }| ||¡rt d||¡ dS | |||¡�,}|s-td| ƒ‚t d||¡ t|tƒrA|di |¤Ž}n||Ž }d|fW  d   ƒ S 1 sSw   Y  d S )Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)Tr   )	rR   r   r&   rA   Údebugr"   r   Ú
isinstanceÚdict)	r   r4   ÚfunctorÚargsr:   r;   rO   ÚlkÚresultsr   r   r   Úrun�   s"   

$÷zRunners.runr$   )r   r   r   r   rR   rZ   r   r   r   r   rK   u   s    rK   c                   @   sR   e Zd Z					ddd„Zdd„ Zdd„ Zd	d
„ Zdefdd„Ze	dd„ ƒZ
dS )ÚConfigMergerNTc                 C   s(   || _ || _|| _|| _|| _d | _d S r   )Ú_pathsÚ_dsÚ_fnsÚ	_base_cfgÚ_include_vendorÚ_cfg)r   rL   Ú
datasourceÚadditional_fnsÚbase_cfgÚinclude_vendorr   r   r   r   £   s   
zConfigMerger.__init__c                 C   sh   g }| j r2z| j  ¡ }|rt|tƒr| |¡ W |S W |S W |S  ty1   t td| j ¡ Y |S w |S )Nz2Failed loading of datasource config object from %s)	r]   Úget_config_objrT   rU   Úappendr9   r
   r@   rA   )r   Úd_cfgsÚds_cfgr   r   r   Ú_get_datasource_configs³   s(   
øøúýúz$ConfigMerger._get_datasource_configsc                 C   sV   g }t tjv r)tjt  }z| t |¡¡ W |S  ty(   t td|¡ Y |S w |S )Nz%Failed loading of env. config from %s)	r   rC   Úenvironrg   r
   Ú	read_confr9   r@   rA   )r   Úe_cfgsÚe_fnr   r   r   Ú_get_env_configsÂ   s   

þþzConfigMerger._get_env_configsc              	   C   sª   g }| j s|S dg}| jr| d¡ | d¡ |D ]9}| j  |¡}|rRtj |¡rRz
| t |¡¡ W q t	yB   t
 d|¡ Y q tyQ   t t
d|¡ Y qw q|S )NÚcloud_configÚvendor2_cloud_configÚvendor_cloud_configz5Skipped loading cloud-config from %s due to non-root.z&Failed loading of cloud-config from %s)r\   r`   rg   Úget_ipath_currC   rG   Úisfiler
   rl   ÚPermissionErrorrA   rS   r9   r@   )r   Úi_cfgsÚcc_pathsÚcc_pÚcc_fnr   r   r   Ú_get_instance_configsÌ   s0   

ýÿÿ€z"ConfigMerger._get_instance_configsÚreturnc              	   C   s�   g }| j r%| j D ]}z
| t |¡¡ W q ty$   t td|¡ Y qw | |  ¡ ¡ | |  	¡ ¡ | |  
¡ ¡ | jrC| | j¡ t |¡S )Nz'Failed loading of configuration from %s)r^   rg   r
   rl   r9   r@   rA   Úextendro   rz   rj   r_   Úmergemanydict)r   ÚcfgsÚc_fnr   r   r   Ú	_read_cfgì   s    
ÿÿ
zConfigMerger._read_cfgc                 C   s   | j d u r
|  ¡ | _ | j S r   )ra   r€   r   r   r   r   Úcfg  s   

zConfigMerger.cfg)NNNNT)r   r   r   r   rj   ro   rz   rU   r€   Úpropertyr�   r   r   r   r   r[   ¢   s    
ú
 r[   c                   @   sF   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Z	dS )ÚContentHandlersc                 C   s   i | _ g | _d S r   )Ú
registeredÚinitializedr   r   r   r   r     rN   zContentHandlers.__init__c                 C   ó
   |   |¡S r   )Úis_registered)r   Úitemr   r   r   Ú__contains__  r.   zContentHandlers.__contains__c                 C   r†   r   )Ú_get_handler)r   Úkeyr   r   r   Ú__getitem__  r.   zContentHandlers.__getitem__c                 C   s
   || j v S r   ©r„   ©r   Úcontent_typer   r   r   r‡     r.   zContentHandlers.is_registeredFTc                 C   sj   t ƒ }| ¡ D ]}|r| |¡ q|  |¡s| |¡ q|D ]}|| j|< q|r3|| jvr3| j |¡ |S r   )ÚsetÚ
list_typesÚaddr‡   r„   r…   rg   )r   Úmodr…   Ú	overwriteÚtypesÚtr   r   r   Úregister  s   

€zContentHandlers.registerc                 C   s
   | j | S r   r�   rŽ   r   r   r   rŠ   (  r.   zContentHandlers._get_handlerc                 C   s   t | j ¡ ƒS r   )Úlistr„   Úitemsr   r   r   r   r™   +  ó   zContentHandlers.itemsN)FT)
r   r   r   r   r‰   rŒ   r‡   r—   rŠ   r™   r   r   r   r   rƒ     s    
rƒ   c                   @   st   e Zd ZdZddefdd„Zdeddfdd	„Zdd
d„Zddd„Z	ddd„Z
ddd„Zddefdd„Zddd„ZdS )ÚPathsé   NÚ	path_cfgsc              
   C   s  || _ | dd¡| _| dd¡| _| dtj¡| _tj 	| jd¡| _
tj 	| j
d¡| _tj 	| jd¡| _| d	d
¡}tj 	|d¡| _i dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d “d!d"“d#d$“d%d&“d'd(“d)d*d+d,d-d.d/d0d1œ¥| _|| _d S )2NÚ	cloud_dirz/var/lib/cloudÚdocs_dirz/usr/share/doc/cloud-init/Úrun_dirÚinstancezboot-finishedÚseedÚtemplates_dirz/etc/cloud/templates/z%s.tmplÚ	boothooksrp   zcloud-config.txtÚdataÚhandlersÚinstance_dataúinstance-data.jsonÚinstance_data_sensitiveúinstance-data-sensitive.jsonÚcombined_cloud_configúcombined-cloud-config.jsonÚnetwork_configznetwork-config.jsonÚinstance_idz.instance-idÚmanual_clean_markerzmanual-cleanÚobj_pklzobj.pklÚscriptsrO   Úuserdatazuser-data.txt.iÚuserdata_rawzuser-data.txtÚ
vendordatazvendor-data.txt.iÚvendordata2zvendor-data2.txt.izvendor-data2.txtzvendor-data.txtzvendor2-cloud-config.txtzvendor-cloud-config.txtzscripts/vendorÚwarningsúhotplug.enabledú.skip-network)Úvendordata2_rawÚvendordata_rawrq   rr   Úvendor_scriptsr¶   r·   r¸   )r~   Úgetrž   rŸ   r   ÚDEFAULT_RUN_DIRr    rC   rG   rJ   Úinstance_linkÚboot_finishedÚseed_dirÚtemplate_tplÚlookupsrb   )r   r�   ÚdsÚtemplate_dirr   r   r   r   2  sx   ÿÿÿÿþýüøõôóòñðïîíìëê
â
!zPaths.__init__Úci_pkl_versionr{   c                 C   sv   t | dƒst| j| jd�j| _d| jvrd| jd< d| jvr#d| jd< d| jvr-d| jd< d	| jvr9d	| jd	< d
S d
S )z(Perform deserialization fixes for Paths.r    )r�   rÃ   r§   r¨   r©   rª   r«   r¬   r·   N)Úhasattrr›   r~   rb   r    rÂ   )r   rÅ   r   r   r   Ú	_unpickleg  s"   
ÿþ


ÿ
ÿ
ÿzPaths._unpicklec                 C   ó   |   | j|¡S r   )r<   r¾   ©r   r4   r   r   r   rs   €  rš   zPaths.get_ipath_curc                 C   rÈ   r   )r<   rž   rÉ   r   r   r   rQ   …  rš   zPaths.get_cpathc                 C   sf   | j sd S | j  ¡ }|d u rd S t|ƒ tjd¡}tj | jd|¡}| j	 
|¡}|r1tj ||¡}|S )Nr2   Ú	instances)rb   Úget_instance_idÚstrr3   rC   ÚseprG   rJ   rž   rÂ   r¼   )r   r4   ÚiidÚpath_safe_iidÚipathÚadd_onr   r   r   Ú
_get_ipathŠ  s   
zPaths._get_ipathc                 C   s    |   |¡}|st d¡ d S |S )Nz?No per instance data available, is there an datasource/iid set?)rÒ   rA   Úwarning)r   r4   rÐ   r   r   r   rP   š  s   
ÿzPaths.get_ipathÚbasec                 C   s    |d u r|S t j || j| ¡S r   )rC   rG   rJ   rÂ   )r   rÔ   r4   r   r   r   r<   ¥  s   zPaths._get_pathc                 C   rÈ   r   )r<   r    rÉ   r   r   r   Úget_runpathª  rš   zPaths.get_runpathr   )r   r   r   Ú_ci_pkl_versionrU   r   ÚintrÇ   rs   rQ   rÒ   rP   rÌ   r<   rÕ   r   r   r   r   r›   /  s    5



r›   c                   @   sX   e Zd ZdZdZdZdZdd„ Zddd„Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zddd„ZdS )ÚDefaultingConfigParserr   g        FNc                 C   sB   | j }z
t | ||¡}W |S  ty   Y |S  ty    Y |S w r   )ÚDEF_BASEr   r¼   r   r   ©r   ÚsectionÚoptionÚvaluer   r   r   r¼   ¾  s   üþþzDefaultingConfigParser.getc                 C   s4   |   |¡s| ¡ dkr|  |¡ t | |||¡ d S )NÚdefault)Úhas_sectionÚlowerÚadd_sectionr   r�   rÚ   r   r   r   r�   È  s   
zDefaultingConfigParser.setc                 C   s"   |   ||¡rt | ||¡ d S d S r   )Ú
has_optionr   Úremove_option©r   rÛ   rÜ   r   r   r   rã   Í  s   ÿz$DefaultingConfigParser.remove_optionc                 C   ó    |   ||¡s	| jS t | ||¡S r   )râ   ÚDEF_BOOLEANr   Ú
getbooleanrä   r   r   r   rç   Ñ  ó   z!DefaultingConfigParser.getbooleanc                 C   rå   r   )râ   Ú	DEF_FLOATr   Úgetfloaträ   r   r   r   rê   Ö  rè   zDefaultingConfigParser.getfloatc                 C   rå   r   )râ   ÚDEF_INTr   Úgetinträ   r   r   r   rì   Û  rè   zDefaultingConfigParser.getintc                 C   s<   d}t ƒ }|  |¡ | ¡  | ¡ }|rd ||dg¡}|S )NÚ Ú
)r   ÚwriteÚflushÚgetvaluerJ   )r   ÚheaderrF   Úoutputstreamr   r   r   Ú	stringifyà  s   
z DefaultingConfigParser.stringifyr   )r   r   r   rë   ré   ræ   rÙ   r¼   r�   rã   rç   rê   rì   rô   r   r   r   r   rØ   ¸  s    

rØ   )$r)   ÚloggingrC   Úconfigparserr   r   r   Úior   r   Ú	cloudinitr   r   r	   r
   Úcloudinit.settingsr   r   r   r   Ú	getLoggerr   rA   r9   r   r   r   r+   r5   r6   rK   r[   rƒ   ÚCloudInitPickleMixinr›   rØ   r   r   r   r   Ú<module>   s*   

:-j# 
