B
    u&ù`^V  ã               @   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m  mZ d dlZd dlmZ d dlZd d	lmZ d d
lmZ d dlZd dlZd dlZd dlmZ d dlZd dl m!Z!m"Z" d dl#m$Z$ da%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dd„ Z-dZ.dd„ Z/dd„ Z0dHdd„Z1d d!„ Z2d"d#„ Z3d$d%„ Z4dId&d'„Z5d(d)„ Z6d*d+„ Z7d,d-„ Z8e&fd.d/„Z9d0d1„ Z:d2d3„ Z;d4d5„ Z<d6d7„ Z=d8d9„ Z>d:d;„ Z?d<d=„ Z@d>d?„ ZAdJd@dA„ZBdKdBdC„ZCdDdE„ ZDdFdG„ ZEdS )Lé    )Úprint_function)Úabsolute_import)Údivision)Úunicode_literals)Ústandard_library)Ú*N)Úparse_version)Útouch)Úwrite_file_content)Ú$install_ispmanager_directory_exclude)Úis_ea4_enabledÚread_cpanel_ea4_php_conf)Úmod_makedirsÚ z/usr/local/bin/lsphpz/var/run/postgresz/etc/sysconfig/postgresz/var/run/postgresqlzhdir:/.cagefsz!/etc/cagefs/cagefs.base.home.dirsz/var/lib/php/sessionc           
   C   sî   t  ¡ sd S tj t¡r,t d t¡¡ d S d t	j
¡} yxtj t¡rxttdƒ }| ¡ }| |krl| | ¡ W d Q R X n*ttdƒ}| d¡ | | ¡ W d Q R X t td¡ W n8 ttfk
rè } zt dtt|ƒ¡ W d d }~X Y nX d S )Nz!Error: "{}" shouldn't be a folderz
^{}/[^/]+
zr+Úwzmount_basedir=1
i€  zFailed to write )ÚdetectÚis_pleskÚosÚpathÚisdirÚPLESK_BASE_HOME_DIRS_FILEÚsecureioÚprint_errorÚformatÚ	cagefslibZPLESK_VHOSTS_DÚexistsÚopenÚ	readlinesÚwriteÚchmodÚOSErrorÚIOErrorÚstr)Zcurrent_vhosts_d_regexpÚfÚcontentÚe© r&   ú&/usr/share/cagefs/cagefsreconfigure.pyÚcreate_plesk_base_home_dirs6   s(    
r(   z//usr/local/cpanel/sys_cpanel/boxtrapper-messagec               C   s   t tdd d S )NT)Ú	read_only)Úadd_mount_to_cagefs_mpÚBOX_TRAPPER_DIRr&   r&   r&   r'   Úadd_boxtrapper_dir_cpanelS   s    r,   c               C   s   t tddd d S )NTÚ700)ÚpersonalÚperm)r*   ÚPLESK_PHP_SESSION_DIRr&   r&   r&   r'   Úadd_php_session_dir_pleskV   s    r1   Fc       
      C   sÜ   |r|rt dƒ‚dd l}|s(tj | ¡rØtj d¡rØ| ¡  g }g }g }|jddd|||d}| d |krØ| |krØ| |krØ| |krØ|r d|  } |r¬| d | } n|r¬d	|  } tdd
ƒ}	|	 	|  
¡ d ¡ |	 ¡  tdƒ d S )Nz5read_only and personal can`t be true in the same timer   z/etc/cagefs/cagefs.mpT)Úpersonal_mountsÚread_only_mountsÚsplitted_mountsÚ
ú@ú,ú!Zatz/usr/share/cagefs/need.remount)Ú
ValueErrorÚ	cagefsctlr   r   r   ÚisfileZcheck_mp_fileZread_mpfiler   r   ÚstripÚcloser	   )
Úliner)   r.   r/   r:   r2   r3   r4   Zmountsr#   r&   r&   r'   r*   Z   s*    
$
r*   c           
   C   s  t  ¡ rŒtj t¡s"ttƒ dS t  tdd¡} | dkr>t	} nP| t	krŽyt 
| t	¡ W n6 tfk
rŒ } zt dt	t|ƒ¡ dS d }~X Y nX yt d¡}W n4 tfk
rÐ } zt dt|ƒ¡ dS d }~X Y nX |j}|j}tj | ¡s4yt| d	ƒ W n8 tfk
r2 } zt d
| t|ƒ¡ dS d }~X Y nX yt | ||¡ W n8 tfk
r~ } zt d| t|ƒ¡ dS d }~X Y nX tt	ƒ dS dS )NTZSOCK_DIRú=r   zfailed to create symlinkFZpostgreszfailed to find 'postgres' userií  zfailed to createzfailed to change owner of)r   Zdetect_postgresqlr   r   r;   ÚPOSTGRES_CONFr*   ÚPOSTGRES_CL7_FOLDERÚget_param_from_fileÚDEFAULT_POSTGRES_FOLDERÚsymlinkr    r   r   r"   ÚpwdÚgetpwnamÚKeyErrorZpw_uidZpw_gidÚlexistsr   Úchown)Zpostgres_folderr%   Zpg_userZpostgres_uidZpostgres_gidr&   r&   r'   Úpostgresql_configures   sD    
rJ   c              C   sb   t dkr^yt tj¡a W nD   dd l} t|  ¡ tj	d t
 dtj d ¡ t d¡ Y nX d S )Nr   r   )Úfilezbad z fileé   )ÚLITESPEED_XMLÚxmlÚparser   ÚLITESPEED_CONFIG_FILEÚ	tracebackÚprintÚ
format_excÚsysÚstderrr   r   Úexit)rQ   r&   r&   r'   Úlitespeed_config_read¢   s    rW   c              C   sJ   t  ¡ rFt t jt jd ¡ tt jdƒ} |  tjdddd¡ |  	¡  d S )Nz.cagefsÚwbr   zUTF-8)ÚindentZnewlÚencoding)
r   Údetect_enterprise_litespeedÚshutilZcopyfilerP   r   r   rM   Ztoprettyxmlr=   )r#   r&   r&   r'   Úlitespeed_config_write¯   s
    r]   c             C   sÔ   t  ¡ rÐtƒ  | d krd}n| }y\t d¡d  d¡d jj}|}| d ksVt|ƒdk rzt|ƒt d¡d  d¡d j_|}W nN t	k
rÊ   t 
d¡}t t|ƒ¡}| |¡ t d¡d  |¡ |}Y nX |S d S )Né   ÚhttpServerConfigr   Ú	enableLVE)r   r[   rW   rM   ÚgetElementsByTagNameÚ
firstChildÚ	nodeValueÚintr"   Ú
IndexErrorÚcreateElementÚcreateTextNodeÚappendChild)Zforce_valueZ	new_valueZenableLVE_valueÚresultr`   r&   r&   r'   Úlitespeed_enableLVE_configure¸   s$     


rj   c              C   sª   t  ¡ r¦tƒ  yLt d¡d  d¡d jj} t| ƒdkrXtdƒt d¡d  d¡d j_W nJ t	k
r¤   t 
d¡}t tdƒ¡} | | ¡ t d¡d  |¡ Y nX d S )Nr_   r   Ú	phpSuExecrL   )r   r[   rW   rM   ra   rb   rc   rd   r"   re   rf   rg   rh   )ZphpSuExec_valuerk   r&   r&   r'   Úlitespeed_phpSuExec_configureÏ   s    $

rl   c              C   sT   t  ¡ } t d¡d  d¡}|sPt| ƒtdƒk rPtdt j d d d tjd	 |S )
zÈ
    CAG-914
    Check if there is extProcessorList section
    If not, print doc link to configure LiteSpeed
    Starting from LSWS v5.3 external apps and script handlers are no longer required.
    r_   r   ZextProcessorListz5.3z%No extProcessorList section in file:
z'
Please configure LiteSpeed Web Server z+using Web Admin Console as discribed here:
z;https://docs.cloudlinux.com/php_selector/#litespeed-support)rK   )	r   Zget_litespeed_versionrM   ra   r   rR   rP   rT   rU   )Zlitespeed_versionÚcheckr&   r&   r'   Úcheck_extProcessorListÝ   s    
rn   c           	   C   s:  t  ¡ r6tƒ  yÖtƒ } | s dS | d  d¡}x´|D ]¬}t| d¡d jjƒdkr4yL| d¡d jd krœt| d¡d jjƒ}|dkrœtdƒ| d¡d j_W q4 tk
rÞ   t	 
d¡}t	 tdƒ¡}| |¡ | |¡ Y q4X q4W W nN tk
r4   dd l}t| ¡ tjd t d	t j d
 ¡ t d¡ Y nX d S )NTr   ÚextProcessorÚnameÚlsphp5ÚrunOnStartUp)Ú1Ú0)rK   zbad z filerL   )r   r[   rW   rn   ra   r"   rb   rc   re   rM   rf   rg   rh   rQ   rR   rS   rT   rU   r   r   rP   rV   )Úcheck_nodelistÚnodelistÚnodeZrunOnStartUp_valuerr   rQ   r&   r&   r'   Ú litespeed_runOnStartUp_configureó   s0    



rx   c             C   sÆ   t  ¡ r¾tƒ  y^tƒ }|sdS |d  d¡}x<|D ]4}t| d¡d jjƒdkr2t| ƒ| d¡d j_q2W W nL tk
r¸   ddl	}t
| ¡ tjd t d	t j d
 ¡ t d¡ Y nX dS dS dS )z:
    LiteSpeed extProcessorList->path change for php5
    Tr   ro   rp   rq   r   N)rK   zbad z filerL   F)r   r[   rW   rn   ra   r"   rb   rc   re   rQ   rR   rS   rT   rU   r   r   rP   rV   )Zlsphp5_pathru   rv   rw   rQ   r&   r&   r'   Úlitespeed_lsphp5_path_change  s"    
ry   c             C   s6   yt jddd| gdd W n t jk
r0   dS X dS )zO
    Perform '/usr/local/directadmin/custombuild/build set cagefs' command
    z(/usr/local/directadmin/custombuild/buildÚsetZcagefsT)rm   N)Ú
subprocessÚrunÚCalledProcessError)Zoptionr&   r&   r'   Úcustombuild_set_cagefs'  s    
r~   c               C   s2   yt jddgdd W n t jk
r,   dS X dS )zR
    Perform '/usr/local/directadmin/custombuild/build rewrite_confs' command
    z(/usr/local/directadmin/custombuild/buildZrewrite_confsT)rm   N)r{   r|   r}   r&   r&   r&   r'   Úcustombuild_rewrite_confs4  s    r   c               C   s4   y$t ƒ  tdƒ tƒ  tƒ  tƒ  dS    dS d S )Nr^   TF)ry   rj   rl   rx   r]   r&   r&   r&   r'   Úlitespeed_configure_selectorB  s    r€   c               C   s&   t  ¡ r"t  ¡ r"tdƒ tƒ  dS dS )z;
    OpenLitespeed configure for CageFS on DirectAdmin
    ZyesTF)r   Zdetect_open_litespeedZis_dar~   r   r&   r&   r&   r'   Úconfigure_open_litespeedN  s
    r   c               C   s.   yt tƒ ƒdkrtƒ  tƒ  dS    dS d S )Nr^   TF)rd   rj   rl   r]   r&   r&   r&   r'   Úlitespeed_configureZ  s    r‚   c           
   C   sð   d} t  ¡ rtj | ¡sd S y˜t  | dd¡}| d¡}t|ƒdkrJ|d }|dkrVd S tj	d|gd	t
d
ƒtjtjdddd}|j ¡ }t
ddƒ}| |d ¡ | ¡  t dd¡ W n6 ttfk
rê } zt dt|ƒ¡ W d d }~X Y nX d S )Nz/usr/local/assp/assp.cfgZsendAllSpamz:=r6   r^   rL   r   z/scripts/whoownsFz	/dev/nullTz	/scripts/)ÚshellÚstdinÚstdoutrU   Z	close_fdsÚcwdÚtextz/etc/cagefs/exclude/assp-deluxer   r5   i€  z*Failed to disable CageFS for ASSP Deluxe: )r   Ú	is_cpanelr   r   r;   rB   ÚsplitÚlenr{   ÚPopenr   ÚPIPEZSTDOUTr…   Úreadr   r=   r   r    r!   r   r   r"   )Zconfig_fileZ
adm_domainÚpartsÚpZ	user_namer#   r%   r&   r&   r'   Údisable_cagefs_for_assp_deluxeg  s&    


r   c             C   sœ   t  ¡  t jd }tƒ rhtj |¡shtƒ }|rhy|d }W n tk
rN   g S X | 	d¡s^g S d 
|¡}tj |¡rˆ| t || d¡fgS t dt|ƒ¡ g S )z
    Return parameter and its value from native php.ini
    :param param_name: name of parameter in php.ini
    :type param_name: string
    zphp.iniÚdefaultzea-phpz/opt/cpanel/{}/root/etc/php.inir?   zfailed to open file)r   Zread_native_confZorig_binariesr   r   r   r;   r   rG   Ú
startswithr   r   rB   r   r   r"   )Z
param_nameZini_fileZconfZdefault_phpr&   r&   r'   Úget_native_settings…  s     


r“   c              C   s~   d} g }t j | ¡rzt| ƒ}tjddd}y| |¡ W n tjk
rN   g S X x | ¡ D ]}| 	| 
|¡¡ qZW | ¡  |S )z-
    Return settings from global_php.ini
    z/etc/cl.selector/global_php.iniNF)ZinterpolationÚstrict)r   r   r;   r   ÚconfigparserZConfigParserZreadfpÚErrorZsectionsÚextendÚitemsr=   )Z
GLOBAL_INIÚsettingsr#   ZcfgZsectr&   r&   r'   Úget_global_php_settingsŸ  s    rš   c             C   s   | sdS |g krddg}n|dkr&g }xrt  ¡ D ]d}tj d|d¡}tj |¡rˆt|dƒ}| ¡ }xø| D ]ð}d}t 	d|d	  d
 ¡}x®t
tt|ƒƒƒD ]š}	| ||	 ¡}
|
rž|rÞ||	 d	 dkrÜd||	  d ||	< qž||	  dd¡\}}| ¡ dks| ¡ r| ¡ |kr4|d	 d |d  d ||	< d}qžW |sn| |d	 d |d  d ¡ qnW | ¡  t|dƒ}| |¡ | ¡  q2t dt|ƒ¡ q2W dS )av  
    Replace or add settings in php.ini for all alt-php versions
    :param settings: list of tuples like [('date.timezone', 'Europe/Moscow'), ('error_log', 'error_log')]
    :param overwrite_list: list of options to overwrite; empty list [] == overwrite all the two options ('error_log', 'date.timezone')
                           None == do not overwrite the options
    NÚ	error_logzdate.timezonez	/opt/alt/zetc/php.iniÚrFz;*\s*r   z\s*=.*ú;r5   r?   rL   )r›   zdate.timezonez = Tr   zfailed to open file)r   Zget_alt_dirsr   r   Újoinr;   r   r   ÚreÚcompileÚreversedÚrangerŠ   Úmatchr‰   r<   Úappendr=   Ú
writelinesr   r   r"   )r™   Úoverwrite_listZalt_dirr   r#   r‡   ZsettingZchangedÚprogÚiri   ZparamÚvaluer&   r&   r'   Úreconfigure_alt_settings²  s>    


&"


rª   c             C   sÆ   d}| dkrjg }| rjxT| D ]L}t | d¡ƒ}| ddg¡s\tdƒ tdƒ tdƒ t d¡ | |¡ qW tƒ }td	d
„ |D ƒƒdkr”| t	dƒ¡ tdd
„ |D ƒƒdkr¸| t	dƒ¡ t
||ƒ dS )a&  
    Replace or add settings in php.ini for all alt-php versions
    :param options: list of options to overwrite; empty list [] == overwrite all the two options ('error_log', 'date.timezone')
                                    None == do not overwrite the options
    :type options: list
    Nr7   r›   zdate.timezonez<Error: incorrect parameter of --apply-global-php-ini option:zGPlease use 0, 1 or 2 parameters from the list: error_log, date.timezonezausing --apply-global-php-ini without arguments applies all global php options including two aboverL   c             S   s   g | ]}|d  dkr|‘qS )r   r›   r&   )Ú.0Úxr&   r&   r'   ú
<listcomp>ð  s    z(replace_alt_settings.<locals>.<listcomp>r   c             S   s   g | ]}|d  dkr|‘qS )r   zdate.timezoner&   )r«   r¬   r&   r&   r'   r­   ò  s    )rz   r‰   ÚissubsetrR   rT   rV   r—   rš   rŠ   r“   rª   )Zoptionsr¦   ÚargÚsr™   r&   r&   r'   Úreplace_alt_settingsÜ  s$    

r±   c           
   C   sT  t  ¡ sd S ytj d¡r~tddƒ} |  ¡ }|  ¡  d}x |D ]}| t	¡dkr@d}P q@W |s˜| 
dt	 d ¡ td|ƒ ntdt	d ƒ t dd¡ tj d¡rþtddƒ} |  ¡ }|  ¡  d}x |D ]}| ¡  d	¡rÈd}P qÈW |sü| 
d
¡ td|ƒ ntddƒ t dd¡ W n8 ttfk
rN } zt dt|ƒ¡ W d d }~X Y nX d S )Nz/etc/cxs/cxs.ignorerœ   FéÿÿÿÿTr5   i¤  z/etc/cxs/cxs.defaultzignore=/etc/cxs/cxs.ignorez
ignore=/etc/cxs/cxs.ignore
zignore=/etc/cxs/cxs.ignore
z/Failed to change CXS configuration for CageFS: )r   Z	CXS_checkr   r   r;   r   r   r=   ÚfindÚCXS_IGNORE_COMMANDr¤   r
   r   r<   r’   r    r!   r   r   r"   )r#   r$   ZCXS_HOOK_INSTALLEDr>   ZIGNORE_HOOK_INSTALLEDr%   r&   r&   r'   Úconfigure_cxsø  sB    





rµ   c              C   s   dd l } tƒ rtjdd tƒ  tƒ  tƒ  t ¡  t	ƒ  |  
¡  t ¡ rX|  ¡  tƒ  t ¡ rftƒ  |  ¡  |  ¡  ttjddd tƒ  d S )Nr   F)Zexit_on_errorTr-   )r.   r/   )r:   rJ   r   Zdetect_postgresr(   r   r   Úcagefs_da_libZ"configure_selector_for_directadminrµ   Zcheck_excluder   rˆ   Zadd_spamassassin_dirs_cpanelr,   r   r1   Zadd_mount_for_php_apmZadd_mounts_for_ea_php_sessionsr*   ZVAR_RUN_CAGEFSr   )r:   r&   r&   r'   Úreconfigure_cagefs$  s$    r·   )FFr   )N)N)N)FZ
__future__r   r   r   r   Zfuturer   Zinstall_aliasesÚbuiltinsZcldetectlibr   r   rE   r\   rT   Zxml.dom.minidomZdomZminidomrN   r{   Zpkg_resourcesr   r   r	   Zcagefshooksr
   r•   rŸ   r   Zcagefs_ispmanager_libr   r¶   r:   r   r   Zclcommon.utilsr   rM   ZLSPHP5_PATHrC   r@   rA   r´   r   r0   r(   r+   r,   r1   r*   rJ   rW   r]   rj   rl   rn   rx   ry   r~   r   r€   r   r‚   r   r“   rš   rª   r±   rµ   r·   r&   r&   r&   r'   Ú<module>   sl    
/	

*
,