https://t.me/AnonymousX5
Server : Apache
System : Linux cvar2.toservers.com 3.10.0-962.3.2.lve1.5.73.el7.x86_64 #1 SMP Wed Aug 24 21:31:23 UTC 2022 x86_64
User : njnconst ( 1116)
PHP Version : 8.4.18
Disable Function : NONE
Directory :  /opt/alt/python37/lib/python3.7/site-packages/clselector/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/alt/python37/lib/python3.7/site-packages/clselector/__pycache__/selectorlib.cpython-37.pyc
B

���b�*�@sDddlmZddlmZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlmZddlmZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZdd	l m!Z!m"Z"dd
l#m$Z$m%Z%m&Z&ddl'm(Z(ddlm)Z)dd
lm*Z*ddlm+Z+m,Z,m-Z-ddl.m/Z/m0Z0m1Z1m2Z2ddlm3Z3ddl4m5Z5m6Z6ddlm7Z8ddl9m:Z:ddl;m<Z<ddl=m>Z>m?Z?ddl@mAZAddlBmCZDddlEmCZFddlGmHZHmIZImJZJmKZKmLZLmMZMddlNmOZOddlPmQZQmRZRGdd�de�Z7Gdd�de7�ZSdd iZTGd!d"�d"eU�ZVdS)#�)�print_function)�division)�absolute_importN)�Set)�	iteritems)�FormattedException)�resolve_username_and_doc_root)�CP_NAME�docroot)�NoDomain�NotSupported�
IncorrectData)�exec_utility)�clselectctl)�clpassenger)�ClUserSelect�ClSelect�ClExtSelect)�APP_STARTED_CONST�ENABLED_STATUS�DISABLED_STATUS�BaseSelectorError)�validate_env_vars)�format_summary�API_1)�ClSelectExcept)�NodeJSConfigError)�NodeManager)�PythonAppFormatVersion�get_venv_rel_path)�
PythonManager)�Environment)�mkdir_p�	file_read�
file_write�get_using_realpath_keys�get_abs_rel�delete_using_realpath_keys)�get_perm)�_set_ui_config�UIConfigExceptionc@seZdZdS)rN)�__name__�
__module__�__qualname__�r.r.�G/opt/alt/python37/lib/python3.7/site-packages/clselector/selectorlib.pyrFsrc@seZdZdZdS)�ClSelectDomainNotFoundzK
    Custom exception in case if user doesn't have the specific domain
    N)r+r,r-�__doc__r.r.r.r/r0Jsr0�status�okc@s�eZdZdd�Zdd�Zdd�Zed�dd	��Zed
d��Zedd
��Z	ed�dd��Z
ed�dd��Zedd��Zed�dd��Z
dd�Zedd��Zdd�Zdd�Zedd��Zed d!��Zd"d#�Zd�d$d%�Zed&d'��Zd(d)�Zed*d+��Zd,d-�Zd�d.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z d<d=�Z!d>d?�Z"d@dA�Z#dBdC�Z$dDdE�Z%dFdG�Z&dHdI�Z'dJdK�Z(dLdM�Z)d�dNdO�Z*edPdQ��Z+d�dRdS�Z,d�dTdU�Z-edVdW��Z.d�dYdZ�Z/d�d\d]�Z0d^d_�Z1d`da�Z2dbdc�Z3ddde�Z4edfdg��Z5dhdi�Z6edjdk��Z7dldm�Z8dndo�Z9edpdq��Z:d�drds�Z;d�dtdu�Z<dvdw�Z=edxdy��Z>d�dzd{�Z?d|d}�Z@d~d�ZAd�d��ZBd�d��ZCd�d�d��ZDd�d��ZEd�d��ZFd�d��ZGed�d���ZHed�d���ZIeJd�d���ZKd�d��ZLd�d��ZMdS)��CloudlinuxSelectorLibcCs�||_d|_d|_d|_d|_d|_d|_d|_d|_d|_	d|_
d|_|j|jkr�dd	lm
}|�|_	t�|_tj|_
tj|_nZ|j|jkr�dd	lm
}|�|_	t�|_tj|_
tj|_n |j|jkr�dd
lm}|�|_dS)Nz/usr/bin/selectorctlz+/usr/share/l.v.e-manager/utils/dynamicui.pyz/usr/sbin/cloudlinux-selector�nodejs�python�ruby�phpr)�ApplicationsManager)�
PhpManager)�interpreter�_SELECTORCTL_UTILITY�DYNAMIC_UI_CTL_CMDZCLOUDLINUX_SELECTOR_UTILITY�NODEJS_INTERPRETER�PYTHON_INTERPRETER�RUBY_INTERPRETER�PHP_INTERPRETER�selector_manager�apps_manager�selector_user_lib�selector_old_lib�$clselect.clselectnodejs.apps_managerr9r�clselectZclselectnodejsuserZclselectctlnodejsuser�$clselect.clselectpython.apps_managerr ZclselectpythonuserZclselectctlpythonZ clselect.clselectphp.php_managerr:)�selfr;r9r:r.r.r/�__init__Us6

zCloudlinuxSelectorLib.__init__cCs |j|jkrdS|jj��dS)za
        Checks that selector is able to work on current os environment
        :return:
        N)r;rArBZ
cl_select_lib�check_requirements)rIr.r.r/�check_selector_is_availablewsz1CloudlinuxSelectorLib.check_selector_is_availablecCs"|j�||�}|�||�\}}|S)z7Get doc_root from application config or raise exception)rCZget_app_domain�$safely_resolve_username_and_doc_root)rI�username�app_root�domain�_�doc_rootr.r.r/�safely_resolve_doc_root_for_app�sz5CloudlinuxSelectorLib.safely_resolve_doc_root_for_appNcCs�yt||d�\}}Wn~tk
rHt|dk	r2dnd||d�d���YnLtk
rltddtid���Yn(tk
r�td	||d�d���YnX||fS)
a8
        Safely resolve username and doc_root by domain,
        or resolve document root by username,
        or resolve document root and username by effective uid
        :param user: str -> name of unix user
        :param domain: str -> domain of panel user
        :return: tuple -> user, doc_root
        )�userrPNzNo such domain: %(domain)szNo such user: %(user)s)rPrT)�message�contextz+Nodejs selector not supported for %(panel)s�panelz3Domain %(domain)s is not owned by the user %(user)s)rrr0rrr	r
)rTrP�result_user�result_doc_rootr.r.r/rM�s&z:CloudlinuxSelectorLib.safely_resolve_username_and_doc_rootcCstd}t�\}}|dkrd}nTt|t�s,d}nD|ddkrJ|ddkrJd}n&|dkr`|dkr`d}n|ddkrpd}|S)	z�
        Check whether selector should be run through "su - user"
        :param opts: dict of parsed cli params
        :return: True if should be run through su or False if not
        TNFz--userz--domainrz
--interpreterr8)r(�
isinstance�dict)�opts�result�euidZegidr.r.r/�should_be_runned_as_user�s

z.CloudlinuxSelectorLib.should_be_runned_as_usercCs$|ddko"|ddk	o"t��dkS)Nz
--interpreterr8z--userr)�os�geteuid)r\r.r.r/�should_run_user_without_cagefs�sz4CloudlinuxSelectorLib.should_run_user_without_cagefscCst�|�}|S)z�
        Resolves user eigher with passed username or with getting current
        user ID
        :param user: str or None -> username to be resolved
        :return: obj -> pwd user object
        )�pwd�getpwnam)rT�userdatar.r.r/�_get_user_pwd_data�s
z(CloudlinuxSelectorLib._get_user_pwd_datacCs"|dkr|dkrtdid���dS)z�
        Check if user and domain are None
        :param user: name of unix user
        :param domain: domain of panel user
        :return: None
        NzBUser or domain parameter must be specified if current user is root)rUrV)r)rTrPr.r.r/�user_and_domain_checker�sz-CloudlinuxSelectorLib.user_and_domain_checkercKs&dd|i}t|�dkr"|�|�|S)Nr2z	ERROR: %sr)�len�update)r]�kwargs�errr.r.r/�
_return_error�s
z#CloudlinuxSelectorLib._return_errorcCs d|d�}|r|�d|i�|S)z�
        Construct error dict in one place
        :param result: error string
        :return: dict with 'status':'error' and error message
        �error)r2r]�details)ri)r]rnrkr.r.r/�_return_with_status_error�s
z/CloudlinuxSelectorLib._return_with_status_errorc
Cs�|ttfkr|�d�|��Sy|tk|j_Wn(tk
rT}z
|�|�Sd}~XYnX|j|jkr�dd|tkii}yt	|�t
Stk
r�YnX|j|jkr�dd|tkii}yt	|�t
Stk
r�YnX|�
�t
S)z�
        Set CL selector status in it's config
        :param status: set status of selector
        :return: error or ok message
        zKUnknown selector status provided: "{}". Can be only 'enabled' or 'disabled'N�
uiSettings�
hidePythonApp�
hideNodeJsApp)rrrl�formatrB�selector_enabledrr;r?r)�OK_RES_DICTr*r>�	update_ui)rIr2�e�config_dictr.r.r/�_change_selector_statuss0z-CloudlinuxSelectorLib._change_selector_statuscCsddi}t�jrd|d<|S)NrtFT)rrt)�resr.r.r/�get_nodejs_selector_status,sz0CloudlinuxSelectorLib.get_nodejs_selector_statuscCsd|jjrtntiS)NZPHPSelector)rBrtrr)rIr.r.r/�get_php_selector_status3sz-CloudlinuxSelectorLib.get_php_selector_statusc
CsJy|j��}|�|���|Stk
rD}z
|�|�Sd}~XYnXdS)N)rB�get_summaryri�get_selector_statusrrl)rIrzrwr.r.r/r}6s
z!CloudlinuxSelectorLib.get_summarycCsddi}t�jrd|d<|S)NrtFT)r rt)rzr.r.r/�get_python_selector_status>sz0CloudlinuxSelectorLib.get_python_selector_statuscCs2yt�|�jStk
r,tddi��YnXdS)NrUzNo such user: `%(user)s`)rcrd�pw_dir�KeyErrorr)rTr.r.r/�
get_user_homeEs
z#CloudlinuxSelectorLib.get_user_homecCst���}|�|���|S)N)rr}rir~)rIrzr.r.r/�get_nodejs_summaryNs
z(CloudlinuxSelectorLib.get_nodejs_summaryc	Cs�|�|�}|j|jkr*|j�|||d�}n&|j|jkrJ|j�|||d�}nt��|g}|j|jkrl|�d�|�|�|dk	r�|j|jkr�|�d�|�|�|�	|||�}|S)aD
        Runs script to execute other script inside user app environment
        :param user: str -> owner of application
        :param app_root: str -> application directory
        :param script_name: str -> name of script
        :param script_args: list of str -> arguments for the script
        :return: dict
        Znpmr6z
run-scriptNz--)
r�r;r>rC�get_binary_pathr?�NotImplementedError�append�extend�_run_interpreter)	rIrTrO�script_nameZscript_args�	user_homeZinterpreter_path�cmdr]r.r.r/�
run_scriptSs$	




z CloudlinuxSelectorLib.run_scriptc	
Cs�tj|tj�||�tjtjdd�}y|��\}}Wn6tk
rh}ztd||d�d���Wdd}~XYnXd�	|j
|��|���}dt�
|�����i}|�d	d
i�|S)z�
        Run interpreter in users environment
        :param cmd: list -> command to execute
        :param user_home: -> user home directory
        :param app_root: -> app path
        :return: dict
        T)�args�cwd�stdout�stderr�textz6run-script call: `%(args)s` failed with error: %(err)s)r�rk)rUrVNz%returncode: {}
stdout:
{}
stderr:
{}
�datar2�success)�
subprocess�Popenr`�path�join�PIPE�communicate�OSErrorrrs�
returncode�strip�base64�	b64encode�encode�decoderi)	r�r�rO�pr�r�rwZ
output_stringr]r.r.r/r�ps 	"
z&CloudlinuxSelectorLib._run_interpretercCs |j|j|jfkr|j��SdS)N)r;r>rArBr})rIr.r.r/�get_full�szCloudlinuxSelectorLib.get_fullcCsZt���}t��}x$t|�D]\}}||d7<qWx|D]}||d|d<q>W|S)a_
        Add selector usage statistics (amount of
        domains that use some version, etc)
        Fist parameter is an array with such format:
        [{'version': '5.6'}, {'version': '7.6'}]
        Output is an array with such format:
        [{'version': '5.6', 'users': 10}, ...]
        :type versions_list: list
        :rtype: list
        ��versionZtotal_users)r�get_user_version_map�collections�Counterr)Z
versions_listZuser_version_mapZversion_user_maprTr��itemr.r.r/�_add_statistics_field�s

z+CloudlinuxSelectorLib._add_statistics_fieldcCst|j|jkr6t|j��d�}t|dtd�}t�|�}n|jdk	rL|j��}ni}|�	d�dkrld|di}n|}|S)zG
        Retrieves supported versions list and default version
        F�json)rs�api_versionNr2�ERRORrU)
r;rArr}rrr��loadsrB�get)rIr��	json_dataZselectorctl_resultr]r.r.r/�get_supported_versions�s
z,CloudlinuxSelectorLib.get_supported_versionscCs4|r
|gnd}|j|jkr&|j�|�S|�d�SdS)z3
        Retrives current version for user
        NzSupported only by php selector)r;rArB�get_current_versionrl)rIrTr.r.r/r��sz)CloudlinuxSelectorLib.get_current_versioncCsR|��}y|d}Wn4tk
rHd|kr:|�|d�Sd|d�SYnXd|iS)N�default_versionrUr�)r2r�)r�r�rl)rI�	json_dictr�r.r.r/�get_default_version�sz)CloudlinuxSelectorLib.get_default_versioncCs@|j|jkr|��S|j|jkr(|��S|j|jkr<|��SdS)N)r;r>r{r?rrAr|)rIr.r.r/r~�sz)CloudlinuxSelectorLib.get_selector_statuscCs
|jjS)N)rBrt)rIr.r.r/�php_selector_is_disabled�sz.CloudlinuxSelectorLib.php_selector_is_disabledcCs|jjS)N)rBrt)rIr.r.r/�php_selector_is_enabled�sz-CloudlinuxSelectorLib.php_selector_is_enabledcCs�|j|jkrdSy*dtjkr(tj�d�ddlm}m}Wntk
rNdSX|�r�|�	�s�|�}|r�y|d}|�
d�s�dSWntk
r�YnXdS)z�
        Returns True when MultiPHP system default PHP version is alt-php and PHP Selector is NOT disabled
        For details please see LVEMAN-1170
        Fz/usr/share/cagefsr)�is_ea4_enabled�read_cpanel_ea4_php_conf�defaultzea-phpT)r;rA�sysr�r��	cagefsctlr�r��ImportErrorr��
startswithr�)rIr�r��conf�default_phpr.r.r/�check_multiphp_system_default�s$

z3CloudlinuxSelectorLib.check_multiphp_system_defaultcCs�|j|j|jfkrrxZt|�D]N\}}y|�||�}Wn(tk
r\}z
|�|�Sd}~XYnX|tkr|SqWtS|��}y|d}Wn&t	k
r�|�d|j
|jf�SXdd�|D�}t|���|r�|�dd�
t|���|�|j
|jf�Sd}	g}
xNt|�D]B\}}|�r,t|j��t|��nt|j��t|��|	d7}	�qW|	t|�k�r`tS|	dk�r�d	d
�|	t|�|
�iS|�d�|
��SdS)N�available_versionsz:corrupted answer from %s --json --summary --interpreter %scSsh|]}|d�qS)r�r.)�.0�xr.r.r/�	<setcomp>sz?CloudlinuxSelectorLib.set_supported_versions.<locals>.<setcomp>zWinvalid alternative versions (%s), see %s --summary --interpreter %s for valid versionsz, rr�r2z>WARNING: only {} of {} commands was successful. Errors was: {}z&All commands were failedErrors was: {})r;r>r?r�set_version_statusrrlrur�r�r<�set�keysr�r�enable_version�str�disable_versionrhrs)rI�versionsr�Zenable_disabler]rwr�Zalternatives_listZalternatives_versionsr�Zerrors_listZ	to_enabler.r.r/�set_supported_versions�sF
z,CloudlinuxSelectorLib.set_supported_versionsc
Cs~y|jdk	r|j�|�Wn^tjjjk
rFtdd|id���Yn4tjjtfk
rx}z|�t	|��Sd}~XYnXt
S)NzNo such php version: %(ver)s�ver)rUrV)rB�switch_default_versionrG�clselectexceptr�NoSuchAlternativeVersion�BaseClSelectExceptionrror�ru)rIr�rwr.r.r/�set_default_version)s
z)CloudlinuxSelectorLib.set_default_versioncCs&|r|j�|t�n|j�|t�tS)z�
        Disable or enable version of selector
        :param target_version_status: disable or enable version of interpreter
        :param version: version of interpreter
        :return: OK_RES_DICT
        )rBr�rrru)rIZtarget_version_statusr�r.r.r/r�5sz(CloudlinuxSelectorLib.set_version_statusc
Cs|y|j|jkr|j�|�WnZtjjjk
rHtdd|id���Yn0tjjk
rv}z|�	t
|��Sd}~XYnXtS)NzNo such php version: %(ver)sr�)rUrV)r;rArBZswitch_current_versionrGr�rr�r�ror�ru)rIr�rwr.r.r/�set_current_versionDsz)CloudlinuxSelectorLib.set_current_versionc
Cs�i}y|j|jkr|j�|�}WnZtjjjk
rLtdd|id���Yn0tjjk
rz}z|�	t
|��Sd}~XYnX|S)NzNo such php version: %(ver)sr�)rUrV)r;rArB�reset_extensionsrGr�rr�r�ror�)rIr��
extensionsrwr.r.r/r�Psz&CloudlinuxSelectorLib.reset_extensionscCs$|j|j|j|jfkr |�|�SdS)N)r;r>r?rAry)rIr2r.r.r/�set_selector_status]sz)CloudlinuxSelectorLib.set_selector_statuscCsNt��st��st��rJt|jdgdd�\}}}|dkrJ|�d�||��SdS)Nz--sync-conf=allT)r�rz"Can not sync UI with reason: {} {})�detect�	is_cpanel�is_plesk�is_darr=rlrs)rI�retcode�outrkr.r.r/rvaszCloudlinuxSelectorLib.update_uic
Csnt��}|j|jkrjy |j�||�}|r2|�|�Wn0tjj	k
rd}z|�
t|��Sd}~XYnX|SdS)N)ru�copyr;rArB�set_extensionsrirGr�r�ror�)rIr�r�r]r�rwr.r.r/r�jsz$CloudlinuxSelectorLib.set_extensionsc
CsT|j|jkrPy|j�||�Wn0tjjk
rN}z|�t|��Sd}~XYnXt	S)N)
r;rArB�set_optionsrGr�r�ror�ru)rI�optionsr�rwr.r.r/r�usz!CloudlinuxSelectorLib.set_optionscCs�|dkrt|���dd�}|dks(|dkr8td�|j���|j|jkrpt�d|�}|sftdd|id���|�d	�S|St	|t
tf�r�|j|jkr�tt
|��St|�S|d
kr�tdd|id���|S)a3
        Attempts to get or verify version to be passed to external program
        Currently supported version is one digit (6 or 8).
        If version is None, return a default version
        :param version: str or None -> version to be verified or found
        :return: str -> digit as string
        Nr��z{} default version not definedz(?P<version>\d+)z#Incorrect selector version: %(ver)sr�)rUrVr��nativezUnsupported version: %(ver)s)
r�r�rrsr;r>�re�match�grouprZ�int�floatr�)rIr�r��mr.r.r/�resolve_version}s&
z%CloudlinuxSelectorLib.resolve_versionc

Cs�|�||�|�|�}|dk	r,tt�|��}|�||�\}}y�|j|jkrp|jj	|||||||||	|j
|
d�nT|j|jkr�tj
j	|||||d�n0|j|jkr�|jj	||||||||||j
|
d�Wn2tjjk
r�}z|jt|�d�Sd}~XYnXtS)a�
        Creates application for specified user, interpreter and version
        If user is None we hope that the external application resolves a user
        Currently NodeJS supported only
        :param domain: str -> domain of the application
        :param app_root: str -> app path relative to user home
        :param app_uri: str -> URI path of the application
        :param version: str or None -> version of the interpreter
        :param user: str or None -> username of user who owns the app
        :param app_mode: str or None -> application mode (development or production)
        :param startup_file: str or None -> main application file
        :param env_vars: json_string or None -> enviroment variables for application
        :param entry_point: Application entry point (used only for python interpreter).
        :param passenger_log_file: Passenger log filename
        :return: dict
        N)rR�env_vars�startup_file�domain_name�entry_pointrC�passenger_log_file)rR)r�rR�app_moder�r�r�rCr�)r])rgr�rr�r�rMr;r?rE�createrCr@rG�clselectctlrubyr>r�r�ror�ru)
rIrO�app_urir�rTrPr�r�r�r�r�rRrwr.r.r/�
create_app�s*

z CloudlinuxSelectorLib.create_appcCs2tj�|j|�}tj�|�s.tdd|id���|S)z�
        Resolve app root to absolute path and checks if it exists
        :param app_root: str -> relative a user homedir app path
        :param userdata: obj -> pwd user object
        :return: str -> absolute path to app
        zNo such application: %(app)s�app)rUrV)r`r�r�r��isdirr)rOre�app_pathr.r.r/�_get_application_path�s
z+CloudlinuxSelectorLib._get_application_pathc
Cs�t��}|�|d�|�|�}|�||�}tj�||�}tj�|�sVt	dd|id���y:t
|d��&}|��}	|�dt
�|	���i�WdQRX|Stk
r�}
z|�t|
dd��Sd}
~
XYnXdS)	a 
        Reads file and returns its content as Base64 string
        :param app_root: str -> path to app relative to user home
        :param user: str -> username to resolve app path
        :param config_path: str -> file to be read (relative to app path)
        :return: dict
        Nz&Configuration file not found: %(path)sr�)rUrV�rbr��strerrorr�)rur�rgrfr�r`r�r��existsr�open�readrir�r�r��	Exceptionro�getattr)rIrO�config_pathrTr]rer��full_config_path�fr�rwr.r.r/�read_app_config�s 
"z%CloudlinuxSelectorLib.read_app_configc

Cs�|�|d�|�|�}|�||�}tj�||�}y*t|d��}|�t�	|��WdQRXt
Stk
r�}	z|�t
|	dd��Sd}	~	XYnXdS)a�
        Saves data passed as Base64 string to specified file
        :param content: data for saving in app's config
        :param app_root: str -> path to app relative to user home
        :param user: str -> username to resolve app path
        :param config_path: str -> file to be read (relative to app path)
        :param content: str -> Base64-encoded string
        :return: dict
        N�wbr�r�)rgrfr�r`r�r�r��writer��	b64decoderur�ror�)
rIrOr��contentrTrer�rrrwr.r.r/�save_app_config�s

z%CloudlinuxSelectorLib.save_app_configcCsDt|�}|dk	r |�d|g�n |dk	r8|�d|g�ntd��|S)Nz--domainz--userzBUser or domain parameter must be specified if current user is root)�listr�r)rTrPr�Zresult_argsr.r.r/�_add_user_or_domain	sz)CloudlinuxSelectorLib._add_user_or_domainFc
Cs�|�||�|j|jkr,tdd|jid���y"x|D]}|j�|||�q4WWn0tjjk
r~}z|�	t
|��Sd}~XYnXtSdS)an
        Uninstall described modules for user's webapp
        :param app_root: directory with webapp
        :param modules: comma-separated list of modules to uninstall
        :param user: name of unix user
        :param domain: domain of user
        :param skip_web_check: skip check web application after changing its properties
        :return: None
        zJUninstall command is available only for python interpreter, not %(interp)s�interp)rUrVN)rgr;r?rrEZ	uninstallrGr�r�ror�ru)rIrO�modulesrTrP�skip_web_check�modulerwr.r.r/�uninstall_moduless

z'CloudlinuxSelectorLib.uninstall_modulesr.c

Cs*|�||�|j|jkrjy|jj||||jd�Wn0tjjk
rb}z|�	t
|��Sd}~XYnXtSn�|j|jk�ry`|r�xV|D]}|jj|||d||jd�q�Wn.|r�|jj||d|||jd�nd}	|�	|	�SWn2tjjk
�r
}z|�	t
|��Sd}~XYnXtSnt
dd|jid���dS)a�
        Install described modules for user's webapp
        :type domain: domain of user
        :param user: name of unix user
        :param app_root: directory with webapp
        :param skip_web_check: skip check web application after change it's properties
        :param spec_file: file containing modules and their versions to install
        :param modules: list of installed modules
        :return: None
        )rrCNz9Please, specify modules or requirements file with moduleszUnknown interpreter: %(interp)sr
)rUrV)rgr;r>rE�installrCrGr�r�ror�rur?r)
rIrOrTrPrZ	spec_filerrwr
rkr.r.r/�install_modules.s2
z%CloudlinuxSelectorLib.install_modulesc
Cs�|�|d�y�|j|jkr*tj�||�n�y|�||�}Wn<tk
r`tj	dd|id��Ynt
k
rvd}YnX|j|j|jfkr�|j
j||||jd�ntjdd|jid��Wn0tjjk
r�}z|�t|��Sd}~XYnXtS)z�
        Destroy specified application root directory and user name
        :param app_root: Application directory
        :param user: name of unix user
        :return: dict
        Nz\No such application or it's broken. Unable to find app-root folder by this path %(app_root)srO)rUrV)rRrCzUnknown interpreter: %(interp)sr
)rgr;r@rGr�ZdestroyrS�	TypeError�ClSelectExceptions�	WrongDatar0r>r?rErC�InterpreterErrorr�r�ror�ru)rIrOrTrRrwr.r.r/�destroy_appZs*
z!CloudlinuxSelectorLib.destroy_appc
Cs�|�|d�yL|�||�}|j|j|jfkrB|j�||||j�ntj	dd|jid��t
Stjj
k
r�}z|�t|��Sd}~XYnXdS)z�
        Start specified application root directory and user name
        :param app_root: Application directory
        :param username: name of unix user
        :return: dict
        NzUnknown interpreter: %(interp)sr
)rUrV)rgrSr;r>r?rE�startrCrrrurGr�r�ror�)rIrOrNrRrwr.r.r/�	start_app~szCloudlinuxSelectorLib.start_appc
Cs�|�|d�yh|�||�}|j|jkr<|j�||||j�n6|j|jkr^|j�||||j�ntj	dd|jid��t
Stjj
k
r�}z|�t|��Sd}~XYnXdS)z�
        Destroy specified application root directory and user name
        :param app_root: Application directory
        :param username: name of unix user
        :return: dict
        NzUnknown interpreter: %(interp)sr
)rUrV)rgrSr;r>rE�restartrCr?rrrurGr�r�ror�)rIrOrNrRrwr.r.r/�restart_app�sz!CloudlinuxSelectorLib.restart_appc
Cs�|�|d�yh|�||�}|j|jkr<|j�||||j�n6|j|jkr^|j�||||j�ntj	dd|jid��t
Stjj
k
r�}z|�t|��Sd}~XYnXdS)z�
        Start specified application root directory and user name
        :param app_root: Application directory
        :param user: name of unix user
        :return: dict
        NzUnknown interpreter: %(interp)sr
)rUrV)rgrSr;r>rE�stoprCr?rrrurGr�r�ror�)rIrOrTrRrwr.r.r/�stop_app�szCloudlinuxSelectorLib.stop_appc
Cs�d|d��}d|d��}x�t�tj�|ddd��D]�}tj�|�s:yPt|dd�}|��|ksl||kr�|�|��|���}|�||�}	t||	d�Wq:t	k
r�t
��\}
}
}t
j�
tt�|���Yq:Xq:WdS)	z�
        Replace old prompt and env_var in binaries in new environment
        Working with bytes here, because of python binary
        �(�:�*�binr�)�moderN)r��globr`r�r�r�r#�replacer$�IOErrorr��exc_infor�rr��	traceback�print_tb)�new_env�old_env�new_rel�old_relZ
old_promptZ
new_promptZ
venv_bin_fileZold_activateZ
_new_activateZnew_activaterQZ
traceback_r.r.r/�6_replace_old_env_and_prompt_in_binaries_in_environment�szLCloudlinuxSelectorLib._replace_old_env_and_prompt_in_binaries_in_environmentcCs�y~t|||�}t�|�j}t|d�d}||jj|j�|||�|d|d|d�||ddg�d�||g�|dgd�i}|St	k
r�iSXdS)a�
        Retrieve application info from user's applications config. Analog of function clpassenger.summary
        :param username: User name
        :param app_config_dict_full: Full user's application config.
        :param app_root: Application root
        :return: Dictionary with application info
         Example:
         { 'binary': '/home/cltest1/virtualenv/new_app_root/2.7/bin/python',   # +
           'domain': 'cltest1.com',                                            # +
           'alias': 'app1',                                                    # +
           'htaccess': '/home/cltest1/public_html/app1/.htaccess',             # +
           'interpreter': 'python',                                            # +
           'directory': '/home/cltest1/new_app_root',                          # +
           'docroot': '/home/cltest1/public_html',                             # +
           'domains': ['cltest1.com']
         }
        rPrr��/z	.htaccess)r;�binary�aliasrPr
�htaccess�	directory�domainsN)
r%rcrdr�r
rCZINTERPRETERr�r�r�)rIrNZapp_config_dict_fullrOZapp_config_dictr�rRZ
app_info_dictr.r.r/�get_app_summary�s z%CloudlinuxSelectorLib.get_app_summarycCsZtj�|�s"t|�t�||�n4x(t�|�D]}t�tj�||�|�q.Wt�	|�dS)z�
        Move all items from old directory of application to new directory
        :param old_directory: full real path to old directory of applicaton
        :param new_directory: full real path to new directory of applicaton
        N)
r`r�r�r"�rename�listdir�shutil�mover��rmdir)�
old_directory�
new_directoryr�r.r.r/�_move_app_from_old_dir_to_new�s	z3CloudlinuxSelectorLib._move_app_from_old_dir_to_newc
Cs<|j�|�}yt|||�}Wn"tk
r>t�d|��YnXt||�\}}t||�\}}	yt�|	�Wn0t	k
r�}
zt�
t|
���Wdd}
~
XYnX|�|||	�}yt||	|�Wntk
r�YnXt�
|��|�|||�}yt|||�}
Wn$tk
�rt�
d|��YnX|
d}|
d}|jj||||d�j}|j|jk�r�t||�\}}t||�\}}t|t|||d�d�\}}nR|j|jk�r�t|tj�|jjj|��\}}t|tj�|jjj|	��\}}nt��tj�|d�}tj�|d�}tj�|�}tj�|��s t�|�t� ||�|�!||�|j|jk�rV|�"|||	|�|j|jk�rtt||�\}}n$|j|jk�r�|j�#||�}nt��|jj�$|||�}|��j%}t|||�d	}|t&k�rt'�(||�||�)d
d�}t'j*||||j|||d|d�t'�+||�t,|||�|||<|j�-||�dS)
a
        Move user's application from directory to new_directory
        :param user:  application owner. unix like user name
        :param old_directory: current directory with application
        :param new_directory: new directory for application
        :return: None
        z8No such application (or application not configured) "%s"Nr
r.)�app_summary)r�r�r��
app_statusr�r�)rRr�r�).rC�get_user_config_datar%r�r�NoSuchApplicationr&r�check_directory�
ValueErrorrr�r2�AppRootBusyrE�_get_environment�namer;r?rr>r`r�r�rDZenvironmentsZDEFAULT_PREFIXr��dirnamer��makedirsr5r6r:r+�_get_prefixr!r-rr�unconfigurer��	configurerr'�write_full_user_config_data)rIrTr8r9�full_config�
app_configZold_absr*Znew_absr)rwZnew_user_summaryZold_user_summaryZold_user_app_summaryrRr.�env_namer�Zrel_venvZ_old_envrQZ_new_envr(r'Znew_env_dir�prefix�environmentr-r<�passenger_log_file_to_setr.r.r/�	_relocates� 





zCloudlinuxSelectorLib._relocatec
CszyD|j|j|jfkr$|�|||�n|j|jkrBtj�|||d�Wn0tjj	k
rt}z|�
t|��Sd}~XYnXtS)a=
        Call selectorctl to relocate application from old_app_root to new_app_root
        :param user: application owner
        :param old_app_root: current application directory (current application name)
        :param new_app_root: new application directory (new application name)
        :return: json
        N)
r;r?r>rPr@rGr��relocater�r�ror�ru)rIrTZold_app_rootZnew_app_rootrwr.r.r/rQ�szCloudlinuxSelectorLib.relocatecCsrd}tj�|||�}tj�|||�}tj�|�tj�|�kr@dStj�|�}tj�|�sbt�|�t�||�dS)a
        :param old_doc_root: path to old doc root of application
        :param old_alias: old alias (uri) of application
        :param new_doc_root: path to new doc root of application
        :param new_alias: new alias (uri) of application
        :return: None
        z	.htaccessN)	r`r�r��realpathrDr�rEr5r�)�old_doc_root�	old_alias�new_doc_root�	new_aliasr/Zold_htaccess_fileZnew_htaccess_fileZnew_htaccess_pathr.r.r/�_transit_htaccess_file�s

z,CloudlinuxSelectorLib._transit_htaccess_filecCs�|j�|�}yt|||�}Wn$tk
r@t�d�|���YnX|�|||�}yt|||�}	Wn$tk
r�t�d�|���YnX|	d}
|	d}|dkr�|
nt	�
|�}|jj||||d�}
|
�
�j}||dtk�r6||�dd�}tj||||j
|dd	||d
|d�
tj|||
|||d�t�||�n|dk�rD|}|�||
||�||d
<|dk	�rn||d<|j�||�dS)a�
        Change application URI
        :param user: application owner. unix like user name
        :param directory: directory with application. (app-root)
        :param alias: new alias (app-uri) for application or None if change only the domain
        :param new_doc_root: NEW doc_root to transit application to
        :param new_domain: NEW domain to transit application to
        :return: None
        z8No such application (or application not configured) "{}"r.r
N)r;r<r�T�transitr�)rRr�r�)rSrUr�rP)rCr=r%r�rr>rsr2rr�	get_aliasrErBr;r-rr�rrHr6rrWrI)rIrTr0rU�
new_domainr.rJrKZapps_summaryZold_app_summaryrTrSrVrNr-rOr.r.r/�_transit�sD



zCloudlinuxSelectorLib._transitc
Cs�yp|dkrd}n|�||�\}}|j|j|jfkrF|�|||||�n(|j|jkrhtjj||||d�nt	��Wn0tj
jk
r�}z|�t
|��Sd}~XYnXtS)aV
        Call selectorctl to transit application to new_app_uri
        :param user: application owner
        :param app_root: application directory (application name)
        :param new_app_uri: new uri or None if change only the domain
        :param new_domain: new domain or None if change only the app_uri
        :return: json
        N)rR)rMr;r?r>r[r@rGr�rXr�r�r�ror�ru)rIrTrOZnew_app_urirZrUrQrwr.r.r/rX�s	
zCloudlinuxSelectorLib.transitcCsVd}|r.y|�|�}Wntjk
r,YnX|j�||j|�|dkrRt�d��dS)z�
        Install nodejs extensions to new nodejs environment and change
        symlink <user_homedir>/<app-root>/node_modules to new environment.
        Raise exception `WebAppError` if npm will return non-zero code
        rz<Module installation has been failed. Please, check npm logs.N)Zextension_install_single_callr�FileProcessErrorrEZ_create_symlink_to_node_modulesr��WebAppError)rIrTrOr'�old_extensionsZnpm_ret_coder.r.r/�_relocate_nodejs_extensions�sz1CloudlinuxSelectorLib._relocate_nodejs_extensionsc	Cs�t|���}x6||D]*}y|�|�Wqtjk
r>YqXqWx6||D]*}y|�|�WqNtjk
rvYqNXqNWdS)z�
        Install python extensions to new python environment.
        They are equivalent to extensions from old environment.
        Remove python extensions which not existing
        in old environment from new environment
        N)r�r�Zextension_uninstallr�ExternalProgramFailed�extension_install)r'r^Znew_extensions�	extensionr.r.r/�_relocate_python_extensionss

z1CloudlinuxSelectorLib._relocate_python_extensionsc

sv�j����yt�����Wn"tk
r>t�d���YnX�j����}�sd|j|�	��
�iS�j�����}�����t
|���}�j	�jkr���||�n�j	�jkrˆ���||�t���}t��|�}	|	d�|�	�j��j�|	��\�}
���������f	dd�}|�sly�jj|
�|d�Wn4tjk
�rh}zt�d|��Wdd}~XYnXn|�dS)a�
        Set current interpreter version for the application

        :param user: application owner. unix like user name
        :param directory: app_root - main directory with user application
        :param version: new version of python interpreter or None if we get current
        :param skip_web_check: skip check web application after change it's properties
        :return: None
        z8No such application (or application not configured) "%s"r
c
slt�������dd�}tj����j���d|d�t�������d�j<�j����dS)Nr�r�)rRr�r�z
%s_version)rrGr�rHr;rrCrI)rO)	r.rKr-r0rRrJrIrTr�r.r/�actionTsz5CloudlinuxSelectorLib._change_version.<locals>.action)rPr.rdz,An error occured during changing version. %sN)rCr=r%r�rr>rErBrCr;�as_dict�_create_environment�_ensure_version_enabledr�r�r?rcr>r_r�summaryr-Z_get_info_about_webappZcheck_response_from_webappr])
rIrTr0r�r�old_environment�new_environmentZinstalled_extensionsZuser_summary_datar;Z
app_domainrdrkr.)	r.rKr-r0rRrJrIrTr�r/�_change_version*s@


"z%CloudlinuxSelectorLib._change_versionc
Cs�y�|j|j|jfkrt�|j|jkrN|j�||��dtj�}|tjkrNddiS|j�	||�t
krt|j||||d�n|�|||�t
Stjjk
r�}z|�t|��Sd}~XYnXdS)ax
        Call selectorctl to change current interpreter version to new_version for application
        :param user: application owner
        :param app_root: application directory (application name)
        :param new_version: new nodejs interpreter version
        :param skip_web_check: skip check web application after change it's properties
        :return: json
        �app_versionr2z�This application was created by too old version of python selector and we cannot change version without migration to the new application format. To do that you can use `cloudlinux-selector migrate` command or just click button in web UI.)rN)r;r>r?r�rCZget_app_configr�r�LEGACY�get_app_statusrrk�_change_version_for_stopped_apprurGr�r�ror�)rIrTrO�new_versionrrlrwr.r.r/�change_versionms	

z$CloudlinuxSelectorLib.change_versionc
Csr|j|jks|j|jkrn|�||�}y|j�||||�Wn2tk
rl}zt�d�	|���Wdd}~XYnXdS)NzRUnable to set environment variables in htaccess file for the application.Error: {})
r;r?r>rSrCZadd_env_vars_for_htaccessr�rr]rs)rIrTrOr�rRrkr.r.r/�set_variables_for_litespeed�sz1CloudlinuxSelectorLib.set_variables_for_litespeedc	
Cs |j�|�}	yt|||	�}
Wn"tk
r>t�d|��YnX|j|jkrx|dk	rx|
d|krx|
dtj	krxt�
d��|dk	r�||
d<|dk	r�||
d<|dk	r�||
d<|dk	r�||
d<|dk	r�||
�d	�ks�|dk	�r�|dk	�r*||
�d	�k�r*||
d	<|j|jk�r*|j�
|||�}|j�||||�|dk	�rJ|d
k�rBdn||
d<|j�||�}t�|�}
t|||
�}|d}|��j}|d
}|d}tj|d�|dk�r�|
�d	�dk�r�tj||||j|||d�n"tj||||j|||
�d	�|d�t�||�|j�||	�|�|||�dS)al
        Set application mode, environment variables and startup_file for application
        :param config_files: names of config files (such as requirements.txt or etc)
        :param entry_point: the specified entrypoint for application
        :param user: application owner. unix like user name
        :param directory: directory with application
        :param app_mode: expected application mode
        :param env_vars: dict with environment variables for application
        :param startup_file: main file for application
        :param passenger_log_file: Passenger log filename
        :return: None
        z8No such application (or application not configured) "%s"Nr�rlz�Unable to set environment variables. Application was created too long time ago. Please, migrate your application to newer version before changing interpreter versionr�r��config_filesr�r�r�r.r
r/)r/)rRr�)rRr�r�)rCr=r%r�rr>r;r?rrmr]r�rEZ_get_full_path_to_startup_fileZ
setup_wsgirBrrhr-�_unconfigurerHrrIrr)rIrTr0r�r�r�r�rsr�rJZapp_config_dataZstartup_file_full_path�env�user_summaryZuser_app_summaryr.r-rR�
htaccess_pathr.r.r/�_set_variables�sd




z$CloudlinuxSelectorLib._set_variablesc	
Cs�|dk	r<ytt�|��}	Wq@ttfk
r8|�d�SXnd}	yZ|j|j|jfkr�|j	�
||�tkr�|�||||	||||�n|�
||||	||||�tStjjk
r�}
z|�t|
��Sd}
~
XYnXdS)ak
        Call selectorctl to set variables for application
        :param config_files: names of config files (such as requirements.txt or etc) (only for python)
        :param entry_point: the specified entrypoint for application (only for python)
        :param user: application owner
        :param app_root: application directory (application name)
        :param app_mode: application mode
        :param env_vars: json_string with environment variables for application
        :param startup_file: main file for application
        :param passenger_log_file: Passenger log filename
        :return: json
        Nz/wrong json format for environment variable list)rr�r�rr@ror;r>r?rCrnrrx�_set_variables_for_stopped_apprurGr�r�r�)rIrTrOr�r�r�r�rsr�Zenv_dictrwr.r.r/�
set_variables�s 
z#CloudlinuxSelectorLib.set_variablesc
CsBy|j�|�}|Stk
r<}z|j|jd�Sd}~XYnXdS)z�
        Retrieves info about all installed interpreters and user(s) applictions
        :param user: User name for read applictions. If None all users will be processed
        :return: Dict with info
        )r]rVN)rCZget_applications_users_inforrUrV)rIrT�result_dictrwr.r.r/�get_apps_users_infos
z)CloudlinuxSelectorLib.get_apps_users_infocCs |j�|�stj�||d��dS)z�
        Check whether particular interpreter version is enabled and raises
        exception if not
        :param username: user to include in exception
        :param new_version: new interpreter version
        zversion is not enabledN)rB�is_version_enabledrGr�UnableToSetAlternative)rIrprNr.r.r/rg!sz-CloudlinuxSelectorLib._ensure_version_enabledc
	Cs�|�||�|j�||�}|j�|||d�}t|���}|j�|||d�}x6|D].}y|�|�WqPtj	j
jk
r|YqPXqPW|j�|�}	||	|d|j
<|j�||	�dS)z�
        Changes version for stopped application
        :param username: application owner
        :param app_root: application directory (application name)
        :param new_version: new nodejs interpreter version
        :return: None
        Nz
%s_version)rgrCZget_interpreter_version_for_apprErfr�r�rarGr�rr`r=r;rI)
rIrNrOrpZold_versionrir^rjrbrKr.r.r/ro+s	

z5CloudlinuxSelectorLib._change_version_for_stopped_appc	
Cs�|j�|�}	|r||	|d<|r,||	|d<|rN||	|�d�krN||	|d<|r^||	|d<|rn||	|d<|dk	r�|dkr�||	|d<nd|	|d<|j�||	�|�|||�dS)	a�
        Sets new app_mode, environment variables and startup file for stopped NodeJS application
        :param config_files: names of config files (such as requirements.txt or etc) (only for python)
        :param entry_point: the specified entrypoint for application (only for python)
        :param str username: application owner
        :param str app_root: application directory (application name)
        :param str app_mode: New application mode, can be None
        :param dict env_vars_dict: New environment variables, can be None
        :param startup_file: New startup file, can be None
        :param passenger_log_file: Passenger log filename
        :return: None
        r�r�r�r�rsNr�r�)rCr=r�rIrr)
rIrNrOr�Z
env_vars_dictr�r�rsr�rKr.r.r/ryFs z4CloudlinuxSelectorLib._set_variables_for_stopped_appcCstt|�d�d��S)z�
        Retrieves major version from full. If already short, return it with no difference
        :param version: Full/short
        :return: Short version as string
        �.r)r�r��split)r�r.r.r/�get_major_version_from_shortgsz2CloudlinuxSelectorLib.get_major_version_from_shortcCs6ttd������}t�}x|D]}|�|�q WdS)z�
        Replace mysqli extension to nd_mysqli for defaults.
        Warning: only for PHP. See LVEMAN-1399 for details
        :return:
        r8N)rr�get_all_alternatives_datar�r�list_extensions)Zalt_php_versions_listZ
cl_ext_selectZalt_php_verr.r.r/�replace_mysqlips	
z$CloudlinuxSelectorLib.replace_mysqlicCsHt�ddg�t�ddg�t�dddddg�t�d	g�|��d
S)zf
        Setup php selector for work
        (suggested to use after native php is installed)
        r�z--force-updatez
--remount-allz/usr/sbin/cloudlinux-selectorzmake-defaults-configz--jsonz
--interpreterr8z//usr/share/l.v.e-manager/utils/cache_phpdata.pyN)r��check_outputr�)�clsr.r.r/�setup_selectorsz$CloudlinuxSelectorLib.setup_selectorc
Cs^|j|jkrt�nt��rtSy|j��tStk
rX}z|�	t
|��Sd}~XYnXdS)zn
        Scan users home dirs for .htaccess files and import
        applications to new config file.
        N)r;r?r�r�r�rurCZ$import_legacy_applications_to_configr�ror�)rIrwr.r.r/�run_import_applications�s
z-CloudlinuxSelectorLib.run_import_applicationscCs&|j|jkrtd��|j�||�tS)z_
        Convert applications created in older selector
        versions to new format
        z/Migration is only available for python selector)r;r?r�rCZmigrate_applicationru)rIrTrOr.r.r/�run_migrate_application�sz-CloudlinuxSelectorLib.run_migrate_application)NN)N)NN)N)N)N)NNNNNNN)N)N)NNF)NNFNr.)N)NN)NF)N)Nr+r,r-rJrLrS�staticmethodrMr_rbrfrgrlroryr{r|r}rr�r�r�r�r�r�r�r�r�r~r�r�r�r�r�r�r�r�r�rvr�r�r�r�r�rrr	rrrrrrr+r2r:rPrQrWr[rXr_rcrkrqrrrxrzr|rgroryr�r��classmethodr�r�r�r.r.r.r/r4Ts�"0
$	
 
,
	!
+



,$'r
5

C$W"

!	
r4)W�
__future__rrrrcr�r5r�r�r�r`r�r�r%r!�typingr�future.utilsr�cldetectlibr�Zclselect.clselectctlnodejsuserrGZclselect.clselectexceptZclselect.clselectctlpythonZclselect.clselectctlrubyZclselect.clselectpythonuserZclselect.clselectnodejsuserZclcommon.clexceptionr�clcommon.clpwdr�clcommon.cpapir	r
Zclcommon.cpapi.cpapiexceptionsrrr
�cllimits.librrrrrr�clselect.baseclselectrrrrrZclselect.clselectctlphprrrrZclselect.clselectnodejsrZ$clselect.clselectnodejs.node_managerrrHrrZ&clselect.clselectpython.python_managerr Z(clselect.clselectpythonuser.environmentsr!ZPythonEnvironmentZ(clselect.clselectnodejsuser.environmentsZNodeJsEnvironmentZclselect.utilsr"r#r$r%r&r'�secureior(�clconfig.ui_config_libr)r*r0ru�objectr4r.r.r.r/�<module>s^ 

https://t.me/AnonymousX5 - 2025