B
    u&ù`Á&  ã               @   sÒ  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 e ¡  d dlT 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 d dlmZmZmZmZmZmZmZmZ d dlmZ dZ y d dl!m"Z"m#Z#m$Z$m%Z%m&Z& W n8 e'k
r0   dZ dZ$dZ%dZ&dZ(edddgƒZ#Y nX dd„ Z)de)_*dd„ Z+de+_*dd„ Z,de,_*d d!„ Z-d"e-_*d#d$„ Z.d%d&„ Z/d'e/_*d(d)„ Z0d*e0_*d+d,„ Z1d-e1_*d.d/„ Z2d0e2_*e)e+e,e-e/e0e1e2fZ3d1d2„ Z4d3d4„ Z5dS )5é    )Úprint_function)Úabsolute_import)Údivision)Úunicode_literals)Ústandard_library)Ú*N)Ú
clconfpars)Úchain)Ú
namedtuple)Úread_mpfileÚDISABLE_ETCFSÚget_cagefs_usersÚenabled_dirÚdisabled_dirÚbuild_wrappers_dictsÚis_ea4_enabledÚread_cpanel_ea4_php_conf)ÚCageFSExceptionT)ÚrunnerÚ	ChkResultÚOKÚFAILEDÚSKIPPEDFr   r   r   ÚINTERNAL_TEST_ERRORr   ÚresÚmsgc              C   st   t dddd} | d | d  }}g }x0t||ƒD ]"}| ¡ }tj |¡s0| |¡ q0W |rjttd 	|¡ƒS tt
dƒS )NT)Zskip_errorsZignore_cacheZreturn_all_mountsr   é   z"There are missing mount points: {}zNo missing mount points found)r   r	   ÚstripÚosÚpathÚisdirÚappendr   r   Úformatr   )Zall_mounts_tupleZmountsZsplitted_mountsZmissingÚpÚt© r%   ú!/usr/share/cagefs/sanity_check.pyÚ check_cagefs_mount_points_exists8   s    r'   z Check cagefs mount points existsc               C   s8   t j t¡r(t j t¡s(ttd t¡ƒS ttd t¡ƒS )Nz{} is not a directoryz
{} is fine)	r   r   Úexistsr   r    r   r   r"   r   r%   r%   r%   r&   Ú check_cagefs_enabled_users_isdirM   s    r)   z'Check cagefs users.enabled is directoryc               C   s8   t j t¡r(t j t¡s(ttd t¡ƒS ttd t¡ƒS )Nz{} is not a directoryz
{} is fine)	r   r   r(   r   r    r   r   r"   r   r%   r%   r%   r&   Ú!check_cagefs_disabled_users_isdirT   s    r*   z(Check cagefs users.disabled is directoryc               C   s,   t j t¡sttd t¡ƒS ttd t¡ƒS )Nz{} doesn't existsz	{} exists)r   r   r(   r   r   r   r"   r   r%   r%   r%   r&   Ú"check_cagefs_disabled_etcfs_exists[   s    r+   z!Check cagefs disable.etcfs existsc          
   C   s   t ƒ }t ƒ }t d¡}x€| D ]x}yt |¡}W n tk
rD   wY nX | |j¡ x@|jD ]6}yt	 
|¡}W n tk
r‚   wZY nX | |j¡ qZW qW xb|D ]Z}| |¡r®qžyt	 
|¡}W n tk
rÒ   wžY nX |j}	|j}
|
|ksž|	|kròqž||	fS W dS )aX  
    Filter out users that are in super groups and
    return username and uid of cagefs user for test
    :param groups: list of super groups
    :type groups: list of str
    :param all_enabled_users: list of cagefs users to filter
    :type all_enabled_users: list of str
    :rtype tuple (user, uid) or (None, None) when user not found
    z^cldiaguser_[a-f0-9]{21}$)NN)ÚsetÚreÚcompileÚgrpZgetgrnamÚKeyErrorÚaddZgr_gidZgr_memÚpwdÚgetpwnamZpw_uidÚmatchZpw_gid)ÚgroupsÚall_enabled_usersZ
super_gidsZ
super_uidsZ
re_patternÚgroupÚgÚuserr#   ÚuidÚgidr%   r%   r&   Úget_cagefs_user_for_testb   s8    





r<   c           
   C   s&  yt dd} W n tk
r(   ttdƒS X | s8ttdƒS yt d¡}W n2 ttfk
rx } zttd 	|¡ƒS d }~X Y nX |d krŒttdƒS t
|j| ƒ\}}|d kr®ttdƒS d 	|¡}d	 	||¡}ytj|tjddd
 ¡  W n: tjk
r } zttd 	||j ¡ ¡ƒS d }~X Y nX ttdƒS )NT)Úraise_exceptionzNo users with cagefs enabledz/etc/pam.d/suz*Error parsing /etc/pam.d/su config file {}z?pam_lve configuration is not found in /etc/pam.d/su config filezCNo users with cagefs enabled (all enabled users are in super group)zYecho -n "Logged in as: $(whoami) - $(id -u) "; [ "$(id -u)" == "{0}" ] && ls /var/.cagefsz.unset BASH_ENV; su '{0}' -s /bin/bash -c '{1}')ÚstderrÚshellÚtextz{}; Output was: "{}"z,Several tested users really can enter cagefs)r   r   r   r   r   Zparse_pam_lve_configÚIOErrorÚ
ValueErrorr   r"   r<   r5   Ú
subprocessZcheck_outputZSTDOUTr   ZCalledProcessErrorÚoutputr   )r6   ZcfgÚer9   r:   ÚinnerÚcmdr%   r%   r&   Úcheck_users_can_enter_cagefs‹   s0    



&rH   z#Check cagefs users can enter cagefsc           
   C   sL   yt dd W n2 tk
r@ }  zttd t| ƒ¡ƒS d } ~ X Y nX ttdƒS )NT)r=   z)Proxy commands config parsing error: "{}"z%Syntax looks fine. Files are parsable)r   Ú	Exceptionr   r   r"   Úreprr   )rE   r%   r%   r&   Ú)check_proxy_commands_configs_are_parsableª   s    rK   z0Check cagefs proxy commands configs are parsablec           
   C   sŽ   g } t   d¡}|sttdƒS xX|D ]P}t|dƒ}| ¡ }W d Q R X t|ƒdkr\|  |¡ q"|d dkr"|  |¡ q"W | r„tt| ƒS ttdƒS )Nz/var/cagefs/*/*/virt.mpzNo virt.mp files foundZrtr   ú@zvirt.mp files syntax is fine)	Úglobr   r   ÚopenÚreadÚlenr!   r   r   )ZwrongÚfilesZvirt_mpÚfÚconfr%   r%   r&   Úcheck_all_virt_mp_files_syntax»   s    




rT   z!Check cagefs virt.mp files syntaxc              C   sd   dd„ } t ƒ rZ| ƒ sZtƒ }|rZy |d }| d¡s<ttdƒS W n tk
rX   ttdƒS X ttdƒS )Nc              S   s8   yt ddƒ} d| k}|  ¡  W n tk
r2   dS X |S )Nz/var/cpanel/cpanel.configÚrzlve_hide_selector=1
F)rN   ÚcloserA   )rR   Úresultr%   r%   r&   Úphp_selector_is_disabled×   s    
z?check_multiphp_system_default.<locals>.php_selector_is_disabledÚdefaultzea-phpznChoose one of ea-php versions instead of alt-php in cPanel MultiPHP Manager for PHP Selector to start working.z*Cannot get MultiPHP system default versionzVMultiPHP system default PHP version is NOT alt-php. PHP Selector should work normally.)r   r   Ú
startswithr   r   r0   r   )rX   rS   Zdefault_phpr%   r%   r&   Úcheck_multiphp_system_defaultÖ   s    
r[   z)Check MultiPHP system default php versionc              C   s°   g } g }xžt D ]–}y|ƒ }|j|j }}W n0 tk
rZ } ztt|ƒ }}W d d }~X Y nX |tkrz| d |j	|¡¡ q|t
fkrŽ|  |¡ | d |j	||¡¡ qW | |fS )Nz	{}...
{}
z{}...
{}: {}
)ÚCAGEFS_CHECKERSr   r   rI   r   rJ   r   r!   r"   Ú__name__r   )ÚerrorsrD   rR   Zchk_resr   ZdetailsrE   r%   r%   r&   Ú	run_testsú   s    
 

r_   c              C   sl   t  ¡ dkrtdƒ tdƒ tr*ttƒ n>tdƒ tƒ \} }td |¡ƒ td 	t
| ƒ¡ƒ | rhtdƒ d S )Nr   z&This script should be run by root useré   z*** Starting sanity check ***
Ú
z*** There are {} errors ***é   )r   ÚgeteuidÚprintÚexitÚcldiaglib_foundr   r\   r_   Újoinr"   rP   )r^   Úoutr%   r%   r&   Úcheck  s    

ri   )6Z
__future__r   r   r   r   Zfuturer   Zinstall_aliasesÚbuiltinsr   r2   r/   rM   rC   r-   Zclcommonr   Ú	itertoolsr	   Úcollectionsr
   Z	cagefsctlr   r   r   r   r   r   r   r   Z	cagefslibr   rf   Z	cldiaglibr   r   r   r   r   ÚImportErrorr   r'   Zpretty_namer)   r*   r+   r<   rH   rK   rT   r[   r\   r_   ri   r%   r%   r%   r&   Ú<module>   sp   (
 )