
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼me¡A  ã               @   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 d dlmZmZmZmZ ej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Ú
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   ú/usr/lib/python3.6/helpers.pyr      s   r   c               @   s   e Zd ZdS )Ú	DummyLockN)r   r   r   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 )N)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   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 )N)Úfn)r   r    r   r   r   r   0   s    zFileLock.__init__c             C   s   dt j| ƒ| 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   | j 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 )N)Úsem_path)r   r(   r   r   r   r   <   s    zFileSemaphores.__init__Fc             c   sF   t |ƒ}y| j||ƒV  W n& tk
r@   |r:| j||ƒ ‚ Y nX d S )N)r&   Ú_acquireÚ	Exceptionr   )r   r%   ÚfreqÚclear_on_failr   r   r   r   ?   s    zFileSemaphores.lockc             C   sN   t |ƒ}| j||ƒ}ytj|ƒ W n& ttfk
rH   tjtd|ƒ dS X dS )NzFailed deleting semaphore %sFT)r&   Ú	_get_pathr	   Zdel_fileÚIOErrorÚOSErrorÚlogexcÚLOG)r   r%   r+   Úsem_filer   r   r   r   I   s    zFileSemaphores.clearc             C   sn   | j ||ƒrd S | j||ƒ}dtjƒ tƒ f }ytj||ƒ W n& ttfk
rd   tj	t
d|ƒ d S X t|ƒS )Nz%s: %s
z Failed writing semaphore file %s)r   r-   ÚosÚgetpidr   r	   Z
write_filer.   r/   r0   r1   r   )r   r%   r+   r2   Úcontentsr   r   r   r)   S   s    zFileSemaphores._acquirec             C   sh   | s|t krdS t|ƒ}| j||ƒ}tjj|ƒr6dS ||krdtjj| j||ƒƒrdtjd||ƒ dS dS )NFTzœ%s has run without canonicalized name [%s].
likely the migrator has not yet run. It will run next boot.
run manually with: cloud-init single --name=migrator)r   r&   r-   r3   ÚpathÚexistsr1   Úwarning)r   r%   r+   Zcnamer2   r   r   r   r   c   s    zFileSemaphores.has_runc             C   s<   | j }| s|tkr"tjj||ƒS tjj|d||f ƒS d S )Nz%s.%s)r(   r   r3   r6   Újoin)r   r%   r+   r(   r   r   r   r-   }   s    zFileSemaphores._get_pathN)F)r   r   r   r   r   r   r   r   r)   r   r-   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 )N)ÚpathsÚsems)r   r;   r   r   r   r   †   s    zRunners.__init__c             C   sj   |t ks| rd S d }|tkr,| jjdƒ}n|tkr@| jjdƒ}|sHd S || jkr`t|ƒ| j|< | j| S )NÚsem)r   r   r;   Ú	get_ipathr   Ú	get_cpathr<   r'   )r   r+   r(   r   r   r   Ú_get_semŠ   s    
zRunners._get_semNFc       	      C   sž   | j |ƒ}|stƒ }|sg }|j||ƒr:tjd||ƒ dS |j|||ƒ�L}|s\td| ƒ‚n4tjd||ƒ t|tƒr€|f |Ž}n||Ž }d|fS W d Q R X d S )Nz%s already ran (freq=%s)FzFailed to acquire lock for %szRunning %s using lock (%s)T)FN)	r@   r   r   r1   Údebugr   r   Ú
isinstanceÚdict)	r   r%   ZfunctorÚargsr+   r,   r=   ZlkÚresultsr   r   r   Úrun�   s     

zRunners.run)NF)r   r   r   r   r@   rF   r   r   r   r   r:   …   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 )N)Ú_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 rVy&| j jƒ }|r.t|tƒr.|j|ƒ W n$ tk
rT   tjtd| j ƒ Y nX |S )Nz2Failed loading of datasource config object from %s)	rI   Zget_config_objrB   rC   Úappendr*   r	   r0   r1   )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  }y|jtj|ƒƒ W n" tk
rN   tjtd|ƒ Y nX |S )Nz%Failed loading of env. config from %s)	r
   r3   ÚenvironrO   r	   Ú	read_confr*   r0   r1   )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.|jdƒ |jdƒ x~|D ]v}| j j|ƒ}|r4tjj|ƒr4y|jtj|ƒƒ W q4 t	k
rˆ   t
jd|ƒ Y q4 tk
r¨   tjt
d|ƒ Y q4X q4W |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)rH   rL   rO   Úget_ipath_curr3   r6   Úisfiler	   rR   ÚPermissionErrorr1   rA   r*   r0   )r   Zi_cfgsZcc_pathsZcc_pZcc_fnr   r   r   Ú_get_instance_configsÜ   s(    



z"ConfigMerger._get_instance_configs)Úreturnc             C   s˜   g }| j rRxF| j D ]<}y|jtj|ƒƒ W q tk
rL   tjtd|ƒ Y qX qW |j| jƒ ƒ |j| j	ƒ ƒ |j| j
ƒ ƒ | jrŽ|j| jƒ tj|ƒS )Nz'Failed loading of configuration from %s)rJ   rO   r	   rR   r*   r0   r1   ÚextendrS   rZ   rP   rK   Zmergemanydict)r   ÚcfgsZc_fnr   r   r   Ú	_read_cfgü   s    zConfigMerger._read_cfgc             C   s   | j d kr| jƒ | _ | j S )N)rM   r^   )r   r   r   r   Úcfg  s    

zConfigMerger.cfg)NNNNT)r   r   r   r   rP   rS   rZ   rC   r^   Úpropertyr_   r   r   r   r   rG   ²   s       


 rG   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 )N)Ú
registeredÚinitialized)r   r   r   r   r     s    zContentHandlers.__init__c             C   s
   | j |ƒS )N)Úis_registered)r   Úitemr   r   r   Ú__contains__!  s    zContentHandlers.__contains__c             C   s
   | j |ƒS )N)Ú_get_handler)r   Úkeyr   r   r   Ú__getitem__$  s    zContentHandlers.__getitem__c             C   s
   || j kS )N)rb   )r   Úcontent_typer   r   r   rd   '  s    zContentHandlers.is_registeredFTc             C   sr   t ƒ }x4|jƒ D ](}|r$|j|ƒ q| j|ƒs|j|ƒ qW x|D ]}|| j|< qBW |rn|| jkrn| jj|ƒ |S )N)ÚsetZ
list_typesÚaddrd   rb   rc   rO   )r   Úmodrc   Z	overwriteÚtypesÚtr   r   r   Úregister*  s    

zContentHandlers.registerc             C   s
   | j | S )N)rb   )r   rj   r   r   r   rg   8  s    zContentHandlers._get_handlerc             C   s   t | jjƒ ƒS )N)Úlistrb   Úitems)r   r   r   r   rr   ;  s    zContentHandlers.itemsN)FT)
r   r   r   r   rf   ri   rd   rp   rg   rr   r   r   r   r   ra     s   
ra   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´   || _ |jddƒ| _|jddƒ| _tjj| jdƒ| _tjj| jdƒ| _tjj| jdƒ| _	|jdd	ƒ}tj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 S )#NÚ	cloud_dirz/var/lib/cloudÚrun_dirz/run/cloud-initÚinstancezboot-finishedZseedZtemplates_dirz/etc/cloud/templates/z%s.tmplÚ	boothookszcloud-config.txtÚdataÚhandlerszinstance-data.jsonzinstance-data-sensitive.jsonzcombined-cloud-config.jsonznetwork-config.jsonz.instance-idzmanual-cleanzobj.pklÚscriptsr=   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)ry   rT   rz   r{   Úinstance_dataÚinstance_data_sensitiveÚcombined_cloud_configZnetwork_configZinstance_idZmanual_clean_markerZobj_pklr|   r=   ZuserdataZuserdata_rawZ
vendordataZvendordata2Zvendordata2_rawZvendordata_rawrU   rV   Zvendor_scriptsr}   )r]   Úgetrv   rw   r3   r6   r9   Úinstance_linkZboot_finishedZseed_dirZtemplate_tplÚlookupsrN   )r   ru   ÚdsZtemplate_dirr   r   r   r   B  sD    
zPaths.__init__)Úci_pkl_versionr[   c             C   s^   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	S )
z(Perform deserialization fixes for Paths.rw   )ru   r„   r~   zinstance-data.jsonr   zinstance-data-sensitive.jsonr€   zcombined-cloud-config.jsonN)Úhasattrrs   r]   rN   rw   rƒ   )r   r…   r   r   r   Ú	_unpickler  s    





zPaths._unpicklec             C   s   | j | j|ƒS )N)r-   r‚   )r   r%   r   r   r   rW   ‰  s    zPaths.get_ipath_curc             C   s   | j | j|ƒS )N)r-   rv   )r   r%   r   r   r   r?   Ž  s    zPaths.get_cpathc             C   sf   | j s
d S | j jƒ }|d kr d S t|ƒjtjdƒ}tjj| jd|ƒ}| j	j
|ƒ}|rbtjj||ƒ}|S )Nr#   Z	instances)rN   Zget_instance_idÚstrr$   r3   Úsepr6   r9   rv   rƒ   r�   )r   r%   ZiidZpath_safe_iidÚipathZadd_onr   r   r   Ú
_get_ipath“  s    
zPaths._get_ipathc             C   s$   | j |ƒ}|stjdƒ d S |S d S )Nz?No per instance data available, is there an datasource/iid set?)r‹   r1   r8   )r   r%   rŠ   r   r   r   r>   £  s    
zPaths.get_ipath)Úbasec             C   s    |d kr|S t jj|| j| ƒS )N)r3   r6   r9   rƒ   )r   rŒ   r%   r   r   r   r-   ®  s    zPaths._get_pathc             C   s   | j | j|ƒS )N)r-   rw   )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_versionrC   r   Úintr‡   rW   r?   r‹   r>   rˆ   r-   r�   r   r   r   r   rs   ?  s   0



rs   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 }ytj| ||ƒ}W n& tk
r,   Y n tk
r>   Y nX |S )N)ÚDEF_BASEr   r�   r   r   )r   ÚsectionÚoptionÚvaluer   r   r   r�   Ç  s    zDefaultingConfigParser.getc             C   s6   | j |ƒ r"|jƒ dkr"| j|ƒ tj| |||ƒ d S )NÚdefault)Zhas_sectionÚlowerZadd_sectionr   rk   )r   r‘   r’   r“   r   r   r   rk   Ñ  s    
zDefaultingConfigParser.setc             C   s   | j ||ƒrtj| ||ƒ d S )N)Ú
has_optionr   Úremove_option)r   r‘   r’   r   r   r   r—   Ö  s    z$DefaultingConfigParser.remove_optionc             C   s    | j ||ƒs| jS tj| ||ƒS )N)r–   ÚDEF_BOOLEANr   Ú
getboolean)r   r‘   r’   r   r   r   r™   Ú  s    z!DefaultingConfigParser.getbooleanc             C   s    | j ||ƒs| jS tj| ||ƒS )N)r–   Ú	DEF_FLOATr   Úgetfloat)r   r‘   r’   r   r   r   r›   ß  s    zDefaultingConfigParser.getfloatc             C   s    | j ||ƒs| jS tj| ||ƒS )N)r–   ÚDEF_INTr   Úgetint)r   r‘   r’   r   r   r   r�   ä  s    zDefaultingConfigParser.getintc             C   s<   d}t ƒ }| j|ƒ |jƒ  |jƒ }|r8dj||dgƒ}|S )NÚ Ú
)r   ÚwriteÚflushÚgetvaluer9   )r   Úheaderr5   Zoutputstreamr   r   r   Ú	stringifyé  s    
z DefaultingConfigParser.stringify)N)N)r   r   r   rœ   rš   r˜   r�   r�   rk   r—   r™   r›   r�   r¤   r   r   r   r   r�   Á  s   

r�   )#r   Zloggingr3   Zconfigparserr   r   r   Úior   r   Z	cloudinitr   r   r	   Zcloudinit.settingsr
   r   r   r   Z	getLoggerr   r1   r*   r   r   r   r   r&   r'   r:   rG   ra   ZCloudInitPickleMixinrs   r�   r   r   r   r   Ú<module>   s(   
J-j# 