§ Rl¾j|Aãó(—ddlmZddlmZmZmZmZmZmZddl m Z ddl m Z m Z ddlmZmZmZmZmZddlmZmZmZmZmZedgd¢¦«Zed gd ¢¦«Zed gd ¢¦«Zed ddg¦«ZdZdZdZ dZ!dZ"dZ#Gd„d¦«Z$dS)é)Ú namedtuple)ÚDictÚIteratorÚListÚOptionalÚTupleÚUnion)ÚClPwd)Ú NotSupportedÚ resellers)ÚDEFAULT_PROVIDERÚ EMPTY_LIMITSÚInheritedLimitsÚLimitsÚXmlConfigReader)ÚDEFAULT_PACKAGEÚ LVE_DEFAULTÚ LVP_DEFAULTÚpanelpackagesdictÚpaneluserslistÚPackage©ÚnameÚproviderÚlimitsÚReseller©rÚdefaultsrÚUser©ÚidÚpackagerÚresellerÚ is_panel_userÚ IneritedLimitÚvalueÚsourceÚDEFAULTSÚownr"r#ÚglobalÚbuiltincó—eZdZdZeedd¬¦«Zeeed¬¦«Z dd„Z e d„¦«Z d„Z e d„¦«Zd „Zd „Zd „Zd „Zed „¦«Zed„¦«Zed„¦«Zed„¦«Zd„Zd„Zd„Zd„Zd„Zd„ZdS)ÚLimitsDataStoragea› This class is designed to merge data from xml config & control panel and provide user-friendy interface to work with lve limits (packages, resellers, defaults) What this class can do: - process information from xml config and control panel - re-pack structures for easy data access What this class should not do: - set limits in kernel - know anything about kernel limits Nrrcóœ—t¦«|_|p t¦«|_d|_d|_d|_d|_d|_dS©N) r Ú_pwdrÚ _xml_sourceÚ_panel_resellers_listÚ _packagesÚ_usersÚ _resellersÚ _defaults)ÚselfÚ_xml_config_readers úQ/opt/cloudlinux/venv/lib64/python3.11/site-packages/cllimitslib_v2/lve_storage.pyÚ__init__zLimitsDataStorage.__init__@sH€Ý‘G”GˆŒ Ø-ÐBµÑ1BÔ1BˆÔØ%)ˆÔ"؈ŒØˆŒ ؈ŒØˆŒˆˆócó(—|dkrd}n|dkrd}|S)z2 Convert mem to vmem and reversed ÚvmemÚmem©)Ú limit_names r9Ú_limit_name_convertz%LimitsDataStorage._limit_name_convertIs,€ð ˜Ò Р؈JˆJØ ˜5Ò Ð ØˆJàÐr;cóv—|j€, t¦«|_n#t$r g|_YnwxYw|jS)z� Get list of names of panel resellers. If cpapi panel plugin don't support that method, we return empty list )r2r r ©r7s r9Ú_get_panel_resellersz&LimitsDataStorage._get_panel_resellersWsS€ð Ô %Ð -ð 0Ý-6©[¬[�Ô*Ð*øÝð 0ð 0ð 0Ø-/�Ô*Ð*Ð*ð 0øøøàÔ)Ð)s ‰�1°1có—|jduS)z@ Not activated reseller doesn't have any limits N)r)r#s r9Ú_is_active_resellerz%LimitsDataStorage._is_active_resellerfs€ð Ô ¨Ð,Ð,r;c#óJK—|j ¦«D]}|V—ŒdSr/)r1Ú users_lve_ids©r7Úuids r9Ú_list_uids_from_ve_cfgz(LimitsDataStorage._list_uids_from_ve_cfgns9èè€àÔ#×1Ò1Ñ3Ô3ð ð ˆC؈IˆIˆIˆIð ð r;cóš—||jvr |j|St||j|j |¦«|jd¬¦«S)ax This method will return User by uid. If we will pass uid of nonexistent user, method return User without any limits, with with DEFAULT_RESELLER_OBJ and with DEFAULT_PKG_OBJ. This trick is needed for validating of limits for nonexistent user in case of migrating limits and entities from another server. Fr )ÚusersrÚDEFAULT_PKG_OBJr1Úget_user_limitsÚDEFAULT_RESELLER_OBJrIs r9Úget_user_by_uidz!LimitsDataStorage.get_user_by_uidssZ€ð �$”*Ð Ð Ø”:˜c”?Ð "ÝØØÔ(ØÔ#×3Ò3°CÑ8Ô8ØÔ.Øð  ñ ô ð r;cóè—||f|jvr|j||fSt|f|jvr|jt|fSt||j|j |t¦«¬¦«S)a' This method is needed because of lvectl bug "by design" our api designed only for situations when user's owner is the owner of the package that contains that user but sometimes user can be in admin's package. We will return entity Package without any limits and with DEFAULT_RESELLER_OBJ if we request name of nonexistent package. This trick is needed for validating of limits for nonexistent package in case of migrating limits and entities from another server r)Úpackagesr rrPr1Úget_package_limits)r7rr#s r9Ú get_package_by_name_and_resellerz2LimitsDataStorage.get_package_by_name_and_reseller‰s‰€ð �dÐ ˜tœ}Ð ,Ð ,Ø”= (¨DÐ!1Ô2Ð 2Ý ˜dÐ # t¤}Ð 4Ð 4Ø”=Õ!1°4Ð!7Ô8Ð 8ÝØØÔ.ØÔ#×6Ò6ØÝ ñôð ñ ô ð r;có<—||jvr |j|S|jSr/)r rP©r7rs r9Úget_reseller_by_namez&LimitsDataStorage.get_reseller_by_name¤s%€à �4”>Ð !Ð !Ø”> $Ô'Ð 'ØÔ(Ð(r;cóê—|j€fi|_| ¦«D]$}|j |¦«|j|<Œ%|j ¦«|jt <|jSr/)r6rDr1Úget_reseller_default_limitsrr(rWs r9rzLimitsDataStorage.defaultsªst€ð Œ>Ð !؈DŒNØ×1Ò1Ñ3Ô3ð Zð Z�Ø'+Ô'7×'SÒ'SÐTXÑ'YÔ'Y�”˜tÑ$Ð$Ø'+Ô'7×'@Ò'@Ñ'BÔ'BˆDŒN�8Ñ $ØŒ~Ðr;c ó—|j€zi|_t¦« ¦«D]R\}}|D]J}t|| |¦«|j ||¦«¬¦«|j||f<ŒKŒS|jS)Nr)r3rÚitemsrrXr1rT)r7rÚprovider_packagesÚ package_names r9rSzLimitsDataStorage.packages´s®€ð Œ>Ð !؈DŒNÝ/@Ñ/BÔ/B×/HÒ/HÑ/JÔ/Jð ð Ñ+�Ð+Ø$5ðð�LÝ?FØ)Ø!%×!:Ò!:¸8Ñ!DÔ!DØ#Ô/×BÒBØ(Ø$ñ ô ð@ñ@ô@�D”N H¨lÐ#;Ñ<Ð<ððŒ~Ðr;c óÈ—|j€Õi|_t¦«D]a\}}}t|| |¦«| ||¦«|j |¦«d¬¦«|j|<Œb| ¦«D]I}||jvr>t||j|j |¦«|j d¬¦«|j|<ŒJ|jS)NT)r!r#r"rr$Fr ) r4rrrXrUr1rOrKrNrP)r7rJr#r"s r9rMzLimitsDataStorage.usersÅs€ð Œ;Р؈DŒKÝ*8Ñ*:Ô*:ð ð Ñ&��X˜wÝ#'ØØ!×6Ò6°xÑ@Ô@Ø ×AÒAÀ'È8ÑTÔTØÔ+×;Ò;¸CÑ@Ô@Ø"&ð $ñ$ô$�” ˜CÑ Ð ð×2Ò2Ñ4Ô4ð ð �ؘdœkÐ)Ð)Ý'+ØØ $Ô 4Ø#Ô/×?Ò?ÀÑDÔDØ!%Ô!:Ø&+ð (ñ(ô(�D”K Ñ$øðŒ{Ðr;cóî—|j€hi|_| ¦«D]L}t||j |¦«|j |¦«¬¦«|j|<ŒM|jS)Nr)r5rDrr1rZÚget_reseller_limits)r7Ú reseller_names r9r zLimitsDataStorage.resellersÞs�€ð Œ?Ð "Ø ˆDŒOØ!%×!:Ò!:Ñ!<Ô!<ð ð � Ý19Ø&Ø!Ô-×IÒIÈ-ÑXÔXØÔ+×?Ò?À ÑNÔNð2ñ2ô2�”  Ñ.Ð.ð ŒÐr;cóH—d„|j ¦«D¦«S)NcóH—i|]\}}|j® |jtk¯||“Œ Sr/)rr)Ú.0Úkeyr"s r9ú zELimitsDataStorage.get_packages_with_custom_limits..ís<€ð ð ð Ù)˜S 'ØŒ~Ð)¨g¬nÅ Ò.LÐ.Lð �Ø.LÐ.LÐ.Lr;)rSr\rCs r9Úget_packages_with_custom_limitsz1LimitsDataStorage.get_packages_with_custom_limitsës1€ð ð Ø-1¬]×-@Ò-@Ñ-BÔ-Bð ñ ô ð r;cóH—d„|j ¦«D¦«S)NcóV—i|]&\}}|j® |jtk¯|j¯#||“Œ'Sr/)rrr$)rerJÚusers r9rgzBLimitsDataStorage.get_users_with_custom_limits..ôsD€ð ð ð Ù#˜#˜tØŒ{Ð&¨4¬;½,Ò+FÐ+FÈ4ÔK]Ð+Fð �Ø+FÐ+FÐ+Fr;)rMr\rCs r9Úget_users_with_custom_limitsz.LimitsDataStorage.get_users_with_custom_limitsòs1€ð ð Ø'+¤z×'7Ò'7Ñ'9Ô'9ð ñ ô ð r;có\—|jj}|jt}|jpt ¦«}| ¦«D]Î\}}|€®t||d¦«}t||d¦«}t|  |¦«} |�t|t¬¦«||<Œe|�4|  |j¦«st|t¬¦«||<Œ›t| t¬¦«||<Œµt|t¬¦«||<ŒÏt!di|¤ŽS)zA Method will return inherited limits for package N©r&r'r?)rrr(rrÚ_asdictr\ÚgetattrrrAÚInheritedLimitÚRESELLER_SOURCErFÚ GLOBAL_SOURCEÚBUILTIN_SOURCEÚ OWN_SOURCEr) r7r"Úreseller_defaultsÚglobal_defaultsÚpackage_own_limitsrfr&Úreseller_default_valueÚglobal_default_valueÚbuiltin_default_values r9rTz$LimitsDataStorage.get_package_limitsúsc€ð $Ô,Ô5ÐØœ-­Ô1ˆØ%œnÐ<µ ×EÒEÑGÔGÐØ,×2Ò2Ñ4Ô4ð ð ‰JˆC�؈}Ý)0Ð1BÀCÈÑ)NÔ)NÐ&Ý'.¨ÀÀTÑ'JÔ'JÐ$Ý(3°D×4LÒ4LÈSÑ4QÔ4QÔ(RÐ%Ø)Ð5Ý.<Ø4Ý.ð/ñ/ô/Ð& sÑ+Ð+ð*Ð5¸d×>VÒ>VÐW^ÔWgÑ>hÔ>hÐ5Ý.<Ø2Ý,ð/ñ/ô/Ð& sÑ+Ð+õ /=Ø3Ý-ð/ñ/ô/Ð& sÑ+Ð+õ +9ØÝ%ð+ñ+ô+Ð" 3Ñ'Ð'õÐ4Ð4Ð!3Ð4Ð4Ð4r;cóΗ|jt}|jj}|jj}|jpt  ¦«}| ¦«D]û\}}|€Ût||d¦«}t||d¦«} t||d¦«} t|  |¦«} |�t|t¬¦«||<Œv| �t| t¬¦«||<Œ’| �4| |j¦«st| t¬¦«||<ŒÈt| t ¬¦«||<Œât|t"¬¦«||<Œüt%di|¤ŽS)z> Method will return inherited limits for user Nrnr?)rr(r#r"rrror\rprrArqÚPACKAGE_SOURCErrrFrsrtrur) r7rkrwrvÚpackage_limitsÚ user_limitsrfr&Ú package_valueryrzr{s r9rOz!LimitsDataStorage.get_user_limits"s¡€ð œ-­Ô1ˆØ œMÔ2ÐØœÔ,ˆØ”{Ð2¥l×;Ò;Ñ=Ô=ˆ Ø%×+Ò+Ñ-Ô-ð" ð" ‰JˆC�؈}Ý '¨¸¸TÑ BÔ B� Ý)0Ð1BÀCÈÑ)NÔ)NÐ&Ý'.¨ÀÀTÑ'JÔ'JÐ$Ý(3°D×4LÒ4LÈSÑ4QÔ4QÔ(RÐ%Ø Ð,Ý'5Ø+Ý-ð(ñ(ô(�K Ñ$Ð$ð,Ð7Ý'5Ø4Ý.ð(ñ(ô(�K Ñ$Ð$ð*Ð5¸d×>VÒ>VÐW[ÔWdÑ>eÔ>eÐ5Ý'5Ø2Ý,ð(ñ(ô(�K Ñ$Ð$õ (6Ø3Ý-ð(ñ(ô(�K Ñ$Ð$õ $2ØÝ%ð$ñ$ô$� ˜CÑ Ð õÐ-Ð- Ð-Ð-Ð-r;c ót—| |¦«�stttdt¬¦«ttdt¬¦«ttdt¬¦«ttdt¬¦«ttdt¬¦«ttdt¬¦«ttdt¬¦«ttd t¬¦«¬ ¦«S|j ¦«}| ¦«D]Z\}}|€:t| |¦«}t|t¬¦«||<ŒAt|t¬¦«||<Œ[td i|¤ŽS) zˆ Method will return limits equal builtin for non-activated reseller and inherited limits for activated reseller ÚcpurnÚncpuÚior>ÚpmemÚnprocÚepÚiops)r‚rƒr„r=r…r†r‡rˆNr?) rFrrqrrtrror\rAru)r7r#Úreseller_limitsrfr&r{s r9raz%LimitsDataStorage.get_reseller_limitsQsÖ€ð×'Ò'¨Ñ1Ô1ñ" Ý"Ý"Ý% eÔ,Ý)ðñôõ$Ý% fÔ-Ý)ðñôõ"Ý% dÔ+Ý)ðñôõ$Ý% eÔ,Ý)ðñôõ$Ý% fÔ-Ý)ðñôõ%Ý% gÔ.Ý)ðñôõ"Ý% dÔ+Ý)ðñôõ$Ý% fÔ-Ý)ðñôð;!ñ!ô!ð! ðF#œ/×1Ò1Ñ3Ô3ˆØ)×/Ò/Ñ1Ô1ð ð ‰JˆC�؈}Ý(3°D×4LÒ4LÈSÑ4QÔ4QÔ(RÐ%Ý'5Ø/Ý)ð(ñ(ô(� Ñ$Ð$õ (6ØÝ%ð(ñ(ô(� Ñ$Ð$õÐ1Ð1 Ð1Ð1Ð1r;cóò—|jt}|tkr| ¦«}nK| |¦«st dit j¦«¤ŽS|j ¦«}| ¦«D]Z\}}|€:t| |¦«}t|t¬¦«||<ŒAt|t¬¦«||<Œ[t di|¤ŽS)zÜ Method will return empty inherited defaults limits for non-activated reseller or inherited defaults limits for activated reseller. For global defaults method will return inherited limits Nrnr?) rr(rorFrrr\rrArqrtru)r7r#rwrvrfr&r{s r9Úget_defaults_limitsz%LimitsDataStorage.get_defaults_limitsŽs€ðœ-­Ô1ˆØ •xÒ Ð Ø /× 7Ò 7Ñ 9Ô 9Ð Ð ð×+Ò+¨HÑ5Ô5ð AÝ&Ð@Ð@­Ô)=Ñ)?Ô)?Ð@Ð@Ð@Ø (Ô 1× 9Ò 9Ñ ;Ô ;Ð Ø+×1Ò1Ñ3Ô3ð ð ‰JˆC�؈}Ý(3°D×4LÒ4LÈSÑ4QÔ4QÔ(RÐ%Ý)7Ø/Ý)ð*ñ*ô*Ð! #Ñ&Ð&õ *8ØÝ%ð*ñ*ô*Ð! #Ñ&Ð&õÐ3Ð3Ð!2Ð3Ð3Ð3r;r/)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr rPrrrNr:Ú staticmethodrArDrFrKrQrUrXÚpropertyrrSrMr rhrlrTrOrar‹r?r;r9r-r- s¿€€€€€ð ð ð $˜8Ø ØØðñôÐð�gØ Ø%Øðñô€Oð ððððð ð ñ„\ð ð *ð *ð *ðð-ð-ñ„\ð-ðððð  ð ð ð, ð ð ð6)ð)ð)ð ððñ„Xððððñ„Xðð ððñ„Xðð0ð ð ñ„Xð ð ð ð ð ð ð ð&5ð&5ð&5ðP-.ð-.ð-.ð^;2ð;2ð;2ðz4ð4ð4ð4ð4r;r-N)%Ú collectionsrÚtypingrrrrrr Úclcommonr Úclcommon.cpapir r Ú clveconfigr rrrrÚ lvectllibrrrrrrrrrqr(rur}rrrsrtr-r?r;r9úr˜sƒðð#Ð"Ð"Ð"Ð"Ð"Ø?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?àÐÐÐÐÐØ2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_ØbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbà ˆ*�YÐ >Ð >Ð >Ñ ?Ô ?€Ø ˆ:�jÐ"@Ð"@Ð"@Ñ AÔ A€Ø€z�&ÐRÐRÐRÑSÔS€Ø�˜O¨g°xÐ-@ÑAÔA€ð €ð€ ؀؀؀ Ø€ðK4ðK4ðK4ðK4ðK4ñK4ôK4ðK4ðK4ðK4r;