Hacked By AnonymousFox

Current Path : /opt/cloudlinux/venv/lib64/python3.11/site-packages/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/__pycache__/lvectllib.cpython-311.pyc

�

ܨfy��	��ddlmZddlmZddlmZddlmZddlmZmZddl	m
Z
mZddlm
Z
mZmZmZmZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmcmZ ddl!Z!dd	l"m#Z#ddl$Z$ddl%Z%dd
lm&Z&ddl'Z'ddl(Z(ddl)m*Z*ddl+m,Z,dd
l-m.Z.m/Z/m0Z0m1Z1ddl2m3Z3ddl4Z4ddl5m6Z6m7Z7ddl8m9Z9ddl:m;Z;ddl<m=Z=m>Z>m?Z?ddl@mAZAmBZBddl'mCZCmDZDmEZEmFZFmGZGddlHmIZIddlJmKZKmLZLdZMdZNdZOdZPdZQdZRdZSdZTdZUeVejW�Xd d����ZYd!ZZe1e,j[��sdZ\dZ]neDeY�"��Z\eCe\�#��Z]d$�Z^d%�Z_d&�Z`d'e3fd(�Zad�d)�Zbd*�Zcd+d,d+d-dd.dd/d0�Zdd.Zed1d,ddddddd0�Zfgd2�Zgd3ahdaidajd4akd4aliamd4and4aod4apd4aqd4ard4asd4atd5aud4avd4awd4axd6�Zyd7�Zzd8�Z{d�d9�Z|d:�Z}d;�Z~e}��p	e~��Zd�d<�Z�d=�Z�d>�Z�d?�Z�d�d@�Z�dA�Z�ej�dB���Z�		d�dC�Z�dD�Z�d�dE�Z�dF�Z�dG�Z�d�dH�Z�dI�Z�dJ�Z�dK�Z�dLeVdMe�fdN�Z�dO�Z�dP�Z�dQe
e�eVffdR�Z�dS�Z�d�dU�Z�dV�Z�d�dW�Z�d�dX�Z�dY�Z�dZ�Z�d[�Z�d�d\�Z�d�d]�Z�d^�Z�d_�Z�d`�Z�d�da�Z�db�Z�ia�dcZ�ddZ�d�de�Z�df�Z�d�dg�Z�dh�Z�di�Z�dj�Z�dk�Z�dl�Z�dm�Z�dn�Z�d�dq�Z�e�fdr�Z�d�ds�Z�dt�Z�du�Z�dv�Z�dw�Z�d�dx�Z�dy�Z�dz�Z�d{e�e�e�ffd|�Z�d�d}�Z�d~�Z�d�Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d�d��Z�d��Z�d�d��Z�d�d��Z�d�d��Z�d�e�d�e�d{eeVfd��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d�d��Z�d��Z�d��Z�d��Z�d�d��Z�d��Z�d��Z�d��Z�da�da�da�da�da�d��Z�d�d��Z�d��Z�d�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�dS)��)�print_function)�absolute_import)�division)�range)�
basestring�unicode)�	iteritems�reraise)�Dict�List�Tuple�Optional�TextN)�partial)�PAGESIZE)�acquire_lock)�Feature)�admins�reseller_users�get_main_username_by_uid�is_panel_feature_supported)�
EncodingError)�reseller_limits_disabled_post�reseller_limits_enabled_post)�exec_utility)�get_subprocess_logger)�get_xml_config�save_xml�BadVeConfigException)�setup_global_lock�LockFailedException)�Lve�PyLve�LVP_XML_TAG_NAME�
PyLveError�NameMap)�detect_panelclass)�write_file_via_tempfile�create_dir_securez%/usr/bin/getcontrolpaneluserspackagesz
/proc/cpuinfoi'�
VE_DEFAULTFz/bin/umountz"/etc/container/exclude_mounts.conf�multi�single�PYLVE_DEBUG�plesk_id)�debug)�pyc�t�t���rtj���SgS)z-Helper function for easy mocking in unittests)�lve�reseller_limit_supported�proc�lvp_id_list���py/lvectllib.py�lvp_listr9Ps/��
�#�#�%�%���x�#�#�%�%�%��	r7c�n�t��}|���|���S)zf
    Get list of resellers with activated reseller limits

    :return: list of pairs (name, uid)
    )r&�
link_xml_node�load_from_node)�name_maps r8�get_active_resellersr>Xs1���y�y�H��������"�"�$�$�$r7c�6�|d�t��D��vS)z]
    Check whether giver reseller has activated reseller limits or not
    :return: bool
    c3� K�|]	\}}|V��
dS�Nr6)�.0�name�uids   r8�	<genexpr>z,is_active_reseller_limits.<locals>.<genexpr>hs&����J�J�i�d�C�T�J�J�J�J�J�Jr7)r>��
reseller_names r8�is_active_reseller_limitsrHcs%��
�J�J�3G�3I�3I�J�J�J�J�Jr7�ec���tj��st|��tr t	ddt|��g��nt
|��tjd��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�rIs r8�raise_cpanel_encoding_errorrVlsm��� �"�"����
�
�
����G��c�!�f�f�%�	'�	'�	'�	'�	�a�����H�Q�K�K�K�K�Kr7c�h�	t|��dS#t$rtdd��YdSwxYw)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
    rLzcan`t get lockN)r r!�check_result_and_exit)�writes r8�get_global_lockrZ~sP��3��%� � � � � ���3�3�3��a�!1�2�2�2�2�2�2�3���s��1�1c��|tjkrj|dkrftr(ttddt|��zg��nt
dt|��z��tj|��dSdSdS)NrrKz
lvectl: %szlvectl: Error: )	�errno�ENOSYSrOrP�MULTI_FORMATrQrRrSrT)�result�messages  r8rXrX�s���	�E�L�=�	 �	 �v��{�{��	3���w��s�7�|�|�0K�&L�M�M�M�M��#�S��\�\�1�2�2�2���������
!�	 �{�{r7�rL�i�)�cpu�ncpu�io�ep�mem�pmem�nproc�iops�d)rerdrfrhrirjrkrg���falsec�
�|adSrA)rO)�	json_flags r8�set_jsonrr�s���D�D�Dr7c�
�|adSrA)�
BYTES_FLAG)�
bytes_flags r8�	set_bytesrv�s���J�J�Jr7c��trtdkrd}ntdkrd}ntdkrd}nd}gd�gd�gd�gd	�d
�|}tr1|�d��dz}|d|�d
gz||d�zS|S)N��noiops_8�8��6�4)�ID�SPEED�PMEM�VMEM�EP�NPROC�IO)r~rr�r�r�r�r��IOPS)r~rr�r�r�)ryrzr|r}rrL�CPU)�NOIOPS�LVE_VERSIONrO�index)�version�fields�	speed_idxs   r8�
get_fieldsr��s���
��+��"�"����	��	�	����	��	�	������B�B�B�
B�
B�
B�
;�
;�
;�
,�
,�
,�	��
��F��C��L�L��)�)�!�+�	��z�	�z�"�e�W�,�v�i�j�j�/A�A�B��Mr7c��|�3tj��}|d�td���|dan|at���}|std���t���adS)Nrzget_lve_version failedzinit_lve() failed.)�clcommon�get_lve_version�	Exceptionr��pylve�
initialize�liblve_settings�lve_settings)�lve_ver�
lve_statuss  r8�initr��s}�����*�,�,���1�:���4�5�5�5��a�j������!�!�#�#�J��.��,�-�-�-��(�(�*�*�L�L�Lr7c��tj�d��}|�dS	tj|��S#t
tf$r<}tdt|����tj
d��Yd}~dSd}~wwxYw)z-Get cpu information from environment veriable�CPU_DATANz.Invalid environment variable 'CPU_DATA' formatrL)�os�environ�get�json�loads�	TypeError�
ValueErrorrRrQrSrT)�packed_cpu_datarIs  r8�_get_cpu_data_from_envr�s����j�n�n�Z�0�0�O����t���z�/�*�*�*���z�"����
�@�#�a�&�&�I�I�I��������������������s�9�B�
1B�Bc��i}i}d}	ttd��}nK#t$r>tdt	t��zdz��tjd��YnwxYw|D]�}|���s||d|z<|dz}i}�&t|�	d����dkr\|�	d��d���||�	d��d���<��d	||�	d��d���<��||d
dgS)zF
    Parse /proc/cpuinfo

    return [NumProc, frequency in MHZ]

    r�rzlvectl: Error: Can`t open �.rLzproc%s�:�rn�proc0zcpu MHz)
�open�CPUINFO�IOErrorrRrQrSrT�strip�len�split)�cpuinfo�procinfo�nprocs�f�lines     r8�get_cpu_datar�sQ���G��H�
�F����#����������
�*�S��\�\�9�C�?�@�@�@��������������:�:���z�z�|�|�
	:�)1�G�H�v�%�&��a�Z�F��H�H��4�:�:�c�?�?�#�#�q�(�(�7;�z�z�#���q�7I�7O�7O�7Q�7Q�����C����+�1�1�3�3�4�4�79�����C����+�1�1�3�3�4�4��G�G�$�Y�/�0�0s��AA&�%A&c�\�t|��}|pd}t}t|d��}tjd|��}|�et|��}|dkrP|dkrJtttdz|z|z����}|dkr|St|tz|��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?$Nrl)rQ�CPUINFO_DATA�int�re�match�round�CORE_WEIGHT�min)�data�lncpu�cpu_datare�cpu_percent�from_cpu_limits      r8�convert_from_old_cpur�:s����t�9�9�D��J�Q�E��H��x��{���D��(�=�$�/�/�K����4�y�y���1�H�H�4�3�;�;� ��{�c�'9�D�'@�4�'G�!H�!H�I�I�N���z�z�%�%��u�{�*�N�;�;�;��4r7c�J�t|��}t}t|d��}tjd|��}|�`t|�dd����}||dzkr|dz}|dkr'tttdz|z����SdSdS)zd
    Try converting cpu limit from SPEED in percentage of one CORE format to
    kernel format.
    rz\d+(?:\.\d+)?%$N�%rnrl)	rQr�r�r�r��float�replacer�r�)r�r�re�percents    r8�convert_from_speed_percentr�Ps���
�t�9�9�D��H��x��{���D��h�)�4�0�0�G�������S�"�-�-�.�.���T�C�Z����S�j�G��Q�;�;��u�[�C�/�'�9�:�:�;�;�;��t��4r7c��t|��}t}t|d��}t|d��}t	jdtj��}|�|��}|��|�d��}t|�d����}|�	��dkr|dz}|||zkr||z}|dkr'tt|tz|z����SdS)	zQ
    Try converting cpu limit from SPEED in mhz/gzh format to kernel format.
    rrLz,(?P<freq>\d+(?:\.\d+)?)(?P<suffix>mhz|ghz)+$N�suffix�freq�GHZi�)rQr�r�r�r��compile�
IGNORECASEr��group�upperr�r�)r�r�re�cpu_freq�patternr�r�r�s        r8�convert_from_speed_hzr�bs����t�9�9�D��H��x��{���D��X�a�[�!�!�H��j�H�"�-�X�X�G��M�M�$���E������X�&�&���U�[�[��(�(�)�)���<�<�>�>�U�"�"��$�;�D��(�T�/�!�!��d�?�D��!�8�8��u�T�K�/�(�:�;�;�<�<�<��4r7c�>�t|��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�s r8�convert_from_speedr�ws$��	#�4�(�(�	'� ��&�&�r7c�z�t||��}|�|St|��}|�|St|��}|�|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��from_cpu�from_speed_percent�
from_speed_hzs     r8�convert_to_kernel_formatr��sV��$�D�%�0�0�H�����3�D�9�9���%�!�!�)�$�/�/�M�� ����4r7c�p�t}t|d��}t|��}d|vrOdtttt|�d����|z������zStttt|��|z������S)zm
    convert speed to old cpu format
    args: cpu limit in speed value
    return: old cpu limit format
    r�*)r�r�rQr��lstrip)�speedr�rjs   r8�speed_to_old_cpur��s����H�������E���J�J�E�
�e�|�|��S��U�3�u�|�|�C�'8�'8�#9�#9�U�#B�C�C�D�D�E�E�E�E��3�u�S��Z�Z�5�0�1�1�2�2�3�3�3r7c#�K�t���t���}	t�||��n1#t$r$tjt
jd|z���wxYw	|V�t�|��dS#t�|��wxYw)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)r�r��get_available_lve_id�	lve_setupr%�syslog�	LOG_ALERT�lve_destroy)�settings�lve_ids  r8�
temporary_lver��s�����
������
�
'�
'�
)�
)�F��
�����)�)�)�)�������
�f�&�)V�X^�)_�	`�	`�	`�
�����
"�����
���&�!�!�!�!�!�����&�!�!�!�!���s�A�.B�B$�$Cc��t���}t||���|_||_||_||_||_ttj
d|ztz����|_|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�?)
r�r�r��ls_cpu�ls_io�	ls_enters�ls_nproc�ls_iopsr��math�ceilr�
ls_memory_phy)r��ls_cpusr�r�r�r�r��ss        r8�make_liblve_settingsr��sm��	�����A�'��g�>�>�>�A�H��A�G��A�K��A�J��A�I��$�)�B��$6��$A�B�B�C�C�A�O��Hr7c���t|�d����}|s.|�d��}tj|��j}t|��S)N�id�user)rQ�getAttribute�pwd�getpwnam�pw_uidr�)�ve_lve_element�user_uid�	user_names   r8�get_ve_lve_user_uidr�sV���>�.�.�t�4�4�5�5�H��2�"�/�/��7�7�	��<�	�*�*�1���x�=�=�r7c���dt|d��i}|tkrt|d��|d<|�|�|��tt	j|����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
    �statusrrL�msgN)rQr^�updaterRr��dumps)�
error_typer��
extensionsr_s    r8rPrP�sl����D��G���
%�F��\�!�!��D��G����u�
����
�
�j�!�!�!�	�$�*�V�
�
�����r7c��	tt�|��d�d����||<dS#tt
tf$rg||||<|�|��}|�dt||����	|j
|��YdS#YYdSxYwwxYw)Nr�limit)r��
ve_default�getElementsByTagNamer�r��
IndexErrorr��
createElement�setAttributerQ�appendChild)�xml�ve_defaults�ve_cfg�val�default�nodes      r8�check_def_valuer�s���	��z�>�>�s�C�C�A�F�S�S�T[�\�\�]�]��C������
�I�.����"�3�<��C���#�#�C�(�(�����'�#�g�c�l�"3�"3�4�4�4�	��C�O�D�!�!�!�!�!�!��	��D�D�D�������s%�AA�A C�(B;�;C�=C�Cc�*���fd�|jD��S)Nc�^��g|])}t|tj���|j�k�'|��*Sr6)�
isinstancer�Element�tagName)rB�_�tags  �r8�
<listcomp>z"xml_filter_tag.<locals>.<listcomp>�s7���Z�Z�Z�!�*�Q���*D�*D�Z���VY�IY�IY�A�IY�IY�IYr7)�
childNodes)rrs `r8�xml_filter_tagr!�s���Z�Z�Z�Z�t��Z�Z�Z�Zr7c��t||��D]9}|�|�|��s�|�|�|��|kr�6|cSdSrA)r!�hasAttributer�)rr�attr�attr_val�
child_nodes     r8�xml_filter_firstr'�sn��$�T�3�/�/���
���J�$;�$;�D�$A�$A�����J�$;�$;�D�$A�$A�X�$M�$M�������r7c�p�t|||���}|�t���|�|��S)N)rrr$)r'r
r�)rrr$�filtered_child_nodes    r8�get_child_tag_atrrr*s;��*��#�D�I�I�I���"��l�l���+�+�D�1�1�1r7c�x�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!rrQ)rrr$r�first_child_nodes     r8�set_child_tag_atrrr-
s;��
&�d�C�0�0��3���!�!�$��C���1�1�1�1�1r7c��	t��\aadS#t$rg}tr%ttdt|��g��ntt|����tj
d��Yd}~dSd}~wwxYw)zLoad config from ve.cfgrKrLN)rr�ve_lveconfigrrOrPr^rQrRrSrTrUs r8�_load_config_wrapperr0s���
�-�/�/������������	���w��A���&7�8�8�8�8��#�a�&�&�M�M�M��������������������s��
B�AB�B�lvp_id�lvp_defaultsc��da	|s"ttd��datS|r!t
�d��atStttdt|����}|r|�d��dant�t��atS#t$r@tr'tdddg��t!jd��nt%d	��YnwxYwtS)
z�Load default limits

    :param int lvp_id: lvp id
    :param bool lvp_defaults: load reseller's default limits instead of global
    :return: dict with default limits
    �true�defaultsrr�r+�WARNINGzdefault section error in ve.cfgrLz(warning: default section error in ve.cfg)�ubcr!r/r�LVE_DEFAULTrr�LVP_DEFAULTr'r$rQr�	cloneNoder
rOrPrSrTrR)r1r2�defaults_root_nodes   r8�_load_default_limitsr<"s���C�>��	�'��j�A�A�!�D�J����	��-�-�j�9�9�J���-�l�<L�d�TW�X^�T_�T_�`�`���	:�+�@�@��L�L�Q�O�J�J�#�-�-�j�9�9�J�����>�>�>��	>���)�-N�!O�P�P�P��H�Q�K�K�K�K��<�=�=�=���>�����s�#B8�"B8�A,B8�8AD�Dc	�|�td�ttttt
tfD����S)Nc3�"K�|]
}|dkV��dS)rnNr6)rB�xs  r8rEz._all_config_elements_loaded.<locals>.<genexpr>Is&����j�j�1�q�B�w�j�j�j�j�j�jr7)�all�ve_lve�ve_lvp�
ve_package�	ve_binary�ve_enter_by_name�ve_cfg_versionr6r7r8�_all_config_elements_loadedrGHs.���j�j����Y�HX�Zh� i�j�j�j�j�j�jr7c��t�d��at�d��at�t��atjj�	t��t�d��}t|��dkr	|dan9t�
d��at�t��t�d��at�d��}t|��dkrt!|djj��ndadS)	z$Load all config elements from ve.cfgr2�packagez
enter-by-namer�binaryr�rLN)r/rrArCr$rBr2�mapr=r;r�rErrrrDr��
firstChild�	nodeValuerF)�enter_by_name_elems�cfg_version_elemss  r8�_load_config_elementsrPKs���
.�
.�u�
5�
5�F��2�2�9�=�=�J�
�
.�
.�/?�
@�
@�F��G��"�"�<�0�0�0�&�;�;�O�L�L��
����!�#�#�.�q�1���!�/�/��@�@��� � �!1�2�2�2� �5�5�h�?�?�I�%�9�9�)�D�D��GJ�K\�G]�G]�`a�Ga�Ga�S�*�1�-�8�B�C�C�C�gh�N�N�Nr7�default_limitsc��iattdttt|���}|d���	t�d��d�d��}t|td���td<n�#tttf$r�t|dtd���td<t�d��}|�dt|d����	t�|��n#YnxYwYnwxYw	tt�d	��d�d
����td<n�#tttf$ry|dtd<t�d	��}|�d
t|d����	t�|��n#YnxYwYnwxYw|d���t d
kr|d���n|ddt"i���|d���|d���|d���t%��dS)z~Create ve_defaults dict with default values for all limits

    :param dict default_limits: default limits for lve or lvp
    N)rrrrrre)rrdrr
r��other�
maxentryprocsrgrf�rh)rrrirjrk)rrrrrrr�r�r�r
r�rrrQrr�r��MEM_DEFAULT_CL5�_check_defaults_for_nones)rQ�
check_def_valr�rdrgs     r8�_load_ve_defaultsrYps����K���T�z�{�SY�cq�s�s�s�M��M�f�����
��/�/��6�6�q�9�F�F�w�O�O��5�e�;�v�CV�W�W�W��E�����
�I�.����5�n�U�6K�S^�_e�Sf�g�g�g��E���"�"�5�)�)������#�n�U�&;�"<�"<�=�=�=�	��"�"�3�'�'�'�'��	��D����������	��
� ?� ?�� H� H�� K� X� X�Yh� i� i�j�j��D�����
�I�.����*�4�0��D��
�
!�
!�'�
*�
*��
�����^�D�-A�)B�)B�C�C�C�	��"�"�2�&�&�&�&��	��D�����������M�d����� +�a���M�M�e�����]�]�u�W\�^m�Vn�5o�5o�5o���M�f������M�g������M�f����������sW�AB�BD;�D1�0D;�1D5�3D;�:D;�?AF�A*H�3H�
H�H�H�Hc��t���D]^\}}|��d|�d�}trtdd|g��n"tj�|�d���t	jd���_dS)z*Check that all default values are not NoneNzERROR: Incorrect z default valuer+rK�
rL)r�itemsrOrPrS�stderrrYrT)�key�value�err_msgs   r8rWrW�s���"�'�'�)�)�	�	�
��U����9�c�9�9�9���	-���'�7�!3�4�4�4�4��J����^�^�^�,�,�,��������	�	r7Tc��t��t||��}|st��st��t	|��dS)z�
    :param bool lvp_defaults: load reseller's default limits instead of global
    :param int lvp_id: lvp id to load customise defaults
    N)r0r<rGrPrY)r1r2�load_config_elementsrQs    r8�get_XML_cfgrc�sW������)�&�,�?�?�N�� �#>�#@�#@� ������n�%�%�%�%�%r7c��	tt||d�����}|||<|S#tttf$rt||��cYSwxYw)Nr
�rr$)r�r*r�r
r�)r�elr�
setup_datar_s     r8�check_valuerh�sm��%��&�r�s��A�A�A�B�B���
�3������
�I�.�%�%�%��;�s�#�$�$�$�$�$�%���s�%(�,A�Ac��tj��}|���|�|��}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
    �rbN)�lveapir&r;�get_idrc)�reseller�xml_config_load_elementsr=�reseller_ids    r8�_load_resellers_xml_datarp�sN���~���H��������/�/�(�+�+�K���2J�K�K�K�K�K�Kr7c
����tjt��a���Yt��}���|vr�|�vr��fd�}n�t	j��r�|��	t
j|��}d|j�d�}t|��5}|�
��}ddd��n#1swxYwYn#t$rd}YnwxYwd|vr3tjtj
d�|d�����fd	�}tD�]n}	||	���r]t!d
|	tt��}
	t#t%t'|	dd�
��|
�����}|td<n#t(t*t,f$rYnwxYwt!d|	tt��t.dkrt!d|	tt��n
dtd<	t#t'|	dd�
����}|td<n#t(t*t,f$rYnwxYwt!d|	tt��t!d|	tt��t!d|	tt����ndSdS)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.
    Nc�h��|�d���ko|�d���kS�Nr�rm�r�)rf�plan_idrms ��r8�<lambda>z$prepare_setup_data.<locals>.<lambda>�s0�������(=�(=��(H�(t�R�_�_�]g�Mh�Mh�lt�Mt�r7z"/usr/local/directadmin/data/users/z
/user.confrnzpackage=customzNPackage for user with id {} is incorrect, please recover it using Note from {}zYhttps://docs.cloudlinux.com/cloudlinux_os_components/#installation-enabling-and-disablingc�b��|�d���ko|�d��Srsrt�rfrus �r8rvz$prepare_setup_data.<locals>.<lambda>�s0�������(=�(=��(H�(l�QS�Q`�Q`�ak�Ql�Ql�Ml�r7rerdr
rer�rfr4rhrrSrTrgrjrirk)�copyrrg�get_reseller_packages_maprM�is_dar��getpwuid�pw_namer��readr�r�r��formatrCrhr�r�r*r�r
r�r7)
rurmr��res_pkg_dict�is_needed_plan�user_pwd�filenamer��textrfr�rdrgs
``           r8�prepare_setup_datar��s������;�'�'�J���0�2�2����H��$<�$<��L�Ya�Lb�Ab�Ab�t�t�t�t�t�N�N�� �"�"�
�v�'9��"�|�F�3�3�H�`�H�DT�`�`�`�H��h���(�1� �v�v�x�x��(�(�(�(�(�(�(�(�(�(�(����(�(�(�(��� �����D�D�D�����
$�4�/�/��M��(�h�o�o�"�w������m�l�l�l�N�
�	A�	A�B��~�b�!�!�
A�#�F�B��Z�H�H����6�7I�"�RW�^e�7f�7f�7f�ns�t�t�t�u�u�C�(+�J�u�%�%��"�J�	�:�����D������D�"�k�:�>�>�>��6�M�M���r�;�
�C�C�C�C�()�J�u�%���/���o�V�V�V�W�W�B�')�J�t�$�$��"�J�	�:�����D������G�R��j�A�A�A��F�B��Z�@�@�@��F�B��Z�@�@�@��i��@	A�	AsZ�.B5�B)�B5�)B-�-B5�0B-�1B5�5C�C�68E/�/F	�F	�)H�H�Hc��	tjtd|gtjtj���}|���|jdkS#t$r#tddt�dd�d|�d���YdSwxYw)Nz-l)�stdoutr]r���zfailed to run "� �")�
subprocess�Popen�UMOUNT�PIPE�communicate�
returncode�OSErrorrX)�path�ps  r8�
umount_dirr�s���U���f�d�D�1�*�/�R\�Ra�b�b�b��	�
�
�����|�q� � ���U�U�U��b�b�������d�d�d�"S�T�T�T�T�T�T�U���s�AA�)B�Bc�J�tj�t��sdSg}	t	td��5}|D]?}|���}|r'|�tj|�����@	ddd��n#1swxYwYn(#t$rtddtz��YnwxYw|sdStjtj��	t	dd��5}d�|�
��D��}ddd��n#1swxYwYn'#ttf$rtdd��YnwxYwd}t|��D]=}d	}|D]1}	|D],}
|
�|	��}|rt#|	��p|}n�-�2|sdS�>dS)
zy
    Unmount all paths from /proc/mounts that match regular expressions from /etc/container/exclude_mounts.conf file
    Nr�r�zfailed to read %sz/proc/mountsc�B�g|]}|���d��S)rL)r�)rB�ms  r8rz"prepare_mounts.<locals>.<listcomp>8s$��:�:�:�q�a�g�g�i�i��l�:�:�:r7zfailed to parse /proc/mounts�
F)r�r��isfile�EXCLUDE_MOUNTS_CONFr�r��appendr�r�r�rX�unshare�CLONE_NEWNS�	readlinesr
r�searchr�)�reg_exp_list�confr�r�r��mounts�ATTEMPTSr�error�mount�reg_expr�s            r8�prepare_mountsr�$s����7�>�>�-�.�.�����L�M�
�%�s�
+�
+�	=�t��
=�
=���'�'�)�)���=� �'�'��
�7�(;�(;�<�<�<��
=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=����	=�	=�	=�	=���
�M�M�M��b�"5�8K�"K�L�L�L�L�L�M���������O�G�'�(�(�(�B�
�.�#�
&�
&�	;�!�:�:�A�K�K�M�M�:�:�:�F�	;�	;�	;�	;�	;�	;�	;�	;�	;�	;�	;����	;�	;�	;�	;����� �B�B�B��b�"@�A�A�A�A�A�B�����H�
�8�_�_�	�	�����	�	�E�'�
�
���N�N�5�)�)����&�u�-�-�6��E��E����	��E�E�	�	�	sk�B�AB�B�B�B�B�B�"C�?C�&D-�6D!�D-�!D%�%D-�(D%�)D-�-!E�Ec���d}	tj|dd���n #t$rtd|��YnwxYwt	��t
�d���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�r`N)r��callr�rRr�r��	lve_start)�	MOUNT_CMDs r8r�r�Hs���?�I�5���	��+�F�F�F�F�F���5�5�5�
�(�)�4�4�4�4�4�5��������	�O�O�=�O�>�>�>�>�>s��9�9c�f�t�|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)r��
lve_creater)r�r�s  r8r�r�UsB��
���V�W�^�^�_e�f�f�".��0�0�0�0�0r7c�f�t�|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}}r�N)r��lve_lvp_creater)r1r�s  r8�
lvp_creater�asB��
����![�!b�!b�ci�!j�!j�&2��4�4�4�4�4r7c��td��}t��}t��D]\}|�d|��t�|d�|�����|�|���]|S)N�	lvectllibz*destroy_lvp_all: destroying LVP with id %s�9lvectl: Can`t destroy lvp with id {}; error code {{code}}r�)r�listr9r/r��lve_lvp_destroyrr�)�logger�destroyed_listr1s   r8�destroy_lvp_allr�ms���
"�;�
/�
/�F��V�V�N��*�*�&�&�����A�6�J�J�J�
���f�&a�&h�&h�io�&p�&p�	�	r�	r�	r����f�%�%�%�%��r7c���td��}|dkrt��dS|�d|��t�|d�|�����dS)Nr�r@z&lvp_destroy: destroying LVP with id %sr�r�)rr�r/r�r�r)r1r�s  r8�lvp_destroyr�ys~��
"�;�
/�
/�F�
����������
�L�L�9�6�B�B�B�	���&�"]�"d�"d�ek�"l�"l��n�n�n�n�nr7c�H�td��}d�|��}d�|��}d}|dkr�t���rt	t����}t
ttj�	������dkrVtj�	��D]6}|�
d|��t�||���d	}�7n�d	}n�tj�|��s=tj�
��rTtj�|���5|�
d
|��t�||���d	}n!tj�|��sd	}|r!trt!t"dg��dSdStrt!t$d|g��dSt'd
�|����dS)Nr�z/Can't remove lve {} from kernel - error code -3z1Can`t destroy lve with id {}; error code {{code}}Fr@rz*lve_destroy all: destroying LVE with id %sr�Tz&lve_destroy: destroying LVE with id %s�OK�WARNzwarning: {})rrr2r3�boolr�r�r�r4�lve_id_listr/r��check_inside_list�resellers_supported�detect_inside_lvprOrP�
SINGLE_FORMATr^rR)r�r��cant_remove_msg�cant_destroy_msg�	destroyed�id_s      r8r�r��s��
"�;�
/�
/�F�H�O�O�PV�W�W�O�J�Q�Q�RX�Y�Y���I�
�����'�'�)�)�	0��_�.�.�/�/�I��t�C�H�(�(�*�*�+�+�,�,�q�0�0��x�+�+�-�-�
!�
!�����I�3�O�O�O�����-=��>�>�>� �	�	�
!�
�I�I��8�%�%�f�-�-�	���-�-�/�/�	�47�H�4N�4N�v�4V�4V�4b��L�L�A�6�J�J�J��O�O�F�,<�O�=�=�=��I�I���+�+�F�3�3�	��I��9��	/��
��v�.�.�.�.�.�	/�	/��	9���v��&?�@�@�@�@�@��-�&�&��7�7�8�8�8�8�8r7c	��|r.tj�|��st|��t	j��5t	jd��	ttd��t_
ttd��t_ttd��t_ttd��t_
ttd��t_tdkrHttd��t_ttd	��t_td
kr$ttd��t_|rr|dkr6t&�|td
�|�����n�t&�|td�|�����n]|dkr"t&�td���n5t&�|td�|�����nJ#t0$r=}t3ddt5|��zdzt5|��z��Yd}~nd}~wwxYwddd��dS#1swxYwYdS)Nr�rfrdrerhrgrUrirjr{rkrz'Can`t setup default settings for LVP {}r�z/Can`t setup lvp with id {}; error code {{code}}zCan`t setup default settingsz/Can`t setup lve with id {}; error code {{code}}rLzCan`t setup lve z. RuntimeWarning excepted: )r2r4�	exist_lvpr��warnings�catch_warnings�filterwarningsr�rgr�r�r�r��	ls_memoryr�r�r�r�r�r��lve_set_defaultr�
lve_lvp_setupr��RuntimeWarningrXrQ)r�r1�rws   r8r�r��s���
��c�h�(�(��0�0���6����	�	 �	"�	"�p�p����(�(�(�	p�!$�Z��%5�!6�!6�L��"%�j��&7�"8�"8�L��#&�z�&�'9�#:�#:�L� �%(��E�):�%;�%;�L�"�%(��D�)9�%:�%:�L�"��Q���-0��F�1C�-D�-D��*�(+�J�w�,?�(@�(@��%��Q���'*�:�f�+=�'>�'>��$��
t��Q�;�;��)�)���6_�6f�6f�gm�6n�6n�*�p�p�p�p��'�'���6g�6n�6n�ou�6v�6v�(�x�x�x�x��1����%�%�l�<Z�%�[�[�[�[�����L�2c�2j�2j�kq�2r�2r� �t�t�t����	p�	p�	p�!�!�$6��V���$D�Gd�$d�gj�km�gn�gn�$n�o�o�o�o�o�o�o�o�����	p����7p�p�p�p�p�p�p�p�p�p�p�p����p�p�p�p�p�ps=�J9�HI"�!J9�"
J)�,3J$�J9�$J)�)J9�9J=�J=c��d}d}t}td��t}|at|t��rL	||d}|sd}n#t$rd}YnwxYw	||d}|sd}n#t$rd}YnwxYw||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
    N�
list-usersrmrI)�packages_users�GetControlPanelUsersr�dict�KeyError)r�rIrm�old_packages_users�temp_packages     r8�"get_package_and_reseller_by_lve_idr��s����G��H�'����&�&�&�"�L�'�N��,��%�%��	�#�F�+�J�7�H��
 ������	�	�	��H�H�H�	����	�"�6�*�9�5�G��
������	�	�	��G�G�G�	�����H��s#�A
�
A�A� A3�3B�Bz+/var/run/cloudlinux/effective-normal-limitsz;/opt/cloudlinux/flags/enabled-flags.d/burstable-limits.flagc�t�tj�t��sdS	tj�t
��}tj�|��s2tj�|��}t|ddd|��n(#t$r}td|�d|�����d}~wwxYwtt
�d���}|5|ri}n�	tj�t
��rDtt
dd�	��5}tj|��}ddd��n#1swxYwYni}nZ#tj$r }td
t
�d|�����d}~wt$r }tdt
�d|�����d}~wwxYw|�t"��	t%tj|��t
d��n1#t$r$}tdt
�d|����Yd}~nd}~wwxYwddd��dS#1swxYwYdS)
ai
    Save calculated effective normal limits for an LVE to a cache file.

    The cache file is stored in /var/run (tmpfs) for faster operations.
    It disappears on reboot, but lvectl apply all runs in the lvectl systemd service anyway,
    so the file will always reappear if the service functions normally.

    If additional speed is desired, consider replacing the standard JSON lib
    with a faster one like rapidjson or orjson.

    :param reset: If True, recreate the cache file from scratch with data available in the dict,
    instead of updating it, defaults to False
    :type reset: bool, optional
    Ni�rz#Error: failed to create the folder z: z.lockr��utf8)�encodingz=Error: failed to parse the effective normal limit cache file z<Error: failed to read the effective normal limit cache file z<Error: failed to save the effective normal limit cache file )r�r��exists�BURSTABLE_LIMITS_FLAG_FILE�dirname�EFFECTIVE_CACHE_FILE�isdirr)r�rRrr�r�r��load�JSONDecodeErrorr�CACHED_EFFECTIVE_LIMITSr(r)�reset�
effective_dir�var_run_dirrI�effective_cache_lock�effective_limits�readfiles       r8�write_effective_cacher��s��0�7�>�>�4�5�5���������(<�=�=�
��w�}�}�]�+�+�	G��'�/�/�-�8�8�K��m�U�A�q�+�F�F�F�������
�H�M�H�H�Q�H�H�I�I�I�
���������(�+?�(F�(F�(F�G�G��	�n�n��	�!���
��7�>�>�"6�7�7�*��2�C�&�I�I�I�?�X�+/�9�X�+>�+>�(�?�?�?�?�?�?�?�?�?�?�?����?�?�?�?��(*�$����'�
�
�
��q�Vj�q�q�no�q�q�r�r�r�������
�
�
��p�Ui�p�p�mn�p�p�q�q�q������
����	��� 7�8�8�8�	n�#�D�J�/?�$@�$@�BV�X]�^�^�^�^���	n�	n�	n��l�Qe�l�l�ij�l�l�m�m�m�m�m�m�m�m�����	n����)n�n�n�n�n�n�n�n�n�n�n�n����n�n�n�n�n�ns��A5B�
C�(B>�>C�H-�&;E�!E�6E�E	�E�	E	�
E�H-�F(� E;�;
F(�F#�#F(�(H-�(G/�.H-�/
H�9H�H-�H�H-�-H1�4H1c�>�ttt|��<dS)a�
    Cache the calculated effective normal limits for an LVE to a dictionary.

    setup_data is a global dict that contains the LVE configuration last applied.
    Holds only one entry - during operations like lvectl apply all, we enter this
    function repeatedly with setup_data containing info for one processed LVE each time.

    These limits can be used by the Burstable Limits components
    to set/reset burst or normal limits without having to go
    through effective limit calculation or invoking lvectl as a middleman.
    Comparing the cached limits to current active limits (in kernel)
    also shows whether or not the LVE has burst limits active at the moment.

    This function gets called in lve_apply, which means it also runs within:
    * lvectl apply all
    * lvectl apply-many
    * lvectl set
    * and others, that also call lve_apply

    :param lve_id: LVE ID for which the limits are being saved.
    :type lve_id: int
    N)rgr�rQ�r�s r8�cache_effective_limitsr�;s��0,6��C��K�K�(�(�(r7c�H��t}�dkrtd���t|c}atdkrt|���d}|�|}n1|rtnt
}	t
t�fd�|	��d��}|dkrR	|�d}n#ttf$rd}YnwxYw	|�d}n#ttf$rd}YnwxYw|���t||�	��td
|tt��}
	tt|dd�
��|
���td<n#t t"t$f$rYnwxYwtd�tdtd<td|tt��t&dkrtd|tt��n
dtd<	t)t|dd�
����td<n#t t"t$f$rYnwxYwtd|tt��td|tt��td|tt��n't||����t&dkr
dtd<|s"t+���t-�|���dSdS)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�useridrn�r1Nc�,��t|����kS)N�r��r)rr�s �r8rvzlve_apply.<locals>.<lambda>ys��� 3�4� H� H� H�F� R�r7rIrm�rmrerdr
rer�rfr4rhrSrTrgrjrirk)rmr�ro)r�r�rrcrBrA�next�filter�	NameErrorr�r�rhrrgr�r*r�r
r�r7r�r�r�)r�rur_rm�out_noder1r��new_packages_usersrf�	node_listr�s`          r8�	lve_applyrXs����$(��
��{�{��X�v�.�.�.�-;�=O�*��N�
��|�|��6�"�"�"�"�	
�B���
���$�0�F�F�&�	�
��R�R�R�R�T]�^�^��
�
����{�{�	�(��0��;�G�G���8�$�	�	�	��G�G�G�	����	�)�&�1�*�=�H�H���8�$�	�	�	��H�H�H�	����
�~��7�X�6�6�6�6��F�B��Z�@�@��	� 8�9K�B�TY�`g�9h�9h�9h�pu� v� v� v�J�u�����J�	�2�	�	�	��D�	�����e��$� +�E� 2�J�u���D�"�k�:�6�6�6��&�=�=���r�;�
�;�;�;�;� !�J�u��	�"�#5�b�g�O�#\�#\�#\�]�]�J�t�����J�	�2�	�	�	��D�	����	�G�R��j�9�9�9��F�B��Z�8�8�8��F�B��Z�8�8�8�8�	�7�X�f�E�E�E�E��'�>�>� !�J�u���)��v�&�&�&��&��(�(�(�(�(�(�)�)sH�B�B(�'B(�,B;�;C�C�)D/�/E	�E	�='G%�%G?�>G?c�$�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)rR)�strings r8�_print_string_safer�s��"
�&�M�M�M�M�Mr7c��td�d�|dd�D��d|dzgz����dS)zz
    Command to print data with only last column 30 symbols wide
    Useful to print data that contains package name.
    rnc��g|]}d|z��S�z%8sr6�rBr�s  r8rz_pprint.<locals>.<listcomp>����?�?�?�a���	�?�?�?r7Nr��%30s�r�join�r�s r8�_pprintr�sM��
�r�w�w�?�?�6�#�2�#�;�?�?�?�6�F�SU�J�CV�BW�W�X�X�Y�Y�Y�Y�Yr7c	��td�d�|dd�D��d|dzd|dzgz����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.
    rnc��g|]}d|z��Srr6r	s  r8rz_pprint_f.<locals>.<listcomp>�r
r7N���rr�rrs r8�	_pprint_fr�s\��
�r�w�w�?�?�6�#�2�#�;�?�?�?�6�F�SU�J�CV�X^�ag�hj�ak�Xk�Bl�l�m�m�n�n�n�n�nr7c	��td�d|dzgd�|dd�D��z����dS)ze
    Command to print data with first column 30 symbols wide.
    Useful to print packages data.
    rnrrc��g|]}d|z��Srr6r	s  r8rz_pprint_p.<locals>.<listcomp>�s��6U�6U�6U�Q�u�q�y�6U�6U�6Ur7rLNrrs r8�	_pprint_pr�sO��
�r�w�w����� 2�3�6U�6U�&�QR�QS�QS�*�6U�6U�6U�U�V�V�W�W�W�W�Wr7c	��td�d|dzgd�|dd�D��zd|dzgz����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.
    rnrrc��g|]}d|z��Srr6r	s  r8rz_pprint_r.<locals>.<listcomp>�s��6W�6W�6W�Q�u�q�y�6W�6W�6Wr7rLr�Nrrs r8�	_pprint_rr�sd��
�r�w�w����� 2�3�6W�6W�&�QR�SU�QU�,�6W�6W�6W�W�[a�dj�km�dn�[n�Zo�o�p�p�q�q�q�q�qr7c� �t|��}t|��ttfvr|�d��rdnd}|�dd��}|rt|��}|dz}nd}|rd�|��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�TFrnirz*{})rQ�typer�
startswithr�r�r)r_�was_changeds  r8�_pmem_vmem_to_bytes_valuer�s���
��J�J�E��u�+�+�#�w��7�7�E�<L�<L�S�<Q�<Q�7�$�$�W\�K��M�M�#�r�"�"�E����E�
�
��
��
�����#.�9�E�L�L�����E�E��Lr7c�B�d}d}t|t��r!|�d��r|dd�}d}	t|��}n#t$rYdSwxYw|rd}|dzdz}|d	krd
�||��}nd�||dz��}|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"
    rnFr�rLNTrmrcrz{}{}Mz{}{}K)rrrr�r�r)r_r_r�vs    r8�_mb_memr!�s����F��K��%��$�$���)9�)9�#�)>�)>���a�b�b�	�������J�J���������r�r���������
��E�T�M�E��q�y�y������.�.��������A��.�.���Ms�A�
A�A�0rc�,�
��t����
�
ddz�
d<�
fd�}|d��dkrt|d����nd}d�}|t|d����t|��t|d����t||d������t||d������t|d	����t|d
����t|d����t|d����|d
��g}t	��}|�||z
}t
r(d��fd�|D����}	d|	zg}n||�|�fd�|D���|S)z^
    Generate header and default package data either as print to stdout or as json string
    rdrlc�0����|d��S)Nrn�r�)r^r5s �r8rvz_formatter.<locals>.<lambda>s���8�<�<��R�0�0�r7rnc�L�trt|��nt|��SrA�rtrr!�r_s r8rvz_formatter.<locals>.<lambda> s&���(*�'@��'G�'G�'G�"�5�>�>�r7rerirhrgrjrfrk)r~rr��NCPUr�r�r�r�r�r��PACKAGEN�,c3�R�K�|]!}d|�d��|d���d�V��"dS)r��":"rnNr%�rBr��
fields_maps  �r8rEz_formatter.<locals>.<genexpr>.sB�����Q�Q�Q�Q�q�q�q�*�.�.��B�*?�*?�*?�*?�@�Q�Q�Q�Q�Q�Qr7�{%s}c�<��g|]}��|d����S�rnr%r.s  �r8rz_formatter.<locals>.<listcomp>2s'���8�8�8�A�*�.�.��B�'�'�8�8�8r7)rryr�rQr�rOr
)�printer�
default_id�default_package�more_fields�get_data�_cpu�convert_mem_limits�resr�r�r5r/s          @@r8�
_formatterr;s��������!�!�H��u�o��,�H�U�O�0�0�0�0�H�08�����2�0E�0E��H�H�U�O�O�,�,�,�2�D�*�*���3�x�x����#7�#7��4�y�y�#�h�h�v�&6�&6�"7�"7��&�&�x�x��'7�'7�8�8�9�9�3�GY�GY�Zb�Zb�ch�Zi�Zi�Gj�Gj�Ck�Ck��(�(�4�.�.�!�!�C����0A�0A�,B�,B�#�h�h�W[�n�n�J]�J]��H�H�V�$�$�%�%�/���J�
�C�
�\�\�F����+����:��x�x�Q�Q�Q�Q�&�Q�Q�Q�Q�Q����}�o����������8�8�8�8��8�8�8�9�9��Jr7c������fd�}|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
    c����d�t|d}t|d}|dkrd}tdkrt|d���n5|�t|d���nt	d�	��t||���tjt���t|||d
����fd�}d
�}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<trt|���d<n|�d<|�trdnd�d<n|�d<d�dvr?dtt�d�d����dz��z�d<nt�d��dz�d<�d�d<tt�d�����d<g}tr(d��fd��D����}d|zg}n�	�fd��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
        rnrIrmNrLr�F)rnrjT)rurmr_c����t�|��tt|��krdtt|��znt�|��S)Nr�)rQrg)r^r�s �r8rvz2_user_formatter.<locals>.wrapper.<locals>.<lambda>]sO����4��9�~�~��Z��_�!5�!5�5�5�%(��J�s�O�(<�(<�$<�$<�;>�t�C�y�>�>�r7c�L�trt|��nt|��SrAr'r(s r8rvz2_user_formatter.<locals>.wrapper.<locals>.<lambda>_�&���,.�+D�U�+K�+K�+K�&�u�~�~�r7r�rdrerirh�vmemrgrfrjrk�N/Ar�rlr�r+c3�Z�K�|]%}d|�d�|����d�V��&dS)r�r-N��lower�rBr�r�s  �r8rEz3_user_formatter.<locals>.wrapper.<locals>.<genexpr>|s>�����O�O�1�1�1�1�1�d�1�7�7�9�9�o�o�o�>�O�O�O�O�O�Or7r0c�D��g|]}�|�����Sr6rDrFs  �r8rz4_user_formatter.<locals>.wrapper.<locals>.<listcomp>s%���6�6�6�!�d�1�7�7�9�9�o�6�6�6r7)r�rFr�rprcryrgrrQrO�_normalize_strr�r�r�r
)
r�rIrm�
check_changedr9r:r�r�r�r3s
       @��r8�wrapperz _user_formatter.<locals>.wrapper?s&������ ��&�y�1��!�$�'�
�3���r�>�>��H��Q���
�w��6�6�6�6�6��#�)��E�R�R�R�R�R���7�7�7�7��w��:�:�:�:��y��$�$���$��(�4�H�H�H�H�J�J�J�J�
�.�.����Y�Y��T�
��-�-��.�.�/�/��U���=�=��0�0�1�1��V���-�-�m�m�F�.C�.C�D�D�E�E��V���-�-�m�m�E�.B�.B�C�C�D�D��V�����t�,�,�-�-��T�
����t�,�,�-�-��T�
��M�M�'�2�2�3�3��W�
��=�=��0�0�1�1��V���	&�,�W�5�5�D��O�O�%�D��O���(,�4�u�u�"�D����'�D����$�u�+����#�c�$�u�+�*<�*<�S�*A�*A�&B�&B�c�&I�"J�"J�J�D��K�K��d�5�k�*�*�c�1�D��K��U���W�
��*�4��=�9�9�:�:��U�����	8��8�8�O�O�O�O��O�O�O�O�O�D��D�=�/�C�C��G�6�6�6�6�v�6�6�6�7�7��
r7r6)r�r3rJs`` r8�_user_formatterrK6s0����A�A�A�A�A�A�D�Nr7c���t��	td��|�|rtd|��n#|�td|���ntd��n#YnxYwdg}tt|���}t	��|z}t|��}tD]}|||��z
}�tr*tdd�	|��zd	z��dSdS)
Nr�r��list-reseller-usersr�r*�r6�	{"data":[r+�]})
rcr�r;rr�rKr�rOrRr
)r�rmr6r_r��	formatterr�s       r8�paneluserslimitsrR�s���M�M�M�
��\�*�*�*���&�� ��6�2�2�2�2�
�
!� �!6��J�J�J�J�J� ��.�.�.���
�������+�K�
��[�
9�
9�
9�F�
�\�\�K�
'�F���'�'�I��"�"���)�)�D�/�/�!����5�
�k�C�H�H�V�,�,�,�t�3�4�4�4�4�4�5�5s�AA�Ac��td��g}tt��D]6\}}|�t	|��|d|df���7|S)z@Get list of tuples[lve_id, reseller, package] from control panelr�rmrI)r�r	r�r�r�)r_�str_uid�payloads   r8�paneluserslistrV�sf����&�&�&�
�F�%�n�5�5�O�O�����
�
�s�7�|�|�W�Z�%8�'�)�:L�M�N�N�N�N��Mr7c���ddlm}i}td��tt�����||<td��|�t��|S)zBGet dict of pairs[provider, list[package_name]] from control panelr)�DEFAULT_PROVIDER�
list-packages�list-resellers-packages)�
clveconfigrXr�r�r��keysr)rX�packagess  r8�panelpackagesdictr^�sp��,�+�+�+�+�+��H���)�)�)�!%�n�&9�&9�&;�&;�!<�!<�H�
���2�3�3�3�
�O�O�N�#�#�#��Or7c�T�t��td��ttddg���}t	��ddgz}t|t���}tD]}|||��z
}�tr*tdd�	|��zdz��d	Sd	S)
z]
    Implements lvectl all-user-list command

    :return: None, prints result to stdout
    r�r*�RESELLERrN)r3rOr+rPN)
rcr�r;rr�rKr�rOrRr
)r_r�rQr�s    r8�all_users_limitsra�s����M�M�M���&�&�&�
�	�	�:�/F�
G�
G�
G�F�
�\�\�Y�
�3�
3�F���	�:�:�:�I��"�"���)�)�D�/�/�!����5�
�k�C�H�H�V�,�,�,�t�3�4�4�4�4�4�5�5r7c���tj��dkr3d�t��D����fd�t|��D��}|S)z�
    Filtering DirectAdmin's admins for `lvectl apply all` command

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

    �DirectAdminc�@�g|]}tj|��j��Sr6)r�r�r�)rBr�s  r8rz(_filtering_da_admins.<locals>.<listcomp>�s%��I�I�I��#�,�t�,�,�3�I�I�Ir7c�$��i|]\}}|�v�	||��
Sr6r6)rBr^r_�uids_da_adminss   �r8�
<dictcomp>z(_filtering_da_admins.<locals>.<dictcomp>�s*���`�`�`�*�#�u�c�Q_�F_�F_�3��F_�F_�F_r7)rM�	getCPNamerr	)�ve_dictrfs @r8�_filtering_da_adminsrj�sV�������-�/�/�I�I����I�I�I��`�`�`�`�	�'�0B�0B�`�`�`���Nr7c���
�	t��tt��}|rHtjj����
�
fd�t���D��}n#t��}YnxYw|durt}t��}n't}tj�|���}i}|D]}|dd�|t|���<�|D]}||vrddd�||<�t|��dkrjt|��}|D]X}||vrd}n||d}||}t!|��}	t|	��dkr||	dd�||<�P|dd�||<�Y|S)Nc�$��i|]\}}|�v�	||��
Sr6r6)rB�kr �cfg_lvp_id_lists   �r8rgz&prepare_apply_data.<locals>.<dictcomp>�s)���_�_�_���1�!��J^�J^�q�!�J^�J^�J^r7Tr�)rrmr�rr)r�r�r�r2rKr=�id_listr\rBr9rAr4r�rr�rj�guess_reseller_by_package)r1�packages_users_rrorirr�rD�pkg�	resellersrns          @r8�prepare_apply_datart�s����!������~�.�.���	`�!�g�.�6�6�8�8�O�_�_�_�_��0D�0D�0F�0F�_�_�_�O���!��&�&�������
��~�~��	��*�*����	��(�&�&�f�&�5�5���G��_�_��FJ�Y]�<^�<^��#�4�8�8�8�9�9��?�?���� � �'+��>�>�G�F�O���O����!�!�'�w�/�/��"�	B�	B�C��'�!�!�����s�|�F�+��!�#�&�C�1�#�6�6�I��9�~�~��!�!�)-�I�a�L�I�I�����)-�D�A�A������Ns�A,A0�0Bc�0�t��\}}ttj�����}|���D]�}|�|d��dkr|�|���2||vr/t�|��|�|��tj	�
d���5t|||d||d���ddd��n#1swxYwY��td���t����r�td��}ttj�����}|���D�]E}||vr/t�|��|�|��t#||��tj�|��}tj���}t(j�|��D]�}	t/j|	��j}||vr/t�|��|�|��|�|d��|kr)tj	�||d|�d	|�d
����t||�������G|D]}t�|���|D]}t�|���dS)
NrT�r�rrm�r�rmr��Can`t move lve_id=� to lvp_id=�; error code {code}r��r�rm)�_get_lve_ve_dict_and_lvp_map�setr2r4r�r\r��discardr�r0�context_ignore_errorrr3rtr5r�r��&_create_if_necessary_and_configure_lvprK�get_reseller_namer��cpapirr�r�r��lve_lvp_move)
�lve_ve_dict�lve_lvp_map�remaning_alive_lvesr��lvp_ve_dict�remaining_alive_lvpsr1rG�kernel_mappingr�s
          r8�lve_destroy_and_recreate_allr�sX��;�=�=��K���c�h�2�2�4�4�5�5���"�"�$�$�����?�?�6�1�%�%��*�*��'�'��/�/�/���(�(�(��O�O�F�#�#�#��'�'��/�/�/�
�V�
(�
(�d�
(�
;�
;�	�	���$�V�,�V�4�$�V�,�Z�8�
�
�
�
�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	���Q�����
�#�#�%�%�*�(��.�.��"�3�8�#7�#7�#9�#9�:�:��"�&�&�(�(�	A�	A�F��-�-�-��%�%�f�-�-�-�$�,�,�V�4�4�4�2�;��G�G�G� �G�5�5�f�=�=�M� �X�\�\�^�^�N� ��5�5�m�D�D�
A�
A����d�+�+�2���0�0�0��O�O�F�+�+�+�'�/�/��7�7�7�!�%�%�f�a�0�0�F�:�:��F�'�'��� e�V� e� e�� e� e� e�(����
��-�@�@�@�@�@�
A�+�	*�	*�F��!�!�&�)�)�)�)�&� � ���������� � s�+D
�
D	�D	c��t��\}}tj�d���5|���D]F}|�|d��dkr*t
|||d||d����G	ddd��n#1swxYwYt
d���t���sdStd��}tj	�
��}|���D]�}t||��tj
�|��}tj�|��D]o}t!j|��j}|�|d��|kr)tj�||d|�d	|�d
����t
||����p��dS)
NTrvrrrmrwr�rxryrzr�r{)r|r2r0rr\r�rr3rtr4rKr�r�r�r�rr�r�r�r�)rir�r�r��lvp_id_rGr��lve_id_s        r8�
lve_apply_allr�Ss)��7�9�9��G�[�	��	$�	$�$�	$�	7�	7�j�j��l�l�n�n�	j�	j�F����v�q�)�)�Q�.�.��&�7�6�?�6�+B�W�U[�_�]g�Mh�i�i�i�i��	j�j�j�j�j�j�j�j�j�j�j�j����j�j�j�j�
�Q������'�'�)�)���� ��&�&�G��X�\�\�^�^�N��<�<�>�>�>�>��.�w��@�@�@���1�1�'�:�:�
��N�1�1�-�@�@�		>�		>�D��l�4�(�(�/�G��!�!�'�1�-�-��8�8���#�#���c��c�c�W�c�c�c�$����

�W�}�=�=�=�=�=�		>�>�>s�AB�B�"B�returnc���t��td��t��}t���r&tt�����ni}||fS)Nr�)rcr�rtr2r3r��lve_id_lvp_id_pairs)r�r�s  r8r|r|us_���M�M�M���&�&�&�$�&�&�K�58�5Q�5Q�5S�5S�[�$�s�.�.�0�0�1�1�1�Y[�K���#�#r7c���t|dd���t|||d||d|���t|d���td|�	��dS)
NTF)r1r2rbrrm)r�r�rmr1)r1rbr�r�r1)rcr)rir1s  r8r�r�}s{���v�D�u�M�M�M�M�
�V��v��v�.��v��z�2������
�v�E�:�:�:�:�
�Q�v�&�&�&�&�&�&r7c���td��t|���tD�]F}t|���|k�r.tj�|��}|dd�D]�}t�d|��	tj
|���3#t$rQtj�
|��rt�|��|�|��Y��wxYwt!|��|j�|��t't(��td���|D]}t+|���t|���dS��HdS)z,Remove reseller from ve.cfg and from procfs.Tr�r�NrF)rZrcrBrr2r4�map_lve_id_listr�r�r�r|r�r0�
lve_existsr��remover��
parentNode�removeChildrrr)r1rf�usersr�s    r8�_remove_resellerr��s����D�����v����������b�1�1�1�V�;�;��H�,�,�V�4�4�E�����(�
)�
)���"�"�1�f�-�-�-�)��L��(�(�(�(���)�)�)��v�(�(��0�0�0�����/�/�/��L�L��(�(�(�(�(�)����
������M�%�%�b�)�)�)��V�����q�!�!�!�!��
"�
"���&�!�!�!�!��v�&�&�&�&��4�4�)<�*�5s�B�AC6�5C6c���t|��rtj|���dStr+t	ddd|zg��tjd��dStd|z��dS)z&Disable reseller limits and call hooksr�r+r6z!no configuration found for LVP %sr�z*warning: no configuration found for LVP %sN)r�r�throw_eventrOrPrSrTrR)rGr1s  r8�disable_reseller_limitsr��s}������I�%�1�=�I�I�I�I�I�I��	I���)�-P�SY�-Y�!Z�[�[�[��H�R�L�L�L�L�L��>��G�H�H�H�H�Hr7c���td��t��d}tD]�}t|���|krkd}t	|��t|��|j�|��tt��t��t|����|sFtr+tddd|zg��tjd��dStd|z��dSdS)	NTFr�r+r6z no configuration found for VE %sr�z)warning: no configuration found for VE %s)rZrcrArr�r�r�r�rrrrOrPrSrTrR)r��Deletedrfs   r8�
lve_deleter��s���D�����M�M�M��G������b�1�1�1�V�;�;��G�������v�����M�%�%�b�)�)�)��V�����M�M�M��f������J��	J����+M�QW�+X� Y�Z�Z�Z��H�R�L�L�L�L�L��=��H�I�I�I�I�I�J�Jr7c���tj�d��s?trt	dddg��ntd��t
jd��dSdS)N�/proc/lve/enterr+r6zenter by name not supportedz$warning: enter by name not supportedr�)r�r�r�rOrPrRrSrTr6r7r8�lve_enter_checkr��sd��
�7�>�>�+�,�,���	:���)�-J�!K�L�L�L�L��8�9�9�9����������r7c���t��	||���z}tdd��}|�|��|���dS#YdSxYw)Nr��w)r�r�r�rY�close)�signrJrr�s    r8�enter_applyr��se������
��6�<�<�>�>�!���"�C�(�(��	�������	���	�	�	�	�	��
������s�AA"�"A'c�N�t��trTd}d}tD]2}|�d��}|r|d|zdzz
}d}�'|d|zdzz
}�3|dz
}t	|��dSt	d��tD]$}t	|�d�����%dS)	NrOTr�r�Fz,"rP�Binaries)rcrOrDr�rR)r_�firstrfr�s    r8�
list_binariesr��s����M�M�M��+������	,�	,�B��?�?�6�*�*�D��
,��#��*�s�*�*������$��+��+�+����$���
�f�
�
�
�
�
�
�j�����	+�	+�B��"�/�/�&�)�)�*�*�*�*�	+�	+r7c�|�t��tD]%}td|�d�����&dS)N�+r�)rcrDr�r�)rfs r8�
load_binariesr��sC���M�M�M��2�2���C�����0�0�1�1�1�1�2�2r7c���t��tdd��}|���}|���|D]}t	d|���t��dS)Nr�r��-)r�r�r�r�r�r�)r��lines�ls   r8�reload_binariesr��sg�������
��$�$�A�
�K�K�M�M�E��G�G�I�I�I�
�����C�������O�O�O�O�Or7c���td��t��t��d}tD]i}|�d��|krNd}td|��|j�|��tt��t���j|sEtrtddd|zg��ntd|z��tjd	��dSdS)
NTFr�r�r+r6zno configuration found for %sz&warning: no configuration found for %sr�)rZr�rcrDr�r�r�r�rrrOrPrRrSrT)rJ�deletedrfs   r8�
del_binaryr�s����D���������M�M�M��G�����
�?�?�6�"�"�f�,�,��G���V�$�$�$��M�%�%�b�)�)�)��V�����M�M�M�����	G���)�-L�PV�-W�!X�Y�Y�Y�Y��:�f�E�F�F�F����������r7c��td��t��tD]}|�d��|krdS�t	d|��t
�d��}|�d|��t�	|��tt
��t��dS)NTr�r�rJ)rZrcrDr�r�rrrrErr)rJrf�bin_xmls   r8�
set_binaryr�s����D�����M�M�M�����
�?�?�6�"�"�f�,�,��F�F�-���V�����"�"�8�,�,�G������(�(�(�� � ��)�)�)��V�����M�M�M�M�Mr7c�R���	|rt}n|rt}nt}��fd�|D��d}n#t$rYdSwxYw|rR�dD]G}|dkrt	|dd��}nt	||d��}|r|j�|���HdStt���dz
}|D]�}	|	dkr\t|�
d����dkr6|	�vr1|�
d��d�d���|	<�dt|�
|	����dkr5|	�vr1|�
|	��d�d���|	<��|rt�d	��dSt�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
    c�,��g|]}�|����|��Sr6r6)rBrI�	is_needed�set_datas  ��r8rz#lve_set_default.<locals>.<listcomp>6s*���
8�
8�
8�A���1�h�!7�!7�
8�a�
8�
8�
8r7rN�set-defaultrgrSrTr
�ve_id)rCrBrAr
r'r�r�r}�LIMITS_LIST_NAMEr�rr��plan_deleter�)
r��package_flagr�r1r�rf�tag_�n�to_keepr
s
` `       r8r�r�&s�����	��	��D�D�
�	��D�D��D�
8�
8�
8�
8�
8��
8�
8�
8��
;���������������
�	��]�+�	,�	,�D��t�|�|�$�R��/�B�B���$�R��w�7�7���
,���(�(��+�+�+�����"�#�#�h�}�&=�=�G��Z�Z���D�=�=�S��!8�!8��!A�!A�B�B�Q�F�F��H�$�$�"$�"9�"9�'�"B�"B�1�"E�"R�"R�Sb�"c�"c�����
��(�(��/�/�
0�
0�1�
4�
4��H�$�$�"$�"9�"9�%�"@�"@��"C�"P�"P�QX�"Y�"Y������&��H�W�%�&�&�&�&�&��8�G�$�%�%�%�%�%s�05�
A�Ac�|�|dvrdSt|��}|dvrdS	t|��}n	#g}YnxYw||vrdSdS)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�rBF)rr)rDrG�username�reseller_users_lists    r8�_check_reseller_user_pairr�Tst����&�&��t�(��,�,�H��?�"�"��u�!�,�]�;�;����!� ��������&�&�&��t��5s�-�3c
��|dkr0|�dd��}|d}t||��sdStd��|rN||dkrBtj�|��rt
|d���ntt
|���nc|dkrMt���r4t
tj�|d�����nt
|���	t��n#YnxYw	t|d}t|��}|r|dnd}t||�	��n#taYnxYw|ddk�r�d}d
�}d|vrt|d||���d
|vrt!|d
��}	n
td
}	d}
d|vr*t#|d|	���}|tdkrd}
|rt$}nt&}|D�]<}
||
|���r,t(D�]+}||v�r#	|dkrt+|
dd||��nt+|
|d||���A#t,t.t0f$r�|dkr|
}nt|||k}|s|dr�|dkrDt2�d��}|�dt9||����nCt2�|��}|�dt9||����|
�|��Y��'wxYw��-|�dd��st=t2��d}|rN||dkrBtj�|��rt
|d���ntt
|���nc|dkrMt���r4t
tj�|d�����nt
|���t?|d|�����<��>|�s�|d�r�|rt@nd}t2�|��}
|rZ|
�dt9|����|
�d|d��|
�tB��nr|�d��r4|
�dtEj#|d��j$��n)|
�dt9|d����t(D]�}||vr�|dkr|
}nt|||k}|s|dr�|dkrDt2�d��}|�dt9||����nCt2�|��}|�dt9||����|
�|����d}tJD]}|j&�'|
|��d}|st2j(�|
��|�dd��st=t2��|�rtj�|��}t
|d���t?|d|���tR�|tR�*d����t
|���tj+�,|��}tj+�-|���D]3}tj.�/||��t?||�	���4|rtaj1|�	���ngt���r4t
tj�|d�����nt
|���t?|d��n�t(D]�}||vr�|dkrHtB�2d��d�dt9||�����TtB�2|��d�dt9||������|�dd��st=t2��t
|���t?|d|���dS)NrrGr�FT)r1r2r�rnr�c�6�t|���|dkS)Nr�r�r��rfr�s  r8rvzlve_set.<locals>.<lambda>�s��.A�QS�.T�.T�.T�X`�ah�Xi�.i�r7r�)r�r�r1rerdr�rgrSrTr
�savezskip-update-cfgr2r�r�z
save-username)3r�r�rZr2r4r�rcr3r�r�r�rpr�rrgr�r�r�rBrAr�r-r�r
r�rrrrQrrrr$rr�r|r}rCr��insertBefore�	lastChildr��lve_inforKr��lvp_lve_id_listr0r�rr�r)r�r1rGr�rIrsrm�has_ve�is_needed_userr��cpu_is_different�
setted_cpu�el_listrfr^�is_differentr�el_name�added�el2�enables_reseller_limitsr�s                      r8�lve_setr�ws&	����{�{� ���_�d�;�;�
��'�"��(���?�?�	��5��D����
�
#�&�H�W�-�-�-��8���f�%�%�	'��v�D�9�9�9�9�9�
�v�&�&�&�&�&�	�1����5�5�7�7���3�8�5�5�h�w�6G�H�H�I�I�I�I�I�	�6�"�"�"�"�
�������
������!�!��'�!2�3��-�g�6�6�	�#,�4�9�Q�<�<�"���7�X�6�6�6�6�6��!� �
�
�
�������A�����i�i���H�$�$��H�5�N�[a�b�b�b�b��X������(�)�)�E�E���'�E� ���H���1�(�5�/�5�Q�Q�Q�J��Z��.�.�.�#(� ��	��G�G��G��-	�-	�B��~�b�(�+�+�,
�+�5�5�C��h���5�"�d�{�{� 2�2�w��QY�Z]�Q^� _� _� _� _� 2�2�s�G�X�c�]� S� S� S��� *�J�	�B�5�5�5�"�e�|�|�/?���0:�#��(�3�-�/O��+�5�x��/?�5�#&�$�;�;�+1�+?�+?��+H�+H�D�$(�$5�$5�o�c�(�SV�-�FX�FX�$Y�$Y�$Y�$Y�+1�+?�+?��+D�+D�D�$(�$5�$5�g�c�(�3�-�>P�>P�$Q�$Q�$Q� "���t� 4� 4� 4���5����
'�, �|�|�$5�u�=�=�%��V�$�$�$����
/�f���(9�9�9��x�)�)�&�1�1�3�#�6��E�E�E�E�E�$�6�2�2�2�2�2��q�[�[�S�%A�%A�%C�%C�[��s�x�'A�'A�(�7�BS�'T�'T�U�U�U�U�U� �v�.�.�.�.��(�7�+�F�;�;�;�;�;���?	-�(�7�+�?	-�*0�;�&�&�e�G��%�%�g�.�.�B��	
B�����c�&�k�k�2�2�2�������(8�9�9�9����z�*�*�*�*��<�<��0�0�B��O�O�F�C�L��'�9J�,K�,K�,S�T�T�T�T��O�O�D�#�h�w�.?�*@�*@�A�A�A�'�
-�
-���(�?�?��e�|�|�'7���(2�#��(�3�-�'G��#�-�x��'7�-��$�;�;�#)�#7�#7��#@�#@�D� �-�-�o�c�(�3�-�>P�>P�Q�Q�Q�Q�#)�#7�#7��#<�#<�D� �-�-�g�c�(�3�-�6H�6H�I�I�I����t�,�,�,���E�!�
�
����+�+�B�s�3�3�3�����
1�� �,�,�R�0�0�0��<�<� 1�5�9�9�
!��� � � ��
-�.1�h�.@�.@��.H�.H�*H�'��6��=�=�=�=��(�7�+�F�;�;�;�;��%�%�f�e�n�n�Q�.?�.?�@�@�@��6�*�*�*�*� #�� 9� 9�&� A� A�
�"�w�6�6�f�6�E�E�?�?�G��F�'�'���8�8�8��g�
�>�>�>�>�>�*�U�0�<�m�T�T�T�T���/�/�1�1�/��s�x�'A�'A�(�7�BS�'T�'T�U�U�U�U�U��v�.�.�.�.��(�7�+�,�,�,��#�	e�	e�C��h����$�;�;��3�3�G�<�<�Q�?�L�L�_�]`�ai�jm�an�]o�]o�p�p�p�p��3�3�C�8�8��;�H�H��QT�U]�^a�Ub�Qc�Qc�d�d�d���|�|�-�u�5�5�	��V�����6�"�"�"�"��(�7�#�F�3�3�3�3��4s+�:D	�	D
�?E�	E�7I
�
C#L1�0L1c�8�td��t��t|d��}t|��dkrd}nt|��dkr|d}|�#tdkr||d<t|d���dSt|d���dS)	zX
    Set package with some heuristic algorithm to simulate old package set behavior
    Tr�rNrLrG��is_resellerF)rZrcrpr�rF�package_set_ext)r�r��
reseller_listrms    r8�package_setr�4s����D�����M�M�M�.�h�w�.?�@�@�M�
�=���Q������	�]�	�	�q�	 �	 � ��#������ 2� 2�$,���!���d�3�3�3�3�3�3���e�4�4�4�4�4�4r7c
�r�td��t��d}|rd�}nd�}d|vrt|d|���tD�]�}|||���r�tD�]U}||v�rM	|dkrC|�d��d	�d
t||����nB|�|��d	�dt||������#tttf$r�|dkrDt�d��}|�d
t||����nCt�|��}|�dt||����|�
|��Y��QwxYw��Wtj��rRt!|�dd
��|d��}|�t$t|����d}���|�s~d
}t�d��}|�d|d��|r$|�d|d��|d}tj��r>t!||d��}|�t$t|����tD]�}||vr�|dkrDt�d��}|�d
t||����nCt�|��}|�dt||����|�
|����tj�
|��t)t��t��t+|��d|vrt-|d��}	n
t.d}	d|vrt1|d|	���|d<|r|dnd}
t3|d|
���dS)NTFc�~�|�d��|dko|�d��|dkS)Nr�r�rmrGrtr�s  r8rvz!package_set_ext.<locals>.<lambda>Ss?��b�o�o�d�.C�.C�x�PW�GX�.X�/V��_�_�Z�8�8�H�_�<U�U�r7c�l�|�d��|dko|�d��S)Nr�r�rmrtr�s  r8rvz!package_set_ext.<locals>.<lambda>Vs7��b�o�o�d�.C�.C�x�PW�GX�.X�/=�!#����!<�!<�<�r7r�)r�r�rgrSrrTr
rGrnr�rIr�rmrerdr�r�)rZrcr�rCr�rrrQr�r
r�rrrrM�is_plesk�_plesk_get_package_idr��XML_PLESK_IDr�r�copy_package_settings_to_cpanelr�rr��
plan_apply)r�r��has_packager�rfr^rr.�package_resellerr�rms           r8r�r�Ms0���D�����M�M�M��K��=�V�V���=�=���� � ���t�~�N�N�N�N������>�"�h�'�'�	�'�
-�
-���(�?�?�-��$�;�;��3�3�G�<�<�Q�?�L�L�_�]`�ai�jm�an�]o�]o�p�p�p�p��3�3�C�8�8��;�H�H��QT�U]�^a�Ub�Qc�Qc�d�d�d���&�
�I�>�-�-�-��$�;�;�#)�#7�#7��#@�#@�D� �-�-�o�c�(�3�-�>P�>P�Q�Q�Q�Q�#)�#7�#7��#<�#<�D� �-�-�g�c�(�3�-�6H�6H�I�I�I����t�,�,�,�,�,�-����
#��#�%�%�
=�0����o�r�1R�1R�T\�]d�Te�f�f������c�(�m�m�<�<�<��K���)���
�
!�
!�)�
,�
,��
����h�w�/�0�0�0��	9��O�O�J���(A�B�B�B�'��8����!�!�	9�,�-=�x��?P�Q�Q�H��O�O�L�#�h�-�-�8�8�8�#�	%�	%�C��h����$�;�;�!�/�/��8�8�D��%�%�o�c�(�3�-�6H�6H�I�I�I�I�!�/�/��4�4�D��%�%�g�c�(�3�-�.@�.@�A�A�A����t�$�$�$����$�$�R�(�(�(��V�����M�M�M�#�H�-�-�-�
�����H�V�$�%�%����F�#������2�8�E�?�%�P�P�P����,7�A�x��(�(�T�H��x�� �8�4�4�4�4�4�4s�&BC2�2B9F/�.F/rmrIc����t��}|���}	tt��fd�|����}|dS#t$rYdSwxYw)z7
    Find the right package id from plesk DB query
    c�4��|d�dhvo|d�kS)Nrr�rLr6)r?rIrms ��r8rvz'_plesk_get_package_id.<locals>.<lambda>�s"���a��d�x��0�0�D�Q�q�T�W�_�r7r�N)r'�list_domain_packages_with_idr�r��
StopIteration)rmrI�panelr]�packs``   r8r�r��s�����
���E��1�1�3�3�H���F�D�D�D�D�D��
�
�����A�w��������t�t����s�(A�
A�Ac�h�t���}td��t}|a|S)z�
    Retrives resellers to packages map from panel using /usr/bin/getcontrolpaneluserspackages
    :return: Dictionary:
    { 'reseller1' -> ['pack1', 'pack2'], 'reseller2' -> ['pack'] }
    rZ)r�ryr�)�packages_users_copy�reseller_packages_maps  r8rzrz�s6��)�-�-�/�/���2�3�3�3�*��(�N� � r7c��|d}|d}t��}||vr|||vrt|d���dSdS)z�
    Set reseller package limits
    :param set_data: input data dictionary
    :return: True - limits was set succesfully
            False - supplied provider has no supplied package
    rGr�Tr�F)rzr�)r�rG�package_namer�s    r8�reseller_package_setr��s`���_�-�M��G�$�L�5�7�7���-�-�-�,�BW�Xe�Bf�2f�2f���d�3�3�3�3��t��ur7c���|d}tj��sdSd|��}tj�|��sdSt|�����}|dd�}i}|D]�}|�d��r�|����	d��}|d�
dd�����}|dd	kr|d||<|tvr|�|��|�d
��rd|vrdS��dD]2}||vr,tj||��}	|	pt|||<�3t!||��rdSt#|t$��}
tD](}|
|}d|�d|�d
�}|�|���)t)d�|��|d��dS)zA
    Copy package limits from ve.cfg to cpanel packages data
    r�Nz/var/cpanel/packages/�lve_�=rrnrL�DEFAULT�_PACKAGE_EXTENSIONSr2)rirhrAr[i�)rMrNr�r�r�r�r�rr�r�r�r�r�r��memory_to_pager�is_limits_equals�create_cpanel_limitsrCr�r(r
)
r�rI�package_path�cpanel_package_data�new_cpanel_package_data�old_cpanel_datar��
line_parts�
limit_name�memory_page_value�cpanel_data�limit_value�
limit_lines
             r8r�r��s���w��G�� �"�"����4�7�4�4�L�
�7�>�>�,�'�'�����|�,�,�6�6�8�8��1�!�!�!�4���O�$�	�	���?�?�6�"�"�	5������+�+�C�0�0�J�#�A��.�.�v�r�:�:�@�@�B�B�J��!�}�	�)�)�.8��m��
�+��-�-�-�'�.�.�t�4�4�4��?�?�0�1�1�	�e�4�6G�6G��F�F��-�W�W�
���(�(� (� 7��
�8S� T� T��*;�*V�{�:�?V�O�J�'�����2�2����'�w�
�;�;�K�&�3�3�
�!�*�-��8�J�8�8��8�8�8�
��&�&�z�2�2�2�2��B�G�G�$;�<�<�l�E�R�R�R�R�Rr7c��|���D]7}|dks|dkr�	||||krdS�&#t$rYdSwxYwdS)zC
    check if new set of limits for package are equals to used
    r�r�FT)r\r�)�
old_limits�
new_limitsr^s   r8rr�s~����� � �����'�>�>�S�F�]�]��	��#��*�S�/�1�1��u�u�2���	�	�	��5�5�5�	�����4s�;�
A
�	A
c���i}|D�]h}|�d��|k�rKtD�]B}	|dkrQt|�d��d�d�������||<n�|dvrpttjt|�|��d�d�����������||<nPt|�|��d�d�������||<��!#tttf$r	d||<Y��@wxYw��j|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�rgrSrrT)rhrArir
r�)r�r�rQrr�r��page_to_memoryr�r�r
r�)�
package_id�xml_packages�result_datarfr
s     r8rr	s����K��3�3��
�?�?�4� � �J�.�.�)�
3�
3��3���}�}�-0��3�3�G�<�<�Q�?�L�L�_�]�]�.�.��%�'�'�$�E�*�*��"9�9�9�-0�$�3� #�B�$;�$;�E�$B�$B�1�$E�$R�$R�SZ�$[�$[� \� \���.�.� �%�'�'�	$�E�*�*�.1��1H�1H��1O�1O�PQ�1R�1_�1_�`g�1h�1h�-i�-i�-o�-o�-q�-q��E�*���"�J�	�:�3�3�3�)2�K��&�&�&�3������s�DE
�
E*�)E*c����td��t��d}���fd�}n��fd�}tD]?}||��r2d}|j�|��tt��n�@|s���At���}t|��dkrd}n|d}|�t�|��dStr*tddd�zg��tj
d	��ntd
�z��t��dS)NTFc�b��|�d���ko|�d��Srsrtrxs �r8rvzplan_delete.<locals>.<lambda>(	s0���r���t�'<�'<��'G�'k�PR�P_�P_�`j�Pk�Pk�Lk�r7c�h��|�d���ko|�d���kSrsrt)rfrurGs ��r8rvzplan_delete.<locals>.<lambda>*	s0���r���t�'<�'<��'G�'x�B�O�O�\f�Lg�Lg�kx�Lx�r7rr+r6z"no configuration found for plan %sr�z+warning: no configuration found for plan %s)rZrcrCr�r�rrrpr�r�rOrPrSrTrRr�)rurGr��is_needed_packagerf�resellers_listrms``     r8r�r�#	s\�����D�����M�M�M��G���k�k�k�k���x�x�x�x�x��������R� � �	��G��M�%�%�b�)�)�)��V�����E�		�
�M�� �6�w�?�?�N��>�"�"�a�'�'����*�!�,���#��G�X�.�.�.����	M����@�G�L�M�
�
�
�
�H�R�L�L�L�L��?�7�K�L�L�L��O�O�O�O�Or7c�(�t||���dS)NrF)r�)rurGs  r8�reseller_plan_deleterI	s����}�5�5�5�5�5�5r7c��	t|�|��d�d����S#ttf$r9|dkr
t
|n"d�t
|dz��cYSwxYw)Nrr
rdz{}%rl)rQrr�r�r
rr)rfr^s  r8�
get_xml_limitrM	s���Y��2�*�*�3�/�/��2�?�?��H�H�I�I�I���
�#�Y�Y�Y�#&�%�<�<�{�3���U�\�\�+�c�BR�TW�BW�5X�5X�X�X�X�Y���s�:=�AB�Bc��d�}|�dStjd|i��}||dd��}|�d��}||dz|�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
    c�^�d}t|��D]\}}||kr|dz
}||kr|cS�dS)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
        rrLr�)�	enumerate)�input_string�char_to_search�ordinal�count�idx�chs      r8�_get_char_indexz'_normalize_str.<locals>._get_char_index^	sR���� ��.�.�	�	�G�C���^�#�#���
���G�#�#��J�J�J���rr7NrQr��rL)r�r�rfind)�data_strr(�json_str�trd_idx�last_idxs     r8rHrHU	sl�����$���t��z�5�(�+�,�,�H��o�h��Q�/�/�G��~�~�c�"�"�H��G�A�I�h�&�'�'r7c�D�������n�rtnt�d���fd�	}|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
�:������
r4t���tjt�����d<��fd�}n�fd�}tjt���trt	���n��d<d�}|�d���d<t
dkr|�d	���d	<tD�]^}||���rOt|d
��}|dkr|nttd
���d
<ttt|d��t�d
���
��dz���d<	tt|�d��d�d�������d<n#ttf$rYnwxYw|t|d	�����d	<|t|d�����d<t|d���d<t|d���d<t|d���d<��`��d����ddz�d<tt!�d�����d<g}tr(d��fd��	D����}d|zg}n��fd��	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
        rmc�h���|�d��ko|�d���kSrsrt)rfr�rGs ��r8rvz5_package_formatter.<locals>.wrapper.<locals>.<lambda>�	s5���<�2�?�?�4�;P�;P�+P�,Q�$&�O�O�J�$?�$?�=�$P�r7c�b���|�d��ko|�d��Srsrt)rfr�s �r8rvz5_package_formatter.<locals>.wrapper.<locals>.<lambda>�	s3���<�2�?�?�4�;P�;P�+P�,D�(*���
�(C�(C�$C�r7r�c�L�trt|��nt|��SrAr'r(s r8rvz5_package_formatter.<locals>.wrapper.<locals>.<lambda>�	r@r7rhrArmrirernrdr�rlr�rSrrTrgrfrjrkNr+c3�v�K�|]3}d|�d��|���d���d�V��4dS)r�r-rBN�r�rErFs  �r8rEz6_package_formatter.<locals>.wrapper.<locals>.<genexpr>�	sJ�����Z�Z�a�a�1�1�1�d�h�h�q�w�w�y�y�%�.H�.H�.H�.H�I�Z�Z�Z�Z�Z�Zr7r0c�`��g|]*}��|���d����+Sr2r5rFs  �r8rz7_package_formatter.<locals>.wrapper.<locals>.<listcomp>�	s/���>�>�>�!�d�h�h�q�w�w�y�y�"�-�-�>�>�>r7)rpryrrOrHr�rCrrQr�r�rr�r
r�r�r�r
)r�rGrr9rfr�r:r�r�r�r�r3s``      @���r8rJz#_package_formatter.<locals>.wrapper�	s�������	*�$�]�3�3�3��9�[�)�)�D�,�D���!Q�!Q�!Q�!Q�!Q���!D�!D�!D�!D���9�[�)�)�D�59�K�^�L�1�1�1�|��T�
�.�.��)�)�$�u�+�6�6��V����?�?�-�-�d�6�l�;�;�D��L��	9�	9�B� � ��$�$�
9�%�b�&�1�1��(-����u�u��[��=P�9Q�9Q��V�� #�$<�!�"�e�,�,�C��V��4E�4E�%G�%G�%G�HK�%L�!�!��W�
��!$�S��/�/��8�8��;�H�H��Y�Y�&�&�"�"�D��J�J��#�J�/�����D�����1�1�-��F�2K�2K�L�L��V��1�1�-��E�2J�2J�K�K��V��*�2�t�4�4��T�
� -�b�'� :� :��W�
�,�R��8�8��V����8�8�G���$� ��K��,�D��M��*�4��=�9�9�:�:��U�����	@��8�8�Z�Z�Z�Z�SY�Z�Z�Z�Z�Z�D��D�=�/�C�C��G�>�>�>�>�v�>�>�>�?�?��
s�;AF�F�FrA)rr)r�r�r3rJs``` r8�_package_formatterr7|	sO�����!�,�g�g�{�2Y�)�)�PY�G�:�:�:�:�:�:�:�:�v�Nr7c���t��td��t���}td��t���}t	t
t���}tt��dt
���}|D]}|||��z
}�tdkr#tt��dt
���}t|��D]M\}}tj��r|dkr�|D]+}tdkr||||��z
}�|||��z
}�,�Ntr*td	d
�|��zdz��dSdS)NrYrZ�r4F�r�r3rLT�adminrOr+rP)rcr�r�ryr;r�DEFAULT_PACKAGEr7r�rFr	rMr{rOrRr
)r]�reseller_packagesr_rQrIrG�
packages_list�reseller_packages        r8�get_packages_listr@�	s����M�M�M���)�)�)��"�"�$�$�H��2�3�3�3�&�+�+�-�-��
�	�o�
>�
>�
>�F�"�:�<�<�U�I�V�V�V�I��%�%���)�)�G�$�$�$�������&�z�|�|��y�Y�Y�Y�	�(1�2C�(D�(D�6�6�$�
�}�����	�=�G�#;�#;�� -�	6�	6����!�!��)�)�$4�m�D�D�D����)�)�$4�5�5�5���		6��5�
�k�C�H�H�V�,�,�,�t�3�4�4�4�4�4�5�5r7c�~�t��td��dg}t��|z}ttt
���}t
|d���}tt��D]\}}|D]}||||��z
}��tr*tdd�|��zdz��dSdS)	NrZr`r9Tr�rOr+rP)rcr�r�r;rr<r7r	r�rOrRr
)r6r�r_rQrGr>r?s       r8�get_resellers_packages_listrB�	s����M�M�M��2�3�3�3��,�K�
�\�\�K�
'�F�
�	�o�
>�
>�
>�F�"�6�t�<�<�<�I�(1�.�(A�(A�A�A�$�
�}� -�	A�	A���i�i� 0�-�@�@�@�F�F�	A��5�
�k�C�H�H�V�,�,�,�t�3�4�4�4�4�4�5�5r7c�L�t��td��t���}td��t���}dg}t	��|z}ttt|���}t|dt���}|D]}|||��z
}�t|d���}t|��D]\}}|D]}	|||	|��z
}��tr*td	d
�|��zdz��dSdS)NrYrZr`)r4r6Fr:Tr�z
{"data": [r+rP)
rcr�r�ryr�r;rr<r7r	rOrRr
)
r]r=r6r�r_rQrIrGr>r?s
          r8�get_all_packages_listrD�	sM���M�M�M���)�)�)��"�"�$�$�H��2�3�3�3�&�+�+�-�-���,�K�
�\�\�K�
'�F�
�	�o�;�
W�
W�
W�F�"�6�u�i�P�P�P�I��%�%���)�)�G�$�$�$���"�6�t�<�<�<�I�(1�2C�(D�(D�A�A�$�
�}� -�	A�	A���i�i� 0�-�@�@�@�F�F�	A��6�
�l�S�X�X�f�-�-�-��4�5�5�5�5�5�6�6r7c�6�t��}|D]}|||<�|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'}
    )r�)�package_list�packages_users_dictrIs   r8�_convert_packages_listrH
s1���&�&���/�/��'.��G�$�$��r7�list-allc�f�|dvrdS|dvr|dkrdSddlm}m}m}m}m}m}m}		|dkrxt�D	|t|d	t|d
d�ia	�n #t$r|ddd�ia	Y�nwxYw	||��\}
}n#t$rdx}
}YnwxYw|||
d�ia	dS|d	kr||||��ia	dS|d
kr1t�!|��}t|��a	tanta	dS|dkr"t�|��a	tanta	dS|dkrt�
|��ata	dS|dkr t�||��}
|
a|
a	nta	dS|dkrt �
|	��at a	dSn1#t"$r}t%|��Yd}~nd}~wt&$rYnwxYwdS)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
    )rIr�rIrYrZr�rMF)r�rIrnr)�
list_users�admin_packages�reseller_package_by_uid�get_uids_list_by_package�resellers_packages�get_reseller_users�list_allr�NrIrm)rIrmTrYrZr�rMrI)�clcommon.cpapirKrLrMrNrOrPrQ�cached_usersr�r�r��cached_list_packagesrH�cached_resellers_packages�cached_reseller_users�cached_defaultrrVr�)�option�lve_package_idrmrKrLrMrNrOrPrQrGrIrF�reseller_users_dictrIs               r8r�r�&
s��&�V�V�V��u�
�&�&�&�>�R�+?�+?��u�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�P
��X����'�W�&�'3�N�'C�I�'N�(4�^�(D�Z�(P�)�)�&�N�N�� �W�W�W�&4�"�RT�6U�6U�%V�N�N�N�W����1�-D�-D�^�-T�-T�*�M�7�7��!�1�1�1�.0�0�M�G�G�G�1����#1�g�S`�2a�2a�!b���t�
�y�
 �
 �,�.F�.F�~�W_�.`�.`�a�N��4�
��
&�
&�$�+�-�~�/�/��!7��!E�!E��'5�$�$�"6���4�
�0�
0�
0�)�0�!3�!3�!5�!5��,:�)�)�";���4�
�|�
#�
#�
�#�)�z�|�|��)�N��4�
�,�
,�
,�%�,�&8�&8��&B�&B�#�)<�%�!4���"7���4�
�z�
!�
!��%�!)�����+�N��4����'�'�'�#�A�&�&�&�&�&�&�&�&������
�
�
���
�����5s��
F�)A�F�A4�0F�3A4�4F�8B�F�B�F�B�
F�$F�:5F�1&F�F�9$F�F�
F.�
F�
F.�-F.c�F�t��tt��S)z2
    Retrieves panel users count
    :return:
    )r�r�r�r6r7r8�get_panel_users_countr\�
s��
�����~���r7c��td��td||���r/t|D]#}tt|��||����"dSdS)Nr�rIr�)r�r�rr�)rurmrDs   r8r�r��
sm����&�&�&��I�w��B�B�B�<�!�'�*�	<�	<�C��c�#�h�h��(�;�;�;�;�;�<�<�	<�	<r7c��|D]}}|�dd��}|������}|D]<}t|��dkr'	t	|��}t|���5#Y�9xYw�=�~dS�Nr[rnr)r�r�r�r�r�r���
users_listr�r�r�s    r8�destroy_manyrb�
s����	�	���|�|�D��$�$���
�
���"�"�$�$���	�	�D��D�	�	�Q�����t�9�9�D���%�%�%�%����D�����	�	�	s�A8�8A<c�P�t��	t��n#YnxYw|D]}}|�dd��}|������}|D]<}t|��dkr'	t
|��}t|���5#Y�9xYw�=�~dSr_)rcr�r�r�r�r�r�rr`s    r8�
apply_manyrd�
s����M�M�M�
�������
�������	�	���|�|�D��$�$���
�
���"�"�$�$���	�	�D��D�	�	�Q�����t�9�9�D��d�O�O�O�O����D�����	�	�	s��#�>B�B!c	���t�t|��t|��|dt|��zdzt|��zdz���dS)NzCan`t put proccess with pid z in lve rzr�)r��lve_enter_pid_flagsr�rQ)�LVEid�PID�flagss   r8�	limit_pidrj�
s`��	����E�
�
�C��H�H�e�.��S���9�J�F��U���S�Vk�k������r7c�x�t�t|��dt|��z���dS)NzCan`t release process with pid r�)r��
lve_leave_pidr�rQ)rhs r8�release_pidrm�
s4��	����C���*K�c�RU�h�h�*V��W�W�W�W�Wr7c	�h�tttttt
ttd�S)N�rr/rrArrCr7rEror6r7r8�get_globalsrp�
s(���l�$��[�$�S� 0�	2�2�2r7c� �g}t���}td��t���}|���at|��D]&\}}|D]}||kr|�|g����'|S)NrZ)r�ryr�r	�extend)rIrm�
pkg_users_oldr=rGr>�package_name_in_keys       r8rprp�
s����H�"�'�'�)�)�M��2�3�3�3�&�+�+�-�-��"�'�'�)�)�N�)2�2C�(D�(D�1�1�$�
�}�#0�	1�	1���-�-�-������0�0�0��	1��Or7c��tjtjdd���}|r�tj�|��r�t
||��\}}|dkrqd�|��}trtdd|g��d
Sd|z}tj�d	|z��tj
|��d
Sd
Sd
Sd
S)z�
    Call Endurance's custom script

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

    �ENDURANCE_CUSTOM_SCRIPTr�)�fileName�	paramName�	separatorrz2Error while executing Endurance's custom script
{}r+rKz	error: %sz%s
N)rM�get_param_from_file�CL_CONFIG_FILEr�r�r�rrrOrPrSr]rYrT)�args�endurance_custom_script�ret_code�std_outr`�err_messages      r8�call_endurance_custom_scriptr��
s���*�=�{�Ga�Ha�HK�M�M�M���
#�2�7�>�>�2I�#J�#J�
#�(�)@�$�G�G���'��q�=�=�L�S�S�T[�\�\�G��
#��G�g�w�%7�8�8�8�8�8�)�G�3���
� � ��+�!5�6�6�6����"�"�"�"�"�
#�
#�
#�
#��=r7c��tr)tt|tjz����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
    )rtr�r��mmaprr!r(s r8�_page_to_memory_or_bytesr�s5���1��5����.�/�/�0�0�0��5�>�>�r7c��t��}ttj�����}t	��t��D]m}	tj�|��}||vr|�|���<#tttf$r|�|��Y�jwxYw|D]}t|���dS)zV
    Remove from LVE all resellers, which are absent from panel
    :return: None
    N)r�r2rKrsrcr9r�r�r�r�r�r�)�reseller_id_list_for_delete�cpapi_resellers_list�lve_reseller_id�lve_reseller_name�reseller_id_for_deletes     r8�remove_absent_resellersr�%s���#'�&�&�� ��� 1� 1� 3� 3�4�4���M�M�M�#�:�:�@�@��	@� #�� 9� 9�/� J� J�� �(<�<�<�+�2�2�?�C�C�C����'�7�+�	@�	@�	@�'�.�.��?�?�?�?�?�	@����#>�1�1���/�0�0�0�0�1�1s�8B�,C�Cc��ttj�����D]�\}}	t	j|���#t$rz	t�|��n[#t$rN	tj	�
|��t�|��n#t$rYnwxYwYnwxYwY��wxYwdS)zM
    Remove from LVE all users, which absent in system
    :return: None
    N)r	r2r4rKr�r|r�r�r%r0r�r�s  r8�remove_absent_usersr�?s���$�C�H�L�L�N�N�3�3������	��L�� � � � ���		�		�		�
�����'�'�'�'���
�
�
���F�%�%�f�-�-�-��O�O�F�+�+�+�+��!�����D�������
������		�����sY�A�
C�A-�,C�-
C�89B2�1C�2
B?	�<C�>B?	�?C�C�C�C�
C)FrA)r)rrrrrrr)NN)rFT)T)NNN)NFNNr)r"rN)r�N)FN)rIrnN)��
__future__rrr�builtinsr�
past.builtinsrr�future.utilsr	r
�typingrrr
rr�
contextlibr�ryr�r\r�r�r�r�rSr��xml.dom.minidom�dom�minidomrr��	functoolsrr�r�rrkr��
clcommon.lockr�clcommon.constrrRrrrr�clcommon.cpapi.cpapiexceptionsrrM�cleventsrr�cllimits.libr�cllvectl.logr�clveconfig.ve_configrrr�clveconfig.ve_lockr r!r"r#r$r%r&�clcontrollibr'�secureior(r)�GET_CP_PACKAGE_SCRIPTr�r�r<r�r�r�r^r�r�r�r��IS_DEBUGr��LVEr�r2r9r>rHrVrZrXr8rVr9r�r�rOrtr�rgr�rr/rrArBrrCr7rErDrFrrrvr�r�r�r�r�r�r�r�r�r�r��contextmanagerr�r�rrPrr!r'r*r-r0r�r<rGrPrQrYrWrcrhrpr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrr!r;rKrRrVr^rarjrtr�r��tupler�r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rzr�r�rrr�rrrHr7r@rBrDrUrTrSrVrWrHr�r\r�rbrdrjrmrprpr�r�r�r�r6r7r8�<module>r�se��&�%�%�%�%�%�&�&�&�&�&�&�������������-�-�-�-�-�-�-�-�+�+�+�+�+�+�+�+�4�4�4�4�4�4�4�4�4�4�4�4�4�4���������������������	�	�	�	�
�
�
�
�	�	�	�	�����
�
�
�
����������������������������
�
�
�
�������
�
�
�
�����&�&�&�&�&�&�"�"�"�"�"�"�g�g�g�g�g�g�g�g�g�g�g�g�8�8�8�8�8�8�����P�P�P�P�P�P�P�P�%�%�%�%�%�%�.�.�.�.�.�.�O�O�O�O�O�O�O�O�O�O�E�E�E�E�E�E�E�E�D�D�D�D�D�D�D�D�D�D�D�D�D�D�*�*�*�*�*�*�?�?�?�?�?�?�?�?�?��
������	��	��:�����
��3�r�z�~�~�m�Q�/�/�0�0����!�!�'�+�.�.���E�
�C�C��E��!�!�!�E�

�#��-�-�-�C����%�%�%�K�K�K��=�����$3�3�3�3�*����
�
�
���
��
�
�����
�
�
��
�
�
�	�	��O�N�N������
�
���
�
�
��
����
�
�	��	����
�
�
�����	������
���
���,+�+�+�+�,
�
�
�1�1�1�<&�%�'�'�9�<�<�>�>������,���$���*�������*4�4�4���"�"���"�(BC�>?�
�
�
�
�(�������&
�
�
�[�[�[�����2�2�2�2�2�2����#��#�D�#�#�#�#�Lk�k�k�"i�"i�"i�J+ �d�3��8�n�+ �+ �+ �+ �\
�
�
� 
&�
&�
&�
&� %�%�%�L�L�L�L�AA�AA�AA�AA�HU�U�U�!�!�!�H
?�
?�
?�	0�	0�	0�	0�	4�	4�	4�	4�	�	�	�	n�	n�	n�!9�!9�!9�J"p�"p�"p�"p�J!�!�!�L��D��Z��>n�>n�>n�>n�B6�6�6�:W)�W)�W)�W)�t���(Z�Z�Z�o�o�o�X�X�X�r�r�r����,���6����>%,�K�K�K�K�`5�5�5�5�6������$5�5�5�(���".�.�.�.�b< �< �< �@>�>�>�D$�e�D�$�J�&7�$�$�$�$�
'�
'�
'�
'����:	I�	I�	I�J�J�J�*���
�
�
�+�+�+�(2�2�2�������*
�
�
� +&�+&�+&�+&�\���Fz�z�z�z�z5�5�5�5�2E5�E5�E5�E5�P
�C�
�#�
�(�3�-�
�
�
�
� !�!�!����,*S�*S�*S�Z������<#�#�#�#�L6�6�6�Y�Y�Y�$(�$(�$(�NH�H�H�H�X5�5�5�:5�5�5�&6�6�6�4!�� �� �� �� ��	�	�	�m�m�m�m�`���<�<�<�<�
�
�
����(���X�X�X�2�2�2�$
�
�
�"#�#�#�2���"1�1�1�4����r7

Hacked By AnonymousFox1.0, Coded By AnonymousFox