HEX
Server: Apache
System: Linux insrv.serversdaddy.com 5.14.0-362.24.2.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Sat Mar 30 14:11:54 EDT 2024 x86_64
User: jsaha (1066)
PHP: 8.3.6
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/alt/python37/lib/python3.7/site-packages/cllimits/lib/__pycache__/limits.cpython-37.opt-1.pyc
B

-��1��#�@s�ddlmZmZmZddlZddlZddlmZddlm	Z	ddl
mZddlm
Z
mZmZmZmZmZmZmZmZmZddlmZddlmZmZmZdd	lmZmZdd
l m!Z!ddl"m#Z#m$Z$m%Z%m&Z&ddl'm(Z(m)Z)m*Z*dd
l+m,Z,m-Z-ddl.m/Z/m0Z0m1Z1ddl2m3Z3ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>ddl?m@Z@Gdd�de�ZAdd�dd�dd�dd�dd�dd�dd�dd�dd�dd�d �
ZBd!d"d#gZCd$d%gZDGd&d'�d'eE�ZFGd(d)�d)eF�ZGdS)*�)�absolute_import�division�print_functionN)�defaultdict)�ClPwd)�FormattedException)
�Feature�NotSupported�cpinfo�domain_owner�get_main_username_by_uid�	getCPName�is_admin�is_panel_feature_supported�is_reseller�reseller_users)�
EncodingError)�
MySQLGovernor�MySQLGovException�GovernorStatus)�print_dictionary�replace_params)�CloudlinuxLicenseLib)�CageFs�CageFsException�LveCtl�LvectlException)�ClQuotaException�
ClQuotaLib�QuotaDisabledException)�	iteritems�
itervalues)�convert_to_kernel_format�is_active_reseller_limits�lve)�
basestring�)
�ADMIN_ONLY_OPTIONS�AVAILABLE_KEYS�AVAILABLE_LIMITS�AVAILABLE_LVE_KEYS�AVAILABLE_LVP_KEYS�AVAILABLE_MYSQL_KEYS�AVAILABLE_MYSQL_KEYS_ALL�AVAILABLE_QUOTA_KEYS�CloudlinuxLimitsNoLveOptsParser�CloudlinuxLimitsOptsParser)�convert_mem_value_to_bytesc@seZdZdS)�DomainExceptionN)�__name__�
__module__�__qualname__�r6r6�py/cllimits/lib/limits.pyr2(sr2c	Cs4|d�dttt|��r"d�|�n|��d�i�S)N�cpu�allz{}%�d)�update�str�intr"�isdigit�format)�limits�valuer6r6r7�<lambda>-srBcCs|d�d|i�S)N�ior9)r;)r@rAr6r6r7rB2�cCs|d�d|i�S)Nr8�mysql)r;)r@rAr6r6r7rB3rDcCs|d�d|i�S)NrCrE)r;)r@rAr6r6r7rB4rDcCs0|d�|�d�d��|�d�d��d��S)N�inodes�,rr&)�soft�hard)r;�split�strip)r@rAr6r6r7rB5scCs|�d|i�S)N�ep)r;)r@rAr6r6r7rB9rDcCs|�d|i�S)N�nproc)r;)r@rAr6r6r7rB:rDcCs|�dt|�i�S)N�pmem)r;r1)r@rAr6r6r7rB;scCs|�dt|�i�S)N�vmem)r;r1)r@rAr6r6r7rB=scCs|�d|i�S)N�iops)r;)r@rAr6r6r7rB?rD)
�speedrCz	mysql-cpuzmysql-iorF�
maxEntryProcsrMrNrOrP�rootZadmin�-ZabusersZsinglecs6eZdZdZdZdZdZdZdZdZ	�fdd�Z
dd�ZdEd	d
�Zdd�Z
d
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zed�d d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zed,d-��Zd.d/�Z d0d1�Z!d2d3�Z"d4d5�Z#d6d7�Z$d8d9�Z%d:d;�Z&d<d=�Z'd>d?�Z(d@dA�Z)dFdCdD�Z*�Z+S)G�CloudlinuxLimitsz2
    Class for run cloudlinux-limits commands
    NFcs&ttj�sttt��t�St��|�S)N)rrZLVE�superrU�CloudlinuxLimitsNoLve�__new__)�cls)�	__class__r6r7rXVs
zCloudlinuxLimits.__new__cCs:t�|_t�|_t�|_t�|_t�|_	t
�|_i|_dS)z#
        Empty constructor
        N)
r�_clpwdr�_lvectlr�_cagefsr�	_cl_quotar�_mysql_governorr0�_opts_parser�_users_list)�selfr6r6r7�__init__[szCloudlinuxLimits.__init__�successcCs2t|t�r|�|t��d��t||jp*|�dS)z�
        Output data wrapper
        :param: `dict` data - data for output to stdout
        :param: `bool` force_json - always output json format
        )�result�	timestampN)�
isinstance�dictr;�timer�_is_json)rb�dataZ
force_jsonrer6r6r7�
print_datajs
zCloudlinuxLimits.print_datacCs�t�}|��s"d|_|�ddi�Sd|k|_|�|�|_|j�d�sP|j�d�rnt��sn|�dd�	t
��i�|j�d�dk	r�t��s�|�dd	i�|��|�
�|jd
r�|��S|jdr�|��S|jdr�|��S|jd
r�|��S|�ddi�SdS)z$
        Run command action
        TrezCloudlinux license isn't validz--jsonz--for-resellerz--reseller-namez;--for-reseller/--reseller-name options not supported on {}.NzEReseller limits are not supported. Can not use --for-reseller option.�set�getzdisable-reseller-limitszenable-reseller-limitszUnknown action, exit)rZget_license_statusrj�_error_and_exit�_parse_args�_optsrnr$Zis_panel_supportedr?r
Zreseller_limit_supported�_verify_reseller�_check_user_owner�_set_run�_get_run�_disable_reseller_limits�_enable_reseller_limits)rb�argvZlicencer6r6r7�runus0





zCloudlinuxLimits.runcCs@|j�||j�\}}|s&|�t|��t|dt�r<d|d<|S)z%
        Parse CLI arguments
        z--lve-idr)r`�
parse_argsrjrorrgr%)rbrxZstatusrkr6r6r7rp�szCloudlinuxLimits._parse_argscCsh|j�d�}|sdS|j�d�dkr(dS|��\}}|dkr@dS||�|�krd|�d||d�d��dS)	z�
        Checks that specified reseller is an owner of specified user and
        terminate program if need
        :return:
        z--for-resellerNz--lve-idr)NzN/Az2%(username)s is not owned by reseller %(reseller)s)�username�reseller)re�context)rqrn�_check_user�_get_reseller_namero)rb�for_reseller�_r{r6r6r7rs�sz"CloudlinuxLimits._check_user_ownercCs4|jds$|jdr$|jd|jd<|��|��S)z#
        Run `get` command
        z--reseller-namez--for-reseller)rq�_get_check_user�_get_action_list)rbr6r6r7ru�szCloudlinuxLimits._get_runc
Csn|jdp|jd}y|j�|�|�id�Wn8tk
rh}z|�t|j|jd��Wdd}~XYnXdS)z7
        Run `disable-reseller-limits` command
        z--reseller-namez
--reseller-idT)rer}N)	rqr\Zdisable_reseller_limitsrlrrorh�messager})rb�res_id�er6r6r7rv�sz)CloudlinuxLimits._disable_reseller_limitsc
Csv|jdp|jdpd}y |j�t|��|�id�Wn8tk
rp}z|�t|j|j	d��Wdd}~XYnXdS)Nz--reseller-namez
--reseller-idz--allT)rer})
rqr\Z#_set_container_limits_by_id_or_namer<rlrrorhr�r})rbr�r�r6r6r7rw�s

z(CloudlinuxLimits._enable_reseller_limitscCsP|��\}}|dk	r$|dk	r$||fS|j}|dr�y|�|d�}Wn8tk
r|}z|�t|j|jd��Wdd}~XYnXy|j�	|�}Wn:t
jk
r�}z|�t|j|jd��Wdd}~XYnX|�|�s�t
|�r�|�dd|id��||j|<�nJ|d}|�r�t|�}xf|D]^}y|j�	|�}Wn<t
jk
�rj}z|�t|j|jd��Wdd}~XYnX||j|<�qWd|jd<n�yt��|_Wn:tk
�r�}z|�t|j|jd��Wdd}~XYnXd	}xl|jD]b}y|j�|�d}Wn<t
jk
�r2}z|�t|j|jd��Wdd}~XYnX||j|<�q�Wd}||fS)
z|
        Determines users according to --lve-id/--username/--domain arguments
        Or build all panel users list
        Nz--domain)rer}z %(username)s is not a panel userr{z--reseller-namerSr�)r~rq�get_user_name_by_domainr2rorhr�r}r[�get_uidr�NoSuchUserException�get_package_name_by_user_id�boolrarrZget_panel_users_uid_list�_panel_uids_listr�	get_names)rb�uidr{�or��
reseller_nameZresellers_users�namer6r6r7r��sP((
(((z CloudlinuxLimits._get_check_usercCs|j�|�S)N)r\r�)rbr�r6r6r7r�%sz,CloudlinuxLimits.get_package_name_by_user_idcCs|||dd�}|dkrFd|d<d|d<|j�d�}|dk	r<|nd|d<n2|�|d�}|r`||d<|�|�|d<|�|�|S)	a?
        Retrives username, domain and reseller
        for supplied uid/username, for uid==0 returns '-'
        either reseller_name if has --for-reseller
        :param uid: uid
        :param username: username
        :return: dict {"id": uid, "username": username, "domain": domain, "reseller": reseller}
        rT)�idr{r|r�domainr{z--for-resellerNr|)rqrn�_get_user_main_domainr�_fix_single_uid_users)rbr�r{�userr�Zuser_main_domainr6r6r7�_get_username_domain_reseller(s	
z.CloudlinuxLimits._get_username_domain_resellercCs$y
|�|�Stk
rdSXdS)zP
        Retrives user's main domain
        :param username: User name
        N)�get_user_domainr2)rbr{r6r6r7r�Bs
z&CloudlinuxLimits._get_user_main_domain)r�cCsv|d}|j�|�}t|�dkr$dSxL|D]D}|�|�}|�|�}|dkr*|dkr*||d<||d<||d<dSq*WdS)	a
        Check and fix user info if some users with same uid present. See LU-1816 for details
        :param user: User info. Example:
            {'id': 10001, 'username': 'cltest2', 'reseller': 'admin', 'domain': 'cltest2.com'}
        :return: None
        r�r&NzN/ArTr�r|r{)r[r��lenr�r)rbr�r�Z	usernamesr{Zmain_domainr|r6r6r7r�Ls


z&CloudlinuxLimits._fix_single_uid_userscs�i}|j}|j��rd|d<nd|d<|ddkrN|j��rFd|d<nd|d<|j��rbd|d<nd|d<t|dt�r�|d�	d	�nd�t
�fd
d�tD��}g}|ddk�r&|d
dk�r&|ddk�r&y|jj
|d|dd�Wn:tk
�r$}z|�t
|j|jd��Wdd}~XYnXy|��}Wnbtk
�r�}zB|ddk�r�d|d<d|k�r�t
�|d<t|�|dd<d}Wdd}~XYnX�x�t|j�D�]|\}}|�||�}	|d�rH|j���rHy&|j�|	d�}
|
�r�dnd|	d<WnPtk
�rF}z0d|d<d|k�r&t
�|d<t|�|dd<Wdd}~XYnX|�|�|	d<|ddk	�s�|d
dk	�s�|ddk	�r�d|j_|j�||d�}|ddk�r�|d�r�|j���s�d|d<d|k�r�t
�|d<d|dd<n�|j���sd|d<d|k�rt
�|d<d|dd<n�y"|j�|�\}}
||
d�|d<Wn�tk
�r�}z0d|d<d|k�rpt
�|d<t|�|dd<Wdd}~XYn8tk
�r�}z|j|d<|j|d<Wdd}~XYnXt |d|d |d!|d"g��r|�ry�|d�r|j�!|	d�|	d<|d �r.|j�"|	d�|	d#<|d!�sB|d"�r�|jj#|	dd$d%�\}}|d!�r�d&|k�rxt
�|d&<||d&d'<|d"�r�d(|k�r�t
�|d(<||d(d'<WnPtk
�r}z0d|d<d|k�r�t
�|d<t|�|dd<Wdd}~XYnX|�$||�||	d)<|�%|	��q�Wt&|�|d*<||d+<|d�s�|jj'dk	�r�g}x0t(|jj'�D] }|�$||d)�|�%|��qdW||d,<ng|d,<|�)|d$�d-S).z3
        Process output for selected users
        �enabled�cageFS�disabledz--for-resellerN�quota�mySqlGovz--limitsrGc3s |]}|�p|�kfVqdS)Nr6)�.0�k)�lkr6r7�	<genexpr>~sz4CloudlinuxLimits._get_action_list.<locals>.<genexpr>z--lve-idz
--usernamez--domainz--human-readable-numbersz--reseller-name)r|)rer}�error�errorsF�cagefsr{�packagerFz'LVE Manager/quota package not installedz#Quotas not activated on this system)rHrIZwarningr}z	mysql-govzmysql-restrictz	mysql-cpuzmysql-ioZmySqlRestrictedT)�with_package_markr8rErCr@�items�users�	resellersr)*rqr]�is_cagefs_presentr^Zis_clquota_presentr_�is_governor_presentrgr<rJrhr)r\Z
_load_inforror�r}�can_get_governor_limitsrr rar��get_user_statusrr��
_package_data�get_limits_by_user_idZis_clquota_activatedZget_inodes_limits_by_uidrr�anyZget_governor_status_by_usernameZget_restrict_status_by_username�get_limits_by_user�_filter_limits�appendr�Z_resellers_datar!rl)rbrer��keysr�r�Zis_governor_availabler�r{r��
cagefs_statusr@Z
soft_limitZ
hard_limitZ	cpu_limitZio_limitZresellers_datar|r6)r�r7r�as�





 *(



"*






 
"









"

z!CloudlinuxLimits._get_action_listcCs�|j��rr|j��\}}|tjkr8dddid�}t|��|tjkrF|�|j��tkrXdSdddd�d�}t|��nd	ddid�}t|��d
S)a�
        Checks if the Governor limits can be retreived.

        After making sure that mysqlgov is installed and operational,
        checks that its mode is in [abusers single], user is reseller
        and resellers limits is OFF, or user belongs to admin.

        Only returns if it's True - otherwise constructs and throws MySQLGovException.
        Does it this way because these exceptions are caught in the web UI and displayed
        with optional localization.
        For localization of messages from here, see example:
        cpanel-lvemanager/spa/src/assets/i18n/hu-hu.json, key "Governor mode is not abusers or single"

        :raises MySQLGovException: Error from the Governor status check, or a constructed error
        for UI to display.
        :raises gov_error: If the Governor status check returned an error, reraises it here.
        :return: Whether it's possible to retrieve Governor limits in current state.
        :rtype: bool
        z%(util)s is currently disabled�utilZGovernor)r�r}Tz%(util)s mode is not %(mode)szabusers or single)r��modez%(util)s not present in systemN)	r_r�Zget_governor_statusrZDISABLEDrZERRORZget_governor_mode�MYSQL_GOV_ENABLED_MODE)rbZ
gov_statusZ	gov_errorZexc_messager6r6r7r��s 



z(CloudlinuxLimits.can_get_governor_limitscCs�x*dD]"}||s|�|d�r|�|�qW|dsJ|�dd�rJ|�d�|ds�|�dd�r�|d�dd�r�|d�d�|ds�|�d�|ds�|�dd�r�|d�dd�r�|d�d�|ds�|�d�d	S)
z�
        Remove limits that are stored as key: False in `keys` dict;
        Used for --limits key;
        :type keys: dict[str, bool]
        :type limits: dict[str, str | dict]
        )rNrOrMrPFrRrLrQr8r9rCN)rn�pop)rbr�r@r�r6r6r7r�)s

$
$zCloudlinuxLimits._filter_limitscCs |��\}}|��|�||�S)z#
        Run `set` command
        )�_set_check_userrr�_set_action)rbr�r{r6r6r7rt>szCloudlinuxLimits._set_runcs����\}}t�fdd�dD��}|dks2|dkrD|sD��ddi�t�fdd�tD��rxt�fdd�tD��sx||fS�jd	s�jd
dk	r�t�jd
�s�t�jd
�s��dd�jd
id
��n$��|�}t|�r��dd|i�||fS)z&
        Find user for modify
        csg|]}�j|�qSr6)rq)r��x)rbr6r7�
<listcomp>Osz4CloudlinuxLimits._set_check_user.<locals>.<listcomp>)z--mysql-unrestrict-allz--reseller-nameNrez1You must set lve-id or username for modify limitscsg|]}�j|�qSr6)rq)r�r�)rbr6r7r�Wscsg|]}�jd�|��qS)z--{})rqr?)r�r�)rbr6r7r�Xsz--reseller-namez--for-resellerz.Reseller limits for %(reseller)s are disabled.r|)rer}zOReseller limits for %s are enabled. Admin can`t set limits for resellers users.)	r~r�ror'r*rqrr#r)rbr�r{Zopts_without_userr�r6)rbr7r�Is$


z CloudlinuxLimits._set_check_usercCsXtdg�}t|Bt|Bt|Bt|Bd�|}tt|�|@�dkrPtt|�|@�SdSdS)z�
        Return keys to reset that are only acceptable to this type of limits
        :param list defaults: List of keys to reset
        :param str t: one of "lve", "cl-quota", "dbgov"
        r9)r$�lvpzcl-quota�dbgovrN)rmr*r+r.r,r��list)�defaults�tZall_keyr�r6r6r7�_clean_defaultsis

z CloudlinuxLimits._clean_defaultscCs@|j}|dp|d}|sdSt|�s<|�tdd|id��dS)z�
        If any reseller is specified in cli options ensures that it exists
        and really a reseller. Will exit with error if not.
        z--reseller-namez--for-resellerNzNo such reseller: %(reseller)sr|)rer})rqrrorh)rbr�r|r6r6r7rr|sz!CloudlinuxLimits._verify_resellerc		Cs�|j}d}d}|dr:|ddkr:|�||�\}}}d}n@|ddk	}d|d<|rf|�||�\}}}n|�|||�\}}}|p�dg}t|�r�tdd	�|D�d
�S|dkr�|j��|�|||||||�S)zl
        Process set limits command
        :param uid: User uid
        :param username: User name
        Fz--for-resellerz--lve-idrTz--reseller-nameNcss|]}|r|VqdS)Nr6)r��coder6r6r7r��sz/CloudlinuxLimits._set_action.<locals>.<genexpr>�*)rq�_set_reseller_action�_set_user_actionr��nextr\Zapply_all_limits�_make_set_action_response)	rbr�r{r��action_with_reseller_container�set_default_resellers_limits�is_lvectl_error�ret_listrer6r6r7r��s(

zCloudlinuxLimits._set_actioncs�|jstd�dS|�t��dd��|ds6|drV|sVd|j_d|j_|���n�d}d}	t	t
��|ddk	s~|ddk	r�|jj|d	d
�\|d<|d<xZt
|�D]N\}
}|
dd�}
|r�|
tkr�d	}	|r�|
tkr�d	}t|�}t|
}|�|�q�W|	�r�|�r�d|j_|�r"|j�|d��nF|�r\|j�|d
�}
|
d}|dk�rR|
d}|
d�n|j�|��dd�����fdd�t
��D��|�|�}|�r�||�d�g}|�d|i�n,||dk�r�dn||�d�g}|�d|i�|�|d	�dS)Nrdr)rfrez	--defaultz--unlimitedFz--mysql-cpuz
--mysql-ioT)r��z--for-resellerz--reseller-namer�r�r@cSst|t�r|�|�n|}|S)N)rgrhr;)�	old_valueZ	new_valuer6r6r7�update_func�s
z?CloudlinuxLimits._make_set_action_response.<locals>.update_funccs4i|],\}}|�kr&��|�|�n�||�qSr6r6)r��keyrA)�
getted_limits�
setted_limitsr�r6r7�
<dictcomp>�sz>CloudlinuxLimits._make_set_action_response.<locals>.<dictcomp>)r�r�r@r�rSrT)r�r{r|r@r�)rj�printr;rir^Z_inode_user_limitsr\r�r�rrhr_r�r r(r*r<�
OUT_LIMITSZ#get_default_limits_by_reseller_nameZget_limits_by_reseller_namer�rrl)rbr�r�r�rer�r�r{Z
is_lve_limitsZ	is_limitsr�rAZ
value_funcZgetted_reseller_datar�r�r�r6)r�r�r�r7r��sj





z*CloudlinuxLimits._make_set_action_responsec
sd}g}t�}�d}t�fdd�tD��r�ddi�t��fdd�tD��}��d�|d	<y|j�|||�}	|�|	�Wn8tk
r�}
z|�t|
j	|
j
d
��Wdd}
~
XYnX�d�r�y|j�||�d}Wn:tfk
�r}
zd}t|
j	|
j
d
�}Wdd}
~
XYnX|�r2d
|d<t�|d<||dd<y"|dk�rJ|j�
|�d}d}
Wn:tfk
�r�}
zd}t|
j	|
j
d
�}
Wdd}
~
XYnX|�r�d
|d<d|k�r�t�|d<|
|dd<d}	|�|	��ddk	�r�y4|��dd�}|dk	�r|j�||�d}d}Wn:tfk
�rH}
zd}t|
j	|
j
d
�}Wdd}
~
XYnX|�rnd
|d<t�|d<||dd<�ddk�r�y.|��dd�dk	�r�|j�|�d}d}
Wn:tfk
�r�}
zd}t|
j	|
j
d
�}
Wdd}
~
XYnX|�rd
|d<d|k�rt�|d<|
|dd<y8|��dd�}|j���rJ|dk	�rJ|j�||�WnRtfk
�r�}
z0d|k�rvt�|d<t|
j	|
j
d
�|dd<Wdd}
~
XYnXd}	|�|	��d�r,y8�ddk�r�d}nd}|j�||�d}	|�|	�Wn:tk
�r*}
z|�t|
j	|
j
d
��Wdd}
~
XYnXt�fdd�tD���r��y�|���rB�d�r��ddk}y|j�||�}	|�|	�Wn:tk
�r�}
z|�t|
j	|
j
d
��Wdd}
~
XYnX�d�r.�ddk}y|j�||�}	|�|	�Wn:tk
�r,}
z|�t|
j	|
j
d
��Wdd}
~
XYnX�d�r�y|j��}	|�|	�Wn:tk
�r�}
z|�t|
j	|
j
d
��Wdd}
~
XYnXt�fdd�tD���rB�d �d!}}|d"k�r�|j�d#��s�d$}d$�d!<y,|j� |d%k�r�d&n|||�}	|�|	�Wn:tk
�r@}
z|�t|
j	|
j
d
��Wdd}
~
XYnXWn:tk
�r~}
z|�t|
j	|
j
d
��Wdd}
~
XYnX�d'�r�y0|jj!|�d'��dd�d(�d}	|�|	�Wn:tk
�r�}
z|�t|
j	|
j
d
��Wdd}
~
XYnX|||fS))NFz--for-resellerc3s|]}�d|VqdS)z--%sNr6)r��s)r�r6r7r�sz4CloudlinuxLimits._set_user_action.<locals>.<genexpr>rR�mepc3s6|].}�d|dk	r��||��d|fVqdS)z--%sN)rn)r�r�)�
limits_mapr�r6r7r�sz--save-all-parameterszsave-all-parameters)rer}z--unlimitedTr��lvectlr�r�rz	--defaultr$zcl-quotar�r�z--cagefsr�c3s|]}�d|VqdS)z--%sNr6)r�r�)r�r6r7r�sz--mysql-govZwatchedz--mysql-restrictZ
restrictedz--mysql-unrestrict-allc3s|]}�d|VqdS)z--%sNr6)r�r�)r�r6r7r��sz--mysql-cpuz
--mysql-ior&z1.2-17r�rS�defaultz--inodes)Zforce)"rhr�r*rnr\Zset_lve_limits_by_user_idr�rror�r}Zset_lve_unlimitedr^Z set_user_inodes_limits_unlimitedrr�Zreset_lve_limitsZreset_user_inodes_limitsr_r�Zreset_user_limits_to_defaultsrr]Zset_user_statusrr-r�Zset_governor_status_for_userZset_restricted_status_for_userZ%set_unrestricted_status_for_all_usersr,Z_is_governor_newer_thenZset_limits_for_userZset_user_inodes_limits)rbr�r�r{r�r�rer�r@�ret_coder��lvectl_error_dictZis_quota_errorZquota_error_dict�lve_defaultsZ
gov_limitsZnew_user_status�str8rCr6)r�r�r7r�
s

(
"

"



"
"



*

(

(
(

(,(
(z!CloudlinuxLimits._set_user_actionc
sd}t�}g}t�fdd�tD��r�ddi�t��fdd�tD��}yF�jddk	rj�j��jd|�}n�j��jd	|�}|�|�Wn8tk
r�}z��	t|j
|jd
��Wdd}~XYnX|ddk	�rtyB��|dd�}	|	dk	�r
�j�
|d	|	�}|�|�d}d}
Wn:tfk
�rN}zd
}t|j
|jd
�}
Wdd}~XYnX|�rtd|d<t�|d<|
|dd<|d�ry�j�|d	�d}
Wn:tfk
�r�}zd
}t|j
|jd
�}
Wdd}~XYnX|�r�d|d<t�|d<|
|dd<d}|�|�|||fS)NFc3s|]}�jd|VqdS)z--%sN)rq)r�r�)rbr6r7r��sz8CloudlinuxLimits._set_reseller_action.<locals>.<genexpr>rRr�c3s:|]2}�jd|dk	r��||��jd|fVqdS)z--%sN)rqrn)r�r�)r�rbr6r7r��sz--lve-idz--for-resellerz--reseller-name)rer}z	--defaultr�Tr�r�r�z--unlimitedr)rhr�r+rqr\Zset_lvp_defaults_by_reseller_idZset_lvp_limits_by_reseller_idr�rror�r}r�Zreset_reseller_limitsZset_lvp_unlimited)rbr�r�r�rer�r@r�r�r�r�r6)r�rbr7r��sV
(

"

"

z%CloudlinuxLimits._set_reseller_actioncCs6tdd�}tdd�|D��|_tdd�|D��|_dS)N)Zcploginr|Zdns)Zkeylscss|]}|d|dfVqdS)rr&Nr6)r��ir6r6r7r��sz/CloudlinuxLimits._init_cache.<locals>.<genexpr>css|]}|d|dfVqdS)rr�Nr6)r�r�r6r6r7r��s)r
rh�_user_to_reseller�_userdomain_cache)rb�infor6r6r7�_init_cache�s
zCloudlinuxLimits._init_cachecCsF|jdkr4y|��Wntk
r2t�|_YnX|j�|d�}|S)zi
        Try to get reseller for given username;
        :type username: str
        :rtype: str
        NrT)r�r�r	rhrn)rbr{r�r6r6r7r�s
z#CloudlinuxLimits._get_reseller_namecCsB|jdkr4y|��Wntk
r2t�|_YnX|j�|d�S)z~
        Retrive main domain for supplied user
        :param username: User name
        :return: Domain name or N/A
        NzN/A)r�r�r	rhrn)rbr{r6r6r7r�s
z CloudlinuxLimits.get_user_domainc
Cs^yt|�}|r|SWn2ttfk
rF}ztt|���Wdd}~XYnXtdd|id���dS)zn
        Retrive username by domain
        :param domain_name: Domain name
        :return: Username
        NzThere is no domain '%(domain)s'r�)r�r})r�IOErrorr	r2r<)rbZdomain_namer{r�r6r6r7r�sz(CloudlinuxLimits.get_user_name_by_domainc
Cs|j}d\}}dd�}|ds*|ddkrr|d}|�|�}t|�}|sft|�rfdd�}|�||��||j|<n�|dr�|d}y|j�|�}Wn:tj	k
r�}z|�t
|j|jd��Wd	d	}~XYnX|�|�}|s�t|�r�|�||��||j|<||fS)
a
        User identification from CLI options. Common for all commands.
        May return (None, None) when user wasn't specified in any way and this
        is a *valid* case when we want to list all users with command like:
        "... get --json --for-reseller=reseller1"
        )NNcSsdd|id�S)Nz %(username)s is not a panel userr{)rer}r6)r{r6r6r7rB*sz.CloudlinuxLimits._check_user.<locals>.<lambda>z--lve-idrcSsdd|id�S)Nz%(uid)s is not a panel userr�)rer}r6)r�r6r6r7rB6sz
--username)rer}N)
rqr�rr�rorar[r�rr�rhr�r})rbr�r�r{Z_username_messageZuser_packageZ_uid_messager�r6r6r7r~!s,
(

zCloudlinuxLimits._check_userr&c
Cs�|jr$|�dt��i�t|d�nXy tt|d�|�di��Wn6tk
rz}ztdt|�|f�Wdd}~XYnXt�	|�dS)z�
        Print error and exit

        :param message dict: Dictionary with keys "result" as string and optional "context" as dict
        rfTrer}zError: %s [%s]N)
rjr;rirr�r<rn�KeyError�sys�exit)rbr�Z
error_coder�r6r6r7roLs &z CloudlinuxLimits._error_and_exit)Frd)r&),r3r4r5�__doc__rqrjr�rar�r�rXrcrlryrprsrurvrwr�r�r�r�rhr�r�r�r�rtr��staticmethodr�rrr�r�r�r�r�rr�r�r~ro�
__classcell__r6r6)rZr7rUFsP
% :
. (Z-9
+rUc@s$eZdZdd�Zdd�Zdd�ZdS)rWcCs"t�|_t�|_t�|_i|_dS)N)rr[rr]r/r`ra)rbr6r6r7rc_szCloudlinuxLimitsNoLve.__init__cCs>ddlm}yt||�d�}Wntk
r8d}YnX|S)z�
        Get package name by user id.
        None package returns as str(None) for user checker compatibility:
          'not str(None)' is True
        :param: id - user/lve id
        :return: Package name
        r)�reseller_package_by_uidr&r�)�clcommon.cpapir�r<�
IndexError)rbZuser_idr�Zpackage_namer6r6r7r�es
z1CloudlinuxLimitsNoLve.get_package_name_by_user_idc
sdi}|j}|j��rd|d<nd|d<t|dt�rB|d�d�nd�t�fdd�tD��}g}x�t|j	�D]�\}}|�
||�}|d	�r
|j���r
y$|j�|d
�}|r�dnd|d<WnNtk
�r}	z.d|d<d|kr�t�|d<t|	�|dd<Wdd}	~	XYnX|�
|�|d
<i|d<|�|�qlWt|�|d<||d<|d�sTg|d<|�|d�dS)z3
        Process output for selected users
        r�r�r�z--limitsrGNc3s |]}|�p|�kfVqdS)Nr6)r�r�)r�r6r7r��sz9CloudlinuxLimitsNoLve._get_action_list.<locals>.<genexpr>r�r{r�r�r�r@r�r�z--for-resellerr�Tr)rqr]r�rgr<rJrhr)r rar�r�rr�r�r�rl)
rbrer�r�r�r�r{r�r�r�r6)r�r7r�us8

 
"
z&CloudlinuxLimitsNoLve._get_action_listN)r3r4r5rcr�r�r6r6r6r7rW]srW)HZ
__future__rrrr�ri�collectionsrZclcommonrZclcommon.clexceptionrr�rr	r
rrr
rrrrZclcommon.cpapi.cpapiexceptionsrZclcommon.librrrZ	cli_utilsrrZ	cllicenserZcllimitsrrrrZcllimits.clquota_librrrZfuture.utilsr r!Z	lvectllibr"r#r$Z
past.builtinsr%Zarg_parsersr'r(r)r*r+r,r-r.r/r0Zutilsr1r2r�ZADMIN_RESELLER_NAMESr��objectrUrWr6r6r6r7�<module>sP00