403Webshell
Server IP : 192.158.238.246  /  Your IP : 18.117.174.43
Web Server : LiteSpeed
System : Linux uniform.iwebfusion.net 4.18.0-553.27.1.lve.1.el8.x86_64 #1 SMP Wed Nov 20 15:58:00 UTC 2024 x86_64
User : jenniferflocom ( 1321)
PHP Version : 8.1.32
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /opt/alt/python37/lib/python3.7/site-packages/clselector/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

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

��d�*�@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-selectorZnodejs�pythonZruby�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_libZ$clselect.clselectnodejs.apps_managerr7r�clselectZclselectnodejsuserZclselectctlnodejsuser�$clselect.clselectpython.apps_managerr ZclselectpythonuserZclselectctlpythonZ clselect.clselectphp.php_managerr8)�selfr9r7r8r.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)r9r?r@Z
cl_select_libZcheck_requirements)rFr.r.r/�check_selector_is_availablewsz1CloudlinuxSelectorLib.check_selector_is_availablecCs"|j�||�}|�||�\}}|S)z7Get doc_root from application config or raise exception)rAZget_app_domain�$safely_resolve_username_and_doc_root)rF�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
        )�userrLNzNo such domain: %(domain)szNo such user: %(user)s)rLrP)�message�contextz+Nodejs selector not supported for %(panel)sZpanelz3Domain %(domain)s is not owned by the user %(user)s)rrr0rrr	r
)rPrLZresult_userZresult_doc_rootr.r.r/rI�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
--interpreterr6)r(�
isinstance�dict)�opts�resultZeuidZegidr.r.r/�should_be_runned_as_user�s

z.CloudlinuxSelectorLib.should_be_runned_as_usercCs$|ddko"|ddk	o"t��dkS)Nz
--interpreterr6z--userr)�os�geteuid)rUr.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)rP�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)rQrR)r)rPrLr.r.r/�user_and_domain_checker�sz-CloudlinuxSelectorLib.user_and_domain_checkercKs&dd|i}t|�dkr"|�|�|S)Nr2z	ERROR: %sr)�len�update)rV�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)r2rV�details)ra)rVrfrcr.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'NZ
uiSettingsZ
hidePythonAppZ
hideNodeJsApp)rrrd�formatr@�selector_enabledrr9r=r)�OK_RES_DICTr*r<�	update_ui)rFr2�eZconfig_dictr.r.r/�_change_selector_statuss0z-CloudlinuxSelectorLib._change_selector_statuscCsddi}t�jrd|d<|S)NriFT)rri)�resr.r.r/�get_nodejs_selector_status,sz0CloudlinuxSelectorLib.get_nodejs_selector_statuscCsd|jjrtntiS)NZPHPSelector)r@rirr)rFr.r.r/�get_php_selector_status3sz-CloudlinuxSelectorLib.get_php_selector_statusc
CsJy|j��}|�|���|Stk
rD}z
|�|�Sd}~XYnXdS)N)r@�get_summaryra�get_selector_statusrrd)rFrnrlr.r.r/rq6s
z!CloudlinuxSelectorLib.get_summarycCsddi}t�jrd|d<|S)NriFT)r ri)rnr.r.r/�get_python_selector_status>sz0CloudlinuxSelectorLib.get_python_selector_statuscCs2yt�|�jStk
r,tddi��YnXdS)NrQzNo such user: `%(user)s`)r[r\�pw_dir�KeyErrorr)rPr.r.r/�
get_user_homeEs
z#CloudlinuxSelectorLib.get_user_homecCst���}|�|���|S)N)rrqrarr)rFrnr.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
        Znpmr5z
run-scriptNz--)
rvr9r<rA�get_binary_pathr=�NotImplementedError�append�extend�_run_interpreter)	rFrPrKZscript_nameZscript_args�	user_homeZinterpreter_path�cmdrVr.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�rc)rQrRNz%returncode: {}
stdout:
{}
stderr:
{}
�datar2�success)�
subprocess�PopenrX�path�join�PIPEZcommunicate�OSErrorrrh�
returncode�strip�base64�	b64encode�encode�decodera)	r~r}rK�pr�r�rlZ
output_stringrVr.r.r/r|ps 	"
z&CloudlinuxSelectorLib._run_interpretercCs |j|j|jfkr|j��SdS)N)r9r<r?r@rq)rFr.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)rZget_user_version_map�collections�Counterr)Z
versions_listZuser_version_mapZversion_user_maprPr��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)rh�api_versionNr2�ERRORrQ)
r9r?rrqrrr��loadsr@�get)rFr�Z	json_dataZselectorctl_resultrVr.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)r9r?r@�get_current_versionrd)rFrPr.r.r/r��sz)CloudlinuxSelectorLib.get_current_versioncCsR|��}y|d}Wn4tk
rHd|kr:|�|d�Sd|d�SYnXd|iS)N�default_versionrQr�)r2r�)r�rurd)rF�	json_dictr�r.r.r/�get_default_version�sz)CloudlinuxSelectorLib.get_default_versioncCs@|j|jkr|��S|j|jkr(|��S|j|jkr<|��SdS)N)r9r<ror=rsr?rp)rFr.r.r/rr�sz)CloudlinuxSelectorLib.get_selector_statuscCs
|jjS)N)r@ri)rFr.r.r/�php_selector_is_disabled�sz.CloudlinuxSelectorLib.php_selector_is_disabledcCs|jjS)N)r@ri)rFr.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)r9r?�sysr�rz�	cagefsctlr�r��ImportErrorr��
startswithru)rFr�r�ZconfZdefault_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)NZavailable_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: {})r9r<r=r�set_version_statusrrdrjr�rur:�set�keysr�rZenable_version�strZdisable_versionr`rh)rFZversionsr�Zenable_disablerVrlr�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)rQrR)r@Zswitch_default_versionrD�clselectexceptr�NoSuchAlternativeVersion�BaseClSelectExceptionrrgr�rj)rFr�rlr.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
        )r@r�rrrj)rFZtarget_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�)rQrR)r9r?r@Zswitch_current_versionrDr�rr�r�rgr�rj)rFr�rlr.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�)rQrR)r9r?r@�reset_extensionsrDr�rr�r�rgr�)rFr��
extensionsrlr.r.r/r�Psz&CloudlinuxSelectorLib.reset_extensionscCs$|j|j|j|jfkr |�|�SdS)N)r9r<r=r?rm)rFr2r.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: {} {})�detectZ	is_cpanelZis_plesk�is_darr;rdrh)rFZretcodeZoutrcr.r.r/rkaszCloudlinuxSelectorLib.update_uic
Csnt��}|j|jkrjy |j�||�}|r2|�|�Wn0tjj	k
rd}z|�
t|��Sd}~XYnX|SdS)N)rj�copyr9r?r@�set_extensionsrarDr�r�rgr�)rFr�r�rVr�rlr.r.r/r�jsz$CloudlinuxSelectorLib.set_extensionsc
CsT|j|jkrPy|j�||�Wn0tjjk
rN}z|�t|��Sd}~XYnXt	S)N)
r9r?r@�set_optionsrDr�r�rgr�rj)rFZoptionsr�rlr.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�)rQrRr�ZnativezUnsupported version: %(ver)s)
r�r�rrhr9r<�re�match�grouprS�int�floatr�)rFr�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)rN�env_vars�startup_file�domain_name�entry_pointrA�passenger_log_file)rN)r�rN�app_moder�r�r�rAr�)rV)r_r�rr�r�rIr9r=rCZcreaterAr>rD�clselectctlrubyr<r�r�rgr�rj)
rFrK�app_urir�rPrLr�r�r�r�r�rNrlr.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)sZapp)rQrR)rXr�r�rt�isdirr)rKr]�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�)rQrR�rbr��strerrorr�)rjr�r_r^r�rXr�r��existsr�open�readrar�r�r��	Exceptionrg�getattr)rFrK�config_pathrPrVr]r��full_config_path�fr�rlr.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�)r_r^r�rXr�r�r��writer�Z	b64decoderjr�rgr�)
rFrKr�ZcontentrPr]r�r�r�rlr.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)rPrLr�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)rQrRN)r_r9r=rrCZ	uninstallrDr�r�rgr�rj)rFrK�modulesrPrL�skip_web_check�modulerlr.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�rANz9Please, specify modules or requirements file with moduleszUnknown interpreter: %(interp)sr�)rQrR)r_r9r<rCZinstallrArDr�r�rgr�rjr=r)
rFrKrPrLr�Z	spec_filer�rlr�rcr.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)srK)rQrR)rNrAzUnknown interpreter: %(interp)sr�)r_r9r>rDr�ZdestroyrO�	TypeError�ClSelectExceptions�	WrongDatar0r<r=rCrA�InterpreterErrorr�r�rgr�rj)rFrKrPrNrlr.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�)rQrR)r_rOr9r<r=rC�startrAr�r�rjrDr�r�rgr�)rFrKrJrNrlr.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�)rQrR)r_rOr9r<rC�restartrAr=r�r�rjrDr�r�rgr�)rFrKrJrNrlr.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�)rQrR)r_rOr9r<rC�stoprAr=r�r�rjrDr�r�rgr�)rFrKrPrNrlr.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�)�moder�N)r��globrXr�r�r�r#�replacer$�IOErrorr��exc_infor�r�r��	tracebackZprint_tb)�new_env�old_env�new_rel�old_relZ
old_promptZ
new_promptZ
venv_bin_fileZold_activateZ
_new_activateZnew_activaterMZ
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']
         }
        rLrr��/z	.htaccess)r9�binary�aliasrLr
�htaccess�	directoryZdomainsN)
r%r[r\rtr
rAZINTERPRETERrxr�ru)rFrJZapp_config_dict_fullrKZapp_config_dictr}rNZ
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)
rXr�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�)rNr�r�).rA�get_user_config_datar%rur��NoSuchApplicationr&rZcheck_directory�
ValueErrorr�r�rZAppRootBusyrC�_get_environment�namer9r=rr<rXr�r�rBZenvironmentsZDEFAULT_PREFIXry�dirnamer��makedirsrrrrZ_get_prefixr!r
rr�unconfigurer��	configurer�r'�write_full_user_config_data)rFrPrr�full_config�
app_configZold_absrZnew_absrrlZnew_user_summaryZold_user_summaryZold_user_app_summaryrNrZenv_namer�Zrel_venvZ_old_envrMZ_new_envrrZnew_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)
r9r=r<r(r>rDr��relocater�r�rgr�rj)rFrPZold_app_rootZnew_app_rootrlr.r.r/r)�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)	rXr�r��realpathrr�rrr�)�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) "{}"rr
N)rrr�T�transitr�)rNr�r�)r+r-r�rL)rArr%rur�rrhrr�rZ	get_aliasrCrr9r
rr�rr!rr�r/r")rFrPr
r-�
new_domainrr#r$Zapps_summaryZold_app_summaryr,r+r.r&r
r'r.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)rN)rIr9r=r<r2r>rDr�r0ryr�r�rgr�rj)rFrPrKZnew_app_urir1r-rMrlr.r.r/r0�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�ZFileProcessErrorrCZ_create_symlink_to_node_modulesr��WebAppError)rFrPrKr�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)rr4Znew_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�)rNr�r�z
%s_version)rr r�r!r9r�rAr")r')	rr$r
r
rNr#rFrPr�r.r/�actionTsz5CloudlinuxSelectorLib._change_version.<locals>.action)rLrr:z,An error occured during changing version. %sN)rArr%rur�rrCrrr9Zas_dict�_create_environment�_ensure_version_enabledr�r�r=r9r<r5r�summaryr
Z_get_info_about_webappZcheck_response_from_webappr3)
rFrPr
r�r��old_environment�new_environmentZinstalled_extensionsZuser_summary_datarZ
app_domainr:rcr.)	rr$r
r
rNr#rFrPr�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)r9r<r=ryrAZget_app_configr�r�LEGACY�get_app_statusrr@�_change_version_for_stopped_apprjrDr�r�rgr�)rFrPrK�new_versionr�rArlr.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: {})
r9r=r<rOrAZadd_env_vars_for_htaccessr�r�r3rh)rFrPrKr�rNrcr.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�rAz�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�rr
r)r)rNr�)rNr�r�)rArr%rur�rr9r=rrBr3r�rCZ_get_full_path_to_startup_fileZ
setup_wsgirrr=r
Z_unconfigurer!r�r"rG)rFrPr
r�r�r�r�rHr�r#Zapp_config_dataZstartup_file_full_path�envZuser_summaryZuser_app_summaryrr
rNZ
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�r�rrgr9r<r=rArCrrJ�_set_variables_for_stopped_apprjrDr�r�r�)rFrPrKr�r�r�r�rHr�Zenv_dictrlr.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
        )rVrRN)rAZget_applications_users_inforrQrR)rFrPZresult_dictrlr.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)r@Zis_version_enabledrDrZUnableToSetAlternative)rFrErJr.r.r/r<!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)r<rAZget_interpreter_version_for_apprCr;r�r�r7rDr�rr6rr9r")
rFrJrKrEZold_versionr>r4r?r8r$r.r.r/rD+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�rHNr�r�)rArr�r"rG)
rFrJrKr�Z
env_vars_dictr�r�rHr�r$r.r.r/rKFs 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:
        r6N)r�rZget_all_alternatives_datar�rZlist_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
--interpreterr6z//usr/share/l.v.e-manager/utils/cache_phpdata.pyN)r�Zcheck_outputrQ)�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)r9r=ryr�r�rjrAZ$import_legacy_applications_to_configr�rgr�)rFrlr.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)r9r=ryrAZmigrate_applicationrj)rFrPrKr.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-rGrHrO�staticmethodrIrWrZr^r_rdrgrmrorprqrsrvrwrr|r�r�r�r�r�rrr�r�r�r�r�r�r�r�r�rkr�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr(r)r/r2r0r5r9r@rFrGrJrLrMr<rDrKrPrQ�classmethodrSrTrUr.r.r.r/r4Ts�"0
$	
 
,
	!
+



,$'r
5

C$W"

!	
r4)W�
__future__rrrr[r�rr�r�r�rXr�r�rr��typingrZfuture.utilsrZcldetectlibr�Zclselect.clselectctlnodejsuserrDZclselect.clselectexceptZclselect.clselectctlpythonZclselect.clselectctlrubyZclselect.clselectpythonuserZclselect.clselectnodejsuserZclcommon.clexceptionrZclcommon.clpwdrZclcommon.cpapir	r
Zclcommon.cpapi.cpapiexceptionsrrr
Zcllimits.librrrrrrZclselect.baseclselectrrrrrZclselect.clselectctlphprrrr�Zclselect.clselectnodejsrZ$clselect.clselectnodejs.node_managerrrErrZ&clselect.clselectpython.python_managerr Z(clselect.clselectpythonuser.environmentsr!ZPythonEnvironmentZ(clselect.clselectnodejsuser.environmentsZNodeJsEnvironmentZclselect.utilsr"r#r$r%r&r'Zsecureior(Zclconfig.ui_config_libr)r*r0rj�objectr4r.r.r.r/�<module>s^ 

Youez - 2016 - github.com/yon3zu
LinuXploit