
    }fq@                        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j(                  e      Z G d de      Z G d	 d
      Z G d d      Z G d d      Zd Z G d d      Z G d d      Z G d d      Z G d d      Z  G d dejB                        Z" G d de      Z#y)    N)NoOptionErrorNoSectionErrorRawConfigParser)StringIO)time)persistencesettings
type_utilsutil)CFG_ENV_NAME
PER_ALWAYSPER_INSTANCEPER_ONCEc                       e Zd Zy)LockFailureN__name__
__module____qualname__     3/usr/lib/python3/dist-packages/cloudinit/helpers.pyr   r          r   r   c                       e Zd Zy)	DummyLockNr   r   r   r   r   r      r   r   r   c                   D    e Zd Zd Zej
                  dd       Zd Zd Zy)DummySemaphoresc                      y Nr   selfs    r   __init__zDummySemaphores.__init__!   s    r   c              #   $   K   t                y wr   )r   )r!   _name_freq_clear_on_fails       r   lockzDummySemaphores.lock$   s     ks   c                      yNFr   r!   r$   r%   s      r   has_runzDummySemaphores.has_run(   s    r   c                      y)NTr   r*   s      r   clearzDummySemaphores.clear+   s    r   NF)	r   r   r   r"   
contextlibcontextmanagerr'   r+   r-   r   r   r   r   r       s+      r   r   c                       e Zd Zd Zd Zy)FileLockc                     || _         y r   )fn)r!   r4   s     r   r"   zFileLock.__init__0   s	    r   c                 N    dt        j                  |       d| j                  dS )N<z using file >)r
   obj_namer4   r    s    r   __str__zFileLock.__str__3   s    '1':':4'@$''JJr   N)r   r   r   r"   r9   r   r   r   r2   r2   /   s    Kr   r2   c                 &    | j                  dd      S )N-_)replace)names    r   canon_sem_namer?   7   s    <<S!!r   c                   P    e Zd Zd Zej
                  dd       Zd Zd Zd Z	d Z
y)	FileSemaphoresc                     || _         y r   )sem_path)r!   rC   s     r   r"   zFileSemaphores.__init__<   s	     r   c              #      K   t        |      }	 | j                  ||       y # t        $ r |r| j                  ||        w xY wwr   )r?   _acquire	Exceptionr-   )r!   r>   freqclear_on_fails       r   r'   zFileSemaphores.lock?   sH     d#	--d++ 	

4&	s   A$ AAAc                     t        |      }| j                  ||      }	 t        j                  |       y# t        t
        f$ r t        j                  t        d|       Y yw xY w)NzFailed deleting semaphore %sFT)r?   	_get_pathr   del_fileIOErrorOSErrorlogexcLOG)r!   r>   rG   sem_files       r   r-   zFileSemaphores.clearI   s\    d#>>$-	MM(#  ! 	KK;XF	s   5 *A"!A"c                 4   | j                  ||      ry | j                  ||      }t        j                         dt	               d}	 t        j                  ||       t        |      S # t        t        f$ r t        j                  t        d|       Y y w xY w)Nz: 
z Failed writing semaphore file %s)r+   rJ   osgetpidr   r   
write_filerL   rM   rN   rO   r2   )r!   r>   rG   rP   contentss        r   rE   zFileSemaphores._acquireS   s    <<d# >>$-!#df5	OOHh/ !! ! 	KK?J	s   	A* **BBc                     |r	|t         k(  ryt        |      }| j                  ||      }t        j                  j                  |      S r)   )r   r?   rJ   rS   pathexists)r!   r>   rG   cnamerP   s        r   r+   zFileSemaphores.has_runc   s>    tz)t$>>%. ww~~h''r   c                     | j                   }|r	|t        k(  r t        j                  j	                  ||      S t        j                  j	                  ||d|      S )N.)rC   r   rS   rX   join)r!   r>   rG   rC   s       r   rJ   zFileSemaphores._get_pathm   sD    ==t|+77<<$//77<<T4*@AAr   Nr.   )r   r   r   r"   r/   r0   r'   r-   rE   r+   rJ   r   r   r   rA   rA   ;   s6    !  " (Br   rA   c                        e Zd Zd Zd ZddZy)Runnersc                      || _         i | _        y r   )pathssems)r!   ra   s     r   r"   zRunners.__init__v   s    
	r   c                     |t         k(  s|sy d }|t        k(  r| j                  j                  d      }n$|t        k(  r| j                  j                  d      }|sy || j                  vrt        |      | j                  |<   | j                  |   S )Nsem)r   r   ra   	get_ipathr   	get_cpathrb   rA   )r!   rG   rC   s      r   _get_semzRunners._get_semz   s    :T< zz++E2HXzz++E2H499$"0":DIIhyy""r   Nc                 |   | j                  |      }|s
t               }|sg }|j                  ||      rt        j	                  d||       y|j                  |||      5 }|st        d|z        t        j	                  d||       t        |t              r	 |di |}n || }d|fcd d d        S # 1 sw Y   y xY w)Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)Tr   )	rg   r   r+   rO   debugr'   r   
isinstancedict)	r!   r>   functorargsrG   rH   rd   lkresultss	            r   runzRunners.run   s    mmD!!#CD;;tT"II0$= XXdD-0 		'B!"AD"HII		6bAdT+%ooG%tnGg		' 		' 		's   A	B22B;r)   )r   r   r   r"   rg   rp   r   r   r   r_   r_   u   s    #&'r   r_   c                   L    e Zd Z	 	 	 	 	 d	dZd Zd Zd ZdefdZe	d        Z
y)
ConfigMergerNc                 X    || _         || _        || _        || _        || _        d | _        y r   )_paths_ds_fns	_base_cfg_include_vendor_cfg)r!   ra   
datasourceadditional_fnsbase_cfginclude_vendors         r   r"   zConfigMerger.__init__   s/     "	!-	r   c                    g }| j                   r@	 | j                   j                         }|r!t        |t              r|j	                  |       |S |S # t
        $ r) t        j                  t        d| j                          Y |S w xY w)Nz2Failed loading of datasource config object from %s)	ru   get_config_objrj   rk   appendrF   r   rN   rO   )r!   d_cfgsds_cfgs      r   _get_datasource_configsz$ConfigMerger._get_datasource_configs   sy    88	002j$8MM&) v  HHH
 s   =A .BBc                    g }t         t        j                  v r>t        j                  t            }	 |j                  t	        j
                  |             |S |S # t        $ r t	        j                  t        d|       Y |S w xY w)Nz%Failed loading of env. config from %s)	r   rS   environr   r   	read_confrF   rN   rO   )r!   e_cfgse_fns      r   _get_env_configszConfigMerger._get_env_configs   sp    2::%::l+DPdnnT23 v  PC!H$OPs   $A $B Bc                    g }| j                   s|S dg}| j                  r"|j                  d       |j                  d       |D ]e  }| j                   j                  |      }|s!t        j
                  j                  |      sA	 |j                  t        j                  |             g |S # t        $ r t        j                  d|       Y t        $ r t        j                  t        d|       Y w xY w)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)rt   rx   r   get_ipath_currS   rX   isfiler   r   PermissionErrorrO   ri   rF   rN   )r!   i_cfgscc_pathscc_pcc_fns        r   _get_instance_configsz"ConfigMerger._get_instance_configs   s     {{M"# OO23OO12 	DKK--d3E.MM$.."78		  ' II%
 ! KKEus   $B..C5#C54C5returnc                    g }| j                   r6| j                   D ]'  }	 |j                  t        j                  |             ) |j                  | j                                |j                  | j                                |j                  | j                                | j                  r|j                  | j                         t        j                  |      S # t        $ r t        j
                  t        d|       Y w xY w)Nz'Failed loading of configuration from %s)rv   r   r   r   rF   rN   rO   extendr   r   r   rw   mergemanydict)r!   cfgsc_fns      r   	_read_cfgzConfigMerger._read_cfg   s     99		 KKt 45 	D))+,D..01D0023>>KK'!!$'' ! KKFs   $C$DDc                 \    | j                   | j                         | _         | j                   S r   )ry   r   r    s    r   cfgzConfigMerger.cfg  s&     99(DIyyr   )NNNNT)r   r   r   r"   r   r   r   rk   r   propertyr   r   r   r   rr   rr      sH      @(4 (0  r   rr   c                   8    e Zd Zd Zd Zd Zd Zd	dZd Zd Z	y)
ContentHandlersc                      i | _         g | _        y r   )
registeredinitializedr    s    r   r"   zContentHandlers.__init__  s    r   c                 $    | j                  |      S r   )is_registered)r!   items     r   __contains__zContentHandlers.__contains__  s    !!$''r   c                 $    | j                  |      S r   )_get_handler)r!   keys     r   __getitem__zContentHandlers.__getitem__  s      %%r   c                     || j                   v S r   r   r!   content_types     r   r   zContentHandlers.is_registered  s    t..r   c                 4   t               }|j                         D ]9  }|r|j                  |       | j                  |      r)|j                  |       ; |D ]  }|| j                  |<    |r)|| j
                  vr| j
                  j                  |       |S r   )set
list_typesaddr   r   r   r   )r!   modr   	overwritetypests         r   registerzContentHandlers.register  s    ! 	!A		!))!,IIaL	!  	%A!$DOOA	%3d&6&66##C(r   c                      | j                   |   S r   r   r   s     r   r   zContentHandlers._get_handler(  s    |,,r   c                 H    t        | j                  j                               S r   )listr   itemsr    s    r   r   zContentHandlers.items+  s    DOO))+,,r   N)FT)
r   r   r   r"   r   r   r   r   r   r   r   r   r   r   r     s%    (&/--r   r   c                   d    e Zd ZdZddefdZdeddfdZddZdd	Z	dd
Z
ddZddefdZddZy)Paths   N	path_cfgsc           	         || _         |j                  dd      | _        |j                  dd      | _        |j                  dt        j
                        | _        t        j                  j                  | j                  d      | _
        t        j                  j                  | j                  d      | _        t        j                  j                  | j                  d      | _        |j                  d	d
      }t        j                  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/d0| _        || _        y )1N	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	boothooksr   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scriptsrd   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)vendordata2_rawvendordata_rawr   r   vendor_scriptsr   r   )r   getr   r   r	   DEFAULT_RUN_DIRr   rS   rX   r]   instance_linkboot_finishedseed_dirtemplate_tpllookupsrz   )r!   r   dstemplate_dirs       r   r"   zPaths.__init__2  s   	'mmK9IJ&]]4
 &MM)X5M5MN"$'',,t~~z"J"$'',,#
  WW\\$..&A%MM4
 "$lI!F

.
 F
 
	
 1
 &'E
 $%A
 3
 >
 ">
  y!
" y#
$ 5%
& )'
( O)
* -+
, /-
.  2/$>#<."0;
@ r   ci_pkl_versionr   c                 f   t        | d      s0t        | j                  | j                        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rd	| j
                  d	<   y
y
)z(Perform deserialization fixes for Paths.r   )r   r   r   r   r   r   r   r   r   N)hasattrr   r   rz   r   r   )r!   r   s     r   	_unpicklezPaths._unpicklef  s    tY' !))g L $,,.,@DLL)$DLL8 / LL) #$,,6 - LL' DLL0.?DLL*+ 1r   c                 :    | j                  | j                  |      S r   )rJ   r   r!   r>   s     r   r   zPaths.get_ipath_cur  s    ~~d00$77r   c                 :    | j                  | j                  |      S r   )rJ   r   r   s     r   rf   zPaths.get_cpath  s    ~~dnnd33r   c                 |   | j                   sy | j                   j                         }|y t        |      j                  t        j
                  d      }t        j                  j                  | j                  d|      }| j                  j                  |      }|r t        j                  j                  ||      }|S )Nr<   	instances)rz   get_instance_idstrr=   rS   seprX   r]   r   r   r   )r!   r>   iidpath_safe_iidipathadd_ons         r   
_get_ipathzPaths._get_ipath  s    oo--/;C((5T^^[-H!!$'GGLL/Er   c                 X    | j                  |      }|st        j                  d       y |S )Nz?No per instance data available, is there an datasource/iid set?)r   rO   warning)r!   r>   r   s      r   re   zPaths.get_ipath  s.    %KK2 Lr   basec                 d    ||S t         j                  j                  || j                  |         S r   )rS   rX   r]   r   )r!   r   r>   s      r   rJ   zPaths._get_path  s*    <Kww||D$,,t"455r   c                 :    | j                  | j                  |      S r   )rJ   r   r   s     r   get_runpathzPaths.get_runpath  s    ~~dllD11r   r   )r   r   r   _ci_pkl_versionrk   r"   intr   r   rf   r   re   r   rJ   r   r   r   r   r   r   /  sO    O2$ 2h@ @ @28
4
 	6c 6
2r   r   c                   J    e Zd ZdZdZdZdZd ZddZd Z	d Z
d	 Zd
 ZddZy)DefaultingConfigParserr   g        FNc                     | j                   }	 t        j                  | ||      }|S # t        $ r Y |S t        $ r Y |S w xY wr   )DEF_BASEr   r   r   r   r!   sectionoptionvalues       r   r   zDefaultingConfigParser.get  sX    	#''gv>E
 	  	   		s   ' 	???c                     | j                  |      s$|j                         dk7  r| j                  |       t        j                  | |||       y )Ndefault)has_sectionloweradd_sectionr   r   r  s       r   r   zDefaultingConfigParser.set  s?    (W]]_	-IW%D'659r   c                 X    | j                  ||      rt        j                  | ||       y y r   )
has_optionr   remove_optionr!   r  r  s      r   r  z$DefaultingConfigParser.remove_option  s'    ??7F+))$@ ,r   c                 l    | j                  ||      s| j                  S t        j                  | ||      S r   )r  DEF_BOOLEANr   
getbooleanr  s      r   r  z!DefaultingConfigParser.getboolean  s1    w/###))$@@r   c                 l    | j                  ||      s| j                  S t        j                  | ||      S r   )r  	DEF_FLOATr   getfloatr  s      r   r  zDefaultingConfigParser.getfloat  s/    w/>>!''gv>>r   c                 l    | j                  ||      s| j                  S t        j                  | ||      S r   )r  DEF_INTr   getintr  s      r   r  zDefaultingConfigParser.getint  s/    w/<<%%dGV<<r   c                     d}t               }| j                  |       |j                          |j                         }|rdj	                  ||dg      }|S )N rR   )r   writeflushgetvaluer]   )r!   headerrV   outputstreams       r   	stringifyz DefaultingConfigParser.stringify  sQ    z

< ((*yy&(B!78Hr   r   )r   r   r   r  r  r  r  r   r   r  r  r  r  r#  r   r   r   r  r    s;    GIKH:
AA
?
=
r   r  )$r/   loggingrS   configparserr   r   r   ior   r   	cloudinitr   r	   r
   r   cloudinit.settingsr   r   r   r   	getLoggerr   rO   rF   r   r   r   r2   r?   rA   r_   rr   r   CloudInitPickleMixinr   r  r   r   r   <module>r+     s      	 G G   = = O Og!	) 		 	 K K"7B 7Bt*' *'Zg gT -  -F{2K,, {2P0_ 0r   