§ Rl¾jÖ0ãó¨—ddlmZddlmZddlmZmZmZmZm Z m Z ddl m Z ddl mZmZddlmZddlmZmZmZmZmZdd lmZGd „d ¦«Zd S) é)Ú defaultdict)Úchain)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚLveCtl)ÚDEFAULTSÚLimitsDataStorage)ÚDEFAULT_PROVIDERé)ÚENTITY_DEFAULTSÚENTITY_PACKAGEÚENTITY_RESELLERÚ ENTITY_USERÚ BaseValidator)ÚEpNprocValidatorcó²—eZdZdddddœZddiZegZdd iZdd „Ze d „¦«Z d „Z e fd„Z d„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Ze defd„¦«Zd S)ÚLimitsValidatorzUser(s)z Package(s)z Reseller(s)zDefaults of resellers)ÚuserÚpackageÚresellerÚdefaultsrzHoster defaults limitszinherited from Globalzinherited from HosterNcó€—|p t¦«|_|pt|j¦«g|_dddddœ|_dS)N)Ú common_msgÚ specific_msgÚaffected_entityÚ entity_id)r Úlimits_providerrÚ_list_validatorsÚ message_dict)ÚselfÚ_limits_data_storageÚ validatorss úZ/opt/cloudlinux/venv/lib64/python3.11/site-packages/cllimits_validator/limits_validator.pyÚ__init__zLimitsValidator.__init__2sY€à3ÐJÕ7HÑ7JÔ7JˆÔØ *ð! Ý ˜TÔ1Ñ 2Ô 2ð/ ˆÔð Ø Ø#Øð  ð ˆÔÐÐócó—|d}|d}|d}|d}|�M|�K|tkrd}n?|tkrd|›d�}n-|tkrd |›d�}n|tkrd |›d�}n d |›d�}nd }|€d }|›d |›d |›�}|S)z› Format message string from single message dict. That function should be used for formatting message while validation input limits rrrr Nz"Hoster defaults limits is affectedzDefaults limits of Reseller "z" are affected.zLimits of user with LVE ID "zLimits of Reseller "zLimits of package "Úú )r rrr)Úmsg_dictrrrr Úmsg_about_affectÚ result_msgs r'Ú+_format_message_string_from_single_msg_dictz;LimitsValidator._format_message_string_from_single_msg_dict@sð€ð˜lÔ+ˆ Ø Ô/ˆ Ø"Ð#4Ô5ˆØ˜[Ô)ˆ à Ð &¨9Ð+@Ø�HÒ$Ð$Ø#GÐ Ð Ø ¥OÒ3Ð3Ø#]À9Ð#]Ð#]Ð#]Ð Ð Ø ¥KÒ/Ð/Ø#\À)Ð#\Ð#\Ð#\Ð Ð Ø ¥OÒ3Ð3Ø#T¸)Ð#TÐ#TÐ#TÐ Ð à#S¸Ð#SÐ#SÐ#SÐ Ð à!Ð Ø Ð ØˆLà"ÐFÐFÐ%5ÐFÐF¸ ÐFÐFˆ àÐr)có —g}d}|jD]?}|r|j|i|¤Ž\}}n|j|i|¤Ž\}}||z}| |¦«Œ@||fS)aà Call each validator from validators list and processing results args and kwargs are argumets for calling of validator We validate limits which already are recorded in ve.cfg if only_input_limits is False. We validate limits which we want to set if only_input_limits is True We return aggregated result as bool value and list of messages which explain which limits are wrong and who holds those T)r"Úvalidate_input_limitsÚvalidate_existing_limitsÚappend) r$Úonly_input_limitsÚargsÚkwargsÚmsg_listÚ total_resultÚ validatorÚresultr-s r'Ú#_call_validators_and_process_resultz3LimitsValidator._call_validators_and_process_resultas�€ðˆØˆ ØÔ.ð &ð &ˆIØ ð WØ#B 9Ô#BÀDÐ#SÈFÐ#SÐ#SÑ �˜˜à#E 9Ô#EÀtÐ#VÈvÐ#VÐ#VÑ �˜Ø ˜FÑ "ˆLØ �OŠO˜HÑ %Ô %Ð %Ð %ؘXÐ%Ð%r)có:‡—d}|tkr(‰j t|¦«¦«}n¹|tkr6‰j t |¦«t |¦«¦«}nx|tkr(‰j t |¦«¦«}nE|tkr8|tkr(‰j t |¦«¦«}n|}d}nd}‰  d|||¦«\}}ˆfd„|D¦«}||fS)NFTcó:•—g|]}‰ |¦«‘ŒS©)r0)Ú.0r-r$s €r'ú z9LimitsValidator.validate_input_limits..�s(ø€ÐhÐhÐhÐS[�D×DÒDÀXÑNÔNÐhÐhÐhr)) rr!Úget_user_by_uidÚintrÚ get_package_by_name_and_resellerÚstrrÚget_reseller_by_namerr r<) r$Ú entity_typer Ú input_limitsrÚcheck_reseller_defaultsÚvalidated_entityr9r8s ` r'r2z%LimitsValidator.validate_input_limitsws6ø€ð#(ÐØ �+Ò %Ð %Ø#Ô3×CÒCÅCÈ ÁNÄNÑSÔSÐ Ð Ø �NÒ *Ð *Ø#Ô3×TÒTÕUXÐYbÑUcÔUcÕehÐiqÑerÔerÑsÔsÐ Ð Ø �OÒ +Ð +Ø#Ô3×HÒHÍÈYÉÌÑXÔXÐ Ð Ø �OÒ +Ð +Ø�HÒ$Ð$Ø#'Ô#7×#LÒ#LÍSÐQZÉ^Ì^Ñ#\Ô#\Ð Ð à#,Ð Ø&*Ð #Ð #à#Ð à!%×!IÒ!IØ Ø Ø Ø #ñ " ô" ш �hð iÐhÐhÐhÐ_gÐhÑhÔhˆà˜XÐ%Ð%r)có`‡—‰jj ¦«}ˆfd„|D¦«}|S)Ncó<•—g|]}‰ d|¦«‘ŒS©F©r<)r@rr$s €r'rAz3LimitsValidator._validate_users..˜s)ø€ÐZÐZÐZÈD�$×:Ò:¸5À$ÑGÔGÐZÐZÐZr))r!ÚusersÚvalues)r$rOr;s` r'Ú_validate_userszLimitsValidator._validate_users”s;ø€ðÔ$Ô*×1Ò1Ñ3Ô3ˆØZÐZÐZÐZÐTYÐZÑZÔZˆàˆ r)có`‡—‰jj ¦«}ˆfd„|D¦«}|S)Ncó<•—g|]}‰ d|¦«‘ŒSrMrN)r@rr$s €r'rAz6LimitsValidator._validate_packages.. s)ø€ÐcÐcÐcÈw�$×:Ò:¸5À'ÑJÔJÐcÐcÐcr))r!ÚpackagesrP)r$rTr;s` r'Ú_validate_packagesz"LimitsValidator._validate_packagesœs;ø€ðÔ'Ô0×7Ò7Ñ9Ô9ˆØcÐcÐcÐcÐZbÐcÑcÔcˆàˆ r)có`‡—‰jj ¦«}ˆfd„|D¦«}|S)NcóJ•—g|]}|j® ‰ d|¦«‘Œ S©NF)rr<)r@rr$s €r'rAz7LimitsValidator._validate_resellers..ªs<ø€ð4ð4ð4ÐPXØÔ&Ð2ð×:Ò:¸5À(ÑKÔKØ2Ð2Ð2r))r!Ú resellersrP)r$rYr;s` r'Ú_validate_resellersz#LimitsValidator._validate_resellers¤sKø€ðÔ(Ô2×9Ò9Ñ;Ô;ˆ ð4ð4ð4ð4Ð\eð4ñ4ô4ˆðˆ r)có—g}|jj ¦«D]c}|jj |t ¦«}|t kr|j€Œ:| | d|¦«¦«Œd|SrX)r!rÚkeysrYÚgetr r4r<)r$r;Ú default_nameÚdefault_entitys r'Ú_validate_defaultsz"LimitsValidator._validate_defaults¯s‰€ðˆØ Ô0Ô9×>Ò>Ñ@Ô@ð [ð [ˆLØ!Ô1Ô;×?Ò?À ÍhÑWÔWˆNð¥Ò)Ð)¨nÔ.EÐ.MØØ �MŠM˜$×BÒBÀ5È.ÑYÔYÑ ZÔ ZÐ ZÐ Z؈ r)cóx—|j ¦«D]\}}|€n| ||¦«}Œ |S)z[ Replacing some specific messages for improve readability of error message )Ú"dict_of_replaced_specific_messagesÚitemsÚreplace)r$rÚ old_spec_msgÚ new_spec_msgs r'Ú_replace_specific_msgsz&LimitsValidator._replace_specific_msgs¼sQ€ð +/Ô*Q×*WÒ*WÑ*YÔ*Yð Lð LÑ &ˆL˜,ØÐ#Ø�Ø'×/Ò/° ¸lÑKÔKˆLˆLàÐr)có2—||jvr |j|S|S)zY Replacing some ids of entities for improve readability of error message )Ú dict_of_replaced_ids_of_entities)r$r s r'Ú_replace_ids_of_entitiesz(LimitsValidator._replace_ids_of_entitiesÈs&€ð ˜Ô=Ð =Ð =ØÔ8¸ÔCÐ CØÐr)có2—||jvr |j|S|S)z[ Replacing some names of entities for improve readability of error message )Ú"dict_of_replaced_names_of_entities)r$Ú entity_names r'Ú_replace_names_of_entitiesz*LimitsValidator._replace_names_of_entitiesÑs&€ð ˜$ÔAÐ AÐ AØÔ:¸;ÔGÐ GØÐr)cóΗtd„¦«}d}|D]‡}|d}| |d¦«}| |d¦«}||jvrŒJ||| || |d¦«dœ¦«Œˆ| ¦«D]³\}} |€dn|›|›d �}|  ¦«D]Ž\} } g} | D]<} | d€ | d}n| d›d | d›d �}|  |¦«Œ=d  d „t| ¦«D¦«¦«} |›|   ¦«›d| ›d �}Œ�Œ´|S)zb Format message string from result of execution of validation the existing limits có*—tt¦«S©N)rÚlistr?r)r'úzLLimitsValidator._format_message_string_for_existing_limits..às€µ ½DÑ0AÔ0A€r)Nrrr r)r rr+ú z (ú)z, c3ó4K—|]}t|¦«V—ŒdSrq)rE)r@Úitems r'ú zMLimitsValidator._format_message_string_for_existing_limits..ÿs(èè€Ð-[Ð-[¸D­c°$©i¬iÐ-[Ð-[Ð-[Ð-[Ð-[Ð-[r)z: ) rrnrjÚlist_of_deleted_ids_of_entitiesr4rgrcÚjoinÚsetÚ capitalize)r$Útotal_result_listÚtotal_result_dictÚ total_msgr-Ú name_of_checkÚtype_of_affected_entityr rÚ entities_dictrGÚlist_entity_dictsÚaffected_entitiesÚ entity_dictrs r'Ú*_format_message_string_for_existing_limitsz:LimitsValidator._format_message_string_for_existing_limitsÚsñ€õ (Ð(AÐ(AÑBÔBÐØˆ ð*ð ð ˆHØ$ \Ô2ˆMØ&*×&EÒ&EÀhÐO`ÔFaÑ&bÔ&bÐ #Ø×5Ò5°h¸{Ô6KÑLÔLˆIà˜DÔ@Ð@Ð@ØØ ˜mÔ ,Ð-DÔ E× LÒ LØ&Ø $× ;Ò ;¸HÀ^Ôð>�KØ" >Ô2Ð:Ø*5°kÔ*B˜˜à-8¸Ô-EÐ*gÐ*gÈÐUcÔIdÐ*gÐ*gÐ*g˜à%×,Ò,¨_Ñ=Ô=Ð=Ð=Ø$(§I¢IÐ-[Ð-[ÅCÐHYÑDZÔDZÐ-[Ñ-[Ô-[Ñ$[Ô$[Ð!à(Ð[¨+×*@Ò*@Ñ*BÔ*BÐ[Ð[ÐFWÐ[Ð[Ð[� � ð \ðÐr)cóø—d„t| ¦«| ¦«| ¦«| ¦«¦«D¦«}| |¦«}|S)Ncó&—g|]\}}|D]}|°|‘ŒŒSr?r?)r@r;Ú msg_dict_listr-s r'rAz.sJ€ð ð ð Ù.˜ ð ,ð  ð ð °6ð  Ø ð ð ð ð r))rrQrUrZr`r†)r$r}rs r'r3z(LimitsValidator.validate_existing_limitssƒ€ð ð Ý27Ø×$Ò$Ñ&Ô&Ø×'Ò'Ñ)Ô)Ø×(Ò(Ñ*Ô*Ø×'Ò'Ñ)Ô)ñ 3ô3ð ñ ô Ðð×CÒCÐDUÑVÔVˆ ØÐr)ÚreturncóH—t¦«}| ¦«}| d¦«|D]g}|dkrŒ | |¦«} t |d dd¦«¦«}|dkr |dkrdSŒX#t $rYŒdwxYwdS)zL Check is Low PMEM limit present :return True/False FrÚpmemÚ*r+i T)r Úget_panel_users_uid_listÚ _load_infoÚget_limits_by_user_idrCrdÚ ValueError)Ú_lvectlÚ_panel_uids_listÚuidÚlimitsÚpmem_limit_bytess r'Úis_low_pmem_limit_presentz)LimitsValidator.is_low_pmem_limit_presentsÌ€õ ‘(”(ˆØ"×;Ò;Ñ=Ô=ÐØ×Ò˜5Ñ!Ô!Ð!Ø#ð ð ˆCØ�aŠxˆxàØ×2Ò2°3Ñ7Ô7ˆFð å#& v¨f¤~×'=Ò'=¸cÀ2Ñ'FÔ'FÑ#GÔ#GÐ Ø# qÒ(Ð(Ð-=Ð@QÒ-QÐ-Qà˜4˜4øøÝð ð ð Ø�ð øøøàˆusÁ5B BÂB)NN)Ú__name__Ú __module__Ú __qualname__rlrir ryrbr(Ú staticmethodr0r<rr2rQrUrZr`rgrjrnr†r3Úboolr—r?r)r'rrse€€€€€ð ØØ!Ø+ð *ð*Ð&ð Ð,ð(Ð$ð ð'Ð#ð Ð!8ð*Ð&ð  ð  ð  ð  ðððñ„\ðð@&ð&ð&ð,Tdð&ð&ð&ð&ð:ðððððð ð ð ð ð ð ð ð ð ððððððð)ð)ð)ðV ð ð ðð tðððñ„\ðððr)rN)Ú collectionsrÚ itertoolsrÚtypingrrrrr r Úcllimitsr Úcllimitslib_v2r r Úclveconfig.ve_config_readerrÚbaserrrrrÚep_nproc_validatorrrr?r)r'úr¥sðð$Ð#Ð#Ð#Ð#Ð#ØÐÐÐÐÐØ:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:àÐÐÐÐÐØ6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ø8Ð8Ð8Ð8Ð8Ð8à^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ø0Ð0Ð0Ð0Ð0Ð0ðYðYðYðYðYñYôYðYðYðYr)