
-P`>                 @   s  d  d l  m  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
 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 e j e  Z Gd
 d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d d   Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z  Gd d   d e  Z! Gd d   d e j"  Z# Gd d   d e  Z$ d S)     )timeN)NoSectionErrorNoOptionErrorRawConfigParser)StringIO)PER_INSTANCE
PER_ALWAYSPER_ONCECFG_ENV_NAME)log)
type_utils)persistence)utilc               @   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)	DummyLockN)r   r   r   r   r   r   r   r   !   s   r   c               @   sX   e  Z d  Z d d   Z e j d d d   Z 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   clear0   s    zDummySemaphores.clearc             C   s   d  S)Nr   )r   r   r   r   	clear_all3   s    zDummySemaphores.clear_allN)
r   r   r   r   
contextlibcontextmanagerr   r   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   8   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__;   s    zFileLock.__str__N)r   r   r   r   r#   r   r   r   r   r!   7   s   r!   c             C   s   |  j  d d  S)N-_)replace)namer   r   r   canon_sem_name?   s    r(   c               @   sp   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 d   Z d S)FileSemaphoresc             C   s   | |  _  d  S)N)sem_path)r   r*   r   r   r   r   D   s    zFileSemaphores.__init__Fc             c   sS   t  |  } y |  j | |  VWn+ t k
 rN | rG |  j | |    Yn Xd  S)N)r(   _acquire	Exceptionr   )r   r'   freqclear_on_failr   r   r   r   G   s    zFileSemaphores.lockc             C   se   t  |  } |  j | |  } y t j |  Wn/ t t f k
 r` t j t d |  d SYn Xd S)NzFailed deleting semaphore %sFT)r(   	_get_pathr   Zdel_fileIOErrorOSErrorlogexcLOG)r   r'   r-   sem_filer   r   r   r   Q   s    	zFileSemaphores.clearc             C   sI   y t  j |  j  Wn. t t f k
 rD t  j t d |  j  Yn Xd  S)Nz&Failed deleting semaphore directory %s)r   Zdel_dirr*   r0   r1   r2   r3   )r   r   r   r   r   [   s
    zFileSemaphores.clear_allc             C   s   |  j  | |  r d  S|  j | |  } d t j   t   f } y t j | |  Wn/ t t f k
 r t j	 t
 d |  d  SYn Xt |  S)Nz%s: %s
z Failed writing semaphore file %s)r   r/   osgetpidr   r   Z
write_filer0   r1   r2   r3   r!   )r   r'   r-   r4   contentsr   r   r   r+   b   s    	zFileSemaphores._acquirec             C   s   | s | t  k r d St |  } |  j | |  } t j j |  rK d S| | k r t j j |  j | |   r t j d | |  d Sd 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/   r5   pathexistsr3   warning)r   r'   r-   Zcnamer4   r   r   r   r   r   s    *	
zFileSemaphores.has_runc             C   sP   |  j  } | s | t k r/ t j j | |  St j j | d | | f  Sd  S)Nz%s.%s)r*   r   r5   r8   join)r   r'   r-   r*   r   r   r   r/      s    	zFileSemaphores._get_pathN)r   r   r   r   r   r    r   r   r   r+   r   r/   r   r   r   r   r)   C   s   	
r)   c               @   s:   e  Z d  Z d d   Z d d   Z d 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   s   | t  k s | r d  Sd  } | t k r> |  j j d  } n | t k r\ |  j j d  } | sf d  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 | |  rS t j d | |  d S| j | | |  g } | s t d |   nG t j d | |  t | t  r | |   } n | |   } d | f SWd  QRXd  S)Nz%s already ran (freq=%s)FzFailed to acquire lock for %szRunning %s using lock (%s)T)FN)	rB   r   r   r3   debugr   r   
isinstancedict)	r   r'   Zfunctorargsr-   r.   r?   ZlkZresultsr   r   r   run   s     	zRunners.run)r   r   r   r   rB   rG   r   r   r   r   r<      s   r<   c               @   sm   e  Z d  Z d d d d d d d  Z d d   Z d d   Z d	 d
   Z 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   ss   g  } |  j  ro y5 |  j  j   } | rC t | t  rC | j |  Wn( t k
 rn t j t d |  j   Yn X| S)Nz2Failed loading of datasource config object from %s)	rJ   Zget_config_objrD   rE   appendr,   r   r2   r3   )r   Zd_cfgsZds_cfgr   r   r   _get_datasource_configs   s    	z$ConfigMerger._get_datasource_configsc             C   sh   g  } t  t j k rd t j t  } y | j t j |   Wn% t k
 rc t j t d |  Yn X| S)Nz%Failed loading of env. config from %s)	r
   r5   environrP   r   	read_confr,   r2   r3   )r   Ze_cfgsZe_fnr   r   r   _get_env_configs   s    zConfigMerger._get_env_configsc             C   s   g  } |  j  s | Sd g } |  j r? | j d  | j d  x | D] } |  j  j |  } | rF t j j |  rF y | j t j |   WqF t	 k
 r t
 j d |  YqF t k
 r t j t
 d |  YqF XqF W| 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)rI   rM   rP   get_ipath_curr5   r8   isfiler   rS   PermissionErrorr3   rC   r,   r2   )r   Zi_cfgsZcc_pathsZcc_pZcc_fnr   r   r   _get_instance_configs   s(    			z"ConfigMerger._get_instance_configsc             C   s   g  } |  j  re xS |  j  D]H } y | j t j |   Wq t k
 r` t j t d |  Yq Xq W| j |  j    | j |  j	    | j |  j
    |  j r | j |  j  t j |  S)Nz'Failed loading of configuration from %s)rK   rP   r   rS   r,   r2   r3   extendrT   r[   rQ   rL   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)rN   r^   )r   r   r   r   cfg  s    zConfigMerger.cfg)
r   r   r   r   rQ   rT   r[   r^   propertyr_   r   r   r   r   rH      s   	rH   c               @   sj   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 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   s   t    } xF | j   D]8 } | r2 | j |  q |  j |  s | j |  q Wx | D] } | |  j | <qY W| r | |  j k r |  j j |  | S)N)setZ
list_typesaddrd   rb   rc   rP   )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   :  s    zContentHandlers._get_handlerc             C   s   t  |  j j    S)N)listrb   items)r   r   r   r   rr   =  s    zContentHandlers.itemsN)
r   r   r   r   rf   ri   rd   rp   rg   rr   r   r   r   r   ra     s   ra   c               @   s   e  Z d  Z d Z 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 d d  Z d d d  Z d S)Paths   Nc          &   C   sH  | |  _  | j d d  |  _ | j d d  |  _ t j j |  j d  |  _ t j j |  j d  |  _ | 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 d  d! d" d# d$ d% d& d' d( d) d* d+ d+ i |  _ | |  _ d  S),N	cloud_dirz/var/lib/cloudrun_dirz/run/cloud-initinstancezboot-finishedZupstart_dirZseedZtemplates_dirz/etc/cloud/templates/z%s.tmplZhandlersscriptsZvendor_scriptszscripts/vendorr?   Z	boothooksZuserdata_rawzuser-data.txtZuserdatazuser-data.txt.iZobj_pklzobj.pklrU   zcloud-config.txtrW   zvendor-cloud-config.txtrV   zvendor2-cloud-config.txtdataZvendordata_rawzvendor-data.txtZvendordata2_rawzvendor-data2.txtZ
vendordatazvendor-data.txt.iZvendordata2zvendor-data2.txt.iZinstance_idz.instance-idZmanual_clean_markerzmanual-cleanwarnings)r]   getru   rv   r5   r8   r;   instance_linkZboot_finishedZupstart_conf_dZseed_dirZtemplate_tpllookupsrO   )r   	path_cfgsdsZtemplate_dirr   r   r   r   D  s:    	zPaths.__init__)ci_pkl_versionreturnc             C   s4   t  |  d  s0 t d |  j d |  j  j |  _ d S)z(Perform deserialization fixes for Paths.rv   r~   r   N)hasattrrs   r]   rO   rv   )r   r   r   r   r   	_unpickleh  s    	zPaths._unpicklec             C   s   |  j  |  j |  S)N)r/   r|   )r   r'   r   r   r   rX   u  s    zPaths.get_ipath_curc             C   s   |  j  |  j |  S)N)r/   ru   )r   r'   r   r   r   rA   z  s    zPaths.get_cpathc             C   s   |  j  s d  S|  j  j   } | d  k r, d  St |  j t j d  } t j j |  j d |  } |  j	 j
 |  } | r t j j | |  } | S)Nr%   Z	instances)rO   Zget_instance_idstrr&   r5   sepr8   r;   ru   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| Sd  S)Nz?No per instance data available, is there an datasource/iid set?)r   r3   r:   )r   r'   r   r   r   r   r@     s
    zPaths.get_ipathc             C   s*   | d  k r | St  j j | |  j |  S)N)r5   r8   r;   r}   )r   baser'   r   r   r   r/     s    zPaths._get_pathc             C   s   |  j  |  j |  S)N)r/   rv   )r   r'   r   r   r   get_runpath  s    zPaths.get_runpath)r   r   r   Z_ci_pkl_versionr   intr   rX   rA   r   r@   r/   r   r   r   r   r   rs   A  s   $	rs   c               @   s   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   sL   |  j  } y t j |  | |  } Wn# t k
 r6 Yn t k
 rG Yn X| S)N)DEF_BASEr   r{   r   r   )r   sectionoptionvaluer   r   r   r{     s    	zDefaultingConfigParser.getc             C   sI   |  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 St j |  | |  S)N)r   DEF_BOOLEANr   
getboolean)r   r   r   r   r   r   r     s    z!DefaultingConfigParser.getbooleanc             C   s,   |  j  | |  s |  j St j |  | |  S)N)r   	DEF_FLOATr   getfloat)r   r   r   r   r   r   r     s    zDefaultingConfigParser.getfloatc             C   s,   |  j  | |  s |  j St j |  | |  S)N)r   DEF_INTr   getint)r   r   r   r   r   r   r     s    zDefaultingConfigParser.getintc             C   sT   d } t    } |  j |  | j   | j   } | rP d j | | d g  } | S)N 
)r   writeflushgetvaluer;   )r   headerr7   Zoutputstreamr   r   r   	stringify  s    	
z DefaultingConfigParser.stringify)r   r   r   r   r   r   r   r{   rk   r   r   r   r   r   r   r   r   r   r     s   
r   )%r   r   r5   configparserr   r   r   ior   Zcloudinit.settingsr   r   r	   r
   Z	cloudinitr   Zloggingr   r   r   Z	getLoggerr   r3   r,   r   objectr   r   r!   r(   r)   r<   rH   ra   ZCloudInitPickleMixinrs   r   r   r   r   r   <module>   s*   "N-_$i