U
    Ó‡g£@  ã                   @   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                   @   s   e Zd ZdS )ÚLockFailureN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú3/usr/lib/python3/dist-packages/cloudinit/helpers.pyr      s   r   c                   @   s   e Zd ZdS )Ú	DummyLockNr   r   r   r   r   r      s   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__!   s    zDummySemaphores.__init__Fc                 c   s   t ƒ V  d S r   )r   )r   Ú_nameÚ_freqZ_clear_on_failr   r   r   Úlock$   s    zDummySemaphores.lockc                 C   s   dS ©NFr   ©r   r   r   r   r   r   Úhas_run(   s    zDummySemaphores.has_runc                 C   s   dS )NTr   r    r   r   r   Úclear+   s    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   s
   || _ d S r   )Úfn)r   r&   r   r   r   r   0   s    zFileLock.__init__c                 C   s   dt  | ¡| jf S )Nz<%s using file %r>)r	   Zobj_namer&   r   r   r   r   Ú__str__3   s    zFileLock.__str__N)r   r   r   r   r'   r   r   r   r   r%   /   s   r%   c                 C   s   |   dd¡S )Nú-Ú_)Úreplace)Únamer   r   r   Úcanon_sem_name7   s    r,   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   s
   || _ d S r   )Úsem_path)r   r.   r   r   r   r   <   s    zFileSemaphores.__init__Fc                 c   sF   t |ƒ}z|  ||¡V  W n& tk
r@   |r:|  ||¡ ‚ Y nX d S r   )r,   Ú_acquireÚ	Exceptionr"   )r   r+   ÚfreqÚclear_on_failr   r   r   r   ?   s    zFileSemaphores.lockc              	   C   sP   t |ƒ}|  ||¡}zt |¡ W n( ttfk
rJ   t td|¡ Y dS X dS )NzFailed deleting semaphore %sFT)r,   Ú	_get_pathr
   Zdel_fileÚIOErrorÚOSErrorÚlogexcÚLOG)r   r+   r1   Úsem_filer   r   r   r"   I   s    zFileSemaphores.clearc              	   C   sp   |   ||¡rd S |  ||¡}dt ¡ tƒ f }zt ||¡ W n( ttfk
rf   t 	t
d|¡ Y d S X t|ƒS )Nz%s: %s
z Failed writing semaphore file %s)r!   r3   ÚosÚgetpidr   r
   Z
write_filer4   r5   r6   r7   r%   )r   r+   r1   r8   Úcontentsr   r   r   r/   S   s    zFileSemaphores._acquirec                 C   s0   |r|t krdS t|ƒ}|  ||¡}tj |¡S r   )r   r,   r3   r9   ÚpathÚexists)r   r+   r1   Zcnamer8   r   r   r   r!   c   s
    zFileSemaphores.has_runc                 C   s:   | j }|r|tkr tj ||¡S tj |d||f ¡S d S )Nz%s.%s)r.   r   r9   r<   Újoin)r   r+   r1   r.   r   r   r   r3   m   s    zFileSemaphores._get_pathN)F)r   r   r   r   r#   r$   r   r"   r/   r!   r3   r   r   r   r   r-   ;   s   	

r-   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   r@   r   r   r   r   v   s    zRunners.__init__c                 C   sh   |t ks|sd S d }|tkr*| j d¡}n|tkr>| j d¡}|sFd S || jkr^t|ƒ| j|< | j| S )NÚsem)r   r   r@   Ú	get_ipathr   Ú	get_cpathrA   r-   )r   r1   r.   r   r   r   Ú_get_semz   s    
zRunners._get_semNFc           	   
   C   sª   |   |¡}|stƒ }|sg }| ||¡r:t d||¡ dS | |||¡�X}|s\td| ƒ‚n@t d||¡ t|tƒr€|f |Ž}n||Ž }d|fW  5 Q R £ S W 5 Q R X d S )Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)T)	rE   r   r!   r7   Údebugr   r   Ú
isinstanceÚdict)	r   r+   ZfunctorÚargsr1   r2   rB   ZlkZresultsr   r   r   Úrun�   s     

zRunners.run)NF)r   r   r   r   rE   rJ   r   r   r   r   r?   u   s   r?   c                   @   sH   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zedœ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   r@   Ú
datasourceZadditional_fnsZbase_cfgZinclude_vendorr   r   r   r   £   s    zConfigMerger.__init__c                 C   sZ   g }| j rVz&| j  ¡ }|r.t|tƒr.| |¡ W n$ tk
rT   t td| j ¡ Y nX |S )Nz2Failed loading of datasource config object from %s)	rM   Zget_config_objrG   rH   Úappendr0   r
   r6   r7   )r   Zd_cfgsZds_cfgr   r   r   Ú_get_datasource_configs³   s    
ý
z$ConfigMerger._get_datasource_configsc                 C   sT   g }t tjkrPtjt  }z| t |¡¡ W n" tk
rN   t td|¡ Y nX |S )Nz%Failed loading of env. config from %s)	r   r9   ÚenvironrS   r
   Ú	read_confr0   r6   r7   )r   Ze_cfgsZ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 ]v}| j  |¡}|r2tj |¡r2z| t |¡¡ W q2 t	k
r†   t
 d|¡ Y q2 tk
r¦   t t
d|¡ Y q2X q2|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)rL   rP   rS   Úget_ipath_curr9   r<   Úisfiler
   rV   ÚPermissionErrorr7   rF   r0   r6   )r   Zi_cfgsZcc_pathsZcc_pZcc_fnr   r   r   Ú_get_instance_configsÌ   s0    

ý  ÿz"ConfigMerger._get_instance_configs)Úreturnc              	   C   s”   g }| j rN| j D ]<}z| t |¡¡ W q tk
rJ   t td|¡ Y qX q| |  ¡ ¡ | |  	¡ ¡ | |  
¡ ¡ | jrŠ| | j¡ t |¡S )Nz'Failed loading of configuration from %s)rN   rS   r
   rV   r0   r6   r7   ÚextendrW   r^   rT   rO   Zmergemanydict)r   ÚcfgsZc_fnr   r   r   Ú	_read_cfgì   s"    
  ÿzConfigMerger._read_cfgc                 C   s   | j d kr|  ¡ | _ | j S r   )rQ   rb   r   r   r   r   Úcfg  s    

zConfigMerger.cfg)NNNNT)r   r   r   r   rT   rW   r^   rH   rb   Úpropertyrc   r   r   r   r   rK   ¢   s        ú

 rK   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     s    zContentHandlers.__init__c                 C   s
   |   |¡S r   )Úis_registered)r   Úitemr   r   r   Ú__contains__  s    zContentHandlers.__contains__c                 C   s
   |   |¡S r   )Ú_get_handler)r   Úkeyr   r   r   Ú__getitem__  s    zContentHandlers.__getitem__c                 C   s
   || j kS r   ©rf   ©r   Zcontent_typer   r   r   rh     s    zContentHandlers.is_registeredFTc                 C   sj   t ƒ }| ¡ D ](}|r"| |¡ q|  |¡s| |¡ q|D ]}|| j|< q<|rf|| jkrf| j |¡ |S r   )ÚsetZ
list_typesÚaddrh   rf   rg   rS   )r   Úmodrg   Z	overwriteÚtypesÚtr   r   r   Úregister  s    
zContentHandlers.registerc                 C   s
   | j | S r   rn   ro   r   r   r   rk   (  s    zContentHandlers._get_handlerc                 C   s   t | j ¡ ƒS r   )Úlistrf   Úitemsr   r   r   r   rw   +  s    zContentHandlers.itemsN)FT)
r   r   r   r   rj   rm   rh   ru   rk   rw   r   r   r   r   re     s   
re   c                   @   sr   e Zd ZdZdedœdd„Zeddœdd„Zdd	d
„Zddd„Z	ddd„Z
ddd„Zdedœ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¡| _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 S )&NÚ	cloud_dirz/var/lib/cloudÚdocs_dirz/usr/share/doc/cloud-init/Úrun_dirÚinstancezboot-finishedZseedZtemplates_dirz/etc/cloud/templates/z%s.tmplÚ	boothookszcloud-config.txtÚdataÚhandlersúinstance-data.jsonúinstance-data-sensitive.jsonúcombined-cloud-config.jsonznetwork-config.jsonz.instance-idzmanual-cleanzobj.pklÚscriptsrB   zuser-data.txt.izuser-data.txtzvendor-data.txt.iz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)r   rX   r€   r�   Úinstance_dataÚinstance_data_sensitiveÚcombined_cloud_configZnetwork_configZinstance_idZmanual_clean_markerZobj_pklr…   rB   ZuserdataZuserdata_rawZ
vendordataZvendordata2Zvendordata2_rawZvendordata_rawrY   rZ   Zvendor_scriptsr†   r‡   rˆ   )ra   Úgetr{   r|   r   ZDEFAULT_RUN_DIRr}   r9   r<   r>   Úinstance_linkZboot_finishedZseed_dirZtemplate_tplÚlookupsrR   )r   rz   ÚdsZtemplate_dirr   r   r   r   2  sZ     ÿ ÿ ÿâ!zPaths.__init__)Úci_pkl_versionr_   c                 C   sr   t | dƒst| j| jd�j| _d| jkr2d| jd< d| jkrFd| jd< d| jkrZd| jd< d	| jkrnd	| jd	< d
S )z(Perform deserialization fixes for Paths.r}   )rz   r�   r‰   r‚   rŠ   rƒ   r‹   r„   r‡   N)Úhasattrrx   ra   rR   r}   rŽ   )r   r�   r   r   r   Ú	_unpickleg  s    
 ÿ



ÿ
ÿ
zPaths._unpicklec                 C   s   |   | j|¡S r   )r3   r�   ©r   r+   r   r   r   r[   €  s    zPaths.get_ipath_curc                 C   s   |   | j|¡S r   )r3   r{   r“   r   r   r   rD   …  s    zPaths.get_cpathc                 C   sf   | j s
d S | j  ¡ }|d kr d S t|ƒ tjd¡}tj | jd|¡}| j	 
|¡}|rbtj ||¡}|S )Nr)   Z	instances)rR   Zget_instance_idÚstrr*   r9   Úsepr<   r>   r{   rŽ   rŒ   )r   r+   ZiidZpath_safe_iidÚipathZadd_onr   r   r   Ú
_get_ipathŠ  s    
zPaths._get_ipathc                 C   s$   |   |¡}|st d¡ d S |S d S )Nz?No per instance data available, is there an datasource/iid set?)r—   r7   Zwarning)r   r+   r–   r   r   r   rC   š  s    
ÿzPaths.get_ipath)Úbasec                 C   s    |d kr|S t j || j| ¡S r   )r9   r<   r>   rŽ   )r   r˜   r+   r   r   r   r3   ¥  s    zPaths._get_pathc                 C   s   |   | j|¡S r   )r3   r}   r“   r   r   r   Úget_runpathª  s    zPaths.get_runpath)N)N)N)N)N)N)N)r   r   r   Z_ci_pkl_versionrH   r   Úintr’   r[   rD   r—   rC   r”   r3   r™   r   r   r   r   rx   /  s   5



rx   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   sD   | j }zt | ||¡}W n& tk
r,   Y n tk
r>   Y nX |S 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)Zhas_sectionÚlowerZadd_sectionr   rp   r�   r   r   r   rp   È  s    
zDefaultingConfigParser.setc                 C   s   |   ||¡rt | ||¡ d S r   )Ú
has_optionr   Úremove_option©r   rž   rŸ   r   r   r   r¤   Í  s    z$DefaultingConfigParser.remove_optionc                 C   s    |   ||¡s| jS t | ||¡S r   )r£   ÚDEF_BOOLEANr   Ú
getbooleanr¥   r   r   r   r§   Ñ  s    z!DefaultingConfigParser.getbooleanc                 C   s    |   ||¡s| jS t | ||¡S r   )r£   Ú	DEF_FLOATr   Úgetfloatr¥   r   r   r   r©   Ö  s    zDefaultingConfigParser.getfloatc                 C   s    |   ||¡s| jS t | ||¡S r   )r£   ÚDEF_INTr   Úgetintr¥   r   r   r   r«   Û  s    zDefaultingConfigParser.getintc                 C   s<   d}t ƒ }|  |¡ | ¡  | ¡ }|r8d ||dg¡}|S )NÚ Ú
)r   ÚwriteÚflushÚgetvaluer>   )r   Úheaderr;   Zoutputstreamr   r   r   Ú	stringifyà  s    
z DefaultingConfigParser.stringify)N)N)r   r   r   rª   r¨   r¦   rœ   rŒ   rp   r¤   r§   r©   r«   r²   r   r   r   r   r›   ¸  s   

r›   )$r#   Zloggingr9   Zconfigparserr   r   r   Úior   r   Z	cloudinitr   r   r	   r
   Zcloudinit.settingsr   r   r   r   Z	getLoggerr   r7   r0   r   r   r   r%   r,   r-   r?   rK   re   ZCloudInitPickleMixinrx   r›   r   r   r   r   Ú<module>   s(   
:-j# 
