
    x[h4                        U d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	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 dd	lmZ d
ZdZdZdddZdZdZdZdZdddeddeddddddZ  e!dg      Z" e!g d      Z# e!g e jI                         e"e#dddd d!      Z%d"Z&d#Z'd$Z( ejR                  e*      Z+d%d&ged'gd(Z,ee-d)<   d* Z.d+ Z/d, Z0d-e1d.ed/ed0e2d1df
d2Z3d3 Z4d4ed0e2fd5Z5	 d:d4efd6Z6d/efd7Z7d1ee1   fd8Z8d9 Z9y);z7Chef: module that configures, starts and installs chef.    N)List)subp
temp_utils	templater
url_helperutil)Cloud)Config)
MetaSchema)Distro)
PER_ALWAYS1.8)	/etc/chefz/var/log/chefz/var/lib/chef/var/chef/cache/var/chef/backupz/var/run/chef)r   r   r   )z/var/cache/chefz/var/backups/chefz#https://www.chef.io/chef/install.sh   z/etc/chef/validation.pemz/etc/chef/firstboot.jsonz:verify_nonez:infoz/var/log/chef/client.logz/etc/chef/client.pemz/var/run/chef/client.pidT)ssl_verify_mode	log_levellog_locationvalidation_keyvalidation_cert
client_keyjson_attribsfile_cache_pathfile_backup_pathpid_file	show_timeencrypted_data_bag_secretr   )r   r   r   r   r   r   r   
server_url	node_nameenvironmentvalidation_namechef_licensez/etc/chef/client.rbz/usr/bin/chef-client)z-dz-i1800z-s20cc_chefallchef)iddistros	frequencyactivate_by_schema_keysmetac                     t        j                  | dd      }|r>t        j                  j	                  t
              rt        j                  t
               y y y )Ndelete_validation_post_execFdefault)r   get_cfg_option_boolospathisfileCHEF_VALIDATION_PEM_PATHunlink)chef_cfg
delete_pems     :/usr/lib/python3/dist-packages/cloudinit/config/cc_chef.pypost_run_chefr;   g   sC    ))/J bggnn%=>
		*+ ?z    c           	         t         j                         }|j                         D ]g  \  }}|t        vrt        j                  d|       %|d ||<   -|t        v rt        j                  ||      ||<   Ot        j                  ||      ||<   i |j                  t        j                         t        j                  |d|       t        j                  |dd      |d   |d   d       |S )	Nz'Skipping unknown chef template key '%s'r    r0   r!   _defaultr   r"   )generated_byr    r!   r   r"   )CHEF_RB_TPL_DEFAULTScopyitemsCHEF_RB_TPL_KEYSLOGdebugCHEF_RB_TPL_BOOL_KEYSr   r2   get_cfg_option_strupdatemake_header)iidr8   paramskvs        r:   get_template_paramsrN   o   s    !&&(F   A1$$II?C9F1I )) 44XqAq	 33Ha@q	A MM ,,.00+s  22- #<0'(9:	
 Mr<   c            	      l   t         j                         D ]  \  } }t        j                  j	                  |       s't        j
                  |       D ]  }t        j                  j	                  t        j                  j                  ||            r6t        j                  dt        j                  j                  | |      |       vt        j                  dt        j                  j                  | |      |       t        j                  t        j                  j                  | |      |         y)zEMigrate legacy chef backup and cache directories to new config paths.z4Ignoring migration of %s. File already exists in %s.zMoving %s to %s.N)CHEF_DIR_MIGRATIONrB   r3   r4   existslistdirjoinrD   rE   shutilmove)old_dirmigrated_dirfilenames      r:   migrate_chef_config_dirsrY      s    !3!9!9!; K77>>'"JJw/ K77>>"'',,|X"FGIINWh7$
 		&GGLL(3 
 BGGLL(;\JKKr<   namecfgcloudargsreturnc                     d|vrt         j                  d|        y|d   }t        j                  |d      }|st	        t
              }t        j                  |t              D ]  }t        j                  |        t                |j                  dt              }|j                  d      }|rQ|dk7  rt        j                  ||       n5t        j                  j!                  |      st         j#                  d|       t        j$                  |d	t&        
      }	|j)                  d      }
|
rt+        |j,                  j/                               }t1        ||      }t3               }|j5                         D ]?  \  }}|t6        v s|s|j9                  t        j                  j;                  |             A t        j<                  |       t?        j@                  |
|	|       nt         j#                  d|	       t        j$                  |dtB        
      }|st         jE                  d       nfi }d|v r|d   |d<   d|v r+|d   }t	        |jG                               D ]
  }||   ||<    t        j                  |tI        jJ                  |             t        jL                  |dd
      }tO        jP                  tR              }|r|rtU        ||      }n|rt        jL                  |dd
      }nd}|rtW        |       tY        |       yy)z'Handler method activated by cloud-init.r(   z8Skipping module named %s, no 'chef' key in configurationNdirectoriesr   r   systemzWchef validation_cert provided as 'system', but validation_key path '%s' does not exist.config_pathr0   zchef_client.rbz&No template found, not rendering to %sfirstboot_pathz7First boot path empty, not writing first boot json filerun_listinitial_attributesforce_installFexec)-rD   rE   r   get_cfg_option_listlist	CHEF_DIRS	itertoolschainREQUIRED_CHEF_DIRS
ensure_dirrY   getr6   
write_filer3   r4   r5   warningrG   CHEF_RB_PATHget_template_filenamestr
datasourceget_instance_idrN   setrB   CHEF_RB_TPL_PATH_KEYSadddirnameensure_dirsr   render_to_fileCHEF_FB_PATHinfokeysjsondumpsr2   r   is_exeCHEF_EXEC_PATHinstall_chefrun_chefr;   )rZ   r[   r\   r]   r8   	chef_dirsd	vkey_pathvcertcfg_filenametemplate_fnrJ   rK   param_pathsrL   rM   fb_filenameinitial_jsonre   rf   	installedruns                         r:   handler      s    S		F	
 	6{H ((=AIO	__Y(:;  -/GHILL*+E HOOIu-	*KK; **-L --.>?K%""2245$S(3 eLLN 	4DAq))a 23	4 	%  lFC<lK ))"LK JK!'/
';L$8+!)*>!?,1134 8"4Q"7Q8TZZ%=> ,,/5M N+I5(+	&&xG
h r<   c                    t         j                  d       t        g}d| v r| d   }t        |t        t
        f      r|j                  |       nlt        |t              r|j                  |       nJt         j                  dt        |             |j                  t               n|j                  t               t        j                  |d       y )NzRunning chef-clientexec_argumentszRUnknown type %s provided for chef 'exec_arguments' expected list, tuple, or stringFcapture)rD   rE   r   
isinstanceri   tupleextendrt   appendrq   typeCHEF_EXEC_DEF_ARGSr   )r8   cmdcmd_argss      r:   r   r      s    II#$
C8#,-hu.JJx #&JJx KK X	 JJ)*

%&IIc5!r<   distroc                 ~   |j                         }|j                  dd      }t        j                  |j	                         d      5 }t
        j                  j                  ||      }|j                  d|       t        j                  || d       t        j                  d
d|i|cd	d	d	       S # 1 sw Y   y	xY w)a  Write blob to a tempfile, and call subp with args, kwargs. Then cleanup.

    'basename' as a kwarg allows providing the basename for the file.
    The 'args' argument to subp will be updated with the full path to the
    filename as the first argument.
    basename	subp_blobT)dir	needs_exer   i  )moder]   N )rA   popr   tempdirget_tmp_exec_pathr3   r4   rS   insertr   rp   r   )blobr   r]   kwargsr   tmpdtmpfs          r:   subp_blob_in_tempfiler     s     99;Dzz*k2H			$$&$
 .	ww||D(+Atd/yy-d-f-. . .s   A!B33B<c                     |t         }|t        }|g }nd|g}t        j                  ||      j                  }t        | ||dd      S )ag  Install an omnibus unified package from url.

    @param url: URL where blob of chef content may be downloaded. Defaults to
        OMNIBUS_URL.
    @param retries: Number of retries to perform when attempting to read url.
        Defaults to OMNIBUS_URL_RETRIES
    @param omnibus_version: Optional version string to require for omnibus
        install.
    z-v)urlretrieszchef-omnibus-installF)r   r   r]   r   r   )OMNIBUS_URLOMNIBUS_URL_RETRIESr   readurlcontentsr   )r   r   r   omnibus_versionr]   contents         r:   install_chef_from_omnibusr   '  sa     {%o&  S':CCG ' r<   c                 f   t        j                  |dd      }t        j                  |dd      }|dk(  rct        j                  |dd       }t        j                  |dt              }t	        ||| j
                         t        j                  |dd	      }|S |dk(  r| j
                  j                  d
g       |S |dk(  rYt        j                  |d      }t        | j
                  t        j                  |d      t        j                  |d      |       |S t        j                  d|       d}|S )Ninstall_typepackagesrg   Fr0   gemsversionruby_versionTr(   omnibusr   omnibus_urlomnibus_url_retries)r   r   r   r   zUnknown chef install type '%s')r   rG   r2   RUBY_VERSION_DEFAULTinstall_chef_from_gemsr   install_packagesr   get_cfg_option_intrD   rq   )r\   r8   r   r   chef_versionr   r   s          r:   r   r   F  s)   **.*L 
"
"8VU
CCv..xDI..n&:
 	|\5<<H &&xF J 
	#%%vh/ J 
	"11(<MN!<<''-@++H6KL+		
 J 	4lCJr<   c                 F    d| z  d| z  g}| dk(  r|j                  d       |S )Nzruby%sz
ruby%s-devr   )zlibopenssl-ruby1.8zrubygems1.8)r   )r   pkgss     r:   get_ruby_packagesr   g  s0    ')<'+ABD%9:Kr<   c                    |j                  t        |              t        j                  j	                  d      st        j                  d| z  d       t        j                  j	                  d      st        j                  d| z  d       |r$t        j                  dddd|z  dd	d
ddg	d       y t        j                  g dd       y )N/usr/bin/gemz/usr/bin/gem%sz/usr/bin/rubyz/usr/bin/ruby%sinstallr(   z-v %s--no-ri	--no-rdoc--bindir/usr/bin-qFr   )r   r   r(   r   r   r   r   r   )r   r   r3   r4   rQ   r   sym_linkr   )r   r   r   s      r:   r   r   o  s    
-l;<77>>.)&5~F77>>/*',6H		,&
 	
 				 	
r<   )NNN):__doc__rk   r   loggingr3   rT   typingr   	cloudinitr   r   r   r   r   cloudinit.cloudr	   cloudinit.configr
   cloudinit.config.schemar   cloudinit.distrosr   cloudinit.settingsr   r   rj   rm   rP   r   r   r6   r}   r@   	frozensetrF   rx   r   rC   rr   r   r   	getLogger__name__rD   r-   __annotations__r;   rN   rY   rt   ri   r   r   r   r   r   r   r   r   r<   r:   <module>r      s   >    	   C C ! # . $ ) 	 $  )+  4 5 ) &..( (**!%   ";-0 !
  			"	"	$			 
	 			
 		 		 		 		  %'5  g! w &x	j , FK(U  U 6 U % U t U  U p",. .d .( =A> B$s) "
r<   