HEX
Server: LiteSpeed
System: Linux standart9.isimtescil.net 3.10.0-962.3.2.lve1.5.26.7.el7.x86_64 #1 SMP Wed Oct 2 07:53:12 EDT 2019 x86_64
User: karalev (5310)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: //opt/alt/python37/lib/python3.7/site-packages/clselect/__pycache__/clselect.cpython-37.pyc
B

���^�P�@s�ddlmZddlmZddlmZddlZddlZddlZddlmZddlm	Z	ddl
mZdd	l
mZmZdd
lmZGdd�de�ZdS)
�)�absolute_import)�print_function)�divisionN)�glob)�map)�configparser�)�ClSelectExcept�BaseClSelectException)�clprintc@sdeZdZdZdZdZdZdZdZdZ	e	dZ
e	d	Zed
d��Z
edd
��ZdLdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdMdd�Zdd�Zd d!�Zd"d#�Zd$d%�ZdNd&d'�Zd(d)�ZdOd+d,�Zd-d.�Zee�Zd/d0�Zee�Zd1d2�Zee�ZdPd4d5�Z d6d7�Z!d8d9�Z"d:d;�Z#d<d=�Z$dQd>d?�Z%dRd@dA�Z&dBdC�Z'dSdDdE�Z(dFdG�Z)dTdHdI�Z*dUdJdK�Z+d*S)V�ClSelectz/etc/cl.selector/selector.confz/etc/cl.selector/defaults.cfgz/usr/bin/phpz/etc/cl.selector/native.confz/etc/cl.selector/user.confz"/etc/cl.selector/php.extensions.d/z/var/lvez
/php%s.datz/php_native_ver.datcCs`y*dtjkrtj�d�ddlm}m}Wntk
rFtd��YnX|�s\|�s\td��dS)Nz/usr/share/cagefsr)�!multiphp_system_default_is_ea_php�selector_modules_must_be_usedzCageFS not installed.zesystem default PHP version is alt-php. PHP Selector is disabled. Use cPanel MultiPHP manager instead.)�sys�path�appendZ	cagefsctlr
r�ImportErrorr
)r
r�r�B/opt/alt/python37/lib/python3.7/site-packages/clselect/clselect.py�%check_multiphp_system_default_version$s
z.ClSelect.check_multiphp_system_default_versioncCstj�tj�S)N)�osr�existsr�	USER_CONFrrrr�work_without_cagefs0szClSelect.work_without_cagefs�phpcCs@||_|��|_i|_i|_t�|_d|_t�	�|_
|��dS)N)�_item�_get_default_config_handler�_dh�_selector_contents�_native_contents�set�_hidden_extensions�_native_versionrrZwithout_cagefs�_load_config_files)�self�itemrrr�__init__4s

zClSelect.__init__cCs,x&ttj�|jd��D]}|�|�qWdS)Nz*.cfg)rrr�join�CONFIGS_DIR�_load_config_file)r$�filenamerrrr#?szClSelect._load_config_filesc
Cs�tjddd�}y|�|�Wn:tjk
rV}ztj|dt|�d��Wdd}~XYnXy|j�|�	dd��
d��Wntjtjfk
r�YnXdS)NF)�
interpolation�strictzConfig is malformed, error: %s)�message�
extensionsZhide_extensions�,)
�ConfigParserZSafeConfigParser�read�Errorr	ZFileProcessError�strr!�update�get�split�NoSectionError�
NoOptionError)r$�filepath�dh�errrr)Cs$zClSelect._load_config_filec	Csl|��}g}xVt|���D]F}y*|�|||d||d|jf�Wqtk
r^wYqXqWt|�S)zM
        Returns alternatives summary as tuple
        :rtype: tuple
        �version�data)�get_all_alternatives_data�sorted�keysrr�KeyError�tuple)r$�alternativesZlist_of_alternativesZaltrrr�list_alternativesRs
zClSelect.list_alternativesc	Cs6|js0y|��Wntjtjfk
r.iSX|jS)a�
        Returns dict of all selector config contents.
        If no data loads them
        :return:
        {'4.4': {'version': '4.4.9', 'data': {'lsphp': '/opt/alt/php44/usr/bin/lsphp',
                                              'php.ini': '/opt/alt/php44/etc/php.ini',
                                              'php': '/opt/alt/php44/usr/bin/php-cgi',
                                              'php-cli': '/opt/alt/php44/usr/bin/php'}}}
        :rtype: dict
        )r�_load_alternatives_configr	�ConfigNotFound�WrongConfigFormat)r$rrrr>dsz"ClSelect.get_all_alternatives_datacCs@|js|��y||j|iStk
r:t�|��YnXdS)z�
        Returns selector config contents of certain version as dict.
        If no data loads them
        @param version: string, selector version
        @return: dict
        N)rrErAr	�NoSuchAlternativeVersion)r$r<rrr�get_alternatives_datavszClSelect.get_alternatives_dataFc	Cs^|��}y0|j�d|j�}|||d||d|jfStjtfk
rX|�|�SXdS)z/
        Gets default selector version
        �versionsr<r=N)r>rr5rr0r7rA�_compose_native_info)r$�show_native_versionrCr<rrr�get_version�s
zClSelect.get_versioncCsF|��}|�||�|�|jd|j|j|f�}|�d�|�|j�dS)z/
        Sets default selector version
        )rJ�
N)r>�_check_alternative�_process_ini_file�
DEFAULTS_PATH�_add_or_change_optionr�_write_to_filer')r$r<rC�defaults_contentsrrr�set_version�szClSelect.set_versioncCsF|��}|�||�|�|j|j|f|jd�}|�d�|�|j�dS)z5
        Removes disabled state from version
        �staterNN)r>rOrPrQr�_remove_optionrSr')r$r<rCrTrrr�enable_version�szClSelect.enable_versioncCsF|��}|�||�|�|j|j|f|jd�}|�d�|�|j�dS)z-
        Marks a vesrion as disabled
        )rVZdisabledrNN)r>rOrPrQrrRrSr')r$r<rCrTrrr�disable_version�szClSelect.disable_versioncCs|j�d|j|fd�S)z�
        Method that allows you to check if some version is enabled in config.
        E.g. is_version_enabled('5.4') -> True
        :rtype: bool
        z%s%srV)rZ
has_optionr)r$r<rrr�is_version_enabled�szClSelect.is_version_enabledc
	CsF|��}|�|�}dddd�i}t|���dg}x:|D]2}||krLi||<|�|�||d<d||d<q8Wy|j�d|j�}Wn tj	tj
fk
r�d}YnXyd||d<Wntk
r�t�
|��YnX|�d�||d<|�d�|�|d�x>tt|��D].}||}	|	||	d||	dff||<�qWt|�S)	zl
        Returns state of alternatives
        @return: tuple[version, tuple[isEnabled, isDefault]]
        �nativeTF)�enabled�defaultr\r]rJr)r>rKr?r@rZrr5rr0r7r8rAr	rH�pop�remover�range�lenrB)
r$rLrCZnative_infoZsummaryZalt_versionsr<Zdefault_version�idx�vrrr�get_summary�s4




zClSelect.get_summaryc	
Csy�t|j�}x�|D]�}|��}|dkr(q|��\}}}}|j|krDq||jkrXi|j|<||j|d<d|j|kr�i|j|d<||j|d|<qW|js�tjddd��Wn^tt	fk
r�}ztjd|j|fdd��Wdd}~XYn"t
k
�rt�|j��YnXdS)a
        Parses selector config file and fills an instance config dict. Example:
        {'4.4': {'version': '4.4.9', 'data': {'lsphp': '/opt/alt/php44/usr/bin/lsphp',
                                              'php.ini': '/opt/alt/php44/etc/php.ini',
                                              'php': '/opt/alt/php44/usr/bin/php-cgi',
                                              'php-cli': '/opt/alt/php44/usr/bin/php'}}}
        :raises ClSelectExcept.ConfigNotFound:
        :raises ClSelectExcept.WrongConfigFormat:
        �r<r=Nzalt-php packages not found)r-zCannot read %s: %s. Native used)�open�CONFIG_PATH�stripr6rrr	rF�OSError�IOError�
ValueErrorrG)	r$�f�lineZ
stripped_liner%Z
short_versionZlong_versionZ	item_pathr;rrrrE�s0





z"ClSelect._load_alternatives_configNcCs4tjddd�}t|_|r$|�|�n|�|j�|S)z:
        Gets ConfigParser handler for future use
        NF)r+r,)r0r3Zoptionxformr1rQ)r$rr:rrrr
sz$ClSelect._get_default_config_handlercCs|dkr||krt�|��dS)Nr[)r	rH)r<rCrrrrOszClSelect._check_alternativecCs dd�dgt|��}||S)z�
        Gets section header data tuple and returns ini section header string
        @param section_info: tuple
        @return: string
        z[%s]rez%s)r'ra)�section_infoZsection_fmtrrr�_make_section_headerszClSelect._make_section_headercCs0ttdd�|��}|r"|ddkr,|�d�|S)zN
        Removes empty lines from list and appends newline if missing
        cSs|dkS)Nrer)�irrr�<lambda>)�z'ClSelect._smooth_data.<locals>.<lambda>���rN)�list�filterr)r=rrr�_smooth_data%s
zClSelect._smooth_dataTc	Cs�g}g}g}	d}
d}d}|�|�}
y�t|�}x�|D]�}|��}|�d�r�d}
d|krXd}|
|krdd}t|�dkr~|�|�g}|�|||	||��|g}	q2|
r�|	�|�q2|�|�q2W|�|||	||��|��Wntt	fk
r�YnX|�sd|
k�rdd|j
dg}|�|�|}|�s�y|�d�}Wntj
k
�rJYnX|d	k�rz|�|||
d
d�|�g||��nB|dk�r�|�|�|�|||
g||��n|�|||
g||��|S)
z�
        Parses ini file by sections,
        calls supplied callable to modify section is question,
        returns file as list of strings
        F�[Tz
[versions]rz%s = nativerer[Zdisable_extentionsz
modules = r/Zenable_extentions)rorfrh�
startswithra�extendr�closerirjr�
_get_builtinsr	�UnableToGetExtensionsr')r$rrn�functionr=�trace�action�contentsZno_section_contents�sectionZ
in_section�foundZhas_default�section_headerrlrmr]Zbuild_inrrrrP/s\





$

zClSelect._process_ini_filecCsLd|j}|��}y||d|}Wn tk
rF|jdd�}YnX|S)z�
        Retrives path to php binary for supplied version
        :param version: php version to retrive path
        :return: path to php binary. If alternative version not found native php binary path returned
        z%s-clir=�cli)�suffix)rr>rA�_get_native_path)r$r<r%rCrrrr�_get_php_binary_pathfs
zClSelect._get_php_binary_pathcCs:|��}d|�d�i}x|��D]}|�|�||<q W|S)a
        Retrives paths to php binary for all versions
        :return: Dictionary version -> path. Example:
            { '5.2': '/opt/alt/php52/usr/bin/php',
              '5.3': '/opt/alt/php53/usr/bin/php',
              'native': '/usr/bin/php'
            }
        r[)r>r�r@)r$rCZ
paths_dictr<rrr�get_all_php_binaries_pathsts
	z#ClSelect.get_all_php_binaries_pathscCs$t|j|d�}|��}|��|S)z�
        Retrives contents of cache file for supplied php version
        :param version: PHP version to read file
        :return: file contents
        �r)rf�CACHEFILE_PATTERNr1rz)r$r<rl�outputrrr�_read_php_cache_file�szClSelect._read_php_cache_filec

Cs�g}y|�|�}Wn2ttfk
rD}zt�||��Wdd}~XYnX|�d�}t�d�}|d|dkrj|ppt|��}xH|�	d�D]:}|�
|�s�q�d�t�	d|����}	|	|j
kr�|�|	�q�W|S)z1
        Gets php compiled-in extensions
        Nz[Zendz\wrrN�_z\s+)r�rirjr	r|�find�re�compilerar6�matchr'�lowerr!r)
r$r<�builtinsr�r;Z
zend_indexZmodule_patternZstripped_outputZext�modulerrrr{�s



zClSelect._get_builtinscsB|�|�}t|�dks"||dkr&|S|�tt�fdd�|���S)z�
        Adds 'modules' option to section or extends it
        @param section_info: tuple (item and version)
        @param section: list
        @param data: string
        @return: list
        rcs|���S)N)rx)rp)r=rrrq�rrz)ClSelect._remove_option.<locals>.<lambda>)rorarvrtru)r$rnr�r=r~r�r)r=rrW�s

zClSelect._remove_optionc	Cs�|�|�}t|�dks"||dkr&|Sd}x,tt|��D]}||�|d�r8|}Pq8Wd|}|rn|||<n
|�|�|�|�S)z�
        Adds 'modules' option to section or extends it
        @param section_info: tuple
        @param section: list
        @param data: tuple
        @return: list
        rNz%s = %s)rorar`rxrrv)	r$rnr�r=r~r�ZoidxrbZoptionrrrrR�s


zClSelect._add_or_change_optionc
Cs\y$t|d�}|�d|�|��Wn2ttfk
rV}zt�||��Wdd}~XYnXdS)z$
        Saves data to file
        �wz%s
N)rf�writerzrirjr	ZUnableToSaveData)r$Z
file_contentsZ	file_pathrlr;rrrrS�s
zClSelect._write_to_filecCs~dddd�}|j}|r0||kr0d|j||f}|jsB|�|j�||jkrr|j|}tj�|�rrtj�|�sr|S|j|jS)z5
        Returns path for native interpreter
        z-cliz.iniz-fpm)r�ZiniZfpmz%s%s)rr�_load_native_contentsrr�isfile�islink)r$r��suffixesr%rrrrr��s

zClSelect._get_native_pathc	Cs�y�t|j�}xR|D]J}|�d�r"q||kr,qd|kr6qttdd�|�d���\}}||j|<qW||jkrv|j|j|<|��Wn$t	t
fk
r�|j|j|<YnXdS)z�
        Parses native.conf file and loads it as dict, for example:
        {'php-fpm': '/usr/local/sbin/php-fpm', 'php.ini': '/usr/local/lib/php.ini', 'php': '/usr/bin/php', 'php-cli': '/usr/bin/php'}
        �#�=cSs|��S)N)rh)�xrrrrq�rrz0ClSelect._load_native_contents.<locals>.<lambda>N)rf�NATIVE_CONFrxrtrr6r�DEFAULT_PHP_PATHrzrirj)r$�valuerlrmr%rrrrr��s 



zClSelect._load_native_contentscCsR|sdd|��fS|jdd�}|rDd|dfd|df|��fSdd|��fS)Nr[F)�verboseznative (%s)rr)r��get_native_version)r$Zshow_versionZnative_versionrrrrK�s
zClSelect._compose_native_infoc

Cs�|jr|jSt�d�}y t|jd�}|��}|��Wn@ttfk
rv}z|rft	�
ddt|�d��dSd}~XYnXxF|��D]:}|�
|�}|r�|�d�|�d�}}	||	f|_||	fSq�WdS)Nz(PHP\s+(?P<full>(?P<short>\d+\.\d+)\.\d+)r��textZERROR)Zstatusr-�short�full)r"r�r�rf�CACHEFILE_NATIVE_VER_PATTERNr1rzrirjrZ
print_diagr3�
splitlinesr��group)
r$r�Zversion_patternrlr=r;rm�mr�r�rrrr�s$


zClSelect.get_native_version)r)F)F)N)TN)T)T)N)F)T),�__name__�
__module__�__qualname__rgrQr�r�rr(Z
CACHEFILE_DIRr�r��staticmethodrrr&r#r)rDr>rIrMrUrXrYrZrdrErrOrorvrPr�r�r�r{rWrRrSr�r�rKr�rrrrrsV

	
!$

7




r)�
__future__rrrrr�rrr�rZfuture.movesrr0�clselectexceptr	r
�
clselectprintr�objectrrrrr�<module>s