????

Your IP : 3.137.208.89


Current Path : /opt/cloudlinux/venv/lib/python3.11/site-packages/clquota/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib/python3.11/site-packages/clquota/__pycache__/__init__.cpython-311.pyc

�

L��e<���,�ddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
mZddlm
Z
mZmZmZmZddlZddlZddlmZddlmZddlmZddlmZmZmZdd	lmZm Z dd
l!m"Z"m#Z#m$Z$m%Z%ej&�'��Z(dZ)Gd�d
e*��Z+Gd�de*��Z,Gd�de*��Z-Gd�de*��Z.Gd�de��Z/Gd�de*��Z0Gd�de*��Z1Gd�de1��Z2d�Z3d�Z4de5fd�Z6Gd �d!e7��Z8dS)"�N)�map)�defaultdict)�S_IRGRP�S_IROTH�S_IRUSR�S_IWUSR�ST_DEV)�FormattedException)�ClPwd)�check_quota_enabled)�admin_packages�
list_users�resellers_packages)�CPAPIExternalProgramFailed�
EncodingError)�ExternalProgramFailed�get_file_lines�run_command�write_file_lines�defaultc��eZdZd�ZdS)�NoSuchPackageExceptionc�D�t�|d|�d���dS)NzNo such package (�)��	Exception�__init__��self�packages  �G/opt/cloudlinux/venv/lib64/python3.11/site-packages/clquota/__init__.pyrzNoSuchPackageException.__init__$s'�����4�4�7�7�7�!D�E�E�E�E�E�N��__name__�
__module__�__qualname__r�r"r!rr#s(������F�F�F�F�Fr"rc��eZdZd�ZdS)�NoSuchUserExceptionc�D�t�|d|�d���dS)NzNo such user (rr)r�users  r!rzNoSuchUserException.__init__)s'�����4�4����!>�?�?�?�?�?r"Nr#r'r"r!r)r)(s(������@�@�@�@�@r"r)c��eZdZd�ZdS)�InsufficientPrivilegesExceptionc�<�t�|d��dS)NzInsufficient privilegesr�rs r!rz(InsufficientPrivilegesException.__init__.s�����4�!:�;�;�;�;�;r"Nr#r'r"r!r-r--s#������<�<�<�<�<r"r-c��eZdZd�ZdS)�IncorrectLimitFormatExceptionc�D�t�|d|�d���dS)NzIncorrect limit format (rr�r�limits  r!rz&IncorrectLimitFormatException.__init__3s'�����4�4����!H�I�I�I�I�Ir"Nr#r'r"r!r1r12s(������J�J�J�J�Jr"r1c�2��eZdZdZdejf�fd�Z�xZS)�MalformedConfigExceptionz\
    Raised when config files is malformed and
    cl-quota is not able to work with it
    �errorc���tt|���dtt	|�����d���dS)Nz�cl-quota can't work because for malformed config. Please, contact CloudLinux support if you need help with resolving this issue. Details: %(error_message)s)�
error_message)�message�context)�superr6r�dict�str)rr7�	__class__s  �r!rz!MalformedConfigException.__init__<s\���
�&��-�-�6�6�-��!�%�j�j����
	8
�	8
�		�		�		�		�		r")r$r%r&�__doc__�ConfigParser�ParsingErrorr�
__classcell__�r?s@r!r6r67sQ���������
�l�7�
�
�
�
�
�
�
�
�
�
r"r6c��eZdZd�ZdS)�GeneralExceptionc�<�t�||��dS�Nr)rr:s  r!rzGeneralException.__init__Js�����4��)�)�)�)�)r"Nr#r'r"r!rFrFIs#������*�*�*�*�*r"rFc���eZdZ�fd�Z�xZS)�QuotaDisabledExceptionc�X��tt|���d��dS)Nz&Quota disabled for all users on server)r<rJr)rr?s �r!rzQuotaDisabledException.__init__Os)���
�$�d�+�+�4�4�5]�^�^�^�^�^r")r$r%r&rrCrDs@r!rJrJNsA�������_�_�_�_�_�_�_�_�_r"rJc��eZdZdZdd�ZdS)�UserQuotaDisabledExceptionz?
    Raised when quota is disabled for one particular user
    Nc�|�d}|r|d|zz
}|r|d|zz
}|r|d|zz
}t�||��dS)NzQuota disabledz for user id %sz (home directory %s)z; %sr)r�uid�homedirr:�all_msgs     r!rz#UserQuotaDisabledException.__init__Wsj��"���	/��(�3�.�.�G��	8��-��7�7�G��	(��v��'�'�G����4��)�)�)�)�)r")NNN)r$r%r&r@rr'r"r!rMrMSs2��������*�*�*�*�*�*r"rMc�v�|ddkr|dz
}d}|dkrdS|D]}|�|��rdS�dS)zd
    >>> _is_sys_path('/home/username')
    False
    >>> _is_sys_path('/var/davecot')
    True
    ����/)	z/root/z/usr/z/var/z/sbin/z/dev/z/bin/z/srv/z/sys/z	/etc/ntp/TN)�
startswith)�path�	sys_path_�path_s   r!�_is_sys_pathrYbsf���B�x�3�������g�I��s�{�{��t������?�?�5�!�!�	��4�4�	��r"c�h��t��}|�����fd��D��}|S)z)
    Return no system users uid list
    c�^��g|])}t�|j����|j��*Sr')rY�pw_dir�pw_uid)�.0�usr�pw_dicts  �r!�
<listcomp>z#_get_users_list.<locals>.<listcomp>zs5���a�a�a��|�G�TW�L�L_�?`�?`�a����$�a�a�ar")r�
get_user_dict)�cl_pwd�	users_uidr`s  @r!�_get_users_listress>���
�W�W�F��"�"�$�$�G�a�a�a�a��a�a�a�I��r"�returnc�H�tjtjdd���}|S)zJ
    Check `cl_quota_inodes_inheritance` parameter in the config file
    �cl_quota_inodes_inheritanceF)�default_val)�cldetectlib�get_boolean_param�CL_CONFIG_FILE)�ress r!�is_quota_inheritance_enabledrns%���
'��(B�Da�ot�
u�
u�
u�C��Jr"c��eZdZdZdZdZdZdZdZdZ	dZ
ed	zZd
Zd�Z
ed���Zd
�Zd�Zd�Zd�Zd�ZdHd�Zd�ZdId�Z		dJd�ZdKd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z ed���Z!dLd �Z"dLd!�Z#dLd"�Z$dLd#�Z%dLd$�Z&dLd%�Z'dLd&�Z(dLd'�Z)dHd(�Z*dMd)�Z+d*�Z,d+�Z-d,�Z.dHd-�Z/d.�Z0dHd/�Z1d0�Z2d1�Z3d2�Z4d3�Z5d4�Z6d5�Z7d6�Z8d7�Z9d8�Z:d9�Z;d:�Z<d;�Z=d<�Z>d=�Z?d>�Z@d?�ZAd@�ZBedA���ZCdB�ZDdC�ZEdD�ZFdE�ZGdIdF�ZHdG�ZIdS)N�QuotaWrapperz4
    Base quota class for inode quotas handling
    z/proc/mountsz/usr/sbin/setquotaz/usr/sbin/repquotaz%/usr/bin/getcontrolpaneluserspackagesz/etc/container/cl-quotas.datz/etc/container/cl-quotas.cacheNz.lockFc�H�|�tj��|�tj��|�tj��t��|_d|_i|_i|_	i|_
i|_i|_i|_
|���|_gd�|_t#j��|_|���|_|�|j��|_d|_d|_dS)N)�
bytes_used�
bytes_soft�
bytes_hard�inodes_used�inodes_soft�inodes_hard)�_assert_file_existsrp�PROC_MOUNTS�REPQUOTA�SETQUOTA�list�_quota_enabled_list�_panel_present�_grace�_quota�
_device_quota�_package_to_uids_map�_uid_to_packages_map�_uid_to_homedir_map�_get_saved_data_handler�_dh�_fields�os�geteuid�_euid�_load_quota_devices�_devices�_get_mountpoint_device_map�_mountpoint_device_mapped�_device_user_map�_all_package_listr/s r!rzQuotaWrapper.__init__�s���� � ��!9�:�:�:�� � ��!6�7�7�7�� � ��!6�7�7�7�#'�6�6�� �"������������$&��!�$&��!�#%�� ��/�/�1�1���n�n�n����Z�\�\��
��0�0�2�2��
�)-�)H�)H���)W�)W��&� $���!%����r"c�j�tj�|��std|�d����dS)z>
        Checks if command is present and exits if no
        zNo such command (rN)r�rV�exists�RuntimeError�rVs r!rxz QuotaWrapper._assert_file_exists�s>��
�w�~�~�d�#�#�	A��,����?�@�@�@�	A�	Ar"c��|SrHr'r/s r!�	__enter__zQuotaWrapper.__enter__�s���r"c�8�|j���dSrH)�LOCK_FD�close)r�type�value�	tracebacks    r!�__exit__zQuotaWrapper.__exit__�s����������r"c�R�|�|�|����S)z9
        Returns user limits converted to tuples
        ��_convert_data_to_tuples�_get_current_quotas�rrOs  r!�get_user_limitszQuotaWrapper.get_user_limits�s&���+�+�D�,D�,D�S�,I�,I�J�J�Jr"c�P�|�|�����S)z=
        Returns all user limits converted to tuples
        r�r/s r!�get_all_users_limitsz!QuotaWrapper.get_all_users_limits�s$���+�+�D�,D�,D�,F�,F�G�G�Gr"c�T�|�|�|�����S)z�
        :param packname: Package name for get limits. If None, returns all packages,
                          else - only supplied package
        Returns package limits converted to tuples (called only from main)
        )�packname�r��_get_package_quotasrs  r!�get_package_limitszQuotaWrapper.get_package_limits�s)���+�+�D�,D�,D�g�,D�,V�,V�W�W�Wr"c�V�|�|�|d�����S)zY
        Returns all packages limits converted to tuples (called only from main)
        T)r��all_packagesr�rs  r!�get_all_packages_limitsz$QuotaWrapper.get_all_packages_limits�s,���+�+�D�,D�,D�g�dh�,D�,i�,i�j�j�jr"c�H�|dkrdS|dvrdS|�|��S)z�
        Preprocessed passed limit: 'default' --> '0', 'unlimited' --> -1, else calls _check_limit
        :param limit:
        :return:
        r�0)�	unlimited�-1r�)�_check_limitr3s  r!�_preprocess_limitzQuotaWrapper._preprocess_limit�s9���I����3��'�'�'��4�� � ��'�'�'r"c��i}i}|j�d��r�t|j�d����dkr�|���}|j�d��D]y}|r ||vr|j�d|���$|j�d|���d��}t|��dkr�f|d|df||<�z|r|�	��|�
��|j���D]}||vr||||<�d||<�|S)z�
        Retrive all available packages with their limits
        :param clean_dead_packages: if True - remove all nonexistent packages from cl-quotas.dat
        :return: Dictionary: { 'package_name': (soft_limit, hard_limit) }
        �packagesr�:���r�r�)
r��has_section�len�items�_get_all_package_list�options�
remove_option�get�split�_write_data�_get_package_to_users_mapr��keys)r�clean_dead_packages�package_limits_dict�db_packages�list_of_packagesr �package_limitss       r!�_get_all_packages_with_limitsz*QuotaWrapper._get_all_packages_with_limits�sz��!�����8���
�+�+�	#��D�H�N�N�:�4N�4N�0O�0O�RS�0S�0S�#�9�9�;�;���8�+�+�J�7�7�
L�
L��&��7�:J�+J�+J��H�*�*�:�w�?�?�?��!%����j�'�!B�!B�!H�!H��!M�!M���~�&�&�!�+�+��'5�a�'8�.��:K�'K��G�$�$�"�
#�� � �"�"�"��&�&�(�(�(��0�5�5�7�7�	:�	:�G��+�%�%�/:�7�/C�#�G�,�,�/9�#�G�,�,�"�"r"Tc��|s|�|�dS|���|}|}	|�|��}|�|	��}|dk�r$|dkrd}|dkrd}|j�d��r^|j�dd��rC|j�dd���d��}
|p|
d}|p|
d}n|pd}|pd}|�||���|r.|d	vrd}n|�|}|	d	vrd}n|�|}|�d||�
��|�	��}
|
D]4}|
|\}}|dks|dkr|�
||||||����5dS|r|�|||�
��\}}nd\}}||}}|dks|dkrd}|dks|dkrd}|�|��}||}|d
|ks|d|ks|�r7|�
|��d}|tkr�|j�d��rZ|j�d|��r?|j�d|���d��}
|
d}|
d}nd}d}|p|}|p|}n|}|}tjd||d|d|||�|�|����g}t'|��|r5|dkrd}n|dvr|}|dkrd}n|dvr|}|�|||��|dkr|dks|dkr|dkr|�|||��dSdSdS)z=
        Sets limits for users
        :return: None
        Nr�r��usersr�rr�)�soft�hard)r�r��rOr�r���
only_storer�rwrvz-ursrt)r�r�)�_check_adminr�r�r��
has_optionr�r��_apply_to_all_if_not_set�_save_user_limitsr��set_package_limit�_combine_user_limitsr��_get_uid_to_packages_map�DEFAULT_PACKAGErpr{�_get_home_device�_fetch_homedirr)rrOr�r��save�sync�
force_saver��soft_arg�hard_arg�limits�
cache_soft�
cache_hardr�r �p_soft�p_hard�user_combine_soft�user_combine_hard�	user_soft�	user_hard�saved_quotas�cached�user_package�
soft_limit�
hard_limit�cmds                           r!�set_user_limitzQuotaWrapper.set_user_limitsh���	������F������������%�%�h�/�/���%�%�h�/�/���#�:�:��t�|�|����t�|�|����x�#�#�G�,�,�
)���1D�1D�W�c�1R�1R�
)�����g�s�3�3�9�9�#�>�>��!�.�V�A�Y�
�!�.�V�A�Y�
�
�!�[�S�
�!�[�S�
��)�)�z�
�)�K�K�K��
F��2�2�2��D�D��\�%�D��2�2�2��D�D��\�%�D��&�&�3�T��&�E�E�E�#'�"D�"D�"F�"F��.�
g�
g��!4�W�!=�����S�=�=�F�c�M�M��*�*�7�F�F�D�$�[e�*�f�f�f���F��	<�37�3L�3L�QT�[_�fj�3L�3k�3k�0��0�0�3;�0��0�0�2C�9�	��4�<�<�,��4�4��I��4�<�<�,��4�4��I��/�/��4�4���c�"���-� �I�-�-��
�1F�)�1S�1S�Wa�1S��8�8��=�=�a�@�L���.�.��8�'�'��0�0�%�T�X�5H�5H��RU�5V�5V�%�!�X�\�\�'�3�7�7�=�=�c�B�B�F�!'���J�!'���J�J�"%�J�!$�J�&�4�*�
�&�4�*�
�
�'�
�&�
��%��c��|�$��|�$����%�%�d�&9�&9�#�&>�&>�?�?��C�
������
D�$��,�,�!%�J�J��{�*�*�%)�
�$��,�,�!%�J�J��{�*�*�%)�
��&�&�s�J�
�C�C�C��C�K�K�D�C�K�K�T�T�\�\�d�d�l�l��"�"�3��d�3�3�3�3�3�.:�\�l�lr"c
��t��}|tkrdS|s|�|�dS|���|�|��}|�|��}g}|r|�|||��\}}|rG||�d���vr/||���vr|�|||��dS	|�|��n#t$r|rYdSYnwxYw|�	��}	|�
��}
|	���D�]}|�|��D�]k}||	|vr�|�t|����d}
trnt��r`t!j��}|�|
��}||kr2|�|d��}||d}||d}|�|||���}|s��|dkrd	}n
|dpd	}|dkrd	}n
|d
pd	}	|�|
|d|
|df||f��s;|�|�d|
|d�d|
|d
�d|�d|��	����\#t,$rY��iwxYwt/|��dkr���d�|��dz}|r,||jvr
d|j|<|j||z|j|<n t4jd|g}t9||���g}��|r|�|||��dSdS)z?
        Sets limits for package
        :rtype : None
        NT�r�rrvrwr�r�r�r�� rsrt�
��-bu��std_in)rr�r�r��!_get_saved_package_limits_if_noner�r��_save_package_limitsr�_get_device_user_mapr�r��	get_names�int�IS_DArn�clcontrollib�DirectAdmin�_get_user_package�_combine_package_limits�limits_are_equal�append�KeyErrorr��joinr�rpr{r)rr r�r�r�r�r��clpwdr��device_user_mapr��devicerO�_user�panel�
_real_package�_real_quotas�datar�r�r�s                     r!r�zQuotaWrapper.set_package_limitvs��
�����o�%�%��F��	������F��������%�%�d�+�+���%�%�d�+�+�����	U��?�?���t�T�T�J�D�$��	�G�t�7�7�T�7�J�J�J�J��t�=�=�?�?�?�?��%�%�g�t�T�:�:�:��F�	��*�*�7�3�3�3�3��%�	�	�	��
����
�
�	�����3�3�5�5���/�/�1�1��%�*�*�,�,�-	�-	�F��5�5�g�>�>�!
�!
���o�f�5�5�5������C���1�1�!�4���J�9�;�;�J�(�4�6�6�E�%*�$;�$;�E�$B�$B�M�$��/�/�'+�'?�'?�
�t�'T�'T��+�M�:�=�I��+�M�:�=�I���3�3��$�T�3�R�R������4�<�<�!$�J�J�!%�a���C�J��4�<�<�!$�J�J�!%�a���C�J�	��0�0�,�s�2C�M�2R�T`�ad�Te�fs�Tt�1u�2<�j�1I�K�K�9��
�
� #��� ,�S� 1�,� ?� ?� ?��c�AR�S_�A`�A`�A`� *�
�
�J�J�8�9�9�9���
 �����D������6�{�{�a�����i�i��'�'�$�.�F��
0���!3�3�3�24�D�&�v�.�-1�-?��-G�&�-P��"�6�*�*�#�,�e�V�<���C��/�/�/�/��F�F��	;��%�%�g�t�T�:�:�:�:�:�	;�	;s%�
C � C2�1C2�6A-J%�%
J3�2J3c�F�|���|�d��}|���D]'}||\}}|�|||dd����(i|_|j�d��r�|j�d��D]�}	|�|��|j�	d|���
d��}t|��dkr�Z|\}}|�|||dd����z#t$r|j�d|��Y��wxYw|���|j���D]-}t"jd|g}t'||j|����.d	S)
zN
        Read limits from file and applies them to packages and users
        TFr�r�r�r�r�r�N)r�r�r�r�r�r�r�r�r�r�r�r�r�r)r�r�r�rpr{r)	rr�r r�r�rOr�r	r�s	         r!�synchronizezQuotaWrapper.synchronize�s���	
�������;�;�D�A�A��%�*�*�,�,�	P�	P�G�'��0�J�D�$��"�"�7�D�$��$�"�O�O�O�O�����8����(�(�
	��x�'�'��0�0�
9�
9��
9��'�'��,�,�,�!�X�\�\�'�3�7�7�=�=�c�B�B�F��6�{�{�Q��� �!'�J�D�$��'�'��T�4��4�'�P�P�P�P��*�9�9�9��H�*�*�7�C�8�8�8�8�8�9�����������(�-�-�/�/�	@�	@�F��(�%��8�C���D�$6�v�$>�?�?�?�?�?�	@�	@s�$AD�;D�%E�Ec
����|���g}|����tt������t
���D]?�|��gtt��fd�|j����z���@|�	d��|�
tj��}tj|tj���}|�|��|�tj��|���dS)zF
        Caches the limits to non-privileged user to see them
        )�keyc� ����|SrHr')�x�current_quotas�ks ��r!�<lambda>z.QuotaWrapper.save_user_cache.<locals>.<lambda>�s���>�!�;L�Q�;O�r"T)�quotingN)r�r��sortedr|r�r�rrr��_get_global_lock�_prepare_writerrp�	CACHEFILE�csv�writer�
QUOTE_MINIMAL�	writerows�_end_writer�
_release_lock)r�
cache_content�file_handler�csv_outrrs    @@r!�save_user_cachezQuotaWrapper.save_user_cache�s%����	
�������
��1�1�3�3����^�0�0�2�2�3�3��=�=�=�	b�	b�A�� � �!��t�C�1O�1O�1O�1O�1O�RV�R^�,_�,_�'`�'`�!`�a�a�a�a����d�#�#�#��+�+�L�,B�C�C���*�\�3�3D�E�E�E�����-�(�(�(�����/�0�0�0��������r"c�v�|j�,dtddg�����k|_|jS)z6
        Return True if control panel present
        N�Unknownz/usr/bin/cldetectz--detect-cp-nameonly)r~r�rstripr/s r!�_check_present_panelz!QuotaWrapper._check_present_panel�s>����&�"+�{�<O�Qg�;h�/i�/i�/p�/p�/r�/r�"r�D���"�"r"c�8�|jdkrt���dS)z2
        Raise exception if no admin user
        rN)r�r-r/s r!r�zQuotaWrapper._check_admins"���:��?�?�1�3�3�3��?r"c�`�|�d��tjdd���}t|_	|�t
j��n&#tj$r}t|���d}~wwxYw	|�	��n#|�	��wxYw|S)z:
        Gets ConfigParser handler for future use
        TNF)�
interpolation�strict)
rrAr>�optionxform�readrp�DATAFILErBr6r")r�dh�es   r!r�z$QuotaWrapper._get_saved_data_handlers���	
���d�#�#�#�
�
&�T�%�
H�
H�
H�����	!��G�G�L�)�*�*�*�*���(�	.�	.�	.�*�1�-�-�-�����	.����
+�
��� � � � ��D��� � � � �����	s)�A�B�A<�(A7�7A<�<B�B+c��|j�|jSi}g}|���D]P}	|�|�|�|����|f���A#t
$rY�MwxYw|D]>}|d|vrg||d<||d�|d���?||_|jS)zF
        Returns dictionary mapping devices to lists of users
        Nrr�)r��_get_list_of_uidsrr�r�r)r�devices_map�device_user_pairsrO�pairs     r!r�z!QuotaWrapper._get_device_user_maps���� �,��(�(������)�)�+�+�	�	�C�
�!�(�(�$�*?�*?��@S�@S�TW�@X�@X�*Y�*Y�[^�)_�`�`�`�`���
�
�
���
����%�	1�	1�D��A�w�k�)�)�')��D��G�$���Q�� �'�'��Q��0�0�0�0� +����$�$s�=A(�(
A5�4A5c��|�|dkr|Stjd��}|�|��}|st|���|�d��S)Nr�z(\d+)r�)�re�compile�searchr1�group)rr4�
limit_pattern�
pattern_matchs    r!r�zQuotaWrapper._check_limit+s`���=�E�T�M�M��L��
�8�,�,�
�%�,�,�U�3�3�
��	7�/��6�6�6��"�"�1�%�%�%r"c��||krdSdS)z�
        Compare tuples
        :param limits1: tuple
        :param limits2: tuple
        :return: True of tuple 1 equal to tuple 2
        TFr')�limits1�limits2s  r!rzQuotaWrapper.limits_are_equal4s���g����4��ur"c���g}|���}|���}|���D�]%}tjd|g}|���D]�}|||vst|�|��vr�)|�|||���}	|	s�D|�	||d||df|	��sK|�
|�d||d�d||d�d|	dpd	�d|	d
pd	��	����t|��dkr��d�|��dz}t||���g}��'d
S)zr
        Applies limits to all users if no other (user or package) ones has
        not been set for them
        r�r�rvrwr�rsrtrr�r�r�r�N)r�r�r�rpr{r5r�r��_combine_default_limitsrrr�rr)
rr�r�r�rr�r	r�rOrs
          r!r�z%QuotaWrapper._apply_to_all_if_not_set@s���
���3�3�5�5���/�/�1�1��%�*�*�,�,�	�	�F��(�%��8�C��-�-�/�/�

)�

)���o�f�5�5�5��PT�Pm�Pm�nq�Pr�Pr�9r�9r���3�3��$�T�3�R�R������,�,�l�3�.?�
�.N�P\�]`�Pa�bo�Pp�-q�sw�x�x�)��M�M����$�S�)�,�7�7�7�$�S�)�,�7�7�7��Q���3����Q���3��#(�)�)�)���6�{�{�a�����i�i��'�'�$�.�F���F�+�+�+�+��F�F�)	�	r"c��|�|||���\}}d\}}|�|��D]}|�|||���\}}�|�d||���\}	}
|	�d}	|
�d}
|	|
fS)zc
        Determines user limits taking into account
        saved package and default ones
        r��NN)r r�r�r�)�_get_saved_user_limits_if_noner��*_get_saved_package_limits_if_none_or_unlim�'_get_saved_user_limits_if_none_or_unlim)rrOr�r��u_soft�u_hardr�r�r �d_soft�d_hards           r!r�z!QuotaWrapper._combine_user_limits^s���
�<�<��4�VZ�<�[�[����#�����4�4�S�9�9�	x�	x�G�!�L�L�U\�ci�pv�L�w�w�N�F�F�F��E�E�#�TZ�ag�E�h�h�����>��F��>��F��v�~�r"c��|�|���\}}|r|rdS|�|}|�|}|�d||���S)zc
        Determines package limits taking into account
        saved user and default ones
        �rOr'Nr�r�)rGrI�rrOr�r��t_soft�t_hards      r!rz$QuotaWrapper._combine_package_limitspsb���<�<��<�E�E�����	�f�	��2��>��F��>��F��;�;��&�W]�;�^�^�^r"c�l�|�|���\}}|�|}|�|}|dkrd}|dkrd}||fS)z�
        Determines default limits taking into account saved user and package ones
        :param soft: soft limit from uid=0
        :param hard: hard limit from uid=0
        rONr�r�)rGrPs      r!rDz$QuotaWrapper._combine_default_limits�sZ���<�<��<�E�E�������D����D��4�<�<��D��4�<�<��D��T�z�r"c�.�	|j�d|���d��\}}|�|dkr|}|�|dkr|}n!#tjtjf$rYnwxYw|�|��}|�|��}||fS)z?
        Retrives saved user limits if none has passed
        r�r�Nr��r�r�r�rA�NoSectionError�
NoOptionErrorr��rrOr�r�r�r�s      r!rGz+QuotaWrapper._get_saved_user_limits_if_none�s���	�#'�8�<�<���#=�#=�#C�#C�C�#H�#H� �I�y��|�	�S� 0� 0� ���|�	�S� 0� 0� �����+�\�-G�H�	�	�	��D�	����� � ��&�&��� � ��&�&���T�z�s�AA�A&�%A&c�f�	|j�d|���d��\}}|dkrd}|dkrd}|�|dkr|dkr|}|�|dkr|dkr|}n!#tjtjf$rYnwxYw|�|��}|�|��}||fS)zN
        Applies saved user limits if none or unlimit has been passed
        r�r�r�r�rUrXs      r!rIz4QuotaWrapper._get_saved_user_limits_if_none_or_unlim�s���	�#'�8�<�<���#=�#=�#C�#C�C�#H�#H� �I�y��D� � ��	��D� � ��	��������c�1A�1A� ���������c�1A�1A� �����+�\�-G�H�	�	�	��D�	����� � ��&�&��� � ��&�&���T�z�s�A!A$�$B�Bc�D�|tkrh	|j�d|���d��\}}|�|dkr|}|�|dkr|}n!#tjtjf$rYnwxYw|�|��}|�|��}||fS)zA
        Applies saved package limits if none has passed
        r�r�Nr��r�r�r�r�rArVrWr��rr r�r��	pack_soft�	pack_hards      r!r�z.QuotaWrapper._get_saved_package_limits_if_none�s����o�%�%�
�'+�x�|�|�J��'H�'H�'N�'N�s�'S�'S�$�	�9��<�I��$4�$4�$�D��<�I��$4�$4�$�D��� �/��1K�L�
�
�
���
����� � ��&�&��� � ��&�&���T�z�s�AA�A1�0A1c�\�|tkrt	|j�d|���d��\}}|�|dkr|dkr|}|�|dkr|dkr|}n!#tjtjf$rYnwxYw|�|��}|�|��}||fS)zQ
        Applies saved package limits if none or unlimit has been passed
        r�r�Nr�r[r\s      r!rHz7QuotaWrapper._get_saved_package_limits_if_none_or_unlim�s����o�%�%�
�'+�x�|�|�J��'H�'H�'N�'N�s�'S�'S�$�	�9��L�D�C�K�K�Y�#�5E�5E�$�D��L�D�C�K�K�Y�#�5E�5E�$�D��� �/��1K�L�
�
�
���
����� � ��&�&��� � ��&�&���T�z�s�AA�A=�<A=c��|jdkr|���S|js|���|_|rB	||j|iS#t$r%|�|��t
|���wxYw|jS)z�
        Retrieves current quotas.
        If euid == 0, use data from repquota utility, else from /etc/container/cl-quotas.cache file
        r)r��_load_user_cacher��_load_current_quotasr�_check_if_quota_enabledr)r�s  r!r�z QuotaWrapper._get_current_quotas�s���
�:��?�?��(�(�*�*�*��{�	6��3�3�5�5�D�K��	/�
/��T�[��-�.�.���
/�
/�
/��,�,�S�1�1�1�)�#�.�.�.�
/�����{�s�A�/Bc��i}|r|���}n|���}|D�]#}dg}	|dkr2|j�dd���d��\}}n1|j�d|���d��\}}|�|��}|�|��}|dkrd}|dkrd}|�||g��n8#tjtj	f$r|�ddg��YnwxYw|�
|�||������%|r(	|||iS#t$rt|���wxYw|S)aa
        Prepares package limits data for outputting
        (call only from get_package_limits/get_all_packages_limits - main)
        :param packname: Package name for get limits. If present, function returns
                            limits only for this package, else - all packages
        :param all_packages: If False reads only used and admin's packages, True - all packages
                                (including reseller packages without users)
        :return Dictionary of package limits:
            {package_name: {'inodes_used': 'xxx', 'inodes_soft': 'yyy', 'inodes_hard': 'zzz'}
        �-rr�r�r�r�r�)r��_get_list_of_packagesr�r�r�r��extendrArVrW�update�	_populaterr)	rr�r��qr�r �valuesr�r�s	         r!r�z QuotaWrapper._get_package_quotas�s���
���	<�#�9�9�;�;��� $�9�9�;�;��'�	6�	6�G��U�F�
*��i�'�'�"&����g�s�!;�!;�!A�!A�#�!F�!F�J�D�$�$�!%����j�'�!B�!B�!H�!H��!M�!M�J�D�$��(�(��.�.���(�(��.�.���4�<�<��D��4�<�<��D��
�
�t�T�l�+�+�+�+�� �/��1K�L�
*�
*�
*��
�
�s�C�j�)�)�)�)�)�
*����
�H�H�T�^�^�G�V�4�4�5�5�5�5��	7�
7� �!�H�+�.�.���
7�
7�
7�,�X�6�6�6�
7�����s�B:C2�22D'�&D'�	E"�"E<c
���|ttt�fd�t|jdd���������iS)Nc�0��|d�|dfS�Nr�rr')rrs �r!rz(QuotaWrapper._populate.<locals>.<lambda>s����!��d�1�Q�4�j�/A�r"�)r=r|r�	enumerater�)r�itemrs  `r!rizQuotaWrapper._populatesH����d�4��%A�%A�%A�%A�I�d�l�[\�[]�[]�N^�D_�D_� `� `�a�a�b�b�c�cr"c�h�t|��������SrH)r|r�r�r/s r!rfz"QuotaWrapper._get_list_of_packagess(���D�2�2�4�4�9�9�;�;�<�<�<r"c�h�t|��������SrH)r|r�r�r/s r!r5zQuotaWrapper._get_list_of_uids s(���D�1�1�3�3�8�8�:�:�;�;�;r"c��|js|���|_|r+	|j|S#t$rt|���wxYw|jSrH)r��_load_package_uids_datarrrs  r!r�z&QuotaWrapper._get_package_to_users_map#so���(�	G�(,�(D�(D�(F�(F�D�%��	6�
6��0��9�9���
6�
6�
6�,�W�5�5�5�
6�����(�(�	�1�Ac���||jvrdS|�|��}t|���}|rt|||����|j�|��dS)Nr�)rOrPr:)r}r�rrMr)rrO�home_dir�quota_disabled_messages    r!rcz$QuotaWrapper._check_if_quota_enabled-st���$�*�*�*��F��&�&�s�+�+��!4�(�!C�!C�!C��!�	1�,��h�Pf�g�g�g�g��$�+�+�C�0�0�0�0�0r"c��|js|���|_|r+	|j|S#t$rt	|���wxYw|jSrH)r�rur�rr)r�s  r!r�z%QuotaWrapper._get_uid_to_packages_map7so���(�	G�(,�(D�(D�(F�(F�D�%��	/�
/��0��5�5���
/�
/�
/�)�#�.�.�.�
/�����(�(rvc��	t��}n>#tttf$r$}t	dt|��z���d}~wwxYwt
t��}t
t��|_|�	��D]f\}}t|��}|d�|dnt}||�|��|j|�|���g	td���}n8#ttf$r$}t	dt|��z���d}~wwxYw|D]!}|�
|�|ntg���"|�
tg��|S)a
        Retrieve package-uids map from cpapi. Only for custom panels. See LU-610 for details. 
        Null packages coming from cpapi are considered to be 'default' package.

        :return: Dictionary with data.
        Example response:
            {'default': ['1038', '1043', '1046'], 'res1_pack1': ['1044'], 'pack1': ['1042']}
        Coorresponding self._uid_to_packages_map value:
            {'1038': ['default'], '1042': ['pack1'], '1043': ['default'], '1044': ['res1_pack1'], '1046': ['default']}
        z%s. Can not get usersNr T��	raise_exc�%s. Can not get admin packages)r�OSErrorrrrr>rr|r�r�r�rr
�
setdefault)	r�users_packagesr3�packages_usersrO�uid_data�s_uidr �
admin_pkgss	         r!�_get_packages_uids_from_cpapiz*QuotaWrapper._get_packages_uids_from_cpapiAs���	L�'�\�\�N�N���3�]�C�	L�	L�	L�'�(?�3�q�6�6�(J�K�K�K�����	L����%�T�*�*��$/��$5�$5��!�+�1�1�3�3�	=�	=�M�C����H�H�E�-5�i�-@�-L�h�y�)�)�Ra�G��7�#�*�*�5�1�1�1��%�e�,�3�3�G�<�<�<�<�	U�'�$�7�7�7�J�J���3�4�	U�	U�	U�'�(H�C�PQ�F�F�(S�T�T�T�����	U����"�	_�	_�G��%�%��1D�g�g�/�[]�^�^�^�^��!�!�/�2�6�6�6��s,��A�A�A�8D	�	D>�D9�9D>c�2�i}|jdkr|S|���satttt������|t<td�|tD����|_|S|�	��S)z�
        Gets map of packages and users
        :rtype dict
        :return Dictionary with data. Example:
            {'default': ['1038', '1043', '1046'], 'res1_pack1': ['1044'], 'pack1': ['1042']}
        rc3�(K�|]
}|tfV��dSrH)r�)r^�is  r!�	<genexpr>z7QuotaWrapper._load_package_uids_data.<locals>.<genexpr>zs'����,e�,e�a�a��-A�,e�,e�,e�,e�,e�,er")
r�r*r|rr>rer�r=r�r�)rr�s  r!ruz$QuotaWrapper._load_package_uids_datals������:��?�?��O��(�(�*�*�	�(,�S��o�6G�6G�-H�-H�(I�(I�H�_�%�(,�,e�,e�8�Tc�Kd�,e�,e�,e�(e�(e�D�%��O��1�1�3�3�3r"c�f�|jr|jS	g|_td���}|D]}|j�|���n8#ttf$r$}tdt
|��z���d}~wwxYw	td���}|���D]!}|D]}|j�|����"n8#ttf$r$}tdt
|��z���d}~wwxYwt|jvr|j�t��|jS)zm
        Retrives all (root and resellers) panel package list
        :return: List of package names
        Tr|r~Nz!%s. Can not get reseller packages)
r�r
rrrrr>rrkr�)r�list_admin_packagesr r3�dict_resellers_packages�
packages_lists      r!r�z"QuotaWrapper._get_all_package_lists����!�	*��)�)�	U�%'�D�"�"0�4�"@�"@�"@��.�
7�
7���&�-�-�g�6�6�6�6�
7���3�4�	U�	U�	U�'�(H�C�PQ�F�F�(S�T�T�T�����	U����	X�&8�4�&H�&H�&H�#�!8�!?�!?�!A�!A�
;�
;�
�,�;�;�G��*�1�1�'�:�:�:�:�;�
;���3�4�	X�	X�	X�'�(K�s�ST�v�v�(V�W�W�W�����	X�����$�"8�8�8��"�)�)�/�:�:�:��%�%s0�6A�A<�A7�7A<�AC�C<�C7�7C<c	��������D]F�	tt��fd�|jdd�����}|��<�7#t$rY�CwxYw�S)zI
        Convert dict to tuples for passing to printing routines
        c�$��|��|fSrHr')rrrs ��r!rz6QuotaWrapper._convert_data_to_tuples.<locals>.<lambda>�s���a��c��1��->�r"roN)r��tuplerr�r)rr�entryrs ` @r!r�z$QuotaWrapper._convert_data_to_tuples�s������9�9�;�;�	�	�C�
��c�#>�#>�#>�#>�#>��L����$�&�&�'�'��!��S�	�	���
�
�
���
�����s�3A�
A�Ac
���i}d}�j}tjdg}t|��}t	jdtj��}|���D�]�}|�d���r|s�|�	��}t|��dkr��|��}|ddd�}	|	dkr�o	||vr��|��}||vrn��
��|	��|��rEtt!t#�fd	�t%|d
d���������||	<��#t&t(t*f$rY��wxYw|�d��r1||�d��d����}��`d
|vrZ|�|��}
|
rC�j�tt!t#d�|
�����������|�������|S)zZ
        Gets current quota settings from repqouta utility for further processing
        Nz-unaz2(block|inode)\sgrace\stime:?\s(\d[\w:]+)(?:;|$|\s)�#�rr�r�c�:���j|d|dfS�Nrr��r�)rrs �r!rz3QuotaWrapper._load_current_quotas.<locals>.<lambda>�s���4�<��!��;M�q�QR�t�:T�r"r�z***z/dev�gracec�F�|d���|dfSr�)�lower)rs r!rz3QuotaWrapper._load_current_quotas.<locals>.<lambda>�s���1������q�QR�t�@T�r")r�rprzrr:r;�
IGNORECASE�
splitlinesrUr�r��#_remove_redundant_fields_from_input�_find_unknown_device�_is_home_devicer�r=r|rrpr�
IndexErrorr)�find�strip�findallrrh�_add_default)rrjr	�devicesr�r�grace_regex_pattern�line�partsrO�founds`          r!rbz!QuotaWrapper._load_current_quotas�sJ���
�����-���$�f�-���3���� �j�)^�`b�`m�n�n���O�O�%�%�	a�	a�D����s�#�#�
a�����
�
�����u�:�:��?�?� �D�D�U�K�K�E��A�h�q�r�r�l���#�:�:����W�,�,�!%�!:�!:�6�!B�!B����(�(�T�-A�-A�$�BU�BU�VY�BZ�BZ�\b�-c�-c�(�!%�d�3�0T�0T�0T�0T�W`�af�gh�gi�gi�aj�Wk�Wk�+l�+l�&m�&m�!n�!n��#���� �*�.A�B�����H���������'�'�
a��d�i�i��/�/�0�0�1�7�7�9�9����D���+�3�3�D�9�9���a��K�&�&�t�D��6T�6T�W\�1]�1]�,^�,^�'_�'_�`�`�`��	����"�"�$�$�%�%�%��s�
BE�E4�3E4c���|dd�}tjd���|��fd�|dd�D����|S)Nr�z^\d+$c�>��g|]}��|���|��Sr')r<)r^�field�is_digit_patterns  �r!razDQuotaWrapper._remove_redundant_fields_from_input.<locals>.<listcomp>�s-���L�L�L�u�-=�-D�-D�U�-K�-K�L�U�L�L�Lr")r:r;rg)rr��stripped_partsr�s   @r!r�z0QuotaWrapper._remove_redundant_fields_from_input�s`����r��r�����H�-�-�����L�L�L�L��a�b�b�	�L�L�L�	N�	N�	N��r"c��t|j��dkrB|j�td�t	j��D������	|j|S#t$rt|���wxYw)Nrc3�LK�|]}t|j��|jfV�� dSrH)r>r]r\)r^r�s  r!r�z.QuotaWrapper._fetch_homedir.<locals>.<genexpr>�sG����5�5�!��%�,�'�'���6�5�5�5�5�5�5r")r�r�rhr=�pwd�getpwallrr)r�s  r!r�zQuotaWrapper._fetch_homedir�s����t�'�(�(�A�-�-��$�+�+��5�5�%(�\�^�^�5�5�5�6�6�
7�
7�
7�	+��+�C�0�0���	+�	+�	+�%�c�*�*�*�	+���s�A)�)Bc��i}ttj��}tjd��}|D]�}|�d��r�|�|��}|d}d|di}|D]~}|�d��s|�d��r|�d��d|d	<�K|�d
��r|�d��d|d<�||vr||�|����|g||<��|���t|��dkrt���|S)aj
        Gets mounted filesystems list and picks ones with quota on

        Example of returned data structure:
            {'/dev/mapper/VolGroup-lv_root': [
                {'mountpoint': '/', 'quota_file': 'quota.user', 'quota_type': 'vfsv0'},
                {'mountpoint': '/var', 'quota_file': 'quota.user', 'quota_type': 'vfsv0'}
                ],
            '/dev/mapper/VolGroup-lv_root2': [
                {'mountpoint': '/', 'quota_file': 'quota.user', 'quota_type': 'vfsv0'},
                {'mountpoint': '/var', 'quota_file': 'quota.user', 'quota_type': 'vfsv0'}
            ]
            }
        z |,zrootfs /r�
mountpointr�z	usrquota=zusruota=�=�
quota_filezjqfmt=�
quota_type)�openrpryr:r;rUr�rr�r�rJ)	rr��proc_mounts_stream�
split_pattr��line_splitedr	�mountpoint_data�line_splited_elements	         r!r�z QuotaWrapper._load_quota_devices�sy����!�,�":�;�;���Z��'�'�
�&�	4�	4�D����z�*�*�
��%�+�+�D�1�1�L�!�!�_�F�+�l�1�o�>�O�(4�
W�
W�$�'�2�2�;�?�?�W�CW�Cb�Cb�cm�Cn�Cn�W�4H�4N�4N�s�4S�4S�TU�4V�O�L�1�1�)�4�4�X�>�>�W�4H�4N�4N�s�4S�4S�TU�4V�O�L�1���� � ����&�&��7�7�7�7�#2�"3������ � �"�"�"��w�<�<�1���(�*�*�*��r"c�>���i}	����ttj��}t	j|d���}n_#ttf$rKt�j	��t��jd��icY��
��SwxYw	��
��n#��
��wxYwt�j	��}|D]x��d|krj|��dttt!��fd�t#t%�j����������i��n�y|s4t�j	��t��jd��iS|S)zJ
        For non-privileged user we outputting data from the file
        �,)�	delimiterr�rc�4���j|�|dzfS)Nr�r�)r�rowrs ��r!rz/QuotaWrapper._load_user_cache.<locals>.<lambda>s�����Q�� #�A�a�C�� *�r")rr�rprr�readerr�IOErrorr>r�r=�fromkeysr�r"rhr|r�ranger�)rrj�fo�cvs_inrOr�s`    @r!razQuotaWrapper._load_user_caches�����
��		!��!�!�#�#�#��l�,�-�-�B��Z��c�2�2�2�F�F����!�	G�	G�	G���
�O�O�T�]�]�4�<��%E�%E�F�F�F���� � � � �	G����
�
��� � � � ��D��� � � � �����$�*�o�o���	�	�C��1�v��}�}����#�a�&�$�t�C�*�*�*�*�*��#�d�l�+�+�,�,�-.�-.�(/�(/�#0�#0�1�2�2�2�����	G���
�O�O�T�]�]�4�<��%E�%E�F�F��s+�AA
�	B?�
AB&�B?�%B&�&B?�?Cc��d�}g}|���D])\}}|D]!}|d}|�||f���"�*|�|d���|S)z�
        return list tuple ('mountpoin tpath', 'device') reverse sorted by deep mountpoint path
        [('/mountpoint_path/path', '/device'), ('/mountpoint_path', '/device')]
        c�Z�|ddkrd}n|d�d��}|S)NrrT)�count)�device_mountpoint�	deep_paths  r!�sort_by_deep_pathzBQuotaWrapper._get_mountpoint_device_map.<locals>.sort_by_deep_path%s7�� ��#�s�*�*��	�	�-�a�0�6�6�s�;�;�	��r"r�T)r�reverse)r�r�sort)rr�r��mountpoint_device_mapr	�mountpoint_data_listr��mountpoint_paths        r!r�z'QuotaWrapper._get_mountpoint_device_map s���
	�	�	�!#��,3�M�M�O�O�	H�	H�(�F�(�#7�
H�
H��"1�,�"?��%�,�,�o�v�-F�G�G�G�G�
H�	�"�"�'8�$�"�G�G�G�$�$r"c��d�}|tj�|����}|jD]'\}}|�||����r|cS�(dS)z3
        Returns device user homedir is on
        c�,�|r|ddkr|dz
}|S)NrSrTr'r�s r!�
_add_slashz1QuotaWrapper._get_home_device.<locals>._add_slash7s$���
��R��C��������Kr"N)r�rV�dirnamer�rU)r�homer�r��mounpoint_pathr	s      r!r�zQuotaWrapper._get_home_device3s��	�	�	��*�R�W�_�_�T�2�2�3�3��&*�&D�	�	�"�N�F��!�!�*�*�^�"<�"<�=�=�
��
�
�
�
�	�	r"c�4�|�|��|kS)z;
        Checks if a device is user homedir device
        )r�)rr�r	s   r!r�zQuotaWrapper._is_home_device@s���$�$�T�*�*�f�4�4r"c��	tj|��t}tj|��tj|��f}|j���D]Q}tj|��t}|tj|��tj|��fkr|cS�RdS#t$r|cYSwxYwrH)r��statr	�major�minorr�r�r)rr	�dev�dev_to_find�current_devices     r!r�z!QuotaWrapper._find_unknown_deviceFs���	��'�&�/�/�&�)�C��8�C�=�=�"�(�3�-�-�8�K�"&�-�"4�"4�"6�"6�
*�
*���g�n�-�-�f�5���2�8�C�=�=�"�(�3�-�-�"@�@�@�)�)�)�)�A�
*�
*���	�	�	��M�M�M�	���s�B0B6�3B6�6C�Cc���gd��	|j�dd���d��\}}|dkrd}|dkrd}��||g��n8#tjtjf$r��ddg��YnwxYwdttt�fd�t|j��������iS)zw
        Insert 'default' quota.
        Calls only from _load_current_quotas, after parsing repquota's output
        )rer�r�rer�r�r�r�c�0��|d�|dfSrnr')rrks �r!rz+QuotaWrapper._add_default.<locals>.<lambda>as���q��t�V�A�a�D�\�.B�r")r�r�r�rgrArVrWr=r|rrpr�)rr�r�rks   @r!r�zQuotaWrapper._add_defaultQs����
&�%�%��		&�#'�8�<�<���#=�#=�#C�#C�C�#H�#H� �I�y��D� � ��	��D� � ��	��M�M�9�i�0�1�1�1�1���+�\�-G�H�	&�	&�	&��M�M�3��*�%�%�%�%�%�	&�����T�$�s�$B�$B�$B�$B�Y�t�|�E\�E\�]�]�^�^�_�_�`�`s�AA � 2B�Bc��|�d}|�d}|�|||��\}}|�|dkr>|� |dkr6|j�d��r|j�d|��nU|j�d��s|j�d��|j�d||�d|����|���dS)z#
        Saves user limits
        Nr�r�r�)rGr�r�r��add_section�setr�)rrOr�r�s    r!r�zQuotaWrapper._save_user_limitscs����<��D��<��D��8�8��d�D�I�I�
��d��L�D�C�K�K���������1E�1E�g�1N�1N���H�"�"�7�C�0�0�0�0��8�'�'��0�0�
.���$�$�W�-�-�-��H�L�L��#�$�$�$���'=�>�>�>��������r"c���|�d}|�d}|�|||��\}}|�|dkr>|� |dkr6|j�d��r|j�d|��nU|j�d��s|j�d��|j�d||�d|����|���|�|��dS)z&
        Saves package limits
        Nr�r�r�)r�r�r�r�r�r�r��_copy_package_limits_to_cpanel)rr r�r�s    r!r�z!QuotaWrapper._save_package_limitsus����<��D��<��D��;�;�G�T�4�P�P�
��d��L�D�C�K�K�d�l�d�c�k�k��H�(�(��4�4�?J��H�"�"�:�w�7�7�7�7��8�'�'�
�3�3�
1���$�$�Z�0�0�0��H�L�L��W����t�t�.D�E�E�E��������+�+�G�4�4�4�4�4r"c��tj��sdSd|��}t|��}t|��dkrdS|�|��\}}|�|�dS|�|d���|}|���D]\}}|dkrd||<�|�|�dd	��|�d
d	��f|d|d
f��rdSdD]E}	dt|	��zd
zt||	��zdz}
|�
|
���Ft||d��dS)zV
        Copy package quota limits from cl-quotas.dat to cpanel packages data
        Nz/var/cpanel/packages/rTr�rer�rvr�rw�rvrw�lve_r�r��w)rj�	is_cpanelrr��_parse_cpanel_package_datar�r�rr�r>rr)rr �package_path�cpanel_package_lines�old_cpanel_data�modified_cpanel_lines�quotas_datarr��
limit_type�limit_strings           r!r�z+QuotaWrapper._copy_package_limits_to_cpanel�s����$�&�&�	��F�8�w�8�8��-�l�;�;���#�$�$��)�)��F�15�1P�1P�Qe�1f�1f�.��.��"�'<�'D��F��.�.�w�T�.�J�J�7�S��&�+�+�-�-�	(�	(�J�C����|�|�#'��C� ��� � �/�"5�"5�m�S�"I�"I�"1�"5�"5�m�S�"I�"I�"K�"-�m�"<�k�-�>X�!Y�[�[�	�
�F�8�	7�	7�J�!�C�
�O�O�3�c�9�C��J�@W�<X�<X�X�[_�_�L�!�(�(��6�6�6�6���'<�c�B�B�B�B�Br"c��|dd�}i}|D]�}|�d��r�|����d��}|d�dd�����}|ddkr|d||<|dvr|�|��|�d	��rd
|vrdS��||fS)z�
        Process cpanel_package_lines - get values of all old lve_ limits
        and remove lines with limits that would be changed
        Nr�r�rr�r��DEFAULTr��_PACKAGE_EXTENSIONS�lverF)rUr�r��replace�remove)r��cpanel_package_lines_modifiedr�r��
line_parts�
limit_names      r!r�z'QuotaWrapper._parse_cpanel_package_data�s���)=�Q�Q�Q�(?�%���(�		"�		"�D����v�&�&�
?�!�Z�Z�\�\�/�/��4�4�
�'��]�2�2�6�2�>�>�D�D�F�F�
��a�=�I�-�-�2<�Q�-�O�J�/��!?�?�?�1�8�8��>�>�>����4�5�5�
"�%�t�:K�:K�!�z�z��� =�=�=r"c�T�|dkr8|dkr2	|j�||��nj#tj$rYnYwxYw|j�|��s|j�|��|j�|||�d|����|���dS)z&
        Saves data to a file
        r�r�N)r�r�rArVr�r�r�r�)rr�r�rq�	item_types     r!�
_save_datazQuotaWrapper._save_data�s����3�;�;�4�3�;�;�
���&�&�y�$�7�7�7�7���.�
�
�
���
�����8�'�'�	�2�2�
0���$�$�Y�/�/�/��H�L�L��D�T�T�T�4�4�*@�A�A�A��������s�*�<�<c�^�tj�|��}	tjd|���\}}tj|d��}||_|S#ttf$rCtj�	|��rtj
|��td���wxYw)zH
        Open temporary file for writing and return file object
        �lvetmp_)�prefix�dirr�zCould not save data)r�rVr��tempfile�mkstemp�fdopen�_tmpr�rr��unlinkrF)r�filepathrV�fd�	temp_pathr$s      r!rzQuotaWrapper._prepare_writer�s����w���x�(�(��	:�$�,�I�4�H�H�H�M�B�	��9�R��-�-�L�!�D�I������!�	:�	:�	:��w�~�~�i�(�(�
%��	�)�$�$�$�"�#8�9�9�9�	:���s�6A�AB,c���	ttztztz}t	j|j|��t	j||��dS#t$rYdSwxYw)z0
        Routines after writing to file
        N)	rrrrr��renamer
�chmodr)rrV�masks   r!r!zQuotaWrapper._end_writer�si��	��W�$�w�.��8�D��I�d�i��&�&�&��H�T�4� � � � � ���	�	�	��D�D�	���s�AA�
A �A c��|�d��|�tj��}|j�|��|�tj��|���dS)z7
        Actual place of saving data to a file
        TN)rrrpr1r��writer!r")rr$s  r!r�zQuotaWrapper._write_data�sq��	
���d�#�#�#��+�+�L�,A�B�B������|�$�$�$�����.�/�/�/��������r"c��|rdt_tj��	ttjd��t_n$#t
tf$rtd���wxYw	tj	tj�
��tj��dS#t
$rtd���wxYwdS)NT�rz Can't open lock file for readingzCan't get lock)rp�
LOCK_WRITEr�r��	LOCK_FILEr�rrF�fcntl�flock�fileno�LOCK_EX)rrs  r!rzQuotaWrapper._get_global_lock�s����	+�&*�L�#���'�
K�'+�L�,B�C�'H�'H��$�$���W�%�
K�
K�
K�&�'I�J�J�J�
K����
9���L�0�7�7�9�9�5�=�I�I�I�I�I���
9�
9�
9�&�'7�8�8�8�
9����(�'s�$A�!A"�&;B#�#B=c��tjs8tj�.tj���dt_dSdSdSrH)rprr�r�r/s r!r"zQuotaWrapper._release_lock�sH���'�	(�l�.B�.N�� �&�&�(�(�(�#'�L� � � �	(�	(�.N�.Nr"rH)F)NNTTFF)NNTTFrF)NF)Jr$r%r&r@ryr{rz�GETPACKSr1rr�rrr�staticmethodrxr�r�r�r�r�r�r�r�r�r�rr&r*r�r�r�r�rr�r�rrDrGrIr�rHr�r�rirfr5r�rcr�r�rur�r�rbr�r�r�rar�r�r�r�r�r�r�r�r�rrr!r�rr"r'r"r!rprp�s���������!�K�$�H�$�H�7�H�.�H�0�I��G��7�"�I��J�&�&�&�,�A�A��\�A�������K�K�K�H�H�H�X�X�X�k�k�k�k�
(�
(�
(� #� #� #� #�DIM�49�q4�q4�q4�q4�fQ;�Q;�Q;�Q;�f@�@�@�>���"#�#�#�4�4�4�
�
�
�%�%�%�(&�&�&��	�	��\�	�����<����$_�_�_�_�$����$���� ����*����"����"����$+�+�+�+�Zd�d�d�=�=�=�<�<�<�)�)�)�)�1�1�1�)�)�)�)�)�)�)�V4�4�4�&&�&�&�6���"�"�"�H���	+�	+�	+�%�%�%�N���8%�%�%�&���5�5�5�	�	�	�a�a�a�$���$5�5�5�&C�C�C�:�>�>��\�>�&
�
�
�
:�
:�
:�	�	�	����9�9�9�9�(�(�(�(�(r"rp)9�configparserrArrr�r�r:r�builtinsr�collectionsrr�rrrrr	r�rj�clcommonr
�clcommon.clpwdr�clcommon.clquotar�clcommon.cpapir
rr�clcommon.cpapi.cpapiexceptionsrr�clcommon.utilsrrrr�detect�is_dar�r�rrr)r-r1r6rFrJrMrYre�boolrn�objectrpr'r"r!�<module>r-sC��$�#�#�#�
�
�
�
�����	�	�	�	�
�
�
�
�	�	�	�	�����������#�#�#�#�#�#�;�;�;�;�;�;�;�;�;�;�;�;�;�;���������'�'�'�'�'�'� � � � � � �0�0�0�0�0�0�I�I�I�I�I�I�I�I�I�I�T�T�T�T�T�T�T�T�_�_�_�_�_�_�_�_�_�_�_�_�	��!�!�#�#����F�F�F�F�F�Y�F�F�F�
@�@�@�@�@�)�@�@�@�
<�<�<�<�<�i�<�<�<�
J�J�J�J�J�I�J�J�J�
�����1����$*�*�*�*�*�y�*�*�*�
_�_�_�_�_�Y�_�_�_�
*�*�*�*�*�!7�*�*�*����"	�	�	��d�����w(�w(�w(�w(�w(�6�w(�w(�w(�w(�w(r"