
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\meA                 @   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# 