o
    x[h«   ã                
   @   s€  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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dlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ deegdgdœZeed< e e¡Z dZ!G dd„ dej"ƒZ#G dd„ de#ƒZ$G dd„ de#ƒZ%de&dedede'ddf
dd„Z(de)fdd„Z*de)de)fd d!„Z+d"e#de)fd#d$„Z,de)de#fd%d&„Z-de)de#fd'd(„Z.dS ))z9ansible enables running on first boot either ansible-pullé    N)Údeepcopy)ÚOptional)Ú	lifecycleÚsignal_handlerÚsubp)ÚCloud)ÚConfig)Ú
MetaSchema)ÚALL_DISTROSÚDistro)ÚPER_INSTANCE)Úget_cfg_by_pathÚ
cc_ansibleÚansible)ÚidÚ	frequencyÚdistrosÚactivate_by_schema_keysÚmetaÚansible_configc                   @   s|   e Zd Zdefdd„Zdeej fdd„Zde	fdd„Z
d	d
„ Zdefdd„Zdd„ Zejdd„ ƒZejde	fdd„ƒZdS )ÚAnsiblePullÚdistroc                 C   s<   dg| _ ddg| _|| _i | _d | _tj dd¡| jd< d S )Nzansible-pullz	--versionÚHOMEz/root)Úcmd_pullÚcmd_versionr   ÚenvÚrun_userÚosÚenvironÚget)Úselfr   © r!   ú=/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.pyÚ__init__    s   
zAnsiblePull.__init__Úreturnc                 C   sH   |   | j¡\}}| ¡  d¡}t d|¡}|r"| d¡}tj 	|¡S d S )Nr   z	([\d\.]+))
Údo_asr   Ú
splitlinesÚpopÚreÚsearchÚgroupr   ÚVersionÚfrom_str)r    ÚstdoutÚ_Ú
first_lineÚmatchesÚversionr!   r!   r"   Úget_version+   s   
zAnsiblePull.get_versionc                 G   s   |   g | j¢|¢¡\}}|S ©N)r%   r   )r    Úargsr-   r.   r!   r!   r"   Úpull4   s   zAnsiblePull.pullc                 C   s   |   ¡ stdƒ‚d S )Nz!command: ansible is not installed)Úis_installedÚ
ValueError©r    r!   r!   r"   Ú
check_deps8   s   ÿzAnsiblePull.check_depsÚcommandc                 K   s0   | j s| j|fi |¤ŽS | jj|| j fi |¤ŽS r3   )r   r   r   r%   ©r    r:   Úkwargsr!   r!   r"   r%   <   s   zAnsiblePull.do_asc                 K   sD   t  ¡ � tj|fd| ji|¤ŽW  d   ƒ S 1 sw   Y  d S )NÚ
update_env)r   Úsuspend_crashr   r   r;   r!   r!   r"   r   A   s   
$ÿzAnsiblePull.subpc                 C   ó   d S r3   r!   r8   r!   r!   r"   r6   E   ó   zAnsiblePull.is_installedÚpkg_namec                 C   r?   r3   r!   ©r    rA   r!   r!   r"   ÚinstallI   r@   zAnsiblePull.installN)Ú__name__Ú
__module__Ú__qualname__r   r#   r   r   r+   r2   Ústrr5   r9   Úlistr%   r   ÚabcÚabstractmethodr6   rC   r!   r!   r!   r"   r      s    	
r   c                       sV   e Zd Zdedee f‡ fdd„Zdd„ Zdd„ Zd	efd
d„Z	de
fdd„Z‡  ZS )ÚAnsiblePullPipr   Úuserc                    s   t ƒ  |¡ || _|  ¡  d S r3   )Úsuperr#   r   Úadd_pip_install_site_to_path©r    r   rL   ©Ú	__class__r!   r"   r#   O   s   zAnsiblePullPip.__init__c                 C   s`   | j r.|  tjddg¡\}}|› d�}| j d¡}|r'd ||g¡| jd< d S || jd< d S d S )Nz-cz&import site; print(site.getuserbase())z/bin/ÚPATHú:)r   r%   ÚsysÚ
executabler   r   Újoin)r    Ú	user_baser.   Úansible_pathÚold_pathr!   r!   r"   rN   T   s   ýÿ
òz+AnsiblePullPip.add_pip_install_site_to_pathc                 C   s6   zdd l }W d S  ty   | j | jjg¡ Y d S w )Nr   )ÚpipÚImportErrorr   Úinstall_packagesÚpip_package_name)r    rZ   r!   r!   r"   Úbootstrap_pip_if_requirede   s
   ÿz(AnsiblePullPip.bootstrap_pip_if_requiredrA   c                 C   s„   |   ¡  |  ¡ s@tjdddg}tj tj t 	d¡d¡¡r"| 
d¡ | jr*| 
d¡ |  g |¢d‘d‘¡ |  g |¢|‘¡ d	S d	S )
zishould cloud-init grow an interface for non-distro package
        managers? this seems reusable
        ú-mrZ   rC   ÚstdlibzEXTERNALLY-MANAGEDz--break-system-packagesú--userz	--upgradeN)r^   r6   rT   rU   r   ÚpathÚexistsrV   Ú	sysconfigÚget_pathÚappendr   r%   )r    rA   Úcmdr!   r!   r"   rC   k   s$   ü
ÿÿ

îzAnsiblePullPip.installr$   c                 C   s4   t jdddg}| jr| d¡ |  |¡\}}d|v S )Nr_   rZ   rH   ra   r   )rT   rU   r   rf   r%   )r    rg   r-   r.   r!   r!   r"   r6   …   s
   
zAnsiblePullPip.is_installed)rD   rE   rF   r   r   rG   r#   rN   r^   rC   Úboolr6   Ú__classcell__r!   r!   rP   r"   rK   N   s    rK   c                       sF   e Zd Zdedee f‡ fdd„Zdefdd„Zdefd	d
„Z	‡  Z
S )ÚAnsiblePullDistror   rL   c                    s   t ƒ  |¡ || _d S r3   )rM   r#   r   rO   rP   r!   r"   r#   �   s   
zAnsiblePullDistro.__init__rA   c                 C   s   |   ¡ s| j |g¡ d S d S r3   )r6   r   r\   rB   r!   r!   r"   rC   ”   s   ÿzAnsiblePullDistro.installr$   c                 C   s   t t d¡ƒS )Nr   )rh   r   Úwhichr8   r!   r!   r"   r6   ˜   s   zAnsiblePullDistro.is_installed)rD   rE   rF   r   r   rG   r#   rC   rh   r6   ri   r!   r!   rP   r"   rj   �   s    rj   ÚnameÚcfgÚcloudr4   r$   c                 C   sà   |  di ¡}|  d¡}|  d¡}|  d¡}|  d¡}|  d¡}	|  dd¡}
|rlt|ƒ |j}|d	kr8t||ƒ}nt||ƒ}| |
¡ | ¡  |  d
d¡}|rS||jt< |rZt	||ƒ |	rct
|t|	ƒƒ |rnt||ƒ d S d S d S )Nr   r   Úinstall_methodÚsetup_controllerÚgalaxyr5   Úpackage_nameÚ rZ   r   )r   Úvalidate_configr   rK   rj   rC   r9   r   ÚCFG_OVERRIDEÚansible_galaxyÚrun_ansible_pullr   Úansible_controller)rl   rm   rn   r4   Úansible_cfgÚansible_userro   rp   Ú
galaxy_cfgÚpull_cfgrr   r   r   r   r!   r!   r"   Úhandleœ   s4   








ér}   c                 C   s®   d}|D ]}t | |ƒstd|› d| › �ƒ‚q|  d¡r/dD ]}t | |ƒs.td|› d| › �ƒ‚q|  d¡}|rIt| d¡| d¡gƒsItd	|› �ƒ‚| d
 }|dvrUtdƒ‚d S )N)ro   rr   zMissing required key 'z' from r5   )zpull/urlzpull/playbook_namerp   ÚrepositoriesÚrun_ansiblezMissing required key from ro   )rZ   r   z Invalid install method {install})r   r7   r   Úany)rm   Úrequired_keysÚkeyÚcontroller_cfgrC   r!   r!   r"   rt   Á   s,   
ÿ

ÿ
þÿÿrt   c                 C   s   dd„ |   ¡ D ƒS )zremove boolean false valuesc                 S   s&   i | ]\}}|d ur|  dd¡|“qS )Fr.   ú-)Úreplace©Ú.0r‚   Úvaluer!   r!   r"   Ú
<dictcomp>ß   s
    þzfilter_args.<locals>.<dictcomp>)Úitems)rm   r!   r!   r"   Úfilter_argsÝ   s   þr‹   r5   c                 C   s    |  d¡}|  ¡ }|st d¡ n|t ddd¡k r0| d¡r0td|j› d|j	› d|j
› d	�ƒ‚| jg d
d„ t|ƒ ¡ D ƒ¢|‘R Ž }|rNtj |› ¡ d S d S )NÚplaybook_namezCannot parse ansible versioné   é   r   ÚdiffzAnsible version Ú.z%doesn't support --diff flag, exiting.c                 S   s2   g | ]\}}|d urd|› d|› �nd|› �‘qS )Tú--ú=r!   r†   r!   r!   r"   Ú
<listcomp>ô   s     ÿÿz$run_ansible_pull.<locals>.<listcomp>)r'   r2   ÚLOGÚwarningr   r+   r   r7   ÚmajorÚminorÚpatchr5   r‹   rŠ   rT   r-   Úwrite)r5   rm   rŒ   Úvr-   r!   r!   r"   rw   æ   s&   

ÿ
þÿûÿrw   c                 C   s4   |   dg ¡}|st d| ¡ |D ]}| |¡ qd S )NÚactionszInvalid config: %s)r   r”   r•   r%   )rm   r   r›   r:   r!   r!   r"   rv   þ   s   ÿrv   c                 C   s‚   |   dg ¡D ]}| dd|d |d g¡ q|   dg ¡D ]"}| d¡}| d¡}d	|gd
d„ t|ƒ ¡ D ƒ¢}|j||d� qd S )Nr~   ÚgitÚcloneÚsourcerb   r   Úplaybook_dirrŒ   zansible-playbookc                 S   s    g | ]\}}d |› d|› �‘qS )r‘   r’   r!   r†   r!   r!   r"   r“     s     z&ansible_controller.<locals>.<listcomp>)Úcwd)r   r%   r'   r‹   rŠ   )rm   r   Ú
repositoryr4   rŸ   rŒ   r:   r!   r!   r"   rx     s   ÿ

þýørx   )/Ú__doc__rI   Úloggingr   r(   rT   rd   Úcopyr   Útypingr   Ú	cloudinitr   r   r   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar	   Úcloudinit.distrosr
   r   Úcloudinit.settingsr   Úcloudinit.utilr   r   Ú__annotations__Ú	getLoggerrD   r”   ru   ÚABCr   rK   rj   rG   rH   r}   Údictrt   r‹   rw   rv   rx   r!   r!   r!   r"   Ú<module>   s@    ü
/A%		