§ ½@¾jKãóŒ—ddlZddlZddlZddlmZddlmZddlmZm Z ddl m Z m Z Gd„de¦«Z Gd„d ¦«ZdS) éN)Úcpapi)ÚFormattedException)Ú exec_utilityÚisolated_child_env)Ú(_convert_memory_value_to_adaptive_formatÚ"check_pmem_lower_bound_from_stringcó—eZdZdS)ÚLvectlExceptionN)Ú__name__Ú __module__Ú __qualname__©óúpy/cllimits/lvectl_lib.pyr r s€€€€€Ø€Drr cóâ—eZdZdZdZdZdZdZdZdZ dZ d„Z e d„¦«Z dd „Zdd „Ze dd „¦«Zdd „Zd „Zd„Zd„Zdd„Zd„Zdd„Zd„Zd„Zdd„Zd„Zd„Zd„Zd„Zd„Zd„Z dd„Z!dS) ÚLveCtlz* Library for work with LVE limits i@BiÊš;Nz/usr/sbin/lvectlcó˜—t|jdgt¦«¬¦«\}}t|¦«|_d|_d|_dS)z5 Object constructor. Get LVE version z lve-version©ÚenvN)rÚ _UTILITY_PATHrÚintÚ lve_versionÚ _package_dataÚ_resellers_data)ÚselfÚ_Ú s_lve_versions rÚ__init__zLveCtl.__init__%sO€õ(¨Ô(:¸]¸OÕQcÑQeÔQeÐfÑfÔfшˆ=ݘ}Ñ-Ô-ˆÔØ!ˆÔØ#ˆÔÐÐrcó˜—tj¦«}t| ¦«¦«}| d¦«|S)zH Get panel users uid list :return: List of uids r)rÚ list_usersÚlistÚkeysÚappend)Ú user_packagesÚuid_lists rÚget_panel_users_uid_listzLveCtl.get_panel_users_uid_list.sB€õ Ô(Ñ*Ô*ˆ ݘ ×*Ò*Ñ,Ô,Ñ-Ô-ˆØ�Š˜ÑÔÐØˆrFcóÒ—| ||¬¦«||jvr$tj|j|¦«}|d=|Stj|jd¦«}|d=|S)zæ Reads limits by user id :param user_id: user/lve id :param human_readable_numbers: if True PMEM and VMEM limits in KBytes, MBytes or GBytes False - in bytes :return: dictionary )ÚuseridÚPACKAGEr)Ú _load_inforÚcopyÚdeepcopy)rÚuser_idÚhuman_readable_numbersÚ user_limitss rÚget_limits_by_user_idzLveCtl.get_limits_by_user_id9su€ð �ŠÐ.°wˆÑ?Ô?Ð?Ø �dÔ(Ð (Ð (Ýœ-¨Ô(:¸7Ô(CÑDÔDˆKؘIÐ&ØÐ õ”m DÔ$6°qÔ$9Ñ:Ô:ˆ Ø ˜ Ð "ØÐrcóŠ—| ||¦«tj|j |¦«¦«}|S)a Reads limits by reseller name :param reseller_name: :param: id - user/lve id :param human_readable_numbers: if True PMEM and VMEM limits in KBytes, MBytes or GBytes False - in bytes :rtype: dict )Ú_load_resellers_infor+r,rÚget)rÚ reseller_namer.Úreseller_limitss rÚget_limits_by_reseller_namez"LveCtl.get_limits_by_reseller_nameNsA€ð ×!Ò!Ð"8¸-ÑHÔHÐHÝœ-¨Ô(<×(@Ò(@ÀÑ(OÔ(OÑPÔPˆØÐrcóŠ—t|¦«}| d¦«r|r|dkstdd|idœ¦«‚dSdS)zï Reject reseller identifiers that lvectl would parse as an option or the special '--all' target. Only the documented '--all' enable-all sentinel is permitted, and only where the caller explicitly allows it. ú-z--allz&Invalid reseller identifier: %(value)sÚvalue©ÚmessageÚcontextN)ÚstrÚ startswithr )Ú identifierÚ allow_allr9s rÚ_reject_option_like_identifierz%LveCtl._reject_option_like_identifier\sj€õ�J‘”ˆØ × Ò ˜CÑ Ô ð ¨)ð ¸ÀÒ8HÐ8HÝ!ØDÐRYÐ[`ÐQaÐbÐbñôð ð ð Ð8HÐ8Hrc ó†—tj ¦«sdS| |¦«d|ddg}|s| d¦«t |j|t¦«¬¦«\}}tj |¦«}|dkrt|d¦«‚|  d g¦«}|r�d d |dd i|dd d |ddi|dd|ddt|dd|¦«t|dd|¦«dœ}|SdS)a Reads limits by reseller name :param reseller_name: reseller's name :param human_readable_numbers: if True PMEM and VMEM limits in KBytes, MBytes or GBytes False - in bytes :rtype: dict[str, str | dict] Nú list-resellerú--jsonú --with-nameú--bytesrrÚmsgÚdataÚDEFAULTÚallÚSPEEDÚEPÚIOÚIOPSÚNPROCÚPMEMÚVMEM)r)ÚcpuÚepÚioÚiopsÚnprocÚpmemÚvmem) Ú lvectllibÚlveÚreseller_limit_supportedrAr#rrrÚjsonÚloadsr r3r) rr4r.Ú lvectl_argsÚret_codeÚstd_outÚ loaded_jsonÚ default_infoÚdefault_limitss rÚ#get_default_limits_by_reseller_namez*LveCtl.get_default_limits_by_reseller_nameisi€õŒ}×5Ò5Ñ7Ô7ð Ø ˆFà ×+Ò+¨MÑ:Ô:Ð:Ø&¨ °xÀÐOˆ Ø%ð *Ø × Ò ˜yÑ )Ô )Ð )Ý(¨Ô);¸[ÕN`ÑNbÔNbÐcÑcÔcш�'Ý”j Ñ)Ô)ˆ Ø �qŠ=ˆ=Ý! +¨eÔ"4Ñ5Ô5Ð 5à"—’ v¨rÑ2Ô2ˆ Ø ð "à$ؘ|¨Aœ¨wÔ7Ð8Ø" 1”o dÔ+ؘl¨1œo¨dÔ3Ð4Ø$ Qœ¨Ô/Ø% aœ¨Ô1Ý@ÀÈaÄÐQWÔAXØAWñYôYå@ÀÈaÄÐQWÔAXØAWñYôYð ð ˆNð"Ð !ð "ð "rcó—|j€8ddlm} t||¦«d¦«}n\#t$rd}YnNwxYw||jvr!t|j|d¦«}n t|jdd¦«}|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 Nr)Úreseller_package_by_uidéÚr))rÚclcommon.cpapirfr=Ú IndexError)rr-rfÚ package_names rÚget_package_name_by_user_idz"LveCtl.get_package_name_by_user_id�s¶€ð Ô Ð %Ø >Ð >Ð >Ð >Ð >Ð >ð "Ý"Ð#:Ð#:¸7Ñ#CÔ#CÀAÔ#FÑGÔG� � øÝð "ð "ð "à!� � � ð "øøøð˜$Ô,Ð,Ð,Ý" 4Ô#5°gÔ#>¸yÔ#IÑJÔJ� � õ # 4Ô#5°aÔ#8¸Ô#CÑDÔD� ØÐs �.® =¼=có$—d|||rd|›d�nddœdœS)Nz+%(what)s set error for uid=%(uid)s%(error)sz [ú]rh)ÚwhatÚuidÚerrorr:r)rÚparamÚlve_idÚerrs rÚ __set_errorzLveCtl.__set_error¤s<€ØHØ$)°&Ø47Ð%? [¨# [ [ [ [¸RðAðAðBðBð BrcóF—t|¦«}|rt|¦«‚dS)a Check if PMEM value is below configured lower bound and raise exception if needed :param pmem_value: PMEM value as string (e.g., "5m", "512M", etc.) :raises LvectlException: If pmem is below configured lower bound or config is corrupted N)rr )rÚ pmem_valuerqs rÚ_check_pmem_lower_boundzLveCtl._check_pmem_lower_bound©s1€õ 3°:Ñ>Ô>ˆØ ð )Ý! %Ñ(Ô(Ð (ð )ð )rcóL—|t|¦«g}d|vsd|vr,| d| d¦«¦«|d<dD]°}| |¦«}|€Œt|¦« ¦«}|dvr |jdkrŒK|dvr |jd krŒ[|d kr| ¦«r|›d �}|d kr| |¦«| d |›d|›�¦«Œ±t|¦«dkrdS| d¦«r| d¦«|r| d|›�¦«t|j |dt¦«¬¦«\}} } |dkr$t|  d|| ¦«¦«‚dS)a- Set limits for given container id :param: str command: 'set' | 'set-reseller', based on container type :param: int | str container_id: LVE | LVP id for set limits :param: dict limits: new LVE limits. Available keys: speed, vmem, pmem, mep, io, nproc, iops and 'save-all-parameters'. All other keys are ignoring. If some parameter absent on current LVE version (for example pmem on LVE4), it will be ignored too. :param reseller_name: Reseller name ÚmeprSÚ maxEntryProcs)ÚspeedrXrWr{rTrVrUN)rWrVrUé)rUér|ú%rWz--ú=érzsave-all-parametersz--save-all-parametersz --reseller=T©ÚstderrrÚLimits) r=r3ÚstriprÚisdigitrxr#Úlenrrrr Ú_LveCtl__set_error) rÚcommandÚ container_idÚlimitsr4r^ÚkÚvr_Úoutrts rÚ_set_container_limits_by_idz"LveCtl._set_container_limits_by_id³sØ€ð¥ LÑ 1Ô 1Ð2ˆ à �Fˆ?ˆ?˜d f˜n˜nØ&,§j¢j°¸¿ º À4Ñ8HÔ8HÑ&IÔ&IˆF�?Ñ #ØRð -ð -ˆAØ— ’ ˜1‘ ” ˆA؈yØÝ�A‘”— ’ ‘”ˆAØÐ-Ð-Ð-°$Ô2BÀaÒ2GÐ2GØØ�Hˆ}ˆ} Ô!1°QÒ!6Ð!6ØØ�GŠ|ˆ| § ¢ ¡ ¤ ˆ|Ø�G�G�G�Ø�FŠ{ˆ{Ø×,Ò,¨QÑ/Ô/Ð/Ø × Ò ˜| A˜|˜|¨˜|˜|Ñ ,Ô ,Ð ,Ð ,Ý ˆ{Ñ Ô ˜qÒ Ð Ø�1Ø �:Š:Ð+Ñ ,Ô ,ð 8Ø × Ò Ð6Ñ 7Ô 7Ð 7à ð >Ø × Ò Ð<¨]Ð<Ð<Ñ =Ô =Ð =å)¨$Ô*<¸kÐRVÕ\nÑ\pÔ\pÐqÑqÔqш�#�sØ �qŠ=ˆ=å! $×"2Ò"2°8¸\È3Ñ"OÔ"OÑPÔPÐ Pð ˆ=rcóà—| |d¬¦«d|g}t|j|dt¦«¬¦«\}}}|dkr$t | d||¦«¦«‚dS)z™ Set limits for given container id :param reseller_id: LVP id or reseller's name or '--all' :type reseller_id: int | str T)r@ú set-resellerr‚rr„N)rArrrr rˆ)rÚ reseller_idr^r_rŽrts rÚ#_set_container_limits_by_id_or_namez*LveCtl._set_container_limits_by_id_or_nameÝs€ð ×+Ò+¨KÀ4Ð+ÑHÔHÐHØ% {Ð3ˆ Ý)¨$Ô*<¸kÐRVÕ\nÑ\pÔ\pÐqÑqÔqш�#�sØ �qŠ=ˆ=å! $×"2Ò"2°8¸[È#Ñ"NÔ"NÑOÔOÐ Oð ˆ=rcó„—t|¦«r| |¦«sdS| d|||¬¦«dS)zð Wrapper for _set_container_limits_by_id, set limits for lve_id; :param int lve_id: user's container id :param limits: dict with limits to set :param reseller_name: Reseller name :return: int rgÚset)r4r)Úboolrlr�)rrsr‹r4s rÚset_lve_limits_by_user_idz LveCtl.set_lve_limits_by_user_idêsN€õ �‰<Œ<ð  × @Ò @ÀÑ HÔ Hð Ø�1Ø ×(Ò(¨°¸ÈmÐ(Ñ\Ô\Ð\؈qrcó4—| d||¦«dS)ú› Wrapper for _set_container_limits_by_id, set limits for lvp_id; :type lvp_id: int :type limits: dict :return: int r‘r©r�©rÚlvp_idr‹s rÚset_lvp_limits_by_reseller_idz$LveCtl.set_lvp_limits_by_reseller_id÷s!€ð ×(Ò(¨¸ÀÑHÔHÐH؈qrcó4—| d||¦«dS)r™zset-reseller-defaultrršr›s rÚset_lvp_defaults_by_reseller_idz&LveCtl.set_lvp_defaults_by_reseller_ids"€ð ×(Ò(Ð)?ÀÈÑPÔPÐP؈qrcóü—dt|¦«dg}|�| d|g¦«t|j|t ¦«¬¦«\}}|dkr$t | d||¦«¦«‚dS)z’ Set unlimited LVE for lve_id :param: lve_id `int`: LVE id :param reseller_name: Reseller name :return: 0 r•ú --unlimitedNz --resellerrrÚ Unlimited)r=Úextendrrrr rˆ)rrsr4Úargsr_rts rÚset_lve_unlimitedzLveCtl.set_lve_unlimited sƒ€ð•s˜6‘{”{ MÐ2ˆØ Ð $Ø �KŠK˜ }Ð5Ñ 6Ô 6Ð 6Ý$ TÔ%7¸ÕCUÑCWÔCWÐXÑXÔX‰ ˆ�#Ø �qŠ=ˆ=Ý! $×"2Ò"2°;ÀÈÑ"LÔ"LÑMÔMÐ M؈qrcóô—| |¦«dt|¦«dg}t|j|t ¦«¬¦«\}}|dkr$t | d||¦«¦«‚dS)z€ Set unlimited LVP for reseller; Accepts name or id; :type lvp_id: str | int :return: 0 r‘r¡rrr¢©rAr=rrrr rˆ)rrœr¤r_rts rÚset_lvp_unlimitedzLveCtl.set_lvp_unlimitedsz€ð ×+Ò+¨FÑ3Ô3Ð3Ø¥ F¡ ¤ ¨]Ð;ˆÝ$ TÔ%7¸ÕCUÑCWÔCWÐXÑXÔX‰ ˆ�#Ø �qŠ=ˆ=Ý! $×"2Ò"2°;ÀÈÑ"LÔ"LÑMÔMÐ M؈qrcóö—dt|¦«dd |¦«›�g}t|j|t ¦«¬¦«\}}|dkr$t | d||¦«¦«‚dS)z¦ Reset LVE limits for lve_id. Set default limits for LVE package or system default LVE :param: lve_id `int: LVE id :return: 0 r•ú --default=ú,rrÚDefault)r=Újoinrrrr rˆ)rrsr‹r¤r_rts rÚreset_lve_limitszLveCtl.reset_lve_limits(s{€ð•s˜6‘{”{Ð$C°·²¸&Ñ1AÔ1AÐ$CÐ$CÐDˆÝ$ TÔ%7¸ÕCUÑCWÔCWÐXÑXÔX‰ ˆ�#Ø �qŠ=ˆ=Ý! $×"2Ò"2°9¸fÀcÑ"JÔ"JÑKÔKÐ K؈qrcó —| |¦«dt|¦«dd |¦«›�g}t|j|t ¦«¬¦«\}}|dkr$t | d||¦«¦«‚dS)zk Reset LVP limits for reseller_name. :param: reseller_name str: :return: 0 r‘rªr«rrr¬)rAr=r­rrrr rˆ)rr4r‹r¤r_rts rÚreset_reseller_limitszLveCtl.reset_reseller_limits5s‘€ð ×+Ò+¨MÑ:Ô:Ð:Ø¥ MÑ 2Ô 2Ð4SÀÇÂÈ&ÑAQÔAQÐ4SÐ4SÐTˆÝ$ TÔ%7¸ÕCUÑCWÔCWÐXÑXÔX‰ ˆ�#Ø �qŠ=ˆ=Ý! $×"2Ò"2°9¸mÈSÑ"QÔ"QÑRÔRÐ R؈qrcóV—t|jddgt¦«¬¦«\}}|S)zO Apply all already configured limits :return: ret code ÚapplyrJr)rrr)rr_rts rÚapply_all_limitszLveCtl.apply_all_limitsBs0€õ % TÔ%7¸'À5Ð9IÕOaÑOcÔOcÐdÑdÔd‰ ˆ�#؈rcóô—| |¦«dt|¦«dg}t|j|t ¦«¬¦«\}}|dkr$t | d||¦«¦«‚dS)z  Disable reseller limits for given name; Equivalent to lvectl remove-reseller :type reseller_name: str :return: 0 zremove-resellerrDrrzDisable reseller limitsr§)rr4r¤r_rts rÚdisable_reseller_limitszLveCtl.disable_reseller_limitsJs~€ð ×+Ò+¨MÑ:Ô:Ð:Ø!¥3 }Ñ#5Ô#5°xÐ@ˆÝ$ TÔ%7¸ÕCUÑCWÔCWÐXÑXÔX‰ ˆ�#Ø �qŠ=ˆ=Ý! $×"2Ò"2Ð3LÈmÐ]`Ñ"aÔ"aÑbÔbÐ b؈qrc ó²—i|_tj ¦«sdSgd¢}|s| d¦«t |j|t¦«¬¦«\}}tj |¦«}|dkrt|d¦«‚tj ¦«D]}|r||krŒ |idœ|j|<Œ|  dg¦«D]|}|d  d ¦«\}} |r|| krŒ)|| d |d i|d d |di|d|dt|d|¦«dœdœ} | |j| d<Œ}dS)z— Load information about resellers; :type human_readable_numbers: bool :type reseller_name: str | None :return: N)rCrDrErFrrrG)Únamer‹rHÚIDú:rJrKrLrMrNrOrP)rRrSrTrUrVrW)Úidr·r‹r·)rrYrZr[r#rrrr\r]r rÚ resellersr3Úsplitr) rr.r4r^r_r`raÚresellerÚid_r·Ú reseller_infos rr2zLveCtl._load_resellers_infoXs¾€ð "ˆÔÝŒ}×5Ò5Ñ7Ô7ð Ø ˆFà@Ð@Ð@ˆ Ø%ð *Ø × Ò ˜yÑ )Ô )Ð )Ý(¨Ô);¸[ÕN`ÑNbÔNbÐcÑcÔcш�'Ý”j Ñ)Ô)ˆ Ø �qŠ=ˆ=Ý! +¨eÔ"4Ñ5Ô5Ð 5õœÑ)Ô)ð Nð NˆHØð  °(Ò!:Ð!:ØØ6>È"Ð-MÐ-MˆDÔ  Ñ *Ð *ð$Ÿš¨°Ñ3Ô3ð Hð HˆHØ  œ×,Ò,¨SÑ1Ô1‰IˆC�Øð  °$Ò!6Ð!6ØàØà! 8¨GÔ#4Ð5Ø" 4œ.Ø  (¨4¤.Ð1Ø$ VÔ,Ø% gÔ.ÝDÀXÈfÔEUØE[ñ]ô]ð ðð ð ˆMð;HˆDÔ  ¨vÔ!6Ñ 7Ð 7ð# Hð Hrcó>—|j€| ||¦«|j�dSi|_|�dt|¦«g}n|�dt|¦«g}ndg}| d¦«|s| d¦«t |j|t¦«¬¦«\}}tj |¦«}|dkrt|d¦«‚|d }|D]¹} i} | d } | d krd } | | d <d | di| d<d | di| d<t| d|¦«| d<| d| d<|j dkr$t| d|¦«| d<| d| d<|j dkr | d| d<| |jt| d¦«<Œº|�$| ||¦«} | r | |jd<dSd|jvrPi} d | d <d di| d<d di| d<d | d<d| d<|j dkr d | d<d| d<|j dkrd| d<| |jd<dSdS)!zÇ Loads all package info from lvectl :param human_readable_numbers: if True PMEM and VMEM limits in KBytes, MBytes or GBytes False - in bytes :return: None NÚpaneluserlimitsÚpaneluserslimitsrDrFrrrGrHr)Ú VE_DEFAULTrIrJrKrRrMrTrQrXrLrSr~rPrWrOrVérNrUr¸Ú0Ú0K)rr2rr=r#rrrr\r]r rrrrd) rr.r(r½r^r_r`raÚ json_dataÚpkg_dataÚ pkg_limitsÚpkg_nameÚreseller_defaultss rr*zLveCtl._load_info‰sÜ€ð Ô Ð 'Ø × %Ò %Ð&<¸hÑ GÔ GÐ Gà Ô Ð )Ø ˆFð ˆÔØ Ð Ø,­c°&©k¬kÐ:ˆKˆKØ Ð !Ø-­s°8©}¬}Ð=ˆKˆKà-Ð.ˆKØ×Ò˜8Ñ$Ô$Ð$Ø%ð *Ø × Ò ˜yÑ )Ô )Ð )Ý(¨Ô);¸[ÕN`ÑNbÔNbÐcÑcÔcш�'Ý”j Ñ)Ô)ˆ Ø �qŠ=ˆ=Ý! +¨eÔ"4Ñ5Ô5Ð 5Ø Ô'ˆ Ø!ð Að AˆH؈JØ  Ô*ˆHؘ<Ò'Ð'Ø$�à$,ˆJ�yÑ !à!&¨°Ô(9Ð :ˆJ�uÑ Ø % x°¤~Ð6ˆJ�tÑ Ý!IÈ(ÐSYÔJZØJ`ñ"bô"bˆJ�vÑ à'¨œ~ˆJ�tÑ ØÔ 1Ò$Ð$å%MÈhÐW]ÔN^ØNdñ&fô&f� ˜6Ñ"à&.¨wÔ&7� ˜7Ñ#ØÔ 1Ò$Ð$à%-¨fÔ%5� ˜6Ñ"Ø6@ˆDÔ �s 8¨D¤>Ñ2Ô2Ñ 3Ð 3à Ð Ø $× HÒ HÈÐSiÑ jÔ jÐ Ø ð Ø(9�Ô" 1Ñ%Ø�à �DÔ&Ð &Ð &àˆJØ$-ˆJ�yÑ !à!&¨  ˆJ�uÑ Ø % s˜|ˆJ�tÑ Ø!%ˆJ�vÑ Ø"ˆJ�tÑ ØÔ 1Ò$Ð$à%)� ˜6Ñ"Ø&)� ˜7Ñ#ØÔ 1Ò$Ð$à%(� ˜6Ñ"Ø$.ˆDÔ ˜qÑ !Ð !Ð !ð! 'Ð &r)F)N)NN)"r r r Ú__doc__ÚMEGAHERZÚGIGAHERZrrÚ_packages_limitsrrrÚ staticmethodr&r0r6rArdrlrˆrxr�r“r—r�rŸr¥r¨r®r°r³rµr2r*rrrrrs䀀€€€ððð€HØ€HØ€KØ&€MØÐØ€MØ€Oð$ð$ð$ðððñ„\ðððððð* ð ð ð ðð ð ð ñ„\ð ð""ð""ð""ð""ðHððð.BðBðBð )ð)ð)ð(Qð(Qð(Qð(QðT Pð Pð Pð ð ð ð ððððððð ð ð ð ð ð ð ð ð ð ð ð ð ðððð ð ð ð/Hð/Hð/HðbK/ðK/ðK/ðK/ðK/ðK/rr)r+r\rYÚclcommonrÚclcommon.clexceptionrÚ cllimits.librrÚcllimits.lib.utilsrrr rrrrúrÕsøðð € € € Ø € € € àÐÐÐØÐÐÐÐÐØ3Ð3Ð3Ð3Ð3Ð3Ø9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ðDðDðDðDðDðDðDðDð ð ð ð ð Ð(ñ ô ð ð{/ð{/ð{/ð{/ð{/ñ{/ô{/ð{/ð{/ð{/r