o
    f*                  
   @   sB  U d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddl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mZmZ ddlmZ dZdgZdZ degedgdZ!ee"d< e#e$Z%G dd dZ&dede'fddZ(dd Z)edddfdefddZ*de'd eded!e+d"df
d#d$Z,dS )%z+Puppet: Install, configure and start puppet    N)suppress)StringIO)ListUnion)helperssubp
temp_utils
url_helperutil)Cloud)Config)
MetaSchema)ALL_DISTROSDistroPackageInstallerError)PER_INSTANCEzKhttps://raw.githubusercontent.com/puppetlabs/install-puppet/main/install.shz--test)puppet-agentpuppet	cc_puppetr   )iddistros	frequencyactivate_by_schema_keysmetac                   @   s   e Zd Zdd ZdS )PuppetConstantsc                 C   s8   || _ || _tj|d| _tj| jd| _|| _d S )Ncertszca.pem)	conf_pathssl_dirospathjoinssl_cert_dirssl_cert_pathcsr_attributes_path)selfpuppet_conf_filepuppet_ssl_dirr#    r'   </usr/lib/python3/dist-packages/cloudinit/config/cc_puppet.py__init__*   s
   
zPuppetConstants.__init__N)__name__
__module____qualname__r)   r'   r'   r'   r(   r   )   s    r   cloudactionc              	   C   s`   d}t D ]}z| j|| d |}W  n
 tjy   Y qw |s.td|dt  dS dS )z8Attempts to perform action on one of the puppet services z.servicez0Could not '%s' any of the following services: %s, N)PUPPET_PACKAGE_NAMESdistromanage_servicer   ProcessExecutionErrorLOGwarningr    )r-   r.   service_managedpuppet_namer'   r'   r(   _manage_puppet_services7   s    r9   c                 C   s   t  | dd|g\}}| S )zGet the config value for a given setting using `puppet config print`
    :param puppet_bin: path to puppet binary
    :param setting: setting to query
    configprint)r   rstrip)
puppet_binsettingout_r'   r'   r(   get_config_valueI   s   rA   Tr2   c           	      C   s   g }|dur
d|g}|dur|d|g7 }|r|dg7 }t j|ddj}tj|  dd!}tj|d	}t	j
||d
d tj|g| ddW  d   S 1 sPw   Y  dS )a  Install puppet-agent from the puppetlabs repositories using the one-shot
    shell script

    :param distro: Instance of Distro
    :param url: URL from where to download the install script
    :param version: version to install, blank defaults to latest
    :param collection: collection to install, blank defaults to latest
    :param cleanup: whether to purge the puppetlabs repo after installation
    Nz-vz-cz	--cleanup   )urlretriesT)dir	needs_exezpuppet-installi  )modeFcapture)r	   readurlcontentsr   tempdirget_tmp_exec_pathr   r   r    r
   
write_filer   )	r2   rC   version
collectioncleanupargscontenttmpdtmpfr'   r'   r(   install_puppet_aioR   s    
$rV   namecfgrR   returnc               	   C   s4  d|vrt d|  d S |d }t|dd}t|dd }t|dd }t|dd}t|d	d}	tj|d
dd}
tj|ddd}tj|dtd}|dkrVd}d}d}nd}d}d }t|d|}|sm|rmt d nu|rt d|rv|nd| |dkr|d u rtD ]*}tt	 |r||ggn|g}|j
| |}	 W d     n	1 sw   Y  q|st ddt n'|r||ggn|g}|j
| n|dkrt|j
||||	 nt d| d}
t|dt|d}t|dt|d}t|dt|d}t|||}d |v rt|j}t }d!d" | D }d#|}|jt||jd$ |d   D ]t\}}|d%krit|jd& t|j|d t|j t|j|d t|j| t|j|d n*| D ]%\}}|d'kr|d(t  }|d)|! }|" }|#||| qmt$|jd*|j  t|j|%  q3d|v rt|j&t'j(|d dd+ |rt)|d, |
rt d- |d.g}d/|v r|d/ }t*|t+t,fr|-| n!t*|t.r|-|/  nt d0t0| |-t1 n|-t1 t2j2|dd1 |rt)|d2 d S d S )3Nr   z9Skipping module named %s, no 'puppet' configuration foundinstallTrO   rP   install_typepackagesrQ   execF)defaultstart_serviceaio_install_urlaiorootz/opt/puppetlabs/bin/puppetr   package_namez@Puppet install set to false but version supplied, doing nothing.z'Attempting to install puppet %s from %slatestz+No installable puppet package in any of: %sr0   z Unknown puppet install type '%s'	conf_filer:   r   ssldirr#   csr_attributesconfc                 S   s   g | ]}|  qS r'   )lstrip).0ir'   r'   r(   
<listcomp>   s    zhandle.<locals>.<listcomp>
)sourceca_certi  certnamez%fz%iz%s.old)default_flow_styleenablezRunning puppet-agentagent	exec_argszOUnknown type %s provided for puppet 'exec_args' expected list, tuple, or stringrH   start)3r5   debugr
   get_cfg_option_boolget_cfg_option_strAIO_INSTALL_URLr6   r1   r   r   r2   install_packagesr    rV   rA   r   load_text_filer   r   DefaultingConfigParser
splitlines	read_filer   items
ensure_dirr   chownbynamer!   rN   r"   replacesocketgetfqdnget_instance_idlowersetrename	stringifyr#   yamldumpr9   
isinstancelisttupleextendstrsplittypePUPPET_AGENT_DEFAULT_ARGSr   ) rW   rX   r-   rR   
puppet_cfgrZ   rO   rP   r[   rQ   runstart_puppetdr`   puppet_userr=   puppet_packagerc   r8   
to_installre   r   r#   p_constantsrK   puppet_configcleaned_linescleaned_contentscfg_nameovcmdcmd_argsr'   r'   r(   handlev   s
  

"	









r   )-__doc__loggingr   r   
contextlibr   ior   typingr   r   r   	cloudinitr   r   r   r	   r
   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   cloudinit.distrosr   r   r   cloudinit.settingsr   ry   r   r1   r   __annotations__	getLoggerr*   r5   r   r   r9   rA   rV   r   r   r'   r'   r'   r(   <module>   sD   

"$