5/9eD ddlmZddlmZddlmZddlmZddlZddlZddlm Z ddl m Z m Z ddl mZmZdd lmZdd lmZdd lmZmZmZd d lmZmZmZmZmZmZmZm Z m!Z!m"Z"ddl#m$Z$m%Z%m&Z&d dl'm(Z(ddl)m*Z*m+Z+ddl,m-Z-m.Z.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;ddlm?Z?Gdde=Z@dddddddddd d! ZAgd"ZBd#d$gZCGd%d&eDZEGd'd(eEZFdS)))print_function)absolute_import)division) basestringN)ClPwd) MySQLGovernorMySQLGovException) iteritems itervalues)CloudlinuxLicenseLib) defaultdict)convert_to_kernel_formatis_active_reseller_limitslve) CloudlinuxLimitsOptsParserCloudlinuxLimitsNoLveOptsParserAVAILABLE_LIMITSAVAILABLE_LVE_KEYSAVAILABLE_MYSQL_KEYSAVAILABLE_QUOTA_KEYSAVAILABLE_KEYSAVAILABLE_LVP_KEYSADMIN_ONLY_OPTIONSAVAILABLE_MYSQL_KEYS_ALL)QuotaDisabledExceptionClQuotaException ClQuotaLib)convert_mem_value_to_bytes)print_dictionaryreplace_params)LveCtlCageFsCageFsExceptionLvectlException) cpinforeseller_users is_reseller getCPName NotSupported domain_owneris_adminget_main_username_by_uidFeatureis_panel_feature_supported)FormattedException) EncodingErrorceZdZdS)DomainExceptionN)__name__ __module__ __qualname__py/cllimits/lib/limits.pyr3r3%sDr8r3c |ddttt|rd|n|dziS)Ncpuallz{}%d)updatestrintrisdigitformatlimitsvalues r9rF*sy 5M s3/u}}1; U0C0C0C5:<<==@CDEEr8c<|dd|iS)Nior<r>rCs r9rFrF/st 3 3UEN C Cr8c<|dd|iS)Nr;mysqlrIrCs r9rFrF0sve}';';WesplitstriprCs r9rFrF2seF8$4$;$; C  #))++ C  #))++==%%r8c0|d|iS)NeprIrCs r9rFrF6s6==$+G+Gr8c0|d|iS)NnprocrIrCs r9rFrF7s6=='51A#B#Br8cJ|dt|iS)Npmemr>rrCs r9rFrF8$ MM65e<<=>>r8cJ|dt|iS)Nvmemr[rCs r9rFrF:r\r8c0|d|iS)NiopsrIrCs r9rFrF<s&--"@"@r8) speedrH mysql-cpumysql-iorN maxEntryProcsrXrZr^r`)rootadmin-abuserssingleceZdZdZdZdZdZdZdZdZ fdZ dZ d&dZ dZ d Zd Zd Zd Zd ZdZdZdZdZdefdZdZdZdZdZdZedZdZ dZ!dZ"dZ#dZ$dZ%d Z&d!Z'd"Z(d#Z)d'd%Z*xZ+S)(CloudlinuxLimitsz2 Class for run cloudlinux-limits commands NFcttjs2ttt t St|SN)r/r.LVEsuperrkCloudlinuxLimitsNoLve__new__)cls __class__s r9rqzCloudlinuxLimits.__new__SsM)'+66 a)+@AAIIJ_`` `wws###r8ct|_t|_t |_t |_t|_ t|_ i|_ dS)z# Empty constructor N) r_clpwdr"_lvectlr#_cagefsr _cl_quotar_mysql_governorr _opts_parser _users_listselfs r9__init__zCloudlinuxLimits.__init__XsZ gg xx xx #,688r8successct|tr)||tjdt ||jp|dS)z Output data wrapper :param: `dict` data - data for output to stdout :param: `bool` force_json - always output json format )result timestampN) isinstancedictr>timer _is_json)r}data force_jsonrs r9 print_datazCloudlinuxLimits.print_datagsT dD ! ! F KK6 DD E E Et}: ;;;;;r8ct}|sd|_|ddiSd|v|_|||_|jds|jdrItjs6|dd ti|jd*tj s|dd i| | |jd r|S|jd r|S|jd r|S|jd r|S|ddiS)z$ Run command action TrzCloudlinux license isn't validz--json--for-reseller--reseller-namez;--for-reseller/--reseller-name options not supported on {}.NzEReseller limits are not supported. Can not use --for-reseller option.setgetzdisable-reseller-limitszenable-reseller-limitszUnknown action, exit)r get_license_statusr_error_and_exit _parse_args_optsrris_panel_supportedrBr)reseller_limit_supported_verify_reseller_check_user_owner_set_run_get_run_disable_reseller_limits_enable_reseller_limits)r}argvlicences r9runzCloudlinuxLimits.runrs'(())++ V DM''3S(TUU U D( %%d++ :>>* + + tz~~>O/P/P )++ $$[bbclcncnoo& :>>* + + 7@\@^@^ 7  a"        :e  L==?? " Z  L==?? " Z1 2 L0022 2 Z0 1 L//11 1''3I(JKK Kr8c|j||j\}}|s"|t |t |dt rd|d<|S)z% Parse CLI arguments --lve-idr)rz parse_argsrrr!rr)r}rstatusrs r9rzCloudlinuxLimits._parse_argssn(33D$-HH  7  !5!5 6 6 6 d:& 3 3 ! D  r8c(|jd}|sdS|jddkrdS|\}}|dvrdS|||kr|d||dddSdS) z Checks that specified reseller is an owner of specified user and terminate program if need :return: rNrr)NN/Az2%(username)s is not owned by reseller %(reseller)s)usernameresellerrcontext)rr _check_user_get_reseller_namer)r} for_reseller_rs r9rz"CloudlinuxLimits._check_user_owners z~~&677   F :>>* % % * * F&&(( 8 } $ $ F 4228<< < <  N ( ,""      = >*:;;L/;/G||SD   $99$z:JKK  2!1X#66x@@D   & &t , , , r8cP ||S#t$rYdSwxYw)zP Retrives user's main domain :param username: User name N)get_user_domainr3r}rs r9rz&CloudlinuxLimits._get_user_main_domain?s=  ''11 1   44 s  %%rc|d}|j|}t|dkrdS|D]J}||}||}|dkr|dkr||d<||d<||d<dSKdS) 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 rrNrrgrrr)rurlenrr)r}rr usernamesr main_domainrs r9rz&CloudlinuxLimits._fix_single_uid_usersIs4jK))#.. y>>Q   F!  H44X>>K..x88He##C!,X#+Z #+Z   r8cr i}|j}|jrd|d<nd|d<|d$|jrd|d<nd|d<|jrd|d<nd|d<t|dtr|d d ndtfd tD}g}|d |d w|d o |j |d|dnE#t$r8}|t|j|jYd}~nd}~wwxYw |}nW#t&$rJ}|ddkr2d|d<d|vr)t|d<t||dd<d}Yd}~nd}~wwxYwt)|jD]\}}|||} |dr|jrt |j| d} | rdnd| d<nI#t0$r<}d|d<d|vrt|d<t||dd<Yd}~nd}~wwxYw||| d<|d |d |d  d|j _|j ||d} |d|dr|js&d|d<d|vrt|d<d|dd<n|js&d|d<d|vrt|d<d|dd<n |j|\} } | | d| d<no#t<$r<}d|d<d|vrt|d<t||dd<Yd}~n.d}~wt>$r}|j|d<|j|d<Yd}~nd}~wwxYwtA|d|d|d |d!gr)|r& |dr#|j!| d| d<|dr#|j"| d| d"<|d s|d!ru|j#| dd#$\}}|d r d%| vrt| d%<|| d%d&<|d!r d'| vrt| d'<|| d'd&<nI#t&$r<}d|d<d|vrt|d<t||dd<Yd}~nd}~wwxYw|$|| | | d(<|%| tM||d)<||d*<|dsf|j j'Ug}tQ|j j'D]3}|$||d(|%|4||d+<ng|d+<|)|d#d,S)-3 Process output for selected users enabledcageFSdisabledrNquotamySqlGov--limitsrOc3*K|] }| p|vfVdSrmr7.0klks r9 z4CloudlinuxLimits._get_action_list..{3EEqQB)!r'*EEEEEEr8r --usernamerz--human-readable-numbersr)rrerrorerrorsFcagefsrpackagerNz'LVE Manager/quota package not installedz#Quotas not activated on this systemrPwarningrz mysql-govzmysql-restrictrbrcmySqlRestrictedTwith_package_markr;rKrHrDitemsusers resellersr)*rrwis_cagefs_presentrxis_clquota_presentryis_governor_presentrr?rSrrrv _load_infor%rrrcan_get_governor_limitsr r r{rget_user_statusr$r _package_dataget_limits_by_user_idis_clquota_activatedget_inodes_limits_by_uidrranyget_governor_status_by_usernameget_restrict_status_by_usernameget_limits_by_user_filter_limitsappendr_resellers_datar r)r}rrkeysrris_governor_availablerrr cagefs_statusrD soft_limit hard_limit cpu_limitio_limitresellers_datarrs @r9rz!CloudlinuxLimits._get_action_list^s  J < ) ) + + *(F8  )F8    &~0022 -"+w",w   3 3 5 5 ,!*F:  !+F: )3AjM3)G)G QQz]  % % %TEEEE4DEEEEE Z= Q|_%<:AV P ''*D(EPQRcPd'eeee" P P P$$TAI%N%N%NOOOOOOOO P *$($@$@$B$B ! !  * * *j!Y..%,z"6))'+vvF8$36q66F8$Z0$) ! ! ! ! ! !  *'t'788P P MC55c8DDDH~ 8$,"@"@"B"B 88$(L$@$@jAQ$R$RM2?%OYYZDNN&888'.F8$v--+/66x(14QF8$X...... 8#>>sCCDO}(AlO,G1Z=Kd-1 *\77Q?Y=Z[[F!"*>:><<>>:*1w#611/3vvF8,4]x(11!^@@BB:*1w#611/3vvF8,4Yx(11 :59^5\5\]`5a5a2J 8BJ/W/WF8,,5???.5F7O'v553766x 08;AF8,W555555/:::01 F9-01 F9------: D%t,<'=tK?PRVWaRbcdd :- ::K(r+/+?+_+_`deo`p+q+qZ(,-y262F2f2fgklvgw2x2x./K( =D,< =.2.B.U.UVZ[eVfhl/V/n/n+ 8 ,?$F2204u 5>F5M'2 +=#611/3vvt 4|dd|ds|dd Sd Sd Sd Sd 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] )rZr^rXr`FrdrVrar;r<rHN)rpop)r}rrDrs r9rzCloudlinuxLimits._filter_limits s3  A7 vzz!U33  1 O$ D%)@)@  JJt   G} "E5!9!9 "fUm>O>OPUW\>]>] " 5M  e $ $ $%= " 5!!!Dz !fjju55 !&,:J:J5RW:X:X ! 4L  U # # #$< ! 4      ! ! ! ! ! ! ! !r8c|\}}||||S)z# Run `set` command )_set_check_userr _set_action)r}rrs r9rzCloudlinuxLimits._set_runsA ,,.. X X...r8c\}}tfddD}|||sdditfdtDr$tfdtDs||fSjdsjd Zt jd s@tjd s%d d jd id n>|}t|rdd |zi||fS)z& Find user for modify c*g|]}j|Sr7rrxr}s r9 z4CloudlinuxLimits._set_check_user../s f f f1A f f fr8)--mysql-unrestrict-allrNrz1You must set lve-id or username for modify limitsc*g|]}j|Sr7rrs r9rz4CloudlinuxLimits._set_check_user..7s:::! 1 :::r8cPg|]"}jd|#S)z--{})rrBrs r9rz4CloudlinuxLimits._set_check_user..8s,QQQ 6==#3#34QQQr8rrz.Reseller limits for %(reseller)s are disabled.rrzOReseller limits for %s are enabled. Admin can`t set limits for resellers users.) rrrrrrr,rr)r}rropts_without_userrs` r9rz CloudlinuxLimits._set_check_user)s((** X f f f f8e f f fgg K8+5F+  (,_!` a a a ::::'9::: ; ; !QQQQ>PQQQRR != z+, kz*+7TdIe@f@f701-=+>  F8$$   7#X."""       r8c |j}d}d}|dr)|ddkr|||\}}}d}nG|ddu}d|d<|r|||\}}}n||||\}}}|pdg}t|rt d|Dd S|dkr|j||||||||S) zl Process set limits command :param uid: User uid :param username: User name FrrrTrNc3K|]}||V dSrmr7)rcodes r9rz/CloudlinuxLimits._set_action..s';;$d;;;;;;;r8*)r_set_reseller_action_set_user_actionrnextrvapply_all_limits_make_set_action_response) r}rrraction_with_reseller_containerset_default_resellers_limitsis_lvectl_errorret_listrs r9rzCloudlinuxLimits._set_actionks@ J).&',$   \1Z=A#5#5150I0I!S0Q0Q -OXv+/ ( (-./@-A-M * AjM- \484M4MaQT4U4U166484I4I!SRZ4[4[16?s x== A;;(;;;R@@ @ !88 L ) ) + + +--.L.=q&.J.18== =r8c|jstddS|tjdd|ds|dr0|s.d|j_d|j_|nd}d} tt|d|d%|j |d \|d<|d<t|D]Q\} } | d d} | r@| tvr7d } | r | tvrd }t!| } t"| } | | R| r|rd|j_|r!|j|d nW|r;|j|d } | d}|| d}| dn|j|dfdtD||}|r||dg}|d|in'||dkrdn||dg}|d|i||d dS)Nrr)rr --default --unlimitedF --mysql-cpu --mysql-ioTrrrrrrDc`t|tr||n|}|Srm)rrr>) old_value new_values r9 update_funcz?CloudlinuxLimits._make_set_action_response..update_funcs6%i662%,,Y7777(1I((r8c`i|]*\}}||vr||n|+Sr7r7)rkeyrE getted_limits setted_limitsrDs r9 z>CloudlinuxLimits._make_set_action_response..s`%%%'C-//)[s);]3=OPPP*3/%%%r8)rrrDrrerg)rrrrDr)rprintr>rrx_inode_user_limitsrvrrr rryrr rrr? OUT_LIMITS#get_default_limits_by_reseller_nameget_limits_by_reseller_namerrr)r}r7r9rrr8rr is_lve_limits is_limitsrFrE value_funcgetted_reseller_datarrrrGrHrDs @@@r9r6z*CloudlinuxLimits._make_set_action_responses}  )   1       kNK *a .K *K *04DN -)-DL &  ! ! # # # #!MI'--M+q/J594H4[4[\dnr5\5t5t1- !L/'ll 5 5 U!""g5SN22 $I-(:!:!:(, JJE!+CJJ}e4442 4 15DL.3T)- (X(XYZ[kYl(m(m 9 T48<3[3[\]^o\p3q3q0';F'CH"{&:4&@,@,JMM,0L,N,Ns,S,SM)))%%%%%%+4M*B*B %%%M!% 7 7 A A 14! ("/""!I MM; ":;;;;#&/76/A/Ax(5&3 EMM7E"2333 OOFD ) ) )qr8c>d}g}t}d}tfdtDrdditfdtD}d|d< |j|||} || nE#t$r8} |t| j | j Yd} ~ nd} ~ wwxYwd r |j ||d} n5#tf$r'} d }t| j | j } Yd} ~ nd} ~ wwxYw|r!d |d <t|d<| |dd < ||j |d} d} n5#tf$r'} d } t| j | j } Yd} ~ nd} ~ wwxYw| r%d |d<d|vrt|d<| |dd<d} || d |dd}||j||d}d} n5#tf$r'} d }t| j | j } Yd} ~ nd} ~ wwxYw|r!d |d <t|d<| |dd <d= |dd|j |d} d} n5#tf$r'} d } t| j | j } Yd} ~ nd} ~ wwxYw| r%d |d<d|vrt|d<| |dd< |dd}|jr||j||nQ#t*f$rC} d|vrt|d<t| j | j |dd<Yd} ~ nd} ~ wwxYwd} || dr ddkrd }nd}|j||d} || nE#t0$r8} |t| j | j Yd} ~ nd} ~ wwxYwtfdt2Dr |rjdrddk} |j||} || nE#t*$r8} |t| j | j Yd} ~ nd} ~ wwxYwdrddk} |j||} || nE#t*$r8} |t| j | j Yd} ~ nd} ~ wwxYwdru |j} || nE#t*$r8} |t| j | j Yd} ~ nd} ~ wwxYwtfdt<Drdd }}|d!kr!|jd"sd#}d#d < |j |d$krd%n|||} || nE#t*$r8} |t| j | j Yd} ~ nd} ~ wwxYwnE#t*$r8} |t| j | j Yd} ~ nd} ~ wwxYwd&r |j !|d&dd'd} || nE#t$r8} |t| j | j Yd} ~ nd} ~ wwxYw|||fS)(NFrc3.K|]}d|zVdSz--%sNr7rsrs r9rz4CloudlinuxLimits._set_user_action..s+99q!}999999r8rdmepc3pK|]0}d|z ||d|zfV1dSrU)r)rr limits_maprs r9rz4CloudlinuxLimits._set_user_action..s[NNA34VaZ=3L&>>!Q//6A:?3L3L3L3LNNr8z--save-all-parameterszsave-all-parametersrr=Trlvectlrrrr<rr&r'rz--cagefsrc3.K|]}d|zVdSrUr7rVs r9rz4CloudlinuxLimits._set_user_action.._s+??q!}??????r8z --mysql-govwatchedz--mysql-restrict restrictedr c3.K|]}d|zVdSrUr7rVs r9rz4CloudlinuxLimits._set_user_action..zs+GGQ1VaZ=GGGGGGr8r>r?rz1.2-17r@redefaultz--inodes)force)"rrrrrvset_lve_limits_by_user_idrr%rrrset_lve_unlimitedrx set_user_inodes_limits_unlimitedrr,reset_lve_limitsreset_user_inodes_limitsryrreset_user_limits_to_defaultsr rwset_user_statusr$rrset_governor_status_for_userset_restricted_status_for_user%set_unrestricted_status_for_all_usersr_is_governor_newer_thenset_limits_for_userset_user_inodes_limits)r}rrrr9r:rrrDret_coderlvectl_error_dictis_quota_errorquota_error_dict lve_defaults gov_limitsnew_user_statusstr;rHrZs ` @r9r3z!CloudlinuxLimits._set_user_actions *+ 9999&8999 9 9 P)51JNNNNN/NNNNNF,-EE2I,J,JF( ) P<AA#v}]]))))" P P P$$TAI%N%N%NOOOOOOOO P ]  & N ..sMBBB$(!!#% N N N"&$( 19$M$M$M!!!!!! N ?#*x #'66x ->x * M (NCCCHHH!&#'  $& M M M!%#'qy!)#L#L#L       M =")w6))'+vvF8$,<x )H OOH % % % [> % N#33AkNEJJ +L11#|DDD"'$(!!#% N N N"&$( 19$M$M$M!!!!!! N ?#*x #'66x ->x *!"*Q++AkNJGGS??DDD%*N'+$$(*QQQ%)N'+19ai'P'P'P$$$$$$Q"A&-F7Ov--+/66x(0@F8$W-]!%!5!5a ng!N!NJ+??AAajF\,JJ8U_```),]]]v--+/66x(37qyRSR[3\3\3\F8$Z000000] H OOH % % % Z= P PZ=I--&*OO&+O ,,XGGG))))" P P P$$TAI%N%N%NOOOOOOOO P ????&>??? ? ?+ P* P//11'\'\}-:\'+';'X'XYace'f'fH$OOH55550\\\ 00QYPQPY1Z1Z1Z[[[[[[[[\+,\12lB\'+';'Z'Z[ceg'h'hH$OOH55550\\\ 00QYPQPY1Z1Z1Z[[[[[[[[\12\\'+';'a'a'c'cH$OOH55550\\\ 00QYPQPY1Z1Z1Z[[[[[[[[\GGGG2FGGGGG\"#M"2AlOR 774+?+W+WX`+a+a7!"B./AlO\'+';'O'O]eio]o]oPYPYu}PSUW(Y(YH$OOH55550\\\ 00QYPQPY1Z1Z1Z[[[[[[[[\$ P P P$$TAI%N%N%NOOOOOOOO P Z= P P55:aee4KU.S.S6))))# P P P$$TAI%N%N%NOOOOOOOO P&00s;1B-- C/7.C**C/<D E %EE 3 F GGG=I JI<<J1:K,, L7LL AN O*'9O%%O* AQ R.RR8)\8"0T\8 U.U \8U\8-0V\8 W (.W\8W  \8,.X\8 Y%.Y\8YA\889[21\82 \4<.\/*\8/\44\88 ]:.]55]:A_ `.``c d}t}g}tfdtDrddi t fdtD} jd'jjd|}n&jjd|}||nE#t$r8} t|j |j Yd}~nd}~wwxYw|d  |d d } | 6j |d| }||d}d} n5#tf$r'}d }t|j |j } Yd}~nd}~wwxYw|r!d |d<t|d<| |dd<|dr j|dd} n5#tf$r'}d }t|j |j } Yd}~nd}~wwxYw|r!d |d<t|d<| |dd<d}|||||fS)NFc38K|]}jd|zVdSrUr)rrWr}s r9rz8CloudlinuxLimits._set_reseller_action..s.BB!tz&1*%BBBBBBr8rdrXc3K|]:}jd|z||jd|zfV;dSrU)rr)rrrZr}s r9rz8CloudlinuxLimits._set_reseller_action..saWWQ37:fqj3I3U&>>!Q//FQJ1GH3U3U3U3UWWr8rrrrr<r%Trr[rr=r)rrrrrvset_lvp_defaults_by_reseller_idset_lvp_limits_by_reseller_idrr%rrrr,reset_reseller_limitsset_lvp_unlimited) r}rrr9rr:rDrorrsrprZs ` @r9r2z%CloudlinuxLimits._set_reseller_actions  BBBB/ABBB B B P)51JWWWWW/WWWWWF P:j)5 $|KKDJWgLhjpqqHH $|II$*UfJgioppH))))" P P P$$TAI%N%N%NOOOOOOOO P [> % N#33AkNEJJ +#|AA!DUBVXdeeHOOH---"'$(!!#% N N N"&$( 19$M$M$M!!!!!! N ?#*x #'66x ->x * ]  & N ..q1B/CDDD$(!!#% N N N"&$( 19$M$M$M!!!!!! N ?#*x #'66x ->x *H OOH % % %&00sJA/C D .DD AE22 F$=FF$"G66 H(H##H(ctd}td|D|_td|D|_dS)N)cploginrdns)keylsc36K|]}|d|dfVdS)rrNr7ris r9rz/CloudlinuxLimits._init_cache...&B&B!ad|&B&B&B&B&B&Br8c36K|]}|d|dfVdS)rr@Nr7rs r9rz/CloudlinuxLimits._init_cache..rr8)r&r_user_to_reseller_userdomain_cache)r}infos r9 _init_cachezCloudlinuxLimits._init_cachesW:;;;!%&B&BT&B&B&B!C!C!%&B&BT&B&B&B!C!Cr8c|j9 |n##t$rt|_YnwxYw|j|d}|S)zi Try to get reseller for given username; :type username: str :rtype: str Nrg)rrr*rr)r}rrs r9rz#CloudlinuxLimits._get_reseller_namesr  ! ) 0  """" 0 0 0)-&&& 0.228SAA  >>c|j9 |n##t$rt|_YnwxYw|j|dS)z~ Retrive main domain for supplied user :param username: User name :return: Domain name or N/A Nr)rrr*rrrs r9rz CloudlinuxLimits.get_user_domainsm  ! ) 0  """" 0 0 0)-&&& 0%))(E:::rc t|}|r|Sn5#ttf$r!}tt |d}~wwxYwtdd|id)zn Retrive username by domain :param domain_name: Domain name :return: Username NzThere is no domain '%(domain)s'rr)r+IOErrorr*r3r?)r} domain_namerrs r9rz(CloudlinuxLimits.get_user_name_by_domains  *#K00H  & * * *!#a&&)) ) **K+3[*ACCDD DsAAAc|j}d\}}d}|ds |ddkri|d}||}t|}|s0t|r!d}|||||j|<n|dr|d} |j|}nJ#tj $r8}|t|j |j Yd}~nd}~wwxYw||}|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" )NNcdd|idS)Nrrrr7)rs r9rFz.CloudlinuxLimits._check_user.. s8"H-. . r8rrcdd|idS)Nz%(uid)s is not a panel userrrr7)rs r9rFz.CloudlinuxLimits._check_user..s; %s|,,r8rrN) rrr-rrr{rurrrrrr)r}rrr_username_message user_package _uid_messagers r9rzCloudlinuxLimits._check_users J" X   Z= -AjMQ..J-C;;C@@L/44H  8DII 8   $$\\#%6%6777$,D S ! ! |_ -H Pk))(33, P P P$$TAI%N%N%NOOOOOOOO P;;C@@L BDII B$$%6%6x%@%@AAA$,D S !H}sB99D.C;;Drc|jr9|dtjit|dnu t t |d|dizn:#t$r-}t dt |d|dYd}~nd}~wwxYwtj |dS) z Print error and exit :param message dict: Dictionary with keys "result" as string and optional "context" as dict rTrrzError: z []N) rr>rr rJr?rKeyErrorsysexit)r}r error_coders r9rz CloudlinuxLimits._error_and_exit+s = < NNK5 6 6 6 Wd + + + + <c'(+,,w{{9b/I/IIJJJJ < < <#a&&&&''':;;;;;;;; < s9A<< B3#B..B3)Fr)r),r4r5r6__doc__rrrr{rrrqr~rrrrrrrrrrrrrrrrrr staticmethodr,rrr6r3r2rrrrrr __classcell__)rss@r9rkrkCsk EHK$$$$$    < < < <#L#L#LJ   @ ' ' ' L L L L L L888t===4$*XXXt111"!!!* / / /@\$   &=&=&=PXXXti1i1i1V717171rDDD    ; ; ; D D D)))Vr8rkc eZdZdZdZdZdS)rpct|_t|_t |_i|_dSrm)rrur#rwrrzr{r|s r9r~zCloudlinuxLimitsNoLve.__init__>s4gg xx ;==r8cvddlm} t||d}n#t$rd}YnwxYw|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_uidrr)clcommon.cpapirr? IndexError)r}user_idr package_names r9rz1CloudlinuxLimitsNoLve.get_package_name_by_user_idDsg ;::::: 66w??BCCLL   LLL s ' 66cx i}|j}|jrd|d<nd|d<t|dtr|ddnd t fdtD}g}t|j D]\}}| ||}|dr|jrt |j |d }|rdnd|d<nI#t$r<} d |d<d |vrt |d <t | |d d<Yd} ~ nd} ~ wwxYw| ||d <i|d <||t||d<||d<|dsg|d<||ddS)rrrrrrONc3*K|] }| p|vfVdSrmr7rs r9rz9CloudlinuxLimitsNoLve._get_action_list..drr8rrrrrrDrrrrTr)rrwrrr?rSrrr r{rrr$rrrr) r}rrrrrrrrrrs @r9rz&CloudlinuxLimitsNoLve._get_action_listTs   J < ) ) + + *(F8  )F8 )3AjM3)G)G QQz]  % % %TEEEE4DEEEEE&t'788  MC55c8DDDH~ 8$,"@"@"B"B 88$(L$@$@jAQ$R$RM2?%OYYZDNN&888'.F8$v--+/66x(14QF8$X...... 8#>>sCCDODN LL    e**ww!" %"$F;  %%%qs)D E 2EE N)r4r5r6r~rrr7r8r9rprp<sA  00000r8rp)G __future__rrr past.builtinsrrrclcommonr clcommon.librr future.utilsr r cllicenser collectionsr lvectllibrrr arg_parsersrrrrrrrrrrcllimits.clquota_librrrutilsr cli_utilsr r!cllimitsr"r#r$r%rr&r'r(r)r*r+r,r-r.r/clcommon.clexceptionr0clcommon.cpapi.cpapiexceptionsr1r3rLADMIN_RESELLER_NAMESrobjectrkrpr7r8r9rs&%%%%%&&&&&&$$$$$$ 99999999........******######NNNNNNNNNN VUUUUUUUUU------66666666EEEEEEEEEEEEBBBBBBBBBBBBBBBBBBBBBBBB333333888888     (    D CMMKKHG B B ? ? ? ? @ @' ,.--#X.vvvvvvvvvrHHHHH,HHHHHr8