%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /proc/self/root/opt/alt/python37/lib/python3.7/site-packages/__pycache__/
Upload File :
Create Path :
Current File : //proc/self/root/opt/alt/python37/lib/python3.7/site-packages/__pycache__/lvectllib.cpython-37.pyc

B

L#Lb(i�	@s>ddlmZddlmZddlmZddlmZddlmZmZddl	m
Z
mZddlm
Z
mZmZmZmZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmmZ ddl!Z!dd	l"m#Z#ddl$Z$ddl%Z%dd
lm&Z&ddl'Z'ddl(Z(ddl)m*Z*m+Z+m,Z,ddl-m.Z.ddl/Z/dd
l0m1Z1m2Z2ddl3m4Z4ddl5m6Z6m7Z7m8Z8ddl9m:Z:m;Z;ddl'm<Z<m=Z=m>Z>m?Z?m@Z@ddlAmBZBdZCdZDdZEdZFdZGdZHdZIdZJdZKeLejM�Ndd��ZOeBdd��r�dZPdZQne=eOd�ZPe<ePd �ZQd!d"�ZRd#d$�ZSd%d&�ZTe.d'�d(d)�ZUd�d*d+�ZVd,d-�ZWd.d/d.d0dd1dd2d3�ZXd1ZYd4d/ddddddd3�ZZd5d6d7d8d9d:d;d<gZ[d=a\da]da^d>a_d>a`iaad>abd>acd>add>aed>afd>agd>ahd?aid>ajd>akd@dA�ZldBdC�ZmdDdE�Zn�ddFdG�ZodHdI�ZpdJdK�Zqep��peq�Zr�ddLdM�ZsdNdO�ZtdPdQ�ZudRdS�Zv�ddTdU�ZwdVdW�ZxejydXdY��Zz�ddZd[�Z{d\d]�Z|�dd^d_�Z}d`da�Z~dbdc�Z�dddde�Z�dfdg�Z�dhdi�Z��ddjdk�Z�dldm�Z�dndo�Z��ddpdq�Z�drds�Z�dtdu�Z�dvdw�Z��ddxdy�Z��d	dzd{�Z�d|d}�Z�d~d�Z�d�d��Z��d
d�d��Z�d�d��Z��dd�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��dd�d��Z�e�fd�d��Z��d
d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��dd�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��dd�d��Z�d�d��Z��dd�dÄZ��dd�dńZ��dd�dDŽZ�d�dɄZ�d�d˄Z�d�d̈́Z�d�dτZ�d�dфZ��dd�dӄZ�d�dՄZ�d�dׄZ�d�dلZ��dd�dۄZ�d�d݄Z�d�d߄Z�d�d�Z�da�da�da�da�da�d�d�ZÐdd�d�Z�d�d�ZŐdd�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�dS(�)�print_function)�absolute_import)�division)�range)�
basestring�unicode)�	iteritems�reraise)�Dict�List�Tuple�Optional�TextN)�partial)�PAGESIZE)�admins�reseller_users�get_main_username_by_uid)�
EncodingError)�reseller_limits_disabled_post�reseller_limits_enabled_post)�exec_utility)�get_xml_config�save_xml�BadVeConfigException)�setup_global_lock�LockFailedException)�Lve�PyLve�LVP_XML_TAG_NAME�
PyLveError�NameMap)�is_cl_solo_editionz%/usr/bin/getcontrolpaneluserspackagesz
/proc/cpuinfoi'Z
VE_DEFAULTFz/bin/umountz"/etc/container/exclude_mounts.conf�multiZsingleZPYLVE_DEBUGT)Zskip_jwt_check)�debug)�pycCst��rtj��SgSdS)z-Helper function for easy mocking in unittestsN)�lve�reseller_limit_supported�procZlvp_id_list�r)r)�:/opt/alt/python37/lib/python3.7/site-packages/lvectllib.py�lvp_listMs
r+cCst�}|��|��S)zf
    Get list of resellers with activated reseller limits

    :return: list of pairs (name, uid)
    )r!�
link_xml_nodeZload_from_node)�name_mapr)r)r*�get_active_resellersUsr.cCs|dd�t�D�kS)z]
    Check whether giver reseller has activated reseller limits or not
    :return: bool
    css|]\}}|VqdS)Nr))�.0�name�uidr)r)r*�	<genexpr>esz,is_active_reseller_limits.<locals>.<genexpr>)r.)�
reseller_namer)r)r*�is_active_reseller_limits`sr4)�ecCs>t��st|�tr(tddt|�g�nt|�t�d�dS)a"
    Since cPanel user can corrupt config file for some user with wrong encodings,
    we want to notify him that he should fix encoding problems with the link to documentation.
    Print error message and exit with code 1 or raise given exception if it isn't cPanel.
    :return: None
    r#�ERROR�N)	�cldetectlib�	is_cpanelr	�JSON�json_format�str�print�sys�exit)r5r)r)r*�raise_cpanel_encoding_errorisr@cCs0yt|�Wntk
r*tdd�YnXdS)az
    ~~~~~~~~~~~~~~~~~~
    !!! DEPRECATED !!!
    ~~~~~~~~~~~~~~~~~~
    Please, use setup_global_lock instead if possible

    Wrapper over setup_global_lock. If lock cannot be set,
    it will write message and close app

    The only reason why it is here is legacy function
    check_result_and_exit that we use in TWO places
    :type write: bool
    :return: Nothing
    r7zcan`t get lockN)rr�check_result_and_exit)�writer)r)r*�get_global_lock{srCcCsN|tjkrJ|dkrJtr0ttddt|�g�ntdt|��t�|�dS)Nrr6z
lvectl: %szlvectl: Error: )	�errnoZENOSYSr:r;�MULTI_FORMATr<r=r>r?)�result�messager)r)r*rA�s
rA�r7�ii)�cpu�ncpu�io�ep�mem�pmem�nproc�iops�drKrJrLrNrOrPrQrM���falsecCs|adS)N)r:)Z	json_flagr)r)r*�set_json�srVcCs|adS)N)�
BYTES_FLAG)Z
bytes_flagr)r)r*�	set_bytes�srXc	Cs�trtdkrd}n tdkr d}ntdkr.d}nd}ddd	d
ddd
gddd	d
ddd
dgddd	d
ddd
gddd
dd
gd�|}tr�|�d�d}|d|�dg||d�S|S)N��noiops_8�8��6�4�ID�SPEED�PMEM�VMEM�EP�NPROC�IO�IOPS)rZr[r]r^r7�CPU)�NOIOPS�LVE_VERSIONr:�index)�version�fieldsZ	speed_idxr)r)r*�
get_fields�s rmcCsR|dkr.t��}|ddkr$td��|dan|at��}|sFtd��t��adS)Nrzget_lve_version failedzinit_lve() failed.)�clcommonZget_lve_version�	Exceptionri�pylve�
initialize�liblve_settings�lve_settings)Zlve_verZ
lve_statusr)r)r*�init�s
rtc
Csftj�d�}|dkrdSy
t�|�Sttfk
r`}ztdt|��t	�
d�Wdd}~XYnXdS)z-Get cpu information from environment veriableZCPU_DATANz.Invalid environment variable 'CPU_DATA' formatr7)�os�environ�get�json�loads�	TypeError�
ValueErrorr=r<r>r?)Zpacked_cpu_datar5r)r)r*�_get_cpu_data_from_envs
r|cCs�i}i}d}yttd�}Wn2tk
rLtdtt�d�t�d�YnXx||D]t}|��sz||d|<|d}i}qTt|�	d��dkr�|�	d�d��||�	d�d��<qTd	||�	d�d��<qTW||d
dgS)zF
    Parse /proc/cpuinfo

    return [NumProc, frequency in MHZ]

    r�rzlvectl: Error: Can`t open �.r7zproc%s�:�rTZproc0zcpu MHz)
�open�CPUINFO�IOErrorr=r<r>r?�strip�len�split)ZcpuinfoZprocinfoZnprocs�f�liner)r)r*�get_cpu_datas"
&r�cCs�t|�}|pd}t}t|d�}t�d|�}|dk	r~t|�}|dkr~|dkr~tttd||��}|dkrp|St|t|�SdS)z�
    Try converting to kernel format from old CPU format (percentage of whole
    cpu) and optionally the NCPU format. Return whichever is less.

    :param data: string presumably in old CPU format
    :param lncpu: integer number of cores limit
    rz
\d{1,2}0?$NrR)r<�CPUINFO_DATA�int�re�match�round�CORE_WEIGHT�min)�data�lncpu�cpu_datarKZcpu_percentZfrom_cpu_limitr)r)r*�convert_from_old_cpu6sr�cCstt|�}t}t|d�}t�d|�}|dk	rpt|�dd��}||dkrP|d}|dkrltttd|��SdSdS)zd
    Try converting cpu limit from SPEED in percentage of one CORE format to
    kernel format.
    rz\d+(?:\.\d+)?%$N�%rTrR)	r<r�r�r�r��float�replacer�r�)r�r�rKZpercentr)r)r*�convert_from_speed_percentLsr�cCs�t|�}t}t|d�}t|d�}t�dtj�}|�|�}|dk	r�|�d�}t|�d��}|�	�dkrp|d}|||kr�||}|dkr�tt
|t|��SdS)	zQ
    Try converting cpu limit from SPEED in mhz/gzh format to kernel format.
    rr7z,(?P<freq>\d+(?:\.\d+)?)(?P<suffix>mhz|ghz)+$N�suffix�freqZGHZi�)r<r�r�r�r��compile�
IGNORECASEr��group�upperr�r�)r�r�rKZcpu_freq�patternr�r�r�r)r)r*�convert_from_speed_hz^s 

r�cCst|�pt|�S)z}
    Try converting cpu limit value from either SPEED limit format
    (percentage of CORE or mhz/ghz) to kernel format.
    )r�r�)r�r)r)r*�convert_from_speedssr�cCsBt||�}|dk	r|St|�}|dk	r*|St|�}|dk	r>|SdS)z�
    Convert different variants of cpu limit to kmod ver 8 variant

    :param data: Value in old CPU format or SPEED with % or mhz/ghz.
    :param lncpu: Limit in old NCPU format.
    :return: CPU limit in kmod ver 8+ format or None for bad format
    N)r�r�r�)r�r�Zfrom_cpuZfrom_speed_percentZ
from_speed_hzr)r)r*�convert_to_kernel_format}s
r�cCs^t}t|d�}t|�}d|krBdtttt|�d��|���Stttt|�|���SdS)zm
    convert speed to old cpu format
    args: cpu limit in speed value
    return: old cpu limit format
    r�*N)r�r�r<r��lstrip)�speedr�rPr)r)r*�speed_to_old_cpu�s"r�c	csft��t��}yt�||�Wn(tk
rHt�tjd|��YnXz
|VWdt�|�XdS)zF
    Run subprocess in lve with pseudo-random id and given limits
    zKUnable to setup lve with id %i, something is wrong, check dmesg for detailsN)rprqZget_available_lve_id�	lve_setupr �syslog�	LOG_ALERT�lve_destroy)Zsettings�lve_idr)r)r*�
temporary_lve�s

r�cCsJt��}t||d�|_||_||_||_||_tt	�
d|t��|_|S)a
    Just a nice user-friendly constructor of liblve_settings object
    You can pass the following ls_cpu and ls_cpus values:
    - in percents of one core (just ls_cpu='75%', ls_cpus will be ignored)
    - in old 'CPU' format (two arguments, ls_cpu and ls_cpus required, both int)
    )r�g�?)
rprrr��ls_cpu�ls_io�	ls_enters�ls_nproc�ls_iopsr��mathZceilr�
ls_memory_phy)r��ls_cpusr�r�r�r�r��sr)r)r*�make_liblve_settings�s	r�cCs0t|�d��}|s(|�d�}t�|�j}t|�S)N�id�user)r<�getAttribute�pwd�getpwnam�pw_uidr�)�ve_lve_elementZuser_uidZ	user_namer)r)r*�get_ve_lve_user_uid�s

r�cCsLdt|d�i}|tkr(t|d�|d<|dk	r:|�|�tt�|��dS)a�
    Print output in json as:
    {"status": "ERROR/OK", "msg": "Some Message", "ext1": "foo", "ext2": "bar"}
    where "status" and "msg" field are mandatory

    :param str error_type: Either MULTI_ERROR or SINGLE_ERROR
    :param list data: List with a status string and a message string
    :param dict extensions: Some additional fields for the final json object
    :return: None
    Zstatusrr7�msgN)r<rE�updater=rx�dumps)Z
error_typer��
extensionsrFr)r)r*r;�s
r;c
Cs�y tt�|�d�d��||<Wn`tttfk
r�||||<|�|�}|�dt	||��y|�
|�WnYnXYnXdS)Nr�limit)r��
ve_default�getElementsByTagNamer�r{�
IndexErrorrz�
createElement�setAttributer<�appendChild)�xml�ve_defaults�ve_cfg�val�default�noder)r)r*�check_def_value�s 
r�cs�fdd�|jD�S)Ncs&g|]}t|tj�r|j�kr|�qSr))�
isinstancer�ZElementZtagName)r/�_)�tagr)r*�
<listcomp>�sz"xml_filter_tag.<locals>.<listcomp>)Z
childNodes)r�r�r))r�r*�xml_filter_tag�sr�cCsFx@t||�D]2}|dk	r$|�|�s$q|dk	r<|�|�|kr<q|SWdS)N)r�ZhasAttributer�)r�r��attrZattr_valZ
child_noder)r)r*�xml_filter_first�sr�cCs&t|||d�}|dkrt��|�|�S)N)r�r�r�)r�r�r�)r�r�r�Zfiltered_child_noder)r)r*�get_child_tag_atrr�sr�cCs"t||�d}|�|t|��dS)z�
    Find in children nodes node with tag and setup attribute
    insted el.getElementsByTagName not search recursiveli in tree
    rN)r�r�r<)r�r�r�r�Zfirst_child_noder)r)r*�set_child_tag_atrrsr�c
Cs�yt�\aaWnPtk
r^}z2tr8ttdt|�g�ntt|��t	�
d�Wdd}~XYnXdat}y\|r�|r�t�
d�at}q�tttdt|��}|r�|�d�daq�t�t�anttd�daWn:tk
r�tr�tdd	d
g�t	�
d�ntd�YnXt�d�at�d
�at�t�atjj�t�t�d�}t|�dk�rN|dant�
d�at�t�t�d�a t�d�a!tt!�dk�r�t"t!dj#j$�a!nda!ia%t&t'dtt%t|d�}|dd�y,t�d�d�(d�}t)|t%dd�t%d<Wnnt*tt+fk
�rVt)|dt%dd�t%d<t�
d�}|�,dt|d��yt�|�WnYnXYnXy t"t�d�d�(d��t%d<Wnbt*tt+fk
�r�|dt%d<t�
d�}	|	�,dt|d��yt�|	�WnYnXYnX|dd�t-dk�r�|dd�n|ddt.id�|dd�|dd�|d d�xbt/t%�D]V\}
}|dk�r4d!�0|
�}t�rftdd|g�nd"|}
t	j1�2d#|
�t	�
d��q4WdS)$z�
    :param bool lvp_defaults: load reseller's default limits instead of global
    :param int lvp_id: lvp id to load customise defaults
    r6r7N�true�defaultsr�rr#�WARNINGzdefault section error in ve.cfgz(warning: default section error in ve.cfgr&�packagez
enter-by-name�binaryrk)r�r�r�r�r�rK)r�rJr�)r��other�
maxentryprocsrMrL�rN)r�r�rOrPrQz!ERROR: Incorrect {} default valuez	error: %sz%s
)3rr��ve_lveconfigrr:r;rEr<r=r>r?�ubc�LVE_DEFAULTr�r��LVP_DEFAULTr�rr�Z	cloneNoder�r��ve_lve�
ve_package�ve_lvpr&�mapr-r,r��ve_enter_by_namer��	ve_binary�ve_cfg_versionr�Z
firstChildZ	nodeValuer�rr�r�r�r{rzr�ri�MEM_DEFAULT_CL5r�format�stderrrB)�lvp_id�lvp_defaultsr5Zdefault_limitsZdefaults_root_nodeZve_enter_by_name_listZ
check_def_valr�rJrM�key�valuerG�err_messager)r)r*�get_XML_cfgs�











 







r�c
CsFytt||dd��}|||<|Stttfk
r@t||�SXdS)Nr�)r�r�)r�r�r{r�rz)r��elr��
setup_datar�r)r)r*�check_value�sr�cCs&t��}|��|�|�}t|�dS)a5
    This function is a pure workaround for our ugly globals-based API which
    should be fixed partially with LU-496, because there is no clean way
    to retrieve reseller's data from ve.cfg without touching globals
    :param reseller: reseller name
    :return: Nothing. It just updates some globals
    N)�lveapir!r,Zget_idr�)�resellerr-Zreseller_idr)r)r*�_load_resellers_xml_data�s	
r�c	sxt�t�a�dk	�rtt�}�dk	rF�|krF�|�krF��fdd�}n2t��rl|dk	rlt�tjd�|d���fdd�}x�t	D]�}||�r~t
d|tt�}y&ttt
|dd	d
�|d��}|td<Wntttfk
r�YnXt
d|tt�td
k�rt
d|tt�ndtd<ytt
|ddd
��}|td<Wntttfk
�rDYnXt
d|tt�t
d|tt�t
d|tt�q~WdS)a
    Put limit values that will be applied later in a global variable `setup_ve`.

    :param plan_id: package
    :param reseller:
        If reseller is None we only inherit from admin packages.
        In that case we ignore all tags in ve.cfg with a "reseller" attribute.
    Ncs|�d��ko|�d��kS)Nr�r�)r�)r�)�plan_idr�r)r*�<lambda>��z$prepare_setup_data.<locals>.<lambda>zNPackage for user with id {} is incorrect, please recover it using Note from {}zYhttps://docs.cloudlinux.com/cloudlinux_os_components/#installation-enabling-and-disablingcs|�d��ko|�d�S)Nr�r�)r�)r�)r�r)r*r��r�rKrJr�)r�r�)r�rLr�rNrr�r�rMrPrOrQ)�copyr�r��get_reseller_packages_mapr8�is_dar�r�r�r�r�r�r�r�r{r�rzr�)	r�r�r�Zres_pkg_dict�is_needed_planr�r�rJrMr))r�r�r*�prepare_setup_data�s<



rc	CsZy,tjtd|gtjtjd�}|��|jdkStk
rTtddtd|f�YnXdS)Nz-l)�stdoutr�r���zfailed to run "%s %s %s")�
subprocess�Popen�UMOUNT�PIPEZcommunicate�
returncode�OSErrorrA)�path�pr)r)r*�
umount_dir�s
rc	CsBtj�t�sdSg}yDttd��0}x(|D] }|��}|r(|�t�|��q(WWdQRXWn"t	k
rzt
ddt�YnX|s�dSt�tj�y,tdd��}dd�|�
�D�}WdQRXWn"tt	fk
r�t
dd�YnXd	}xXt|�D]L}d
}x<|D]4}	x.|D]&}
|
�|	�}|�rt|	��p&|}P�qWq�W|s�Pq�WdS)zz
    Unmount all paths from /proc/mounts that match regular expressions from /etc/container/exclude_mounts.conf file 
    Nr}rzfailed to read %sz/proc/mountscSsg|]}|��d�qS)r7)r�)r/�mr)r)r*r��sz"prepare_mounts.<locals>.<listcomp>zfailed to parse /proc/mounts�
F)rur�isfile�EXCLUDE_MOUNTS_CONFr�r��appendr�r�r�rA�unshareZCLONE_NEWNS�	readlinesr�r�searchr)Zreg_exp_listZconfr}r�r�ZmountsZATTEMPTSr��errorZmountZreg_exprr)r)r*�prepare_mounts�s<
" 


rcCsNd}ytj|ddd�Wntk
r6td|�YnXt�tjdd�dS)	zI
    Start LVE engine and initialize default mount namespace for LVE
    z,/bin/mount --make-rprivate / >/dev/null 2>&1Tz	/bin/bash)�shell�
executablezError: failed to executezCan`t init lve default settings)�err_msgN)rZcallrr=rrp�	lve_start)Z	MOUNT_CMDr)r)r*r	srcCstj|d�|�|d�dS)zs
    Create LVE container for given ID
    :type lve_id: int
    :type ignore_error: bool
    :return: Nothing
    z8lvectl: Can`t create lve with id {}; error code {{code}})r�ignore_errorN)rp�
lve_creater�)r�rr)r)r*rsrcCstj|d�|�|d�dS)zs
    Create LVP container for given ID
    :type lvp_id: int
    :type ignore_error: bool
    :return: Nothing
    z8lvectl: Can`t create lvp with id {}; error code {{code}})rrN)rpZlve_lvp_creater�)r�rr)r)r*�
lvp_create"srcCs8t�}x,t�D]"}tj|d�|�d�|�|�qW|S)Nz9lvectl: Can`t destroy lvp with id {}; error code {{code}})r)�listr+rp�lve_lvp_destroyr�r)Zdestroyed_listr�r)r)r*�destroy_lvp_all.sr"cCs(|dkrt�ntj|d�|�d�dS)N�allz9lvectl: Can`t destroy lvp with id {}; error code {{code}})r)r"rpr!r�)r�r)r)r*�lvp_destroy7sr$cCs�d�|�}d�|�}d}|dkrvt��r2tt��}tttj����dkrpx*tj��D]}tj	||d�d}qTWq�d}nJtj�
|�s�tj��r�tj�|�dk	r�tj	||d�d}ntj�
|�s�d}|r�t
r�ttdg�n"t
r�ttd	|g�ntd
�|��dS)Nz/Can't remove lve {} from kernel - error code -3z1Can`t destroy lve with id {}; error code {{code}}Fr#r)rTZOKZWARNzwarning: {})r�r&r'�boolr"r�r r(�lve_id_listr�Zcheck_inside_listZresellers_supported�detect_inside_lvpr:r;�
SINGLE_FORMATrEr=)r�Zcant_remove_msgZcant_destroy_msgZ	destroyedZid_r)r)r*r�@s0




r�cCsp|rtj�|�st|�t����Dt�d�y�ttd�t	_
ttd�t	_ttd�t	_ttd�t	_
ttd�t	_tdkr�ttd�t	_ttd	�t	_td
kr�ttd�t	_|r�|dkr�tj|t	d
�|�d�ntj|t	d�|�d�n0|dk�rtjt	dd�ntj|t	d�|�d�WnBtk
�r`}z"tddt|�dt|��Wdd}~XYnXWdQRXdS)NrrLrJrKrNrMr�rOrPr\rQrz&Can`t setup default settingsfor LVP {})rz/Can`t setup lvp with id {}; error code {{code}}zCan`t setup default settingsz/Can`t setup lve with id {}; error code {{code}}r7zCan`t setup lve z. RuntimeWarning excepted: )r&r(�	exist_lvpr�warnings�catch_warnings�filterwarningsr�r�rsr�r�r�Z	ls_memoryr�rir�r�r�rp�lve_set_defaultr�Z
lve_lvp_setupr��RuntimeWarningrAr<)r�r�Zrwr)r)r*r�cs6

r�cCs�d}d}t}td�t}|at|t�r�y||d}|s<d}Wntk
rVd}YnXy||d}|snd}Wntk
r�d}YnX||fS)z�
    Get pair of package, reseller for lve_id
    :param lve_id: lve_id, UID with package, reseller
    :return: tuple of (package, reseller); Both can be None
    Nz
list-usersr�r�)�packages_users�GetControlPanelUsersr��dict�KeyError)r�r�r��old_packages_usersZtemp_packager)r)r*�"get_package_and_reseller_by_lve_id�s(


r4c

Cst}|dkrtd|�t}|atdkr0t|d�d}|dk	rB|}n0|rLt}	nt}	x |	D]}
t|
d�|krV|
}PqVW|dkr�y||d}Wnttfk
r�d}YnXy||d}Wnttfk
r�d}YnX|dk	�r�t	||d	�t
d
|tt�}yt
t|ddd
�|d�td<Wntttfk
�r4YnXtddk�rPtdtd<t
d|tt�tdk�rxt
d|tt�ndtd<ytt|ddd
��}|td<Wntttfk
�r�YnXt
d|tt�t
d|tt�t
d|tt�n t	|||d�tdk�rdtd<|�st||d�dS)a

    Aplly limits to LVE lve_id
    :param lve_id: lve id
    :type lve_id: int
    :param plan_id: package for user with lve_id. deprecated
    :type plan_id: string
    :param result: if True = don't apply limits. only create setup_data with actual limits
    :type result: boolean
    :param reseller: if True = plan_id is resellers plan. deprecated
    :type reseller: boolean
    :param out_node: node with limits for lve_id
    :type out_node: xml_node
    :param lvp_id: reseller container id; host container if 0
    r�useridrT)r�N)r�r�r�)r�rKrJr�)r�r�)r�rLr�rNr�r�rMrPrOrQ)r�r�rU)r/r0r�r�r�r�r��	NameErrorr2rr�r�r�r�r�r{r�rzr�r�r�)
r�r�rFr��out_noder�r3Znew_packages_usersr��	node_listr�r�rMr)r)r*�	lve_apply�sh







r9cCst|�dS)a�
    Sometimes python is confused about which encoding
    we should use to print message. E.g. when we use
    "command | grep" to find something in the output.

    According to python docs, "Software should only work with Unicode
    strings internally, converting to a particular encoding on output."

    So let's convert all unicode into str using our "magic" byteify method
    :param string:
    :return:
    N)r=)�stringr)r)r*�_print_string_safesr;cGs2td�dd�|dd�D�d|dg��dS)zz
    Command to print data with only last column 30 symbols wide
    Useful to print data that contains package name.
    rTcSsg|]}d|�qS)z%8sr))r/r�r)r)r*r�sz_pprint.<locals>.<listcomp>Nrz%30s)r;�join)rlr)r)r*�_pprintsr=cGs<td�dd�|dd�D�d|dd|dg��dS)z�
    Command to print data with two last columns 30 symbols wide.
    Useful to print full data of every user with package name and reseller name.
    rTcSsg|]}d|�qS)z%8sr))r/r�r)r)r*r�$sz_pprint_f.<locals>.<listcomp>N���z%30sr)r;r<)rlr)r)r*�	_pprint_fsr?cGs2td�d|dgdd�|dd�D���dS)ze
    Command to print data with first column 30 symbols wide.
    Useful to print packages data.
    rTz%30srcSsg|]}d|�qS)z%8sr))r/r�r)r)r*r�,sz_pprint_p.<locals>.<listcomp>r7N)r;r<)rlr)r)r*�	_pprint_p'sr@cGs@td�d|dgdd�|dd�D�d|dg��dS)	z�
    Command to print data with first column and last column are 30 symbols wide.
    Useful to print data with user names and package names.
    rTz%30srcSsg|]}d|�qS)z%8sr))r/r�r)r)r*r�4sz_pprint_r.<locals>.<listcomp>r7rN)r;r<)rlr)r)r*�	_pprint_r/srAcCsft|�}t|�ttfkr&|�d�r&dnd}|�dd�}|rLt|�}|d9}nd}|r^d�|�n|}|S)z�
    Convert pmem or vmem limits to bytes value

    :param value: pmem or vmem limits in kbytes value
    :return: bytes value of limit

    r�TFrTirz*{})r<�typer�
startswithr�r�r�)r��was_changedr)r)r*�_pmem_vmem_to_bytes_value7s	"
rEcCs�d}d}t|t�r,|�d�r,|dd�}d}yt|�}Wntk
rLdSX|rVd}|dd}|d	krxd
�||�}nd�||d�}|S)z�
    Convert amount of RAM to M format

    :param string value: amount of memory in KB
    :rtype: string
    :return: amount of memory in MB like "1234M"
    rTFr�r7NTrSirz{}{}Mz{}{}K)r�rrCr�r{r�)r�rFrD�vr)r)r*�_mb_memMs rG�0r�c
st����dd�d<�fdd�}|d�dkr<t|d��nd}dd�}|t|d��t|�t|d��t||d���t||d	���t|d
��t|d��t|d��t|d
��|d��g}t�}|dk	r�||7}tr�d��fdd�|D��}	d|	g}n||�|�fdd�|D��|S)z^
    Generate header and default package data either as print to stdout or as json string
    rJrRcs��|d�S)NrT)rw)r�)r�r)r*r�or�z_formatter.<locals>.<lambda>rTcSstrt|�St|�S)N)rWrErG)r�r)r)r*r�qsrKrOrNrMrPrLrQ)r_r`rgZNCPUrarbrcrdrerf�PACKAGEN�,c3s"|]}d|��|d�fVqdS)z	"%s":"%s"rTN)rw)r/r�)�
fields_mapr)r*r2sz_formatter.<locals>.<genexpr>z{%s}csg|]}��|d��qS)rT)rw)r/r�)rKr)r*r��sz_formatter.<locals>.<listcomp>)r�r�r�r<rmr:r<)
�printer�
default_idZdefault_package�more_fields�get_dataZ_cpu�convert_mem_limits�resrlr�r))r�rKr*�
_formatterhs(rRcs��fdd�}|S)aA
    Generate inner function with closured fields names and printer function

    :param list fields: List of strings that represent names of fields in final output
    :param callable printer: Function to format and print data for every entry
    :rtype: callable
    :return: function to format data for every user
    csd�t|d}t|d}|dkr(d}tdkr>t|dd�n$|dk	rPt|�nt�t||d�t�t��t|||dd��fd	d
�}dd
�}t|��d<t|d
���d
<t|d���d<t||d����d<t||d����d<t|d���d<t|d���d<t|d���d<t|d���d<t	�r8t
|��d<n|�d<|dk�r^t	�rTdnd�d<n|�d<d�d
k�r�dtt�d
�d��d��d
<nt�d
�d�d
<�d
�d<tt
�d���d
<g}t	�r�d��fdd��D��}d|g}n��fdd��D��|S) z�
        :param string user: Find and format data for this User ID
        :rtype: list
        :return: List of given user's statistics data line or empty list
        rTr�r�Nr7)r�T)r�r�rFcs4t�|�tt|�kr(dtt|�St�|�S)Nr�)r<r�)r�)r�r)r*r��sz2_user_formatter.<locals>.wrapper.<locals>.<lambda>cSstrt|�St|�S)N)rWrErG)r�r)r)r*r��sr�rJrKrOrN�vmemrMrLrPrQzN/Ar�rRr�rJc3s"|]}d|�|��fVqdS)z	"%s":"%s"N)�lower)r/r�)r�r)r*r2�sz3_user_formatter.<locals>.wrapper.<locals>.<genexpr>z{%s}csg|]}�|���qSr))rT)r/r�)r�r)r*r��sz4_user_formatter.<locals>.wrapper.<locals>.<listcomp>)r/r�rr�r�r�r�r9r<r:�_normalize_strr�r�r�r<)r�r�r�Z
check_changedrPrQr�)rlrL)r�r*�wrapper�sR


$z _user_formatter.<locals>.wrapperr))rlrLrVr))rlrLr*�_user_formatter�s	>rWcCs�t�yBtd�|dk	r(|r(td|�n|dk	r>td|d�ntd�WnYnXdg}tt|d�}t�|}t|�}xtD]}|||�7}q�Wtr�tdd�	|�d	�dS)
Nz
list-usersr5zlist-reseller-users)r�rI)rNz	{"data":[rJz]})
r�r0rRr=rmrWr/r:r=r<)r5r�rNrFrl�	formatterr�r)r)r*�paneluserslimits�s$

rYcCsBtd�g}x0tt�D]$\}}|�t|�|d|df�qW|S)z@Get list of tuples[lve_id, reseller, package] from control panelz
list-usersr�r�)r0rr/rr�)rFZstr_uidZpayloadr)r)r*�paneluserslist�s
 rZcCs>ddlm}i}td�tt���||<td�|�t�|S)zBGet dict of pairs[provider, list[package_name]] from control panelr)�DEFAULT_PROVIDERz
list-packageszlist-resellers-packages)Z
clveconfigr[r0r r/�keysr�)r[�packagesr)r)r*�panelpackagesdict�s
r^cCspt�td�ttddgd�}t�ddg}t|td�}xtD]}|||�7}q>Wtrltdd�	|�d�d	S)
z]
    Implements lvectl all-user-list command

    :return: None, prints result to stdout
    z
list-usersrI�RESELLER)rN)rLz	{"data":[rJz]}N)
r�r0rRr?rmrWr/r:r=r<)rFrlrXr�r)r)r*�all_users_limits
s
r`cs6t��dkr2dd�t�D���fdd�t|�D�}|S)z�
    Filtering DirectAdmin's admins for `lvectl apply all` command

    :param ve_dict: dict with LVE
    :return: filtering dict

    ZDirectAdmincSsg|]}t�|�j�qSr))r�r�r�)r/r�r)r)r*r�)sz(_filtering_da_admins.<locals>.<listcomp>csi|]\}}|�kr||�qSr)r))r/r�r�)�uids_da_adminsr)r*�
<dictcomp>*sz(_filtering_da_admins.<locals>.<dictcomp>)r8Z	getCPNamerr)�ve_dictr))rar*�_filtering_da_adminss	rdc
s>y8t�tt�}|r6tjj����fdd�t��D�}Wnt�}YnX|dkr`t}t	�}nt
}tjj|d�}i}x |D]}|dd�|t
|d�<q|Wx"|D]}||kr�ddd�||<q�Wt|�dk�r:t|�}xf|D]^}||kr�d}n||d}||}t|�}	t|	�dk�r(||	dd�||<q�|dd�||<q�W|S)	Ncsi|]\}}|�kr||�qSr)r))r/�krF)�cfg_lvp_id_listr)r*rb6sz&prepare_apply_data.<locals>.<dictcomp>T)r�)r�r�)r�rr�)r0r1r/r&r�r-�id_list�itemsr�r+r�r(r&r�r�rd�guess_reseller_by_package)
r�Zpackages_users_r8rgrcr�r�r1Zpkg�	resellersr))rfr*�prepare_apply_data/s>


rkc	Cszt�td�t�}t��r*tt���}nt�}tjj}dtj_xH|�	�D]<}|�
|d�dkrJ||d||d}}t|||d�qJW|tj_td�t���rvtd�}tj�
�}x�|�	�D]�}t|dd�t|||d||d|d�t|d	�td|d	�tj
�|�}tj�|�}	xR|	D]J}
t�|
�j}|�
|d�|k�r`tjj||d
�||�d�t||d��q$Wq�WdS)
Nz
list-usersTrr�r�)r7r�)r�r�)r7r�r�)r�z6Can`t move lve_id={} to lvp_id={}; error code {{code}})r)r�)r�r0rkr&r'r1Zlve_id_lvp_id_pairsr%rr\rwr9r(r��get_reseller_namernZcpapirr�r�r��lve_lvp_mover�)rcZlve_lvp_mapZorig_ignore_errorr�r7r�Zkernel_mappingZlvp_id_r3�usersr��lve_id_r)r)r*�
lve_apply_allas<

 

rpc
Cs�td�t|d�x�tD]�}t|d�|krtj�|�}xd|dd�D]T}t�d|�yt	�
|�WqDtk
r�tj�
|�r�t�|�|�|�YqDXqDWt|�|j�|�tt�tdd�x|D]}t|�q�Wt|d�dSqWdS)z,Remove reseller from ve.cfg and from procfs.T)r�)r�NrF)rCr�r�r�r&r(Zmap_lve_id_listrprmr��getpwuidr2r%Z
lve_existsr��remover$�
parentNode�removeChildrr�r9)r�r�rnr�r)r)r*�_remove_reseller�s,





rucCsHt|�rtj|d�n.tr8tddd|g�t�d�ntd|�dS)z&Disable reseller limits and call hooks)r�r#r�z!no configuration found for LVP %srz*warning: no configuration found for LVP %sN)rur�throw_eventr:r;r>r?r=)r3r�r)r)r*�disable_reseller_limits�srwcCs�td�t�d}xPtD]H}t|d�|krd}t|�t|�|j�|�tt	�t�t
|�qW|s�tr�tddd|g�t
�d�ntd|�dS)	NTF)r�r#r�z no configuration found for VE %srz)warning: no configuration found for VE %s)rCr�r�r�r�rrsrtrr�r9r:r;r>r?r=)r��Deletedr�r)r)r*�
lve_delete�s"
rycCs6tj�d�s2tr tdddg�ntd�t�d�dS)Nz/proc/lve/enterr#r�zenter by name not supportedz$warning: enter by name not supportedr)rur�existsr:r;r=r>r?r)r)r)r*�lve_enter_check�s
r{cCsDt�y,||��}tdd�}|�|�|��WnYnXdS)Nz/proc/lve/enter�w)r{r�r�rB�close)Zsignr�r�r�r)r)r*�enter_apply�s

r~cCs�t�trfd}d}x@tD]8}|�d�}|r@|d|d7}d}q|d|d7}qW|d7}t|�n$td�xtD]}t|�d��qtWdS)	Nz	{"data":[Tr�"Fz,"z]}ZBinaries)r�r:r�r�r=)rF�firstr�rr)r)r*�
list_binaries�s



r�cCs(t�xtD]}td|�d��qWdS)N�+r)r�r�r~r�)r�r)r)r*�
load_binaries�s
r�cCsBt�tdd�}|��}|��x|D]}td|�q&Wt�dS)Nz/proc/lve/enterr}�-)r{r�rr}r~r�)r��lines�lr)r)r*�reload_binaries�s

r�cCs�td�t�t�d}xBtD]:}|�d�|krd}td|�|j�|�tt	�t�qW|s�t
rxtddd|g�ntd|�t
�d	�dS)
NTFrr�r#r�zno configuration found for %sz&warning: no configuration found for %sr)rCr{r�r�r�r~rsrtrr�r:r;r=r>r?)r�Zdeletedr�r)r)r*�
del_binarys 


r�cCsjtd�t�xtD]}|�d�|krdSqWtd|�t�d�}|�d|�t�	|�t
t�t�dS)NTrr�r�)rCr�r�r�r~r�r�r�r�r�r)r�r�Zbin_xmlr)r)r*�
set_binarys



r�c
sFy4|rt}n|rt}nt}��fdd�|D�d}Wntk
rHdSX|r�xB�dD]6}|dkrrt|dd�}nt||d	�}|rX|j�|�qXWdStt��d}xz|D]r}	|	dkr�t	|�
d��dkr�|	�kr�|�
d�d�d��|	<q�t	|�
|	��dkr�|	�kr�|�
|	�d�d	��|	<q�W|�r6t�d
�nt
�d
�dS)a�
    Set given lve or package to default values for given parameters

    :param dict set_data: Arguments of lvectl call
    :param bool package_flag: Should we delete package or lve with given id
    :param callable is_needed: Function that takes xml element and set_data dict and returns
                               whether current xml element contains info about needed ID from set_data
    csg|]}�|��r|�qSr)r))r/r5)�	is_needed�set_datar)r*r�6sz#lve_set_default.<locals>.<listcomp>rNzset-defaultrMr�r�r��ve_id)r�r�r�r�r�rsrt�set�LIMITS_LIST_NAMEr�r�r��plan_deletery)
r��package_flagr�r�r�r�Ztag_�nZto_keepr�r))r�r�r*r-&s8	
r-cCsN|dkrdSt|�}|dkr dSyt|�}Wng}YnX||krJdSdS)a
    Checks is uid owned by reseller
    :param uid: uid for check
    :param reseller_name: Reseller name, None treats as root
    :return: True - valid reseller/user pair, False - else
        Special case:
          if reseller_name is None (root) - always valid
    )N�rootT)r�zN/AF)rr)r1r3ZusernameZreseller_users_listr)r)r*�_check_reseller_user_pairTs	
r�cCs�|dkr*|�dd�}|d}t||�s*dStd�|rh||dkrhtj�|�r\t|dd�q�t|d�n2|dkr�t��r�ttj�|d�d�n
t|d�y
t	�WnYnXy4t
|d}t|�}|r�|dnd}t||d	�Wnt
aYnX|ddk�rvd}d
d�}d|k�r,t|d||d
�d|k�rDt|d�}	nt
d}	d}
d|k�r|t|d|	d�}|tdk�r|d}
|�r�t}nt}�x�|D�]�}
||
|��r�x�tD]�}||k�r�y4|dk�r�t|
dd||�nt|
|d||�Wn�tttfk
�r�|dk�r|
}nt|||k}|�s6|d�r�|dk�r`t�d�}|�dt||��nt�|�}|�dt||��|
�|�YnX�q�Wtt�d}|�r�||dk�r�tj�|��r�t|dd�n
t|d�n6|dk�rt���rttj�|d�d�n
t|d�t|d|d�n�q�W|�s�|d�r�|�rDt nd}t�|�}
|�r�|
�dt|��|
�d|d�|
�t!�n:|�d��r�|
�dt"�#|d�j$�n|
�dt|d��x�tD]�}||k�r�|dk�r�|
}nt|||k}|�s|d�r�|dk�r,t�d�}|�dt||��nt�|�}|�dt||��|
�|��q�Wd}x"t%D]}|j&�'|
|�d}P�qdW|�s�tj(�|
�tt�|�r<tj�|�}t|dd�t|d|d�t)�|t)�*d��t|d�tj+�,|�}x2tj+j-|d�D] }tj.�/||�t||d	��qW|�rtt0j1|d	�n8t���r^ttj�|d�d�n
t|d�t|d�n�x`tD]X}||k�r||dk�r�t!�2d�d�dt||��nt!�2|�d�dt||���q|Wtt�t|d�t|d|d�dS)Nrr3r�FT)r�r�)r�rT)r�cSst|d�|dkS)N)r�r�)r�)r�r�r)r)r*r��r�zlve_set.<locals>.<lambda>zset-default)r�r�r�rKrJ)r�rMr�r�r��saver&r�r�z
save-username)3rwr�rCr&r(r)r�r'r'r0r/rirr�r�r-r�r�r�r�r�r�r{r�rzr�r�r�r<r�rr9rr�r�rqZpw_namer�rsZinsertBefore�	lastChildrpZlve_infor�rlZlvp_lve_id_listr%rmrrvr�)r�r�r3r�r�rjr�Zhas_veZis_needed_userr�Zcpu_is_differentZ
setted_cpuZel_listr�r�Zis_differentr�Zel_nameZaddedZel2Zenables_reseller_limitsror)r)r*�lve_setws�




























 $
r�cCsvtd�t�t|d�}t|�dkr,d}nt|�dkr@|d}|dk	rftdkrf||d<t|dd�nt|dd�dS)	zX
    Set package with some heuristic algorithm to simulate old package set behavior
    Tr�rNr7r3)�is_resellerF)rCr�rir�r��package_set_ext)r�r�Z
reseller_listr�r)r)r*�package_set,sr�c	CsPtd�t�d}|r dd�}ndd�}d|kr>t|d|d�x�tD]�}|||�rDx�tD]�}||krXyJ|dkr�|�d	�d
�dt||��n|�|�d
�dt||��WqXtt	t
fk
�r|dkr�t�d	�}|�dt||��nt�|�}|�dt||��|�
|�YqXXqXWd}qDW|�s�t�d
�}|�d|d�|�r^|�d|d�xjtD]b}||k�rd|dk�r�t�d	�}|�dt||��nt�|�}|�dt||��|�
|��qdWtj�
|�d|k�r�t|d�}ntd}d|k�rt|d|d�|d<tt�t�t|�|�r8|dnd}t|d|d�dS)NTFcSs$|�d�|dko"|�d�|dkS)Nr�r�r�r3)r�)r�r�r)r)r*r�Ksz!package_set_ext.<locals>.<lambda>cSs|�d�|dko|�d�S)Nr�r�r�)r�)r�r�r)r)r*r�Nszset-default)r�r�rMr�rr�r�r�r�r�r�r3rKrJ)r�)r�)rCr�r-r�r�r�r�r<r{r�rzr�r�r�r�r�r�r�r�copy_package_settings_to_cpanel�
plan_apply)	r�r�Zhas_packagerr�r�r�r�r�r)r)r*r�Es`



 "









r�cCst��}td�t}|a|S)z�
    Retrives resellers to packages map from panel using /usr/bin/getcontrolpaneluserspackages
    :return: Dictionary:
    { 'reseller1' -> ['pack1', 'pack2'], 'reseller2' -> ['pack'] }
    zlist-resellers-packages)r/r�r0)Zpackages_users_copy�reseller_packages_mapr)r)r*r�s
rcCsB|d}|d}t�}||kr:|||kr:t|dd�dSdSdS)z�
    Set reseller package limits
    :param set_data: input data dictionary
    :return: True - limits was set succesfully
            False - supplied provider has no supplied package
    r3r�T)r�FN)rr�)r�r3�package_namer�r)r)r*�reseller_package_set�sr�c
CsD|d}t��sdSd|��}tj�|�s.dSt|���}|dd�}i}xx|D]p}|�d�r�|���	d�}|d�
dd���}|dd	kr�|d||<|tkr�|�|�|�d
�rPd|krPdSqPWt
|t�}	t||�r�dSx6tD].}
dt|
�dt|	|
�d}|�|�q�Wt|d
�}x|D]}|�|��q$W|��dS)zA
    Copy package limits from ve.cfg to cpanel packages data
    r�Nz/var/cpanel/packages/Zlve_�=rrTr7�DEFAULTZ_PACKAGE_EXTENSIONSr&�
r|)r8r9rurrr�rrCr�r�r�r�rr�create_cpanel_limitsr��is_limits_equalsr<rrBr})
r�r�Zpackage_pathZcpanel_package_dataZcpanel_package_data_modifyZold_cpanel_datar�Z
line_partsZ
limit_nameZcpanel_datar�Zlimit_stringZcpanel_pkg_filer)r)r*r��s:






 

r�c	CsVxP|��D]D}|dks
|dkr q
y||||kr6dSWq
tk
rLdSXq
WdS)zC
    check if new set of limits for package are equals to used
    r�r�FT)r\r2)Z
old_limitsZ
new_limitsr�r)r)r*r��s
r�cCs�i}x�|D]�}|�d�|kr
x�tD]�}y�|dkrRt|�d�d�d����||<nT|dkr�tt�t|�|�d�d������||<n t|�|�d�d����||<Wq"tt	t
fk
r�d||<Yq"Xq"Wq
W|S)	z�
    create limits for cpanel package file
    use data from ve.cfg:
    limit = limit if found in ve.cfg or DEFAULT
    return dict
    r�rMr�rr�)rNrSrOr�r�)r�r�r<r�r�rnZpage_to_memoryr�r{r�rz)r�Zxml_packagesZresult_datar�r�r)r)r*r��s

",$r�cs�td�t�d}�dkr(�fdd�}n��fdd�}x.tD]&}||�r<d}|j�|�tt�Pq<W|s؈dkr�t��}t|�dkr�d}n|d}|dk	r�t	�|�dSt
r�tddd	�g�t�
d
�ntd��t�dS)NTFcs|�d��ko|�d�S)Nr�r�)r�)r�)r�r)r*r��r�zplan_delete.<locals>.<lambda>cs|�d��ko|�d��kS)Nr�r�)r�)r�)r�r3r)r*r��r�rr#r�z"no configuration found for plan %srz+warning: no configuration found for plan %s)rCr�r�rsrtrr�rir�r�r:r;r>r?r=rp)r�r3rx�is_needed_packager�Zresellers_listr�r))r�r3r*r��s8

r�cCst||d�dS)N)r3)r�)r�r3r)r)r*�reseller_plan_deletesr�c	CsTyt|�|�d�d��Sttfk
rN|dkr<t|Sd�t|d�SXdS)Nrr�rJz{}%rR)r<r�r�r{r�r�r�)r�r�r)r)r*�
get_xml_limit!sr�cCsHdd�}|dkrdSt�d|i�}||dd�}|�d�}||d|�S)z�
    Normalize string for JSON output.
    Example:
     - Input string: -_&[{}]'"`te\s/t
     - Output string: -_&[{}]'"`te\\s/t\a
    :param data_str: String for normalize
    :return: Normalied string
    cSs:d}x0t|�D]$\}}||kr|d7}||kr|SqWdS)z�
        Get the index of the specified occurrence of character in string
        :param input_string: String
        :param char_to_search: Character to search
        :param ordinal: Required occurence number
        :return: Char index
        rr7r)�	enumerate)Zinput_stringZchar_to_searchZordinal�count�idxZchr)r)r*�_get_char_index2sz'_normalize_str.<locals>._get_char_indexNr<r�r7)rxr��rfind)Zdata_strr�Zjson_strZtrd_idxZlast_idxr)r)r*rU)s	
rUcs.�dk	r�n
�rtnt�d���fdd�	}|S)a�
    Generate inner function with closured fields names, is_reseller flag and printer function

    :param list fields: List of strings that represent names of fields in final output
    :param boolean is_reseller: Format output with info about reseller or not
    :param callable printer: Function to format and print data for every entry
    :rtype: callable
    :return: function to format data for every user
    Nc
s��r.t��t�t����d<��fdd�}n�fdd�}t�t��trPt��n��d<dd�}|�d��d<td	kr�|�d
��d
<x�tD]�}||�r�t|d�}|dkr�|n
ttd��d<tt	t|d
�t
�d�d�d��d<y$tt
|�d�d�d����d<Wnt
tfk
�r$YnX|t|d
���d
<|t|d���d<t|d��d<t|d��d<t|d��d<q�W��d�dk�r��d
d�d<tt�d���d
<g}t�r�d��fdd��D��}d|g}n��fdd��D��|S)a
        :param string package_name: Find and format data for this package name
        :param string reseller_name: reseller name, owner of supplied package
        :rtype: list
        :return: List of giver package's statistics data line or empty list
        r�cs�|�d�ko|�d��kS)Nr�r�)r�)r�)r�r3r)r*r�ksz5_package_formatter.<locals>.wrapper.<locals>.<lambda>cs�|�d�ko|�d�S)Nr�r�)r�)r�)r�r)r*r�osr�cSstrt|�St|�S)N)rWrErG)r�r)r)r*r�usrNrSrSrOrKrTrJ)r�rRr�r�rr�rMrLrPrQNrJc3s&|]}d|��|��d�fVqdS)z	"%s":"%s"zN/AN)rwrT)r/r�)r�r)r*r2�sz6_package_formatter.<locals>.wrapper.<locals>.<genexpr>z{%s}csg|]}��|��d��qS)rT)rwrT)r/r�)r�r)r*r��sz7_package_formatter.<locals>.wrapper.<locals>.<listcomp>)r�r�r�r:rUrir�r�r<r�r�r�r�r�r{rwr�r<)r�r3r�rPr�r�rQr�)rlr�rL)r�r�r3r*rV]sJ



" z#_package_formatter.<locals>.wrapper)N)rAr@)rlr�rLrVr))rlr�rLr*�_package_formatterPs;r�cCs�t�td�t��}td�t��}tttd�}tt�dtd�}x|D]}|||�7}qHWt	dkrttt�dtd�}xXt
|�D]L\}}t��r�|dkr�q~x0|D](}t	dkr�||||�7}q�|||�7}q�Wq~Wt
r�td	d
�|�d�dS)Nz
list-packageszlist-resellers-packages)rMF)r�rLr7TZadminz	{"data":[rJz]})r�r0r/r�rRr@�DEFAULT_PACKAGEr�rmr�rr8rr:r=r<)r]�reseller_packagesrFrXr�r3�
packages_list�reseller_packager)r)r*�get_packages_list�s(

r�cCs�t�td�dg}t�|}tttd�}t|dd�}x0tt�D]$\}}x|D]}||||�7}qNWq@Wt	r�t
dd�|�d�dS)	Nzlist-resellers-packagesr_)rMT)r�z	{"data":[rJz]})r�r0rmrRr@r�r�rr/r:r=r<)rNrlrFrXr3r�r�r)r)r*�get_resellers_packages_list�s

r�c
Cs�t�td�t��}td�t��}dg}t�|}ttt|d�}t|dtd�}x|D]}|||�7}qXWt|dd�}x0t	|�D]$\}}x|D]}	|||	|�7}q�Wq�Wt
r�td	d
�|�d�dS)Nz
list-packageszlist-resellers-packagesr_)rMrNF)r�rLT)r�z
{"data": [rJz]})
r�r0r/r�rmrRrAr�r�rr:r=r<)
r]r�rNrlrFrXr�r3r�r�r)r)r*�get_all_packages_list�s"


r�cCs t�}x|D]}|||<qW|S)z�
    Converts package list to internal format
    :param package_list: Package list. Example: ['BusinessPackage', 'Package2']
    :return: Package list as dictionary. Example: {'BusinessPackage': 'BusinessPackage', 'Package2': 'Package2'}
    )r1)�package_listZpackages_users_dictr�r)r)r*�_convert_packages_list�s
r��list-allc
Cs|dkrdS|dkr |dkr dSddlm}m}m}m}m}m}m}	�y�|dkr�tdk	r�y"|t|d	t|d
d�ia	Wq�t
k
r�|ddd�ia	Yq�Xn@y||�\}
}Wntk
r�d}
}YnX|||
d�ia	dSn�|d	kr�||||�ia	dS|d
k�r,tdk�r$|�}t
|�a	t	anta	dS|dk�rTtdk�rL|�a	t	anta	dS|dk�rvtdk�rn|�ata	dS|dk�r�tdk�r�||�}
|
a|
a	nta	dS|dk�r�tdk�r�|	�ata	dSWn@tk
�r�}zt|�Wdd}~XYntk
�rYnXdS)a�
    Parse output from GET_CP_PACKAGE_SCRIPT and get package and lve relations

    :param option: option for GET_CP_PACKAGE_SCRIPT.
     Option is one from the following possible values:  'userid', 'package', 'list-packages', 'list-resellers-packages'
    :type option: string
    :param lve_package_id: lve_id or package_name
    :type lve_package_id: string or int
    :param reseller:
    :type reseller: string
    )zlist-allr5r�z
list-packageszlist-resellers-packagesz
list-userszlist-reseller-usersF)r5r�rTr)�
list_users�admin_packages�reseller_package_by_uid�get_uids_list_by_package�resellers_packages�get_reseller_users�list_allr5Nr�r�)r�r�Tz
list-packageszlist-resellers-packagesz
list-userszlist-reseller-userszlist-all)�clcommon.cpapir�r�r�r�r�r�r��cached_usersr/r2r{�cached_list_packagesr��cached_resellers_packages�cached_reseller_users�cached_defaultrr@r)ZoptionZlve_package_idr�r�r�r�r�r�r�r�r3r�r�Zreseller_users_dictr5r)r)r*r0�sp$"









r0cCst�tt�S)z2
    Retrieves panel users count
    :return:
    )r0r�r/r)r)r)r*�get_panel_users_counte	sr�cCs>td�td||d�r:x"t|D]}tt|�||d�q WdS)Nz
list-usersr�)r�)r0r/r9r�)r�r�r1r)r)r*r�o	sr�cCsfx`|D]X}|�dd�}|����}x:|D]2}t|�dkr(yt|�}t|�Wq(Yq(Xq(WqWdS)Nr�rTr)r�r�r�r�r�r�)�
users_listr�rnr�r)r)r*�destroy_manyy	s

r�cCs�t�y
t�WnYnXx`|D]X}|�dd�}|����}x:|D]2}t|�dkrFyt|�}t|�WqFYqFXqFWq$WdS)Nr�rTr)r�r0r�r�r�r�r�r9)r�r�rnr�r)r)r*�
apply_many�	s


r�cCs6tjt|�t|�|dt|�dt|�dd�dS)NzCan`t put proccess with pid z in lve z; error code {code})r)rpZlve_enter_pid_flagsr�r<)ZLVEid�PID�flagsr)r)r*�	limit_pid�	sr�cCstjt|�dt|�d�dS)NzCan`t release process with pid )r)rpZ
lve_leave_pidr�r<)r�r)r)r*�release_pid�	sr�c	Csttttttttd�S)N)r�r�r�r�r�r�r�r�)r�r�r�r�r�r�r�r�r)r)r)r*�get_globals�	s
r�cCs`g}t��}td�t��}|��ax6t|�D]*\}}x |D]}||kr<|�|g�q<Wq.W|S)Nzlist-resellers-packages)r/r�r0r�extend)r�r�Z
pkg_users_oldr�r3r�Zpackage_name_in_keyr)r)r*ri�	s
ricCs|tjtjddd�}|rxtj�|�rxt||�\}}|dkrxd�|�}trVt	dd|g�n"d|}t
j�d	|�t
�
|�d
S)z�
    Call Endurance's custom script

    :param args: list of arguments for pass to Endurance's custom script
    :return: None

    ZENDURANCE_CUSTOM_SCRIPTr�)ZfileNameZ	paramNameZ	separatorrz2Error while executing Endurance's custom script
{}r#r6z	error: %sz%s
N)r8Zget_param_from_fileZCL_CONFIG_FILErurrrr�r:r;r>r�rBr?)�argsZendurance_custom_scriptZret_codeZstd_outrGr�r)r)r*�call_endurance_custom_script�	s	
r�cCstrtt|tj��St|�S)a
    Convert page value to human-readable value or bytes, depending on BYTES_FLAG;
    E.g.
    >>> _page_to_memory_or_bytes(1233254)  # BYTES_FLAG=False
    '100M'
    >>> _page_to_memory_or_bytes(1233254)  # BYTES_FLAG=True
    654321

    :type value: int
    :rtype: str | int
    )rWr�r��mmaprrG)r�r)r)r*�_page_to_memory_or_bytes�	sr�cCs�t�}ttj���}t�xVt�D]L}y"tj�|�}||krF|�|�Wq"tt	t
fk
rl|�|�Yq"Xq"Wx|D]}t|�qxWdS)zV
    Remove from LVE all resellers, which are absent from panel
    :return: None
    N)r r&r�rjr�r+rlrr2rr�ru)Zreseller_id_list_for_deleteZcpapi_resellers_listZlve_reseller_idZlve_reseller_nameZreseller_id_for_deleter)r)r*�remove_absent_resellers�	s
r�cCs�x�ttj���D]�\}}yt�|�Wqtk
r�yt�|�WnDtk
r�ytj	�
|�t�|�Wntk
r�YnXYnXYqXqWdS)zM
    Remove from LVE all users, which absent in system
    :return: None
    N)rr&r(r�r�rqr2r�r r%r)r�r�r)r)r*�remove_absent_users
sr�)F)N)r)r)rrrrrrr)N)NN)rF)NNN)F)F)r)NFNNr)rHr�N)NN)r)r)r)F)F)N)FN)r�rTN)N)�Z
__future__rrr�builtinsrZ
past.builtinsrrZfuture.utilsrr	�typingr
rrr
r�
contextlibr�r�r*rDrur�r�r�r>rZxml.dom.minidomZdomZminidomr�rx�	functoolsrrr�rr�rnr�rrrZclcommon.cpapi.cpapiexceptionsrr8ZcleventsrrZcllimits.librZclveconfig.ve_configrrrZclveconfig.ve_lockrrrrrr r!Zclcommon.lib.cleditionr"ZGET_CP_PACKAGE_SCRIPTr�r�r�rhrrrEr(r�rvrwZIS_DEBUGrpr&r+r.r4r@rCrAr�r�r�r�rir:rWrsr�r/r�r�r�r�r�r�r�r�r�r�rVrXrmrtr|r�r�r�r�r�r�r�r��contextmanagerr�r�r�r;r�r�r�r�r�r�r�r�rrrrrrr"r$r�r�r4r9r;r=r?r@rArErGrRrWrYrZr^r`rdrkrprurwryr{r~r�r�r�r�r�r-r�r�r�r�rr�r�r�r�r�r�r�rUr�r�r�r�r�r�r�r�r�r�r0r�r�r�r�r�r�r�rir�r�r�r�r)r)r)r*�<module>
s~

	



			5
$
		#$&VL
2)
	
.#6?(&'L
k



Zerion Mini Shell 1.0