§ ½@¾jðyã ó<—ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mcmZddlmZddlmZddlmZddlmZmZmZmZmZmZddlZddlZddlZddl Z ddl!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+dd l,m-Z-dd l.m/Z/dd l0m1Z1dd l2m3Z3m4Z4dd l5m6Z6ddl7m8Z8m9Z9ddl:m;Z;mm?Z?m@Z@ddl mAZAmBZBmCZCmDZDmEZEddlFmGZGmHZHddlImJZKddlImLZLddlImMZNddlOmPZPdZQdZRdZSdZTdZUdZVdZWdZXdZYe8d ¦«ZZe[ej\ ]d!d¦«¦«Z^d"Z_e&e"j`¦«sdZadZbneDe^¬#¦«ZaeBea¬$¦«ZbGd%„d&e¦«Zcd'ecfd(„Zdd)„Zed*„Zfd+„Zgd,„Zhd-„Zid.„Zjd/„Zkd0e+fd1„ZldÖd2„Zmd3„Znd4d5d4d6dd7dd8d9œZod7Zpd:d5ddddddd9œZqgd;¢Zrda�d=a‚d=aƒd=a„d?„Z…d@„Z†dA„Z‡dB„Zˆd×dC„Z‰dD„ZŠdE„Z‹eЦ«p e‹¦«ZŒdØdF„Z�dG„ZŽdH„Z�dI„Z�dØdJ„Z‘dK„Z’ej“dL„¦«Z”dMecfdN„Z•dO„Z–d×dP„Z—dQ„Z˜dR„Z™dÙdS„ZšdT„Z›dU„ZœdV„Z�dWe[dXežfdY„ZŸdZ„Z d[„Z¡d\ee¢e[ffd]„Z£d^„Z¤dÚd`„Z¥da„Z¦dÛdb„Z§dÜdc„Z¨dd„Z©de„Zªdf„Z«dÖdg„Z¬dÖdh„Z­di„Z®dj„Z¯dk„Z°dØdl„Z±dm„Z²ia³dnZ´doZµdÖdp„Z¶dq„Z·dre[d'ežfds„Z¸d'e¹fdt„ZºGdu„dve»¦«Z¼dre[d'dfdw„Z½ dÝdx„Z¾dy„Z¿dz„ZÀd{„ZÁd|„ZÂdÞd~eÃdeÄd€e[d'e¢fd�„ZÅd‚„ZÆdƒ„ZÇd„d…d†d‡dˆd‰dŠd‹œZÈd×dŒ„ZÉ dßd�„ZÊe¿dfd�„ZËdÙd‘„ZÌd’„ZÍd“„ZÎd”„ZÏd•„ZÐdØd–„ZÑd—„ZÒd˜eÓdWe[d'dfd™„ZÔdš„ZÕd'eÃeÓeÓffd›„ZÖd×dàdœ„Z×d�„ZØdž„ZÙdŸ„ZÚd „ZÛd¡„ZÜd¢„ZÝd£„ZÞd¤„Zßd¥„Zàd¦„Zád§„Zâd¨„Zãd©„Zädª„Zåd«„Zæd¬„ZçdØd­„Zèd®„ZédØd¯„ZêdÖd°„Zëd±Zìd²e¢d'dfd³„ZídÖd´„Zîdµe¢d²e¢d'ee[fd¶„Zïd·„Zðd¸„Zñd¹„Zòdº„Zód»„Zôd×d¼„Zõd½„Zöd¾„Z÷d¿„ZødádÀ„ZùdÁ„Zúd„ZûdÄZüdaýdaþdaÿd�ad�ad�adÄ„�ZdâdÆ„�ZdÇ„�Zd×dÈ„�ZdÉ„�ZdÊ„�ZdË„�Z dÌ„�Z dÍ„�Z d΄�Z dÏ„�Z dЄ�ZdÑ„�Z dãdÒ„�ZdÓ„�ZdÔ„�ZdÕ„�ZdS)äéN)Úrange)Úpartial)ÚPAGESIZE)ÚDictÚListÚOptionalÚTextÚTupleÚ TypedDict)ÚFeature)ÚadminsÚget_main_username_by_uidÚis_panel_feature_supportedÚreseller_usersÚ userdomains)ÚCPAPIExceptionÚ EncodingError)Ú acquire_lock)ÚExternalProgramFailed)Údetect_panelclass)Úreseller_limits_disabled_postÚreseller_limits_enabled_post)Ú exec_utility)Úget_lvectl_child_loggerÚget_subprocess_logger)ÚBadVeConfigExceptionÚget_xml_configÚsave_xml)ÚLockFailedExceptionÚsetup_global_lock)ÚLVP_XML_TAG_NAMEÚLveÚNameMapÚPyLveÚ PyLveError)Úcreate_dir_secureÚwrite_file_via_tempfile)Úconfig)Údomain_lve_sentry_extra)Ú id_registry)ÚLvdErrorz%/usr/bin/getcontrolpaneluserspackagesz /proc/cpuinfoi'Ú VE_DEFAULTFz /bin/umountz"/etc/container/exclude_mounts.confÚmultiÚsingleÚ lvectllibÚ PYLVE_DEBUGÚplesk_id)Údebug)Úpycó\—eZdZUeezed<eed<eed<eed<eed<eed<eed<dS) ÚLiblveSettingsÚls_cpuÚls_cpusÚls_ioÚ ls_entersÚ ls_memory_phyÚls_nprocÚls_iopsN)Ú__name__Ú __module__Ú __qualname__ÚintÚstrÚ__annotations__©óúpy/lvectllib.pyr5r5VsY€€€€€€Ø �#‰IÐÐÑØ €L€L�LØ €J€J�JØ€N€N�NØÐÐÑØ€M€M�MØ €L€L�L€L€LrDr5Úreturnc óD—ddddddddœ}| |¦«|S)Nr)r6r7r8r9r:r;r<)Úupdate)ÚkwargsÚdefaultss rEÚcreate_liblve_settingsrK`s<€àØØØØØØð ð €Hð ‡O‚O�FÑÔÐØ €OrDcót—t ¦«rtj ¦«SgS)zÉRaw kernel LVP list (/proc/lve/resellers), including per-user domain-isolation LVPs. Reserved for isolation-aware internals; reseller- management code MUST iterate reseller_lvp_list() instead.)ÚlveÚreseller_limit_supportedÚprocÚ lvp_id_listrCrDrEÚlvp_listrQns1€õ ×#Ò#Ñ%Ô%ð&ÝŒx×#Ò#Ñ%Ô%Ð%Ø €IrDcó`—ttj¦«¦«t¦«z S)u§Per-user domain-isolation LVP ids (lvp). The kernel registers an LVP named lvp in /proc/lve/resellers for every user that has per-domain isolation allowed/enabled (a marker in the websiteisolation config), even when the user has 0 registered domains. These are not resellers — they are maintained by the isolation feature — so reseller-management code must never treat them as reseller LVPs. This is the single source of truth for "is this kernel LVP an isolation LVP"; it mirrors the same find_all_lve_ids_with_config() signal that lveapi uses to build the nested LVP/LVE hierarchy. Note this is broader than _is_domain_isolated_user(), which additionally requires >= 1 domain: the kernel LVP exists on the marker alone (see CLOS-4513). CLOS-5716: reseller UIDs are excluded even when they carry a marker. A reseller LVP is never a per-user isolation LVP, but a bare lvd_ids marker can be planted on a reseller UID too (lvectl allow-domain-limits / cagefsctl --isolates-allow-all). Without this exclusion such a reseller wrongly matched is_isolation_lvp() and was skipped in lve_apply_all(), leaving the reseller LVP zeroed and every sub-user under it degraded to the kernel default on boot. This read-side exclusion is the backstop; enable_domain_isolation() additionally refuses to plant the marker on a reseller in the first place (write-side guard), so both ends are covered. Disk-only: callable from non-lvectl entrypoints (cloudlinux-packages, clsummary) that do not initialize pylve, so this MUST NOT make a kernel call. ws_config.find_all_lve_ids_with_config() reads /etc/container/lvd_ids and returns [] when the directory is absent, which covers both "kernel does not support domains" and "no isolation configured" without needing lve_kapi_ver(). _reseller_lvp_ids() is likewise disk-only (reads ve.cfg). )Ú frozensetÚ ws_configÚfind_all_lve_ids_with_configÚ_reseller_lvp_idsrCrDrEÚ_isolation_lvp_idsrWws(€õB •YÔ;Ñ=Ô=Ñ >Ô >ÕARÑATÔATÑ TÐTrDcóê— t¦«}| ¦«t| ¦«¦«S#tjt tf$rt¦«cYSwxYw)uÌUIDs registered as in ve.cfg (disk-only). Read via NameMap, which loads the reseller id/name pairs from ve.cfg without any kernel call, so this stays usable from the same non-lvectl entrypoints as _isolation_lvp_ids(). Any failure to read ve.cfg degrades to excluding nothing (frozenset) rather than aborting the isolation lookup that lve_apply_all()/clsummary/cloudlinux-packages depend on: * NameMapConfigError — malformed ve.cfg, * LockFailedException — ve.cfg lock held/unavailable, * OSError — no /etc/container at all (the RPM %check mock chroot) or a non-root reader that can't open the lock file (FileNotFoundError/PermissionError). Before CLOS-5716 this function did not exist and _isolation_lvp_ids() never touched ve.cfg, so it could not fail on any of these; the broad fallback preserves that resilience. )r#Ú link_xml_noderSÚid_listÚlveapiÚNameMapConfigErrorrÚOSError©Úname_maps rErVrV›sr€ð&Ý‘9”9ˆØ×ÒÑ Ô Ð Ý˜×)Ò)Ñ+Ô+Ñ,Ô,Ð,øÝ Ô %Õ':½GÐ Dððð݉{Œ{ÐÐÐðøøøs‚AAÁ*A2Á1A2có"—|t¦«vS)zKTrue if lvp_id is a per-user domain-isolation LVP (see _isolation_lvp_ids).)rW©Úlvp_ids rEÚis_isolation_lvprc¶s€à Õ'Ñ)Ô)Ð )Ð)rDcóT‡—t¦«Šˆfd„t¦«D¦«S)aGKernel reseller LVPs, excluding per-user domain-isolation LVPs. Use this everywhere reseller-management code enumerates resellers (destroy all, apply all, remove absent resellers, list-reseller, package limits, summaries). Centralizing the phantom-isolation-LVP filter here means a new reseller command cannot reintroduce the CLOS-4370/4390/4419/4513 class of bug as long as it iterates this function instead of the raw lvp_list(). Backward compatible: on kernels without domain support the isolation set is empty, so the result equals lvp_list(). có•—g|]}|‰v¯|‘Œ SrCrC)Ú.0rbÚ isolations €rEú z%reseller_lvp_list..Ès#ø€Ð GÐ GÐ G�v¨v¸YÐ/FÐ/FˆFÐ/FÐ/FÐ/FrD)rWrQ)rgs@rEÚreseller_lvp_listri»s.ø€õ#Ñ$Ô$€IØ GÐ GÐ GÐ G¥¡¤Ð GÑ GÔ GÐGrDcón—t¦«}| ¦«| ¦«S)zf Get list of resellers with activated reseller limits :return: list of pairs (name, uid) )r#rYÚload_from_noder^s rEÚget_active_resellersrlËs1€õ ‰yŒy€HØ ×ÒÑÔÐØ × "Ò "Ñ $Ô $Ð$rDcó6—|d„t¦«D¦«vS)z] Check whether giver reseller has activated reseller limits or not :return: bool c3ó K—|] \}}|V—Œ dS©NrC)rfÚnameÚuids rEú z,is_active_reseller_limits..Ûs&èè€ÐJÐJ¡i d¨C˜TÐJÐJÐJÐJÐJÐJrD)rl©Ú reseller_names rEÚis_active_reseller_limitsruÖs%€ð ÐJÐJÕ3GÑ3IÔ3IÐJÑJÔJÐ JÐJrDÚecóÄ—tj¦«s|‚tr tddt |¦«g¦«nt |¦«t jd¦«dS)a" Since cPanel user can corrupt config file for some user with wrong encodings, we want to notify him that he should fix encoding problems with the link to documentation. Print error message and exit with code 1 or raise given exception if it isn't cPanel. :return: None r-ÚERRORéN)Ú cldetectlibÚ is_cpanelÚJSONÚ json_formatrAÚprintÚsysÚexit©rvs rEÚraise_cpanel_encoding_errorr‚ßsg€õ Ô Ñ "Ô "ð؈å ðÝ�GØ�c !™fœfÐ%ñ 'ô 'ð 'ð 'õ ˆa‰ŒˆÝ„HˆQ�K„K€K€K€KrDcóh— t|¦«dS#t$rtdd¦«YdSwxYw)az ~~~~~~~~~~~~~~~~~~ !!! DEPRECATED !!! ~~~~~~~~~~~~~~~~~~ Please, use setup_global_lock instead if possible Wrapper over setup_global_lock. If lock cannot be set, it will write message and close app The only reason why it is here is legacy function check_result_and_exit that we use in TWO places :type write: bool :return: Nothing ryzcan`t get lockN)r rÚcheck_result_and_exit)Úwrites rEÚget_global_lockr†ñsP€ð3ݘ%Ñ Ô Ð Ð Ð øÝ ð3ð3ð3ݘaÐ!1Ñ2Ô2Ð2Ð2Ð2Ð2ð3øøøs ‚“1°1có¼—|dtj fvrJtrttdd|›�g¦«nt d|›�¦«t j|¦«dSdS)Nrrxzlvectl: zlvectl: Error: )ÚerrnoÚENOSYSr|r}Ú MULTI_FORMATr~rr€)ÚresultÚmessages rEr„r„st€à �a�%œ,˜Ð'Ð'Ð'Ý ð /Ý �  wÐ0D¸7Ð0DÐ0DÐ&EÑ FÔ FÐ FÐ Få Ð- GÐ-Ð-Ñ .Ô .Ð .Ý Œ�ÑÔÐÐÐð (Ð'rDéryéié)ÚcpuÚncpuÚioÚepÚmemÚpmemÚnprocÚiopséd)r‘r�r’r”r•r–r—r“éÚÚfalsecó —|adSro)r|)Ú json_flags rEÚset_jsonržJs €à €D€D€DrDcó —|adSro)Ú BYTES_FLAG)Ú bytes_flags rEÚ set_bytesr¢Os €à€J€J€JrDcó —|adS)z‹--exact-limits: add LIMITS/INDIVIDUAL to paneluserslimits JSON rows. Opt-in because existing readers match the row text as it is. N)Ú EXACT_LIMITS)Úexact_limits_flags rEÚset_exact_limitsr¦Ts €ð %€L€L€LrDcó—trtdkrd}ntdkrd}ntdkrd}nd}gd¢gd¢gd¢gd ¢d œ|}tr1| d ¦«d z}|d|…d gz||d…zS|S)NéÚnoiops_8Ú8éÚ6Ú4)ÚIDÚSPEEDÚPMEMÚVMEMÚEPÚNPROCÚIO)r®r¯r°r±r²r³r´ÚIOPS)r®r¯r±r²r´)r©rªr¬r­r¯ryÚCPU)ÚNOIOPSÚ LVE_VERSIONr|Úindex)ÚversionÚfieldsÚ speed_idxs rEÚ get_fieldsr½]sÈ€Ý ð•+ Ò"Ð"؈ˆÝ ˜Ò Р؈ˆÝ ˜Ò Р؈ˆàˆàBÐBÐBØ BÐ BÐ BØ ;Ð ;Ð ;Ø ,Ð ,Ð ,ð ðð ô €Fõ  ðCØ—L’L Ñ)Ô)¨AÑ-ˆ Ø�z˜ �zÔ" e WÑ,¨v°i°j°jÔ/AÑAÐBØ €MrDcóú—|€3tj¦«}|d€td¦«‚|dan|at ¦«}|std¦«‚t ¦«adS)Nrzget_lve_version failedzinit_lve() failed.)ÚclcommonÚget_lve_versionÚ RuntimeErrorr¸ÚpylveÚ initializeÚliblve_settingsÚ lve_settings)Úlve_verÚ lve_statuss rEÚinitrÈss}€à€ÝÔ*Ñ,Ô,ˆØ �1Œ:Ð ÝÐ7Ñ8Ô8Ð 8ؘa”jˆ ˆ àˆ õ×!Ò!Ñ#Ô#€JØ ð1ÝÐ/Ñ0Ô0Ð0å×(Ò(Ñ*Ô*€L€L€LrDcó—tj d¦«}|€dS tj|¦«S#t t f$r<}tdt|¦«¦«tj d¦«Yd}~dSd}~wwxYw)z-Get cpu information from environment veriableÚCPU_DATANz.Invalid environment variable 'CPU_DATA' formatry) ÚosÚenvironÚgetÚjsonÚloadsÚ TypeErrorÚ ValueErrorr~rArr€)Úpacked_cpu_datarvs rEÚ_get_cpu_data_from_envrÓ‰s‰€å”j—n’n ZÑ0Ô0€OØÐ؈tðÝŒz˜/Ñ*Ô*Ð*øÝ •zÐ "ðððÝ Ð@Å#ÀaÁ&Ä&ÑIÔIÐIÝ Œ�‰ Œ ˆ ˆ ˆ ˆ ˆ ˆ ˆ øøøøðøøøs¥9¹BÁ 1BÂBcóÀ—i}i}d} ttdd¬¦«5}|D]Ø}| ¦«s||d|›�<|dz}i}Œ&t| d¦«¦«dkr\| d¦«d ¦«|| d¦«d ¦«<Œ¨d || d¦«d ¦«<ŒÙ d d d ¦«n #1swxYwYn<#t $r/t d t›d �¦«tjd¦«YnwxYw||d dgS)zF Parse /proc/cpuinfo return [NumProc, frequency in MHZ] rÚrúutf-8©ÚencodingrOryú:éršNzlvectl: Error: Can`t open ú.Úproc0zcpu MHz) ÚopenÚCPUINFOÚstripÚlenÚsplitÚIOErrorr~rr€)ÚcpuinfoÚprocinfoÚnprocsÚfÚlines rEÚ get_cpu_datarè–s¿€ð€GØ€HØ €Fðå •'˜3¨Ð 1Ñ 1Ô 1ð B°QØð Bð B�Ø—z’z‘|”|ð Bà/7�G˜O 6˜O˜OÑ,Ø# a™Z�Fà!�H�Hå˜4Ÿ:š: c™?œ?Ñ+Ô+¨qÒ0Ð0Ø?C¿zºzÈ#¹¼ÈqÔ?Q×?WÒ?WÑ?YÔ?Y˜ §¢¨C¡¤°Ô!3×!9Ò!9Ñ!;Ô!;Ñ<Ð<à?A˜ §¢¨C¡¤°Ô!3×!9Ò!9Ñ!;Ô!;Ñ<Ð<ð Bð Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bøøõ ðððÝ Ð5­7Ð5Ð5Ð5Ñ6Ô6Ð6Ý Œ�‰ Œ ˆ ˆ ˆ ðøøøð �G˜GÔ$ YÔ/Ð 0Ð0s5ˆDŸCDÃ< DÄD Ä DÄD ÄDÄ6E Å E cód—t|¦«}|pd}t}t|d¦«}tjd|¦«}|�it|¦«}d|cxkrdkrMnnJtt t dz|z|z¦«¦«}|dkr|St|t z|¦«SdS)zû Try converting to kernel format from old CPU format (percentage of whole cpu) and optionally the NCPU format. Return whichever is less. :param data: string presumably in old CPU format :param lncpu: integer number of cores limit rz \d{1,2}0?$Nr˜)rAÚ CPUINFO_DATAr@ÚreÚmatchÚroundÚ CORE_WEIGHTÚmin)ÚdataÚlncpuÚcpu_datar‘Ú cpu_percentÚfrom_cpu_limits rEÚconvert_from_old_cpurõ»s¶€õ ˆt‰9Œ9€DØ ˆJ�Q€EÝ€HÝ ˆx˜Œ{Ñ Ô €DÝ”(˜=¨$Ñ/Ô/€KØÐÝ�4‰yŒyˆØ ˆtˆ?ˆ?Š?ˆ?�sŠ?ˆ?ˆ?ˆ?ˆ?Ý ¥¥{°cÑ'9¸DÑ'@À4Ñ'GÑ!HÔ!HÑIÔIˆNؘŠzˆzØ%Ð%Ý�u�{Ñ*¨NÑ;Ô;Ð ;Ø ˆ4rDcóJ—t|¦«}t}t|d¦«}tjd|¦«}|�`t | dd¦«¦«}||dzkr|dz}|dkr'tttdz|z¦«¦«SdSdS)zd Try converting cpu limit from SPEED in percentage of one CORE format to kernel format. rz\d+(?:\.\d+)?%$Nú%ršr˜) rArêr@rërìÚfloatÚreplacerírî)rðròr‘Úpercents rEÚconvert_from_speed_percentrûÑs£€õ ˆt‰9Œ9€DÝ€HÝ ˆx˜Œ{Ñ Ô €DÝŒhÐ)¨4Ñ0Ô0€GØÐݘŸ š  S¨"Ñ-Ô-Ñ.Ô.ˆØ �T˜C‘ZÒ Ð Ø˜S‘jˆGØ �QŠ;ˆ;Ý•u�[¨CÑ/°'Ñ9Ñ:Ô:Ñ;Ô;Ð ;؈tØ ˆ4rDcó—t|¦«}t}t|d¦«}t|d¦«}t jdtj¦«}| |¦«}|��| d¦«}t| d¦«¦«}|  ¦«dkr|dz}|||zkr||z}|dkr'tt|tz|z ¦«¦«SdS) zQ Try converting cpu limit from SPEED in mhz/gzh format to kernel format. rryz,(?P\d+(?:\.\d+)?)(?Pmhz|ghz)+$NÚsuffixÚfreqÚGHZiè) rArêr@rørëÚcompileÚ IGNORECASErìÚgroupÚupperrírî)rðròr‘Úcpu_freqÚpatternrìrýrþs rEÚconvert_from_speed_hzrãsí€õ ˆt‰9Œ9€DÝ€HÝ ˆx˜Œ{Ñ Ô €DÝ�X˜a”[Ñ!Ô!€HÝŒjÐHÍ"Ì-ÑXÔX€GØ �MŠM˜$Ñ Ô €EØ ÐØ—’˜XÑ&Ô&ˆÝ�U—[’[ Ñ(Ô(Ñ)Ô)ˆØ �<Š<‰>Œ>˜UÒ "Ð "ؘ$‘;ˆDØ �(˜T‘/Ò !Ð !ؘd‘?ˆDØ �!Š8ˆ8Ý•u˜T¥KÑ/°(Ñ:Ñ;Ô;Ñ<Ô<Ð <Ø ˆ4rDcó>—t|¦«pt|¦«S)z} Try converting cpu limit value from either SPEED limit format (percentage of CORE or mhz/ghz) to kernel format. )rûr)rðs rEÚconvert_from_speedrøs$€õ # 4Ñ(Ô(ð 'Ý  Ñ &Ô &ðrDcóz—t||¦«}|�|St|¦«}|�|St|¦«}|�|SdS)zý Convert different variants of cpu limit to kmod ver 8 variant :param data: Value in old CPU format or SPEED with % or mhz/ghz. :param lncpu: Limit in old NCPU format. :return: CPU limit in kmod ver 8+ format or None for bad format N)rõrûr)rðrñÚfrom_cpuÚfrom_speed_percentÚ from_speed_hzs rEÚconvert_to_kernel_formatr sV€õ$ D¨%Ñ0Ô0€HØÐ؈Ý3°DÑ9Ô9ÐØÐ%Ø!Ð!Ý)¨$Ñ/Ô/€MØÐ ØÐà ˆ4rDc óp—t}t|d¦«}t|¦«}d|vrOdtttt| d¦«¦«|z¦«¦«¦«zStttt|¦«|z¦«¦«¦«S)zm convert speed to old cpu format args: cpu limit in speed value return: old cpu limit format rÚ*)rêr@rAríÚlstrip)Úspeedròr–s rEÚspeed_to_old_cpurs“€õ €HÝ �˜” Ñ Ô €EÝ �‰JŒJ€EØ ˆe€|€|Ø•S��U¥3 u§|¢|°CÑ'8Ô'8Ñ#9Ô#9¸UÑ#BÑCÔCÑDÔDÑEÔEÑEÐEÝ �s•5�˜U™œ uÑ,Ñ-Ô-Ñ.Ô.Ñ /Ô /Ð/rDc#óˆK—t ¦«t ¦«} t ||¦«n2#t$r%t jt jd|›d�¦«‚wxYw |V—t |¦«dS#t |¦«wxYw)zF Run subprocess in lve with pseudo-random id and given limits zUnable to setup lve with id z-, something is wrong, check dmesg for detailsN)rÂrÃÚget_available_lve_idÚ lve_setupr%ÚsyslogÚ LOG_ALERTÚ lve_destroy)ÚsettingsÚlve_ids rEÚ temporary_lver%sÝèè€õ  ×ÒÑÔÐÝ × 'Ò 'Ñ )Ô )€FðÝ �Š˜ Ñ)Ô)Ð)Ð)øÝ ðððÝŒ •fÔ&ð)VÀvð)Vð)Vð)Vñ Wô Wð Wà ðøøøð "؈ ˆ ˆ å ×Ò˜&Ñ!Ô!Ð!Ð!Ð!ø�×Ò˜&Ñ!Ô!Ð!Ð!øøøs¶AÁ/BÂB%Â%CrcóR—t ¦«}t|d|d¬¦«|_|d|_|d|_|d|_|d|_ttj d|d ztz ¦«¦«|_ |S) a Just a nice user-friendly constructor of liblve_settings object You can pass the following ls_cpu and ls_cpus values: - in percents of one core (just ls_cpu='75%', ls_cpus will be ignored) - in old 'CPU' format (two arguments, ls_cpu and ls_cpus required, both int) r6r7©rñr8r9r;r<gð?r:) rÂrÄr r6r8r9r;r<r@ÚmathÚceilrr:)rÚss rEÚmake_liblve_settingsr!:s�€õ ×ÒÑÔ€AÝ'¨°Ô(:À(È9ÔBUÐVÑVÔV€A„HØ�wÔ€A„Gؘ;Ô'€A„Kؘ*Ô%€A„JؘÔ#€A„Iå�$œ) B¨°/Ô)BÑ$BÅXÑ$MÑNÔNÑOÔO€A„OØ €HrDcóÄ—t| d¦«¦«}|s.| d¦«}tj|¦«j}t |¦«S)NÚidÚuser)rAÚ getAttributeÚpwdÚgetpwnamÚpw_uidr@)Úve_lve_elementÚuser_uidÚ user_names rEÚget_ve_lve_user_uidr,MsV€Ý�>×.Ò.¨tÑ4Ô4Ñ5Ô5€HØ ð2Ø"×/Ò/°Ñ7Ô7ˆ Ý”<  Ñ*Ô*Ô1ˆÝ ˆx‰=Œ=ÐrDcóê—dt|d¦«i}|tkrt|d¦«|d<|�| |¦«tt j|¦«¦«dS)a† Print output in json as: {"status": "ERROR/OK", "msg": "Some Message", "ext1": "foo", "ext2": "bar"} where "status" and "msg" field are mandatory :param str error_type: Either MULTI_ERROR or SINGLE_ERROR :param list data: List with a status string and a message string :param dict extensions: Some additional fields for the final json object :return: None ÚstatusrryÚmsgN)rArŠrHr~rÎÚdumps)Ú error_typerðÚ extensionsr‹s rEr}r}Usl€ð�˜D œG™ œ Ð %€FØ•\Ò!Ð!ݘD œG™ œ ˆˆu‰ ØÐØ� Š �jÑ!Ô!Ð!Ý �$Œ*�VÑ Ô ÑÔÐÐÐrDcó¢— tt |¦«d d¦«¦«||<dS#tt t f$rp||||<| |¦«}| dt||¦«¦« |j |¦«YdS#t$rYYdSwxYwwxYw)NrÚlimit) r@Ú ve_defaultÚgetElementsByTagNamer%rÑÚ IndexErrorrÐÚ createElementÚ setAttributerAÚ appendChildÚ Exception)ÚxmlÚ ve_defaultsÚve_cfgÚvalÚdefaultÚnodes rEÚcheck_def_valuerBhsê€ð Ý�z×>Ò>¸sÑCÔCÀAÔF×SÒSÐT[Ñ\Ô\Ñ]Ô]ˆ �CÑÐÐøÝ � ¥IÐ .ðððØ" 3œ<ˆ �CÑØ×#Ò# CÑ(Ô(ˆØ ×Ò˜'¥# g¨c¤lÑ"3Ô"3Ñ4Ô4Ð4ð Ø ˆCŒO˜DÑ !Ô !Ð !Ð !Ð !Ð !øÝð ð ð Ø ˆDˆDˆDð øøøð øøøs+‚AAÁA CÂ(B;Â; C ÃCà C à Ccó*‡—ˆfd„|jD¦«S)Ncó^•—g|])}t|tj¦«¯|j‰k¯'|‘Œ*SrC)Ú isinstancer<ÚElementÚtagName)rfÚ_Útags €rErhz"xml_filter_tag..vs7ø€Ð ZÐ ZÐ Z�!­*°Q½¼ Ñ*DÔ*DÐ ZÈÌÐVYÒIYÐIYˆAÐIYÐIYÐIYrD)Ú childNodes)rArIs `rEÚxml_filter_tagrKusø€Ø ZÐ ZÐ ZÐ Z�t”Ð ZÑ ZÔ ZÐZrDcóš—t||¦«D]9}|�| |¦«sŒ|�| |¦«|krŒ6|cSdSro)rKÚ hasAttributer%)rArIÚattrÚattr_valÚ child_nodes rEÚxml_filter_firstrQysn€Ý$ T¨3Ñ/Ô/ððˆ Ø Ð  J×$;Ò$;¸DÑ$AÔ$AÐ Ø Ø Ð  J×$;Ò$;¸DÑ$AÔ$AÀXÒ$MÐ$MØ ØÐÐÐð ðrDcóp—t|||¬¦«}|€t¦«‚| |¦«S)N)rArIrN)rQr7r%)rArIrNÚfiltered_child_nodes rEÚget_child_tag_atrrrT‚s;€Ý*°¸#ÀDÐIÑIÔIÐØÐ"݉lŒlÐØ × +Ò +¨DÑ 1Ô 1Ð1rDcóx—t||¦«d}| |t|¦«¦«dS)z„ Find in children nodes node with tag and setup attribute insted el.getElementsByTagName not search recursiveli in tree rN)rKr9rA)rArIrNr?Úfirst_child_nodes rEÚset_child_tag_atrrrW‰s;€õ & d¨CÑ0Ô0°Ô3ÐØ×!Ò! $­¨C©¬Ñ1Ô1Ð1Ð1Ð1rDcó— t¦«\aadS#t$rg}tr%t t dt|¦«g¦«ntt|¦«¦«tj d¦«Yd}~dSd}~wwxYw)zLoad config from ve.cfgrxryN) rr>Ú ve_lveconfigrr|r}rŠrAr~rr€r�s rEÚ_load_config_wrapperrZ’sŠ€ð Ý-Ñ/Ô/ш� � � øÝ ðððÝ ð Ý �  wµ°A±´Ð&7Ñ 8Ô 8Ð 8Ð 8å •#�a‘&”&‰MŒMˆMÝ Œ�‰ Œ ˆ ˆ ˆ ˆ ˆ ˆ ˆ øøøøð øøøs‚• BŸABÂBrbÚ lvp_defaultscóz—da |s"ttd¦«datS|r!t  d¦«atStttdt|¦«¦«}|r|  d¦«danPttd¦«r t  t¦«anttd¦«datS#t$r@tr't!dddg¦«t#jd ¦«nt'd ¦«YnwxYwtS) z¬Load default limits :param int lvp_id: lvp id :param bool lvp_defaults: load reseller's default limits instead of global :return: dict with default limits ÚtruerJrr#Ú cloneNoder-ÚWARNINGzdefault section error in ve.cfgryz(warning: default section error in ve.cfg)ÚubcrKrYr5Ú LVE_DEFAULTr>r8Ú LVP_DEFAULTrQr!rAr6Úhasattrr^r7r|r}rr€r~)rbr[Údefaults_root_nodes rEÚ_load_default_limitsre¡s8€ð €Cð>Øð Ý'­ °jÑAÔAÀ!ÔDˆJÝÐ à ð Ý×-Ò-¨jÑ9Ô9ˆJÝÐ å-­lÕð>ð>Ý ð >Ý ˜ )Ð-NÐ!OÑ PÔ PÐ PÝ ŒH�Q‰KŒKˆKˆKå Ð<Ñ =Ô =Ð =øøð >øøøõ Ðs„#C)¨"C)Á BC)Ã)AD3Ä2D3c ó|—td„ttttt t fD¦«¦«S)Nc3ó"K—|] }|dkV—Œ dS)ršNrC)rfÚxs rErrz._all_config_elements_loaded..Ës&èè€ÐjÐj˜1ˆq�BŠwÐjÐjÐjÐjÐjÐjrD)ÚallÚve_lveÚve_lvpÚ ve_packageÚ ve_binaryÚve_enter_by_nameÚve_cfg_versionrCrDrEÚ_all_config_elements_loadedrpÊs.€Ý ÐjÐj¥­µ½YÕHXÕZhÐ iÐjÑjÔjÑ jÔ jÐjrDcó¬—t d¦«at d¦«at t¦«at jj  t¦«t d¦«}t|¦«dkr |da n9t  d¦«a t t¦«t d¦«at d¦«}t|¦«dkrt!|djj¦«ndadS) z$Load all config elements from ve.cfgrMÚpackagez enter-by-namerÚbinaryrºryN)rYr6rjrlr!rkrMÚmapr_rYràrnr>r8r:rmr@Ú firstChildÚ nodeValuero)Úenter_by_name_elemsÚcfg_version_elemss rEÚ_load_config_elementsryÍs€õ× .Ò .¨uÑ 5Ô 5€FÝ×2Ò2°9Ñ=Ô=€JÝ × .Ò .Õ/?Ñ @Ô @€FÝ„GÔ×"Ò"¥<Ñ0Ô0Ð0å&×;Ò;¸OÑLÔLÐÝ Ð ÑÔ !Ò#Ð#Ø.¨qÔ1ÐÐå!×/Ò/°Ñ@Ô@ÐÝ× Ò Õ!1Ñ2Ô2Ð2å ×5Ò5°hÑ?Ô?€Iõ%×9Ò9¸)ÑDÔDÐÝGJÐK\ÑG]ÔG]Ð`aÒGaÐGa•SÐ*¨1Ô-Ô8ÔBÑCÔCÐCÐgh€N€N€NrDÚdefault_limitscó0—iattttt|¬¦«}|d¬¦« t d¦«d d¦«}t|td¬¦«td<n¶#tttf$rœt|dtd¬¦«td<t  d¦«}|  dt|d¦«¦« t |¦«n#t$rYnwxYwYnwxYw t!t d¦«d d ¦«¦«td <nœ#tttf$r‚|d td <t  d¦«}|  d t|d ¦«¦« t |¦«n#t$rYnwxYwYnwxYw|d ¬¦«t"d kr |d ¬¦«n|d d t$i¬¦«|d¬¦«|d¬¦«|d¬¦«t'¦«dS)z~Create ve_defaults dict with default values for all limits :param dict default_limits: default limits for lve or lvp )r<r=r>r@r‘)r?r�rr4rÚotherÚ maxentryprocsr“r’ér”)r?r@r•r–r—N)r=rrBr5r>r6r%r rÑr7rÐr8r9rAr:r;r@r¸ÚMEM_DEFAULT_CL5Ú_check_defaults_for_nones)rzÚ check_def_valrr�r“s rEÚ_load_ve_defaultsr‚òs¼€ð€KÝÝÝ ÝÝØð ñô€Mð€M�fÐÑÔÐð Ý×/Ò/°Ñ6Ô6°qÔ9×FÒFÀwÑOÔOˆÝ5°eÅ;ÈvÔCVÐWÑWÔW� �EÑÐøÝ � ¥IÐ .ðððÝ5°nÀUÔ6KÕS^Ð_eÔSfÐgÑgÔg� �EÑÝ×"Ò" 5Ñ)Ô)ˆØ ×Ò˜¥# n°UÔ&;Ñ"<Ô"<Ñ=Ô=Ð=ð Ý × "Ò " 3Ñ 'Ô 'Ð 'Ð 'øÝð ð ð Ø ˆDð øøøøøð øøøð Ý¥ × ?Ò ?ÀÑ HÔ HÈÔ K× XÒ XÐYhÑ iÔ iÑjÔj� �DÑÐøÝ � ¥IÐ .ðððØ*¨4Ô0� �DÑÝ × !Ò ! 'Ñ *Ô *ˆØ �Š˜­¨^¸DÔ-AÑ)BÔ)BÑCÔCÐCð Ý × "Ò " 2Ñ &Ô &Ð &Ð &øÝð ð ð Ø ˆDð øøøøøð øøøð€M�dÐÑÔÐÝ�Q‚€Øˆ ˜%Ð Ñ Ô Ð Ð àˆ ˜%¨%µÐ)AÐBÑBÔBÐBØ€M�fÐÑÔÐØ€M�gÐÑÔÐØ€M�fÐÑÔÐåÑÔÐÐÐso¸ABÂBEÄD0Ä/EÄ0 D=Ä:EÄ<D=Ä=EÅEÅAFÆA*H)Ç;HÈH)È H#È H)È"H#È#H)È(H)cóö—t ¦«D]^\}}|�Œd|›d�}trtdd|g¦«n"tj |›d�¦«t jd¦«Œ_dS)z*Check that all default values are not NoneNzERROR: Incorrect z default valuer-rxú ry)r=Úitemsr|r}rÚstderrr…r€)ÚkeyÚvalueÚerr_msgs rEr€r€(s‘€õ"×'Ò'Ñ)Ô)ð ð ‰ ˆˆUØ Ð Ø à9 cÐ9Ð9Ð9ˆÝ ð -Ý ˜ '¨7Ð!3Ñ 4Ô 4Ð 4Ð 4å ŒJ× Ò  ˜^˜^˜^Ñ ,Ô ,Ð ,Ý Œ�‰ Œ ˆ ˆ ð ð rDTcóœ—t¦«t||¦«}|st¦«st¦«t |¦«dS)z� :param bool lvp_defaults: load reseller's default limits instead of global :param int lvp_id: lvp id to load customise defaults N)rZrerpryr‚)rbr[Úload_config_elementsrzs rEÚ get_XML_cfgrŒ8sW€õ ÑÔÐÝ)¨&°,Ñ?Ô?€Nðð Õ#>Ñ#@Ô#@ð ÝÑÔÐå�nÑ%Ô%Ð%Ð%Ð%rDcó´— tt||d¬¦«¦«}|||<|S#tttf$rt||¦«cYSwxYw)Nr4©rIrN)r@rTrÑr7rÐ)r?Úelr=Ú setup_datarˆs rEÚ check_valuer‘Hsm€ð%ÝÕ& r¨s¸ÐAÑAÔAÑBÔBˆØˆ �3‰Øˆ øÝ � ¥IÐ .ð%ð%ð%Ý�;˜sÔ#Ñ$Ô$Ð$Ð$Ð$ð%øøøs‚%(¨,AÁAcó —tj¦«}| ¦«| |¦«}t ||¬¦«dS)a5 This function is a pure workaround for our ugly globals-based API which should be fixed partially with LU-496, because there is no clean way to retrieve reseller's data from ve.cfg without touching globals :param reseller: reseller name :return: Nothing. It just updates some globals ©r‹N)r[r#rYÚget_idrŒ)ÚresellerÚxml_config_load_elementsr_Ú reseller_ids rEÚ_load_resellers_xml_datar˜QsN€õŒ~ÑÔ€HØ ×ÒÑÔÐØ—/’/ (Ñ+Ô+€KÝ� Ð2JÐKÑKÔKÐKÐKÐKrDc ó܇‡—tjt¦«a‰��Kt¦«}‰�‰|vr‰|‰vrˆˆfd„}n±t j¦«r™|�— t j|¦«}d|j›d�}t|d¬¦«5}|  ¦«}ddd¦«n #1swxYwYn#t$rd}YnwxYwd|vr#tj tj d |›d �¦«ˆfd „}tD�]n} || ¦«�r]td | tt¦«} t!t#t%| d d¬¦«| ¬¦«¦«} | td <n#t&t(t*f$rYnwxYwtd| tt¦«t,dkrtd| tt¦«n dtd< t!t%| dd¬¦«¦«} | td<n#t&t(t*f$rYnwxYwtd| tt¦«td| tt¦«td| tt¦«�ŒndSdS)a Put limit values that will be applied later in a global variable `setup_ve`. :param plan_id: package :param reseller: If reseller is None we only inherit from admin packages. In that case we ignore all tags in ve.cfg with a "reseller" attribute. Ncóh•—| d¦«‰ko| d¦«‰kS©Nr#r•©r%)r�Úplan_idr•s €€rEÚis_needed_planz*prepare_setup_data..is_needed_planss1ø€Ø—’ tÑ,Ô,°Ò7Ðc¸B¿OºOÈJÑ.is_needed_planŠs/ø€Ø—’ tÑ,Ô,°Ò7Ð[ÀÇÂÐPZÑ@[Ô@[Ð<[Ð[rDr‘r�r4rŽrr’r]r”rr|r}r“r–r•r—)Úcopyr=r�Úget_reseller_packages_maprzÚis_dar&ÚgetpwuidÚpw_namerÝÚreadr;rrrlr‘r@r rTrÑr7rÐr`) r�r•rÚ res_pkg_dictržÚuser_pwdÚfilenameræÚtextr�rñr�r“s `` rEÚprepare_setup_datar«`s.øø€õ”�;Ñ'Ô'€JØÑÝ0Ñ2Ô2ˆ ð Ð  H° Ð$<Ð$<ÀÈLÐYaÔLbÐAbÐAbð dð dð dð dð dð dð dõÔ Ñ"Ô"ð  vÐ'9ðÝ"œ|¨FÑ3Ô3�HØ`ÀHÔDTÐ`Ð`Ð`�Hݘh°Ð9Ñ9Ô9ð(¸QØ Ÿvšv™xœx˜ð(ð(ð(ñ(ô(ð(ð(ð(ð(ð(ð(øøøð(ð(ð(ð(øøå ðððØ�D�D�Dðøøøð $¨4Ð/Ð/Ý”MÝÔ(ðt°Fðtðtðtñôðð \ð \ð \ð \ð \õð Añ AˆB؈~˜bÑ!Ô!ñ AÝ# F¨Bµ ½ZÑHÔH�ðÝÕ6Õ7IÈ"ÐRWÐ^eÐ7fÑ7fÔ7fÐnsÐtÑtÔtÑuÔu�CØ(+•J˜uÑ%Ð%øÝ"¥Jµ Ð:ðððØ�Dðøøøå˜D "¥kµ:Ñ>Ô>Ð>ݘ6’M�MÝ  r­;½ ÑCÔCÐCÐCà()•J˜uÑ%ðÝÕ/°¸ÀoÐVÑVÔVÑWÔW�BØ')•J˜tÑ$Ð$øÝ"¥Jµ Ð:ðððØ�Dðøøøå˜G R­µjÑAÔAÐAݘF B­ µZÑ@Ô@Ð@ݘF B­ µZÑ@Ô@Ð@ùðqÐðH Að AsZÁ0B7 B+ B7Â+B/Â/B7Â2B/Â3B7Â7 CÃCÄ(8E!Å!E;Å:E;Ç )G7Ç7HÈHc ó6— tjtd|gtjtj¬¦«5}| ¦«|jdkcddd¦«S#1swxYwYdS#t $r tddt›d|›d�¦«YdSwxYw)Nz-l)Ústdoutr†réÿÿÿÿzfailed to run "z -l ú")Ú subprocessÚPopenÚUMOUNTÚPIPEÚ communicateÚ returncoder]r„)ÚpathrOs rEÚ umount_dirr·¨s€ð Iå Ô Ý �T˜4Ð Ý”?Ý”?ð ñ ô ð (ðØ × Ò Ñ Ô Ð Ø”? aÒ'ð  (ð (ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (øõ ðIðIðIݘbÐ"GµFÐ"GÐ"GÀÐ"GÐ"GÐ"GÑHÔHÐHÐHÐHÐHðIøøøs4‚3A.µA!Á A.Á!A%Á%A.Á(A%Á)A.Á.&BÂBcóR—tj t¦«sdSg} t tdd¬¦«5}|D]?}| ¦«}|r'| tj|¦«¦«Œ@ ddd¦«n #1swxYwYn(#t$rtddt›�¦«YnwxYw|sdStj tj ¦« t ddd¬¦«5}d„|  ¦«D¦«}ddd¦«n #1swxYwYn'#ttf$rtdd ¦«YnwxYwd }t|¦«D]=}d }|D]1} |D],} |  | ¦«} | rt#| ¦«p|}nŒ-Œ2|sdSŒ>dS) zy Unmount all paths from /proc/mounts that match regular expressions from /etc/container/exclude_mounts.conf file NrÕrÖr×r®zfailed to read z /proc/mountscóB—g|]}| ¦«d‘ŒS)ry)rá)rfÚms rErhz"prepare_mounts..Ês$€Ð:Ð:Ð: q�a—g’g‘i”i ”lÐ:Ð:Ð:rDzfailed to parse /proc/mountsé F)rËr¶ÚisfileÚEXCLUDE_MOUNTS_CONFrÝrßÚappendrërrâr„ÚunshareÚ CLONE_NEWNSÚ readlinesr7rÚsearchr·) Ú reg_exp_listÚconfrÕrræÚmountsÚATTEMPTSrHÚerrorÚmountÚreg_exprºs rEÚprepare_mountsrʶs”€õ Œ7�>Š>Õ-Ñ .Ô .ðØˆØ€LðKÝ Õ% s°WÐ =Ñ =Ô =ð =ÀØð =ð =�ØŸ'š'™)œ)�Øð=Ø ×'Ò'­¬ °7Ñ(;Ô(;Ñ<Ô<Ð<øð =ð =ð =ð =ñ =ô =ð =ð =ð =ð =ð =ð =øøøð =ð =ð =ð =øøõ ðKðKðKݘbÐ"IÕ4GÐ"IÐ"IÑJÔJÐJÐJÐJðKøøøà ðØˆÝ „O•GÔ'Ñ(Ô(Ð(ðBÝ �. #°Ð 8Ñ 8Ô 8ð ;¸AØ:Ð:¨A¯KªK©M¬MÐ:Ñ:Ô:ˆFð ;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;øøå �Ð ðBðBðBݘbÐ"@ÑAÔAÐAÐAÐAðBøøøà€HÝ �8‰_Œ_ð ð ˆØˆØð ð ˆEØ'ð ð �Ø—N’N 5Ñ)Ô)�ØðÝ& uÑ-Ô-Ð6°�EØ�Eðøðð Ø ˆEˆEð ð ð slªBÁAB BÂBÂBÂBÂBÂ"CÃCÃ(D1Ã:D%Ä D1Ä%D)Ä)D1Ä,D)Ä-D1Ä1!EÅEcóΗd} tj|dd¬¦«n #t$rtd|¦«YnwxYwt ¦«t  d¬¦«dS) zI Start LVE engine and initialize default mount namespace for LVE z,/bin/mount --make-rprivate / >/dev/null 2>&1Tz /bin/bash)ÚshellÚ executablezError: failed to executezCan`t init lve default settings©r‰N)r°Úcallr]r~rÊrÂÚ lve_start)Ú MOUNT_CMDs rErÐrÐÚs�€ð?€Ið5ÝŒ˜ ¨¸+ÐFÑFÔFÐFÐFøÝ ð5ð5ð5Ý Ð(¨)Ñ4Ô4Ð4Ð4Ð4ð5øøøåÑÔÐÝ ‡O‚OÐ=€OÑ>Ô>Ð>Ð>Ð>s „œ9¸9cóH—t |d|›d�|¬¦«dS)zs Create LVE container for given ID :type lve_id: int :type ignore_error: bool :return: Nothing z!lvectl: Can`t create lve with id ú; error code {code}©r‰Ú ignore_errorN)rÂÚ lve_create)rrÕs rErÖrÖçs>€õ ×Ò�VØ^ÀÐ^Ð^Ð^Ø".ðñ0ô0ð0ð0ð0rDcóH—t |d|›d�|¬¦«dS)zs Create LVP container for given ID :type lvp_id: int :type ignore_error: bool :return: Nothing z!lvectl: Can`t create lvp with id rÓrÔN)rÂÚlve_lvp_create)rbrÕs rEÚ lvp_createrÙós>€õ ×Ò˜Ø!bÀVÐ!bÐ!bÐ!bØ&2ðñ4ô4ð4ð4ð4rDcóN—td¦«}g}t¦«D]„}tj |¬¦«s| d|¦«Œ9| d|¦«t  |d|›d�¬¦«| |¦«Œ…|S)Nr/raz=destroy_lvp_all: lvp %s n(cascaded with its parent), skippingz*destroy_lvp_all: destroying LVP with id %sú"lvectl: Can`t destroy lvp with id rÓrÎ) rrQrMrOÚ exist_lvpr2rÂÚlve_lvp_destroyr¾)ÚloggerÚdestroyed_listrbs rEÚdestroy_lvp_allràÿs¿€Ý " ;Ñ /Ô /€Fà€Nõ‘*”*ð&ð&ˆÝŒx×!Ò!¨Ð!Ñ0Ô0ð Ø �LŠLÐXÐZ`Ñ aÔ aÐ aØ Ø� Š ÐAÀ6ÑJÔJÐJÝ ×Ò˜fØ&hÈ6Ð&hÐ&hÐ&hð ñ jô jð jà×Ò˜fÑ%Ô%Ð%Ð%Ø ÐrDcó¼—td¦«}|dkrt¦«dS| d|¦«t |d|›d�¬¦«dS)Nr/riz&lvp_destroy: destroying LVP with id %srÛrÓrÎ)rràr2rÂrÝ)rbrÞs rEÚ lvp_destroyrâsz€Ý " ;Ñ /Ô /€Fà �‚€ÝÑÔÐØˆà ‡L‚LÐ9¸6ÑBÔBÐBÝ ×Ò˜&Ø"dÀvÐ"dÐ"dÐ"dðñfôfðfðfðfrDcóì—td¦«}d|›d�}d|›d�}d}|dkrÉt ¦«rtt ¦«¦«}t t tj ¦«¦«¦«dkrVtj ¦«D]6}|  d |¦«t  ||¬ ¦«d }Œ7nµd }n²tj  |¦«s=tj  ¦«rTtj  |¦«�5|  d |¦«t  ||¬ ¦«d }n!tj  |¦«sd }|r!trtt d g¦«dSdStrtt"d|g¦«dSt%d|›�¦«dS)Nr/zCan't remove lve z from kernel - error code -3zCan`t destroy lve with id rÓFrirz*lve_destroy all: destroying LVE with id %srÎTz&lve_destroy: destroying LVE with id %sÚOKÚWARNz warning: )rrMrNÚboolràràÚlistrOÚ lve_id_listr2rÚcheck_inside_listÚresellers_supportedÚdetect_inside_lvpr|r}Ú SINGLE_FORMATrŠr~)rrÞÚcant_remove_msgÚcant_destroy_msgÚ destroyedÚid_s rErr&sô€Ý " ;Ñ /Ô /€FàO¨6ÐOÐOÐO€OØQ°FÐQÐQÐQÐØ€Ià �‚€Ý × 'Ò 'Ñ )Ô )ð 0Ý�_Ñ.Ô.Ñ/Ô/ˆIÝ �t•C”H×(Ò(Ñ*Ô*Ñ+Ô+Ñ ,Ô ,¨qÒ 0Ð 0Ý”x×+Ò+Ñ-Ô-ð !ð !�Ø— ’ ÐIÈ3ÑOÔOÐOÝ—’ Ð-=�Ñ>Ô>Ð>Ø � � ð !ð ˆIˆIå Œ8× %Ò % fÑ -Ô -ð Ý”×-Ò-Ñ/Ô/ð Ý47´H×4NÒ4NÈvÑ4VÔ4VÐ4bØ �LŠLÐAÀ6Ñ JÔ JÐ JÝ �OŠO˜FÐ,<ˆOÑ =Ô =Ð =؈IˆIÝ”×+Ò+¨FÑ3Ô3ð ØˆIàð1Ý ð /Ý � ¨ vÑ .Ô .Ð .Ð .Ð .ð /ð /õ ð 1Ý �  v¨Ð&?Ñ @Ô @Ð @Ð @Ð @å Ð/˜oÐ/Ð/Ñ 0Ô 0Ð 0Ð 0Ð 0rDc ó0—|r.tj |¦«st|¦«t j¦«5t jd¦« ttd¦«t_ ttd¦«t_ ttd¦«t_ ttd¦«t_ ttd¦«t_tdkrHttd¦«t_ttd ¦«t_td kr$ttd ¦«t_|rS|d kr&t& |td |›�¬¦«nut& |td|›d�¬¦«nN|d kr"t& td¬¦«n&t& |td|›d�¬¦«nJ#t.$r=}t1ddt3|¦«zdzt3|¦«z¦«Yd}~nd}~wwxYwddd¦«dS#1swxYwYdS)NrÇr’r�r‘r”r“r~r•r–r«r—rú%Can`t setup default settings for LVP rÎzCan`t setup lvp with id rÓzCan`t setup default settingszCan`t setup lve with id ryzCan`t setup lve z. RuntimeWarning excepted: )rMrOrÜrÙÚwarningsÚcatch_warningsÚfilterwarningsr@r�rÅr8r6r7Ú ls_memoryr9r¸r:r;r<rÂÚlve_set_defaultÚ lve_lvp_setuprÚRuntimeWarningr„rA)rrbÚrws rErrKsÉ€Ø ð•c”h×(Ò(¨Ñ0Ô0ðå�6ÑÔÐå Ô Ñ "Ô "ðpðpÝÔ Ñ(Ô(Ð(ð pÝ!$¥Z°Ô%5Ñ!6Ô!6�LÔ Ý"%¥j°Ô&7Ñ"8Ô"8�LÔ Ý#&¥z°&Ô'9Ñ#:Ô#:�LÔ Ý%(­°EÔ):Ñ%;Ô%;�LÔ "Ý%(­°DÔ)9Ñ%:Ô%:�LÔ "å˜QŠˆÝ-0µ¸FÔ1CÑ-DÔ-D• Ô*Ý(+­J°wÔ,?Ñ(@Ô(@• Ô%ݘQŠˆÝ'*­:°fÔ+=Ñ'>Ô'>• Ô$Øð lؘQ’;�;Ý×)Ò)Ø¥ Ð6fÐ^dÐ6fÐ6fð*ñhôhðhðhõ×'Ò'Ø¥ Ð6nÐQWÐ6nÐ6nÐ6nð(ñpôpðpðpà˜1’�Ý×%Ò%¥lÐ3I6É1J É6I;É;J Ê JÊJcó—d}d}t}td¦«t}|at|t¦«rL ||d}|sd}n#t$rd}YnwxYw ||d}|sd}n#t$rd}YnwxYw||fS)z¤ Get pair of package, reseller for lve_id :param lve_id: lve_id, UID with package, reseller :return: tuple of (package, reseller); Both can be None Nú list-usersr•rr)Úpackages_usersÚGetControlPanelUsersrEÚdictÚKeyError)rrrr•Úold_packages_usersÚ temp_packages rEÚ"get_package_and_reseller_by_lve_idrpsÙ€ð€GØ€Hå'ÐݘÑ&Ô&Ð&õ"€Là'€NÝ�,¥Ñ%Ô%ðð Ø# FÔ+¨JÔ7ˆHàð Ø�øøÝð ð ð ØˆHˆHˆHð øøøð Ø" 6Ô*¨9Ô5ˆGàð Ø�øøÝð ð ð ØˆGˆGˆGð øøøð �HÐ Ðs#ºA Á AÁAÁ A3Á3 BÂBz+/var/run/cloudlinux/effective-normal-limitsz;/opt/cloudlinux/flags/enabled-flags.d/burstable-limits.flagcót—tj t¦«sdS tj t ¦«}tj |¦«s2tj |¦«}t|ddd|¦«n(#t$r}td|›d|›�¦«‚d}~wwxYwtt ›d�¦«}|5|ri}nÆ tj  t ¦«rDtt dd¬ ¦«5}tj|¦«}ddd¦«n #1swxYwYni}nZ#tj$r }td t ›d|›�¦«‚d}~wt$r }td t ›d|›�¦«‚d}~wwxYw| t"¦« t%tj|¦«t d¦«n1#t$r$}td t ›d|›�¦«Yd}~nd}~wwxYwddd¦«dS#1swxYwYdS) ai Save calculated effective normal limits for an LVE to a cache file. The cache file is stored in /var/run (tmpfs) for faster operations. It disappears on reboot, but lvectl apply all runs in the lvectl systemd service anyway, so the file will always reappear if the service functions normally. If additional speed is desired, consider replacing the standard JSON lib with a faster one like rapidjson or orjson. :param reset: If True, recreate the cache file from scratch with data available in the dict, instead of updating it, defaults to False :type reset: bool, optional Ni€rz#Error: failed to create the folder ú: z.lockrÕÚutf8r×z=Error: failed to parse the effective normal limit cache file zŠ>Õ4Ñ 5Ô 5ð؈ðÝœŸšÕ(<Ñ=Ô=ˆ ÝŒw�}Š}˜]Ñ+Ô+ð GÝœ'Ÿ/š/¨-Ñ8Ô8ˆKÝ ˜m¨U°A°q¸+Ñ FÔ FÐ FøøÝ ðððÝ ÐH°MÐHÐHÀQÐHÐHÑIÔIÐIØ øøøøðøøøõ(Õ+?Ð(FÐ(FÐ(FÑGÔGÐØ ðnðnØ ð Ø!Ð Ð ð Ý”7—>’>Õ"6Ñ7Ô7ð*ÝÕ2°CÀ&ÐIÑIÔIð?ÈXÝ+/¬9°XÑ+>Ô+>Ð(ð?ð?ð?ñ?ô?ð?ð?ð?ð?ð?ð?øøøð?ð?ð?ð?øð(*Ð$øøÝÔ'ð ð ð ÝÐqÕVjÐqÐqÐnoÐqÐqÑrÔrÐrØøøøøÝð ð ð ÝÐpÕUiÐpÐpÐmnÐpÐpÑqÔqÐqØøøøøð øøøð ×ÒÕ 7Ñ8Ô8Ð8ð nÝ #¥D¤JÐ/?Ñ$@Ô$@ÕBVÐX]Ñ ^Ô ^Ð ^Ð ^øÝð nð nð nÝ ÐlÕQeÐlÐlÐijÐlÐlÑ mÔ mÐ mÐ mÐ mÐ mÐ mÐ møøøøð nøøøð)nðnðnñnônðnðnðnðnðnðnðnøøøðnðnðnðnðnðns¨¨A5B CÂ(B>Â>CÃH-Ã&;EÄ!EÄ6 EÅE ÅEÅ E Å EÅH-ÅF(Å E;Å; F(ÆF#Æ#F(Æ(H-Ç(G/Ç.H-Ç/ HÇ9HÈH-ÈHÈH-È-H1È4H1có>—ttt|¦«<dS)a» Cache the calculated effective normal limits for an LVE to a dictionary. setup_data is a global dict that contains the LVE configuration last applied. Holds only one entry - during operations like lvectl apply all, we enter this function repeatedly with setup_data containing info for one processed LVE each time. These limits can be used by the Burstable Limits components to set/reset burst or normal limits without having to go through effective limit calculation or invoking lvectl as a middleman. Comparing the cached limits to current active limits (in kernel) also shows whether or not the LVE has burst limits active at the moment. This function gets called in lve_apply, which means it also runs within: * lvectl apply all * lvectl apply-many * lvectl set * and others, that also call lve_apply :param lve_id: LVE ID for which the limits are being saved. :type lve_id: int N)r�rrA©rs rEÚcache_effective_limitsrÜs€õ0,6Õ�C ™KœKÑ(Ð(Ð(rDrcóØ—|dkstj ¦«sdS|tt j¦«¦«vrdSt tj|¦«¦«S)u0Return True if the user has at least one isolated domain registered. CLOS-4370: the per-domain branch in lve_apply only does meaningful work when the user has at least one docroot in the lvd-map. A bare marker file from ``lvectl allow-domain-limits`` (with no ``enable-domain-limits`` follow-up) or a 0-row hashtable left behind by ``lvd_map_remove`` after the last ``disable-domain-limits`` both leave the per-uid file in place, so existence alone is not enough — we must also check that the hashtable actually has entries. rF) rMr3Údomains_supportedÚsetrTrUræÚws_id_registryÚget_all_entriesrs rEÚ_is_domain_isolated_userrøs^€ð�‚{€{�#œ&×2Ò2Ñ4Ô4€{؈uØ •S�Ô?ÑAÔAÑBÔBÐBÐB؈uÝ •Ô.¨vÑ6Ô6Ñ 7Ô 7Ð7rDcó€—tj ¦«st¦«St j¦«S)u8Collect all known domain LVE IDs from the on-disk registries. Domain LVEs (created by lvdctl set) appear in /proc/lve/list at root level, but lve_apply() must not process them as regular users — their limits are managed by apply_domain_lve_limits() inside the domain-isolated-user branch. )rMr3rrrÚget_all_domain_idsrCrDrEÚ_get_all_domain_lve_idsr! s2€õ Œ6× #Ò #Ñ %Ô %ð݉uŒuˆ Ý Ô ,Ñ .Ô .Ð.rDcó—eZdZdZdS)ÚDomainLveIdErrorz>Raised when lvectl set/delete/destroy targets a domain LVE ID.N)r=r>r?Ú__doc__rCrDrEr#r#s€€€€€ØHÐHÐHÐHrDr#cóÜ—|dkstj ¦«sdSt¦«}|sdSt j¦«}||ks||vrt d|›d|›d�¦«‚dS)a�Refuse to operate on domain LVE IDs from lvectl set/delete/destroy. Domain LVEs are managed exclusively by lvdctl; lvectl operations on them corrupt the domain configuration or create phantom entries in ve.cfg. The check only activates when at least one domain LVE is registered, so existing customers without domain isolation see no change in behaviour. rNzLVE ID z is in the domain LVE range (>= zV) or is a registered domain LVE. Domain limits must be managed via lvdctl, not lvectl.)rMr3rr!rÚmin_idr#)rÚ domain_idsÚ min_domain_ids rEÚ_reject_if_domain_lve_idr)s¡€ð�‚{€{�#œ&×2Ò2Ñ4Ô4€{؈Ý(Ñ*Ô*€JØ ð؈Ý"Ô)Ñ+Ô+€MØ �ÒР&¨JÐ"6Ð"6Ýð E�fð Eð E¸mð Eð Eð Eñ ô ð ð#7Ð"6rDc óR ‡—t}‰dkrtd‰¦«t|c}atdkrt|¬¦«d} |�|} n1|rtnt } t tˆfd„| ¦«d¦«} |dkrR |‰d}n#ttf$rd}YnwxYw |‰d}n#ttf$rd}YnwxYw| ��€t||¬ ¦«td | tt¦«} tt| d d ¬ ¦«| ¬¦«td <n#t t"t$f$rYnwxYwtd €td td <td| tt¦«t&dkrtd| tt¦«n dtd< t)t| dd¬ ¦«¦«td<n#t t"t$f$rYnwxYwtd| tt¦«td| tt¦«td| tt¦«n't||‰¬¦«t&dkr dtd<|�s¦t+‰¦«‰dk�rtt-‰¦«�rd|€t.j ¦«}t4 d‰¦«t. ‰¦«} | ‰kr°t.j ‰¬¦«s�| rVt.j | ¬¦«s6t4 d| ‰¦«t>  | ¦«t4 d‰| ‰¦«t> !‰| ¦«t.j ‰¬¦«rt. "‰| |¦«|dko‰tG¦«v} | stI‰‰¬¦«tI‰¦« t. %‰¦«}t. &‰||¬¦«| s%t> '‰tPd‰›�¬¦«t. )‰|¬¦«dS#tTtVtXf$rN}t[j-tZj.d ‰›d!|›�¦«t4 /d"‰|d#¬$¦«Yd}~dSd}~wwxYw‰dk�rt. 0¦«rétc‰¦«rÚ|€t.j ¦«}t. ‰¦«} | 2‰d¦«| kr†| dks t.j | ¬¦«r`t4 d%‰‰| 2‰d¦«| ¦«t.j3 4| ‰d&‰›d'| ›d(�¬¦«| |‰<tI‰|¬¦«dSdS))uÍ Aplly limits to LVE lve_id :param lve_id: lve id :type lve_id: int :param plan_id: package for user with lve_id. deprecated :type plan_id: string :param result: if True = don't apply limits. only create setup_data with actual limits :type result: boolean :param reseller: if True = plan_id is resellers plan. deprecated :type reseller: boolean :param out_node: node with limits for lve_id :type out_node: xml_node :param lvp_id: reseller container id; host container if 0 :param kernel_map: lve_id->lvp_id dict from /proc/lve/map, shared across a batch. CLOS-6868: reading it here instead made `apply all` quadratic — the file grows with domain count and was re-parsed twice per isolated account (2,002 reads and 15.3 s of a 27.7 s profiled run at 5,000 domains). Passed in, it is read once per command. Mutations this function performs are written back into the dict, so a later account sees the true state; `_map_domain_lves` already updates it in place for the same reason. Omitted, it is read on first use inside the branch that needs it, preserving the behaviour of a standalone `lvectl apply `. rÚuseridršraNcó,•—t|¬¦«‰kS)N©r)©r,)rArs €rEúzlve_apply..`sø€Õ 3À4Ð HÑ HÔ HÈFÒ R€rDrrr•©r•r‘r�r4rŽrr’r]r”r|r}r“r–r•r—)r•rr›zDlve_apply: uid=%s is domain-isolated, applying the per-domain branchzFlve_apply: creating the missing reseller LVP lvp%s for isolated uid=%sz>lve_apply: creating isolation LVP lvp%s under lvp%s for uid=%s©Ú domain_mapròrÎz1lve_apply: skipping per-domain isolation for uid=rztlve_apply: per-domain isolation SKIPPED for uid=%s: %r -- the account keeps its user limits but its domains get noneT)Úexc_infozjlve_apply: uid=%s has an isolation marker but no enabled domain; un-nesting lve%s from lvp%s back to lvp%súCan`t move lve_id=ú to lvp_id=rÓ)5rýrþr>rŒrkrjÚnextÚfilterÚ NameErrorrr«r‘r=r�r rTrÑr7rÐr`r@rrrMrOrtÚlogr2Úlve2lvprÜÚinforÂrØÚlve_lvp_create2Ú nest_user_lverVrÚ_build_domain_mapÚ_map_domain_lvesr÷rÅÚapply_domain_lve_limitsr]r+r%rÚ LOG_WARNINGÚwarningrNrcrÍr3Ú lve_lvp_move)rr�r‹r•Úout_noderbÚ kernel_maprÚnew_packages_usersr�Ú node_listrñÚ parent_lvpÚis_reseller_poolr2Úexcs` rEÚ lve_applyrK6s¿ø€õ8(ÐØ �‚{€{ݘX vÑ.Ô.Ð.Ý-;Ð=OÐ*ИNå �‚|€|ݘ6Ð"Ñ"Ô"Ð"à €BØÐØ ˆˆà$Ð0•F�F­&ˆ Ý Ý ÐRÐRÐRÐRÐT]Ñ ^Ô ^Ø ñ ô ˆð �‚{€{ð Ø(¨Ô0°Ô;ˆGˆGøÝ�8Ð$ð ð ð ØˆGˆGˆGð øøøð Ø)¨&Ô1°*Ô=ˆHˆHøÝ�8Ð$ð ð ð ØˆHˆHˆHð øøøð �~å˜7¨XÐ6Ñ6Ô6Ð6õ˜F B­ µZÑ@Ô@ˆð Ý 8Õ9KÈBÐTYÐ`gÐ9hÑ9hÔ9hÐpuÐ vÑ vÔ v�J�uÑ Ð øÝ�J­ Ð2ð ð ð Ø ˆDð øøøå �eÔ Ð $Ý +¨EÔ 2�J�uÑ å�D˜"�k­:Ñ6Ô6Ð6å �&Š=ˆ=Ý ˜˜r¥;µ Ñ ;Ô ;Ð ;Ð ;à !�J�uÑ ð Ý"Õ#5°b¸gÈOÐ#\Ñ#\Ô#\Ñ]Ô]�J�tÑ Ð øÝ�J­ Ð2ð ð ð Ø ˆDð øøøõ �G˜R¥­jÑ9Ô9Ð9Ý�F˜B¥ ­ZÑ8Ô8Ð8Ý�F˜B¥ ­ZÑ8Ô8Ð8Ð8õ ˜7¨X¸fÐEÑEÔEÐEÝ �'Š>ˆ>Ø !�J�uÑ à ñs-ݘvÑ&Ô&Ð&Ø �QŠ;‰;Õ3°FÑ;Ô;‰;ØÐ!õ!œXŸ\š\™^œ^� õ �IŠIÐ\Øñ ô ð õJŸš VÑ,Ô,ˆJؘVÒ#Ð#­C¬H×,>Ò,>ÀfÐ,>Ñ,MÔ,MÐ#ðð5¥c¤h×&8Ò&8À Ð&8Ñ&KÔ&Kð5Ý—H’Hð3Ø4>ÀñHôHðHå×(Ò(¨Ñ4Ô4Ð4Ý—’ð&Ø'-¨z¸6ñCôCðCå×%Ò% f¨jÑ9Ô9Ð9õ Œx×!Ò!¨Ð!Ñ0Ô0ð BÝ×!Ò! &¨*°jÑAÔAÐAð< &¨š{ÐL¨vÕ9JÑ9LÔ9LÐ/LÐ à#ð 1ݘ&¨Ð0Ñ0Ô0Ð0Ý �fÑ Ô Ð ð 8õ !×2Ò2°6Ñ:Ô:� õ×$Ò$ V¨ZÀJÐ$ÑOÔOÐOà'ðdÝ×)Ò)¨&µ,Ø2bÐZ`Ð2bÐ2bð*ñdôdðdå×+Ò+¨F¸zÐ+ÑJÔJÐJÐJÐJøÝ�X¥zÐ2ð 8ð 8ð 8Ý” ÝÔ&ØWÈÐWÐWÐRUÐWÐWñôðõ — ’ ðUà" C°$ðñ8ô8ð8ð8ð8ð8ð8ð8ð8øøøøð 8øøøð.˜Š{‰{�s×;Ò;Ñ=Ô=ˆ{ÕBRÐSYÑBZÔBZˆ{ØÐ%å!$¤§¢¡¤�Jõ!Ÿ[š[¨Ñ0Ô0� Ø—>’> &¨!Ñ,Ô,° Ò:Ð:Ø !’O�O¥s¤x×'9Ò'9ÀÐ'9Ñ'LÔ'L�Oå—H’HðQà# V¨Z¯^ª^¸FÀAÑ-FÔ-FÈ ñTôTðTõ”F×'Ò'Ø" FØ i°VÐ iÐ iÈ Ð iÐ iÐ ið(ñôðð*4�J˜vÑ&å �f VÐ ,Ñ ,Ô ,Ð ,Ð ,Ð ,ðgs-ðs-sbÂBÂB(Â'B(Â,B;Â;CÃCÄ)D/Ä/E ÅE Æ='G%Ç%G?Ç>G?Ð'A:R#Ò#TÒ:ATÔTcóh—t|t|¦«dz g¬¦«}t|¦«dS)zt Print data with the last column 30 symbols wide. Useful for printing data that contains package names. ry©Ú wide_indicesN©Ú_format_fieldsràr~©r»Úformatted_strings rEÚ_pprintrSIs9€õ & f½CÀ¹K¼KÈ!¹OÐ;LÐMÑMÔMÐÝ Ð ÑÔÐÐÐrDcóŠ—t|t|¦«dz t|¦«dz g¬¦«}t|¦«dS)z˜ Print data with the two last columns 30 symbols wide. Useful for printing full data of every user with package name and reseller name. rÚryrMNrOrQs rEÚ _pprint_frURsO€õ &ØÝ˜&‘k”k A‘o¥s¨6¡{¤{°Q¡Ð7ðñôÐõ Ð ÑÔÐÐÐrDcóH—t|dg¬¦«}t|¦«dS)zb Print data with the first column 30 symbols wide. Useful for printing packages data. rrMN)rPr~rQs rEÚ _pprint_prW_s.€õ & f¸A¸3Ð?Ñ?Ô?ÐÝ Ð ÑÔÐÐÐrDcój—t|dt|¦«dz g¬¦«}t|¦«dS)z… Print data with the first and last columns 30 symbols wide. Useful for printing data with user names and package names. rryrMNrOrQs rEÚ _pprint_rrYhs;€õ & f¸A½sÀ6¹{¼{ÈQ¹Ð;OÐPÑPÔPÐÝ Ð ÑÔÐÐÐrDér»rNÚwidthcóä—g}t|¦«D]J\}}t|¦«}||vr| |d|›�›¦«Œ3| |d›¦«ŒKd |¦«S)aK Helper function to format fields based on specified indices for wide columns. Args: fields: The fields to format. wide_indices: List of indices in the fields that should be wide. width: The width of the wide columns. Returns: A formatted string with specified fields widened. ú>z>8rš)Ú enumeraterAr¾Újoin)r»rNr[Úformatted_fieldsr¹ÚfieldÚ field_strs rErPrPqs�€ðÐå! &Ñ)Ô)ð7ð7‰ ˆˆu嘑J”Jˆ à �LÐ Ð Ø × #Ò # yÐ$;°5Ð$;Ð$;Ð$;Ñ <Ô <Ð <Ð <à × #Ò # yÐ$5Ð$5Ñ 6Ô 6Ð 6Ð 6à �7Š7Ð#Ñ $Ô $Ð$rDcóè—t|¦«}t|t¦«o| d¦«}| dd¦«}|rt |¦«}|dz}nd}|rd|›�n|}|S)zŽ Convert pmem or vmem limits to bytes value :param value: pmem or vmem limits in kbytes value :return: bytes value of limit rršér)rArEÚ startswithrùr@)rˆÚ was_changeds rEÚ_pmem_vmem_to_bytes_valuergŒs€€õ �‰JŒJ€EݘU¥CÑ(Ô(ÐB¨U×-=Ò-=¸cÑ-BÔ-B€KØ �MŠM˜#˜rÑ "Ô "€EØ ðÝ�E‘ ” ˆØ �‰ ˆˆàˆà&Ð 1ˆK�ˆKˆKˆK¨E€EØ €LrDcó—d}d}t|t¦«r!| d¦«r |dd…}d} t|¦«}n#t$rYdSwxYw|rd}|dzdz}|d kr|›|›d �}n |›|dz›d �}|S) z  Convert amount of RAM to M format :param string value: amount of memory in KB :rtype: string :return: amount of memory in MB like "1234M" ršFrryNTr™r�rÚMÚK)rErArer@rÑ)rˆr‹rfÚvs rEÚ_mb_memrl¢sÏ€ð€FØ€KÝ�%�ÑÔð %×"2Ò"2°3Ñ"7Ô"7ðØ�a�b�b” ˆØˆ ðÝ �‰JŒJˆˆøÝ ððð؈rˆrðøøøàðØˆØ �‰E�T‰M€EØ ˆq‚y€yØÐ$˜EÐ$Ð$Ð$ˆˆàÐ$˜A ™EÐ$Ð$Ð$ˆØ €Ms¼A Á AÁA)r�r�)r•r•)Úvmemr”)r“r“)r–r–)r’r’)r—r—)r¯r°r±r²r³r´rµcó¨—i}g}|D] }|tvrŒ t|\}}| |d¦«}|dkrŒ9t|¦«} |dvr| dz} | ||<|�Ht| |¦«¦«t|¦«kr| |¦«Œ¡ddi} dt j|fi| ¤Ž›dt j|fi| ¤Ž›�S) a>Return the ',"LIMITS":{...},"INDIVIDUAL":[...]' tail of a JSON row. The display fields keep their historical form -- SPEED in whole percent, memory as "1024M", and a '*' on values that differ from the package -- because existing parsers read them as such. That form loses a fractional CPU limit (0.29% is shown as 0) and needs de-starring to be read, so with --exact-limits each row also carries plain integers (CLOS-7520): cpu in hundredths of a percent, pmem/vmem in bytes (with or without --bytes), the rest as the kernel counts them. INDIVIDUAL names the LIMITS keys the '*' marks. Opt-in, because readers also match the row text itself: appending keys to every row broke 28-reset-to-unlim-limits.sh, which greps it whole. :param list fields: the row's output fields; LIMITS mirrors their limits :param dict limits: effective limits in kernel format (cpu in hundredths of a percent, memory in pages) :param dict package_limits: the package's limits in the same format, or None for a row that is a package itself rš)r•rmrdNÚ separators)ú,rÙz ,"LIMITS":z,"INDIVIDUAL":)Ú_MACHINE_LIMIT_FIELDSrÍr@rAr¾rÎr0) r»ÚlimitsÚpackage_limitsÚvaluesÚ individualrar‡ÚsourceÚrawrˆÚcompacts rEÚ_machine_limits_jsonryÉs €ð&€FØ€JØð #ð #ˆØ Õ-Ð -Ð -Ø Ý+¨EÔ2‰ ˆˆVØ�jŠj˜ Ñ$Ô$ˆØ �"Š9ˆ9Ø Ý�C‘”ˆØ Ð"Ð "Ð "Ø �T‰MˆE؈ˆs‰ Ø Ð %­#¨n×.@Ò.@ÀÑ.HÔ.HÑ*IÔ*IÍSÐQTÉXÌXÒ*UÐ*UØ × Ò ˜cÑ "Ô "Ð "øØ˜ZÐ(€GØ h�œ  6Ð5Ð5¨WÐ5Ð5Ð hÐ hÅTÄZÐPZÐEfÐEfÐ^eÐEfÐEfÐ hÐ hÐhrDÚ0r@có€‡ ‡ —t ¦«Š tr|rtt ¦«‰ ¦«nd}‰ ddz‰ d<ˆ fd„}|d¦«dkrt |d¦«¦«nd}d„}|t |d¦«¦«t |¦«t |d¦«¦«t ||d¦«¦«¦«t ||d¦«¦«¦«t |d ¦«¦«t |d ¦«¦«t |d ¦«¦«t |d ¦«¦«|d œ Š g} t ¦«} |�| |z } tr+d ˆ fd„| D¦«¦«} d| ›|›d�g} n|| Ž|ˆ fd„| D¦«Ž| S)z¶ Generate header and default package data either as print to stdout or as json string *machine_limits* adds LIMITS/INDIVIDUAL to the JSON row, see _machine_limits_json. ršr�r˜có0•—‰ |d¦«S)Nrš©rÍ)r‡rJs €rEÚget_dataz_formatter..get_dataûsø€Ø�|Š|˜C Ñ$Ô$Ð$rDcóL—trt|¦«nt|¦«Sro©r rgrl©rˆs rEÚconvert_mem_limitsz&_formatter..convert_mem_limitss!€Ý3=ÐQÕ(¨Ñ/Ô/Ð/Å7È5Á>Ä>ÐQrDr‘r•r”r“r–r’r—) r®r¯r¶ÚNCPUr°r±r²r³r´rµÚPACKAGENrpc3óR•K—|]!}d|›d‰ |d¦«›d�V—Œ"dS)r¯ú":"ršNr}©rfræÚ fields_maps €rErrz_formatter..sEøèè€ÐKÐK¸qÐ:˜AÐ:Ð: *§.¢.°°BÑ"7Ô"7Ð:Ð:Ð:ÐKÐKÐKÐKÐKÐKrDú{ú}có<•—g|]}‰ |d¦«‘ŒS©ršr}r‡s €rErhz_formatter..s'ø€Ð8Ð8Ð8¨A�*—.’.  BÑ'Ô'Ð8Ð8Ð8rD)r=r¡r|ryr½rrAr_)ÚprinterÚ default_idÚdefault_packageÚ more_fieldsÚmachine_limitsÚ machine_tailr~Ú_cpur‚Úresr»rçrJrˆs @@rEÚ _formatterr•ïsøø€õ×ÒÑ!Ô!€HÝCGÐbÈNÐbÕ'­ © ¬ °hÑ?Ô?Ð?Ð`b€Là˜u”o¨Ñ,€HˆU�Oð%ð%ð%ð%ð%ð19°¸±´À2Ò0EÐ0EÕ ˜H˜H U™OœOÑ ,Ô ,Ð ,È2€DðRðRðRð¥3 x x°¡¤Ñ#7Ô#7Ý�4‰yŒy¥# h h¨vÑ&6Ô&6Ñ"7Ô"7ÝÐ&Ð& x x°Ñ'7Ô'7Ñ8Ô8Ñ9Ô9Å3ÐGYÐGYÐZbÐZbÐchÑZiÔZiÑGjÔGjÑCkÔCkÝ�(�(˜4‘.”.Ñ!Ô!­C°°¸Ñ0AÔ0AÑ,BÔ,BÍ#ÈhÈhÐW[ÉnÌnÑJ]ÔJ]Ý�H�H˜VÑ$Ô$Ñ%Ô%°/ð ð€Jð €CÝ ‰\Œ\€FØÐØ�+ÑˆÝ ð:Ø�xŠxÐKÐKÐKÐKÀFÐKÑKÔKÑKÔKˆØ*�DÐ*˜,Ð*Ð*Ð*Ð+ˆˆàˆ�ÐÐØˆÐ8Ð8Ð8Ð8°Ð8Ñ8Ô8Ð9Ð9Ø €JrDc󇇇—ˆˆˆfd„}|S)aª Generate inner function with closured fields names and printer function :param list fields: List of strings that represent names of fields in final output :param callable printer: Function to format and print data for every entry :param bool machine_limits: add LIMITS/INDIVIDUAL to each JSON row, see _machine_limits_json :rtype: callable :return: function to format data for every user cóΕ‡—dŠt|d}t|d}|dkrd}tdkrt|d¬¦«n5|�t|d¬¦«nt d¬ ¦«t||¬¦«t jt ¦«Št|||d ¬ ¦«tr‰ rt‰ t ‰¬ ¦«nd}ˆfd „}d„}t|¦«‰d<t|d¦«¦«‰d<t|d¦«¦«‰d<t||d¦«¦«¦«‰d<t||d¦«¦«¦«‰d<t|d¦«¦«‰d<t|d¦«¦«‰d<t|d¦«¦«‰d<t|d¦«¦«‰d<trt|¦«‰d<n|‰d<|€trdnd‰d<n|‰d<d‰dvr?dtt‰d  d¦«¦«dz¦«z‰d<nt‰d¦«dz‰d<‰d‰d<tt‰d¦«¦«‰d<g}tr+d ˆfd„‰ D¦«¦«}d|›|›d �g}n‰ ˆfd!„‰ D¦«Ž|S)"z© :param string user: Find and format data for this User ID :rtype: list :return: List of given user's statistics data line or empty list ršrrr•Nryr0F)r–r“T)r�r•r‹)rscóÊ•—t‰|¦«tt|¦«krdtt|¦«znt‰|¦«S)Nr)rAr�)r‡rðs €rEÚ check_changedz7_user_formatter..wrapper..check_changedCsPø€Ý14°T¸#´Y±´Å3ÅzÐRUÄÑCWÔCWÒ1WÐ1W�3��Z¨œ_Ñ-Ô-Ñ-Ð-Õ]`ÐaeÐfiÔajÑ]kÔ]kÐ krDcóL—trt|¦«nt|¦«Sror€r�s rEr‚z<_user_formatter..wrapper..convert_mem_limitsFó!€Ý7AÐUÕ,¨UÑ3Ô3Ð3ÅwÈuÁ~Ä~Ð UrDr#r�r‘r•r”rmr“r’r–r—úN/Arr˜rrpc3óZ•K—|]%}d|›d‰| ¦«›d�V—Œ&dS)r¯r†N©Úlower©rfrærðs €rErrz3_user_formatter..wrapper..dsCøèè€ÐIÐI¸QÐ8 Ð8Ð8 d¨1¯7ª7©9¬9¤oÐ8Ð8Ð8ÐIÐIÐIÐIÐIÐIrDr‰rŠcóD•—g|]}‰| ¦«‘ŒSrCržr s €rErhz4_user_formatter..wrapper..gs%ø€Ð6Ð6Ð6¨!�d˜1Ÿ7š7™9œ9”oÐ6Ð6Ð6rD)rýror«r˜rŒr¡r�rKr|ryrAÚ_normalize_strr@rrr_) r$rrr•r’r™r‚r”rçrðr»r‘r�s @€€€rEÚwrapperz _user_formatter..wrapper"sløø€ð ˆÝ  Ô& yÔ1ˆÝ! $Ô'¨ Ô3ˆØ �rŠ>ˆ>؈HÝ ˜QÒ Ð õ ˜w°Ð 6Ñ 6Ô 6Ð 6Ð 6àÐ#õ)¨ÈEÐRÑRÔRÐRÐRõ °Ð7Ñ7Ô7Ð7Ý ˜w°Ð :Ñ :Ô :Ð :ÝŒy�Ñ$Ô$ˆÝ�$ °(À4ÐHÑHÔHÐHåð;Ø$2ð;Õ,¨VµZÐPTÐUÑUÔUÐUØ8:ð ð lð lð lð lð lð Vð Vð Võ˜‘Y”YˆˆT‰ ݘ-˜-¨Ñ.Ô.Ñ/Ô/ˆˆU‰ ݘ=˜=¨Ñ0Ô0Ñ1Ô1ˆˆV‰ ÝÐ-Ð-¨m¨m¸FÑ.CÔ.CÑDÔDÑEÔEˆˆV‰ ÝÐ-Ð-¨m¨m¸EÑ.BÔ.BÑCÔCÑDÔDˆˆV‰ ݘ˜ tÑ,Ô,Ñ-Ô-ˆˆT‰ ݘ˜ tÑ,Ô,Ñ-Ô-ˆˆT‰ ݘM˜M¨'Ñ2Ô2Ñ3Ô3ˆˆW‰ ݘ=˜=¨Ñ0Ô0Ñ1Ô1ˆˆV‰ Ý ð &Ý,¨WÑ5Ô5ˆD�‰OˆOà%ˆD�‰OØ Ð Ý(,Ð4˜u˜u°"ˆD�Ñ Ð à'ˆD�Ñ à �$�u”+РРإ#¥c¨$¨u¬+×*<Ò*<¸SÑ*AÔ*AÑ&BÔ&BÀcÑ&IÑ"JÔ"JÑJˆD�‰KˆKå˜d 5œkÑ*Ô*¨cÑ1ˆD�‰KؘUœ ˆˆW‰ ÝÕ*¨4°¬=Ñ9Ô9Ñ:Ô:ˆˆU‰ àˆÝ ð 8Ø—8’8ÐIÐIÐIÐIÀ&ÐIÑIÔIÑIÔIˆDØ.˜Ð.˜lÐ.Ð.Ð.Ð/ˆCˆCà ˆGÐ6Ð6Ð6Ð6¨vÐ6Ñ6Ô6Ð 7Ð 7؈ rDrC)r»r�r‘r£s``` rEÚ_user_formatterr¤s7øøø€ðFðFðFðFðFðFðFðN €NrDcóò—t¦« td¦«|�|rtd|¦«n#|�td|¬¦«ntd¦«n#t$rYnwxYwdg}tt|t ¬¦«}t ¦«|z}t|t ¬¦«}tD]}|||¦«z }Œtr*tdd   |¦«zd z¦«dSdS) Nrür+úlist-reseller-usersr0r„)r�r‘)r‘ú {"data":[rpú]}) rŒrþr;r•rSr¤r½r¤rýr|r~r_)r+r•r�r‹r»Ú formatterr$s rEÚpaneluserslimitsrªns$€Ý�M„M€Mð å˜\Ñ*Ô*Ð*ð Ð  &Ð Ý  ¨6Ñ 2Ô 2Ð 2Ð 2à Ð !Ý Ð!6ÀÐ JÑ JÔ JÐ JÐ Jå  Ñ .Ô .Ð .øøÝ ð ð ð Ø ˆð øøøà�+€KÝ �¨[ÍÐ VÑ VÔ V€FÝ ‰\Œ\˜KÑ '€FÝ µ|ÐDÑDÔD€IÝð"ð"ˆØ�)�)˜D‘/”/Ñ!ˆˆÝ ð5Ý ˆk˜CŸHšH VÑ,Ô,Ñ,¨tÑ3Ñ4Ô4Ð4Ð4Ð4ð5ð5s�AAÁ A%Á$A%cóÈ—td¦«g}t ¦«D]6\}}| t |¦«|d|df¦«Œ7|S)z@Get list of tuples[lve_id, reseller, package] from control panelrür•rr)rþrýr…r¾r@)r‹Ústr_uidÚpayloads rEÚpaneluserslistr®‰sj€õ˜Ñ&Ô&Ð&Ø €FÝ*×0Ò0Ñ2Ô2ðOðOш�Ø� Š •s˜7‘|”| W¨ZÔ%8¸'À)Ô:LÐMÑNÔNÐNÐNØ €MrDcóØ—ddlm}i}td¦«tt ¦«¦«||<td¦«| t¦«|S)zBGet dict of pairs[provider, list[package_name]] from control panelr)ÚDEFAULT_PROVIDERú list-packagesúlist-resellers-packages)Ú clveconfigr°rþrçrýÚkeysrH)r°Úpackagess rEÚpanelpackagesdictr¶“sp€ð,Ð+Ð+Ð+Ð+Ð+Ø€Hå˜Ñ)Ô)Ð)å!%¥n×&9Ò&9Ñ&;Ô&;Ñ!<Ô!<€HÐ ÑÝÐ2Ñ3Ô3Ð3ð ‡O‚O•NÑ#Ô#Ð#à €OrDcóT—t¦«td¦«ttddg¬¦«}t ¦«ddgz}t |t¬¦«}t D]}|||¦«z }Œtr*tdd  |¦«zdz¦«d Sd S) z] Implements lvectl all-user-list command :return: None, prints result to stdout rür„ÚRESELLER)r�)r�r§rpr¨N) rŒrþr•rUr½r¤rýr|r~r_)r‹r»r©r$s rEÚall_users_limitsr¹¥s¶€õ �M„M€MݘÑ&Ô&Ð&å � ° ¸:Ð/FÐ GÑ GÔ G€FÝ ‰\Œ\˜Y¨ Ð3Ñ 3€Få µ Ð:Ñ:Ô:€IÝð"ð"ˆØ�)�)˜D‘/”/Ñ!ˆˆå ð5Ý ˆk˜CŸHšH VÑ,Ô,Ñ,¨tÑ3Ñ4Ô4Ð4Ð4Ð4ð5ð5rDc󦇗tj¦«dkr8d„t¦«D¦«Šˆfd„| ¦«D¦«}|S)z‡ Filtering DirectAdmin's admins for `lvectl apply all` command :param ve_dict: dict with LVE :return: filtering dict Ú DirectAdmincó@—g|]}tj|¦«j‘ŒSrC)r&r'r()rfr$s rErhz(_filtering_da_admins..Äs%€ÐIÐIÐI¸�#œ, tÑ,Ô,Ô3ÐIÐIÐIrDcó$•—i|] \}}|‰v¯ ||“Œ SrCrC)rfr‡rˆÚuids_da_adminss €rEú z(_filtering_da_admins..Ås)ø€Ð]Ð]Ð]¡* # uÀ3ÈnÐC\ÐC\�3˜ÐC\ÐC\ÐC\rD)rzÚ getCPNamer r…)Úve_dictr¾s @rEÚ_filtering_da_adminsr¹sVø€õÔÑÔ -Ò/Ð/àIÐIÅÁÄÐIÑIÔIˆØ]Ð]Ð]Ð]°· ² ±´Ð]Ñ]Ô]ˆà €NrDcóà‡ — t¦«tt¦«}|rHtjj ¦«Š ˆ fd„t ¦«D¦«}n#t$ri}YnwxYw|durt}t¦«}n't}tj   |¬¦«}i}|D]}|ddœ|t|¬¦«<Œ|D]}||vrdddœ||<Œt|¦«dkrjt!|¦«}|D]X}||vrd}n||d}||}t#|¦«} t| ¦«dkr|| ddœ||<ŒP|ddœ||<ŒY|S)Ncó$•—i|] \}}|‰v¯ ||“Œ SrCrC)rfÚkrkÚcfg_lvp_id_lists €rEr¿z&prepare_apply_data..Ñs)ø€Ð_Ð_Ð_©¨¨1È!ÈÐJ^ÐJ^˜q !ÐJ^ÐJ^ÐJ^rDTra)rAr•r-rrA)rþrÿrýrMrtr_rZr…r;rkrQrjrOrèr,ràrÂÚguess_reseller_by_package) rbÚpackages_users_rGrZrÁrArrqÚpkgÚ resellersrÆs @rEÚprepare_apply_datarËÊsÒø€ðåÑÔÐÝ�~Ñ.Ô.ˆØ ð `Ý!œgÔ.×6Ò6Ñ8Ô8ˆOØ_Ð_Ð_Ð_µ×0DÒ0DÑ0FÔ0FÐ_Ñ_Ô_ˆOøøÝ ðððØˆˆˆðøøøð�€~€~݈ Ý‘*”*ˆˆåˆ Ý”(×&Ò&¨fÐ&Ñ5Ô5ˆð €GØð_ð_ˆØFJÐY]Ð<^Ð<^ˆÕ#°4Ð8Ñ8Ô8Ñ9Ð9Øð?ð?ˆØ ˜Ð Ð à'+¸Ð>Ð>ˆG�F‰Oøå ˆOÑÔ Ò!Ð!õ' wÑ/Ô/ˆØ"ð Bð BˆCؘ'Ð!Ð!Ø��à˜s”| FÔ+�à! #Ô&ˆCÝ1°#Ñ6Ô6ˆIÝ�9‰~Œ~ Ò!Ð!Ø)-¸IÀa¼LÐIÐI�˜‘ � à)-¸DÐAÐA�˜‘ � Ø €NsƒA,A0Á0 A?Á>A?c óš—t¦«\}}ttj ¦«¦«}| ¦«D]Ç}| |d¦«dkr| |¦«Œ2||vr/t |¦«| |¦«tj   d¬¦«5t|||d||d¬¦«ddd¦«n #1swxYwYŒÈtd¬¦«t  ¦«�rétd¦«}ttj ¦«¦«}| ¦«D�]j}t|¦«r| |¦«Œ(||vr/t  |¦«| |¦«t%||¦«tj |¦«}tj ¦«}t*j |¦«D]¢} t1j| ¦«j}||vr/t |¦«| |¦«| |d¦«|kr)tj  ||d|›d |›d �¬ ¦«t||¬ ¦«Œ£�Œl|D],}t|¦«rŒt  |¦«Œ-|D]}t |¦«ŒdS) NrT©rÕrAr•)rDr•rr4r5rÓrÎ)rr•)Ú_get_lve_ve_dict_and_lvp_maprrMrOrèr´rÍÚdiscardrr3Úcontext_ignore_errorrKrNrËrPrcrÂrÝÚ&_create_if_necessary_and_configure_lvprtÚget_reseller_namer¿Úcpapirr&r'r(rC) Ú lve_ve_dictÚ lve_lvp_mapÚremaning_alive_lvesrÚ lvp_ve_dictÚremaining_alive_lvpsrbrtÚkernel_mappingr$s rEÚlve_destroy_and_recreate_allrÚûs–€Ý;Ñ=Ô=Ñ€K�å�cœh×2Ò2Ñ4Ô4Ñ5Ô5Ðà×"Ò"Ñ$Ô$ððˆØ �?Š?˜6 1Ñ %Ô %¨Ò *Ð *à × 'Ò '¨Ñ /Ô /Ð /Ø Ø Ð(Ð (Ð (Ý �OŠO˜FÑ #Ô #Ð #Ø × 'Ò '¨Ñ /Ô /Ð /å ŒV× (Ò (°dÐ (Ñ ;Ô ;ð ð Ý ØØ$ VÔ,¨VÔ4Ø$ VÔ,¨ZÔ8ð ñ ô ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øõ�QÐÑÔÐå ×#Ò#Ñ%Ô%ñ,*Ý(¨Ñ.Ô.ˆ Ý"¥3¤8×#7Ò#7Ñ#9Ô#9Ñ:Ô:Ðð"×&Ò&Ñ(Ô(ð Añ AˆFõ  Ñ'Ô'ð Ø$×,Ò,¨VÑ4Ô4Ð4ØØÐ-Ð-Ð-Ý×%Ò% fÑ-Ô-Ð-Ø$×,Ò,¨VÑ4Ô4Ð4Ý 2°;ÀÑ GÔ GÐ Gõ œG×5Ò5°fÑ=Ô=ˆMÝ œXŸ\š\™^œ^ˆNÝ œ×5Ò5°mÑDÔDð Að A�Ýœ dÑ+Ô+Ô2�ØÐ0Ð0Ð0Ý—O’O FÑ+Ô+Ð+Ø'×/Ò/°Ñ7Ô7Ð7à!×%Ò% f¨aÑ0Ô0°FÒ:Ð:Ý”F×'Ò'ØØØ e°VÐ eÐ eÈÐ eÐ eÐ eð(ñôðõ  °-Ð@Ñ@Ô@Ð@Ð@ñ Að+ð *ð *ˆFõ  Ñ'Ô'ð ØÝ × !Ò ! &Ñ )Ô )Ð )Ð )ð &ð ð ˆÝ �Š˜ÑÔÐÐð ð sÃ+D Ä D ÄD rEcóT‡—ˆfd„| ¦«D¦«D]}||=ŒdS)a¥Drop every LVE mapped to *lvp_id* from a /proc/lve/map snapshot. Call after destroying lvp: the kernel unlinks the LVP's whole child list and deletes each child's map row, so the snapshot's rows for them no longer describe kernel state. Dropping them (rather than re-reading the file) keeps the dict identity that the batch shares, and costs one dict scan on what is a rare repair path. có&•—g|] \}}|‰k¯ |‘ŒSrCrC)rfrÚ mapped_torbs €rErhz(_forget_lvp_children..Qs)ø€Ð]Ð]Ð]Ñ/˜f iÈÐV\ÒI\ÐI\�6ÐI\ÐI\ÐI\rDN)r…)rErbrs ` rEÚ_forget_lvp_childrenrÞHsJø€ð^Ð]Ð]Ð]°:×3CÒ3CÑ3EÔ3EÐ]Ñ]Ô]ððˆØ �vÐ Ð ððrDc ó¦—t¦«\}}t¦«}tj ¦«}tj d¬¦«5| ¦«D]L}||vrŒ| |d¦«dkr+t|||d||d|¬¦«ŒM ddd¦«n #1swxYwYtd|¬¦«t  ¦«sdStd¦«}| ¦«D�](}t|¦«rŒt|||¬¦«tj |¦«}tj |¦«D�]Ã}t%j|¦«j} t+|¦«rð||krêtj |¬ ¦«st. ||¦«netj ||¦«sEt. |¦«t. ||¦«t7||¦«| |d¦«|kr.tj ||d |›d |›d �¬ ¦«|||<nH| |d¦«|kr.tj ||d |›d |›d �¬ ¦«|||<t|||¬¦«�Œx#t:t<t>f$r3} tAj t@j!d|›d|›d| ›�¦«Yd} ~ �Œ½d} ~ wwxYw�Œ*dS)NTrÍrrAr•)rDr•rE)rrE)rErar4r5rÓrÎ)rr•rEz#lve_apply_all: failed to apply uid=z under lvp=r)"rÎr!rMrOrtr3rÐr´rÍrKrNrËrcrÑrÒr¿rÓrr&r'r(rrÜrÂr<rérÝrÞrCr]r+r%rÚLOG_ERR) rÁrÕÚdomain_lve_idsrErÚlvp_id_rtr$Úlve_id_rJs rEÚ lve_apply_allräVs€Ý7Ñ9Ô9Ñ€Gˆ[Ý,Ñ.Ô.€Nõ ”—’‘”€Jå Œ× $Ò $°$Ð $Ñ 7Ô 7ð Wð WØ—l’l‘n”nð Wð WˆFؘÐ'Ð'ðà�Š˜v qÑ)Ô)¨QÒ.Ð.ݘ&¨7°6¬?¸6Ô+BØ#*¨6¤?°:Ô#>È:ðWñWôWðWøð Wð Wð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wõ�Q :Ð.Ñ.Ô.Ð.õ × 'Ò 'Ñ )Ô )ðØˆå  Ñ&Ô&€Gð—<’<‘>”>ðQñQˆõ ˜GÑ $Ô $ð Ø å.¨w¸ÈJÐWÑWÔWÐWõœ×1Ò1°'Ñ:Ô:ˆ Ý”N×1Ò1°-Ñ@Ô@ðC ñC ˆDÝ”l 4Ñ(Ô(Ô/ˆGð7 õ,¨GÑ4Ô4ð$6¸ÀGÒ9KÐ9Kõœ8×-Ò-°WÐ-Ñ=Ô=ðBÝ×-Ò-¨g°wÑ?Ô?Ð?Ð?å œX×7Ò7¸ÀÑIÔIð BÝ×-Ò-¨gÑ6Ô6Ð6Ý×-Ò-¨g°wÑ?Ô?Ð?õ-¨Z¸ÑAÔAÐAð"—~’~ g¨qÑ1Ô1°WÒ<Ð<Ýœ×+Ò+Ø#Ø#Ø$k¸Ð$kÐ$kÈWÐ$kÐ$kÐ$kð,ñôðð /6˜  7Ñ+øð"—~’~ g¨qÑ1Ô1°WÒ<Ð<Ýœ×+Ò+Ø#Ø#Ø$k¸Ð$kÐ$kÈWÐ$kÐ$kÐ$kð,ñôðð /6˜  7Ñ+å °=ÈZÐXÑXÔXÐXÑXøÝ�X¥zÐ2ð ð ð Ý” Ý”Nð2¸'ð2ð2Ø!(ð2ð2Ø,/ð2ð2ñôðððððñøøøøð øøøñ}C ðQðQs,ÁA"C à CÃCÆ'ELÌM Ì(MÍM cóâ—t¦«td¦«t¦«}t ¦«r&t t ¦«¦«ni}||fS)Nrü)rŒrþrËrMrNrÿÚlve_id_lvp_id_pairs)rÔrÕs rErÎrÎÈs_€Ý�M„M€MݘÑ&Ô&Ð&Ý$Ñ&Ô&€KÝ58×5QÒ5QÑ5SÔ5SÐ[•$•s×.Ò.Ñ0Ô0Ñ1Ô1Ð1ÐY[€KØ ˜ Ð #Ð#rDcóÈ—t|dd¬¦«t|||d||d||¬¦«t|d¬¦«td||¬ ¦«dS) NTF)rbr[r‹rAr•)rrDr•rbrE)rbr‹r)rrbrE)rŒrK)rÁrbrEs rErÑrÑÐs€€õ�v¨DÀuÐMÑMÔMÐMÝ �Vؘv” vÔ.ؘv” zÔ2ØØ#ð %ñ%ô%ð%õ �v°EÐ:Ñ:Ô:Ð:Ý �Q˜v°*Ð=Ñ=Ô=Ð=Ð=Ð=rDcó`—td¦«t|¬¦«tD�]Ê}t|¬¦«|k�r²tj |¦«}tj |¦«}t|¦«D]U} tj |¦«j }n#t$rYŒ)wxYwt|¦«r||vr| |¦«ŒV|dd…D]�}t  d|¦« tj|¦«Œ3#t$rQtj |¦«rt |¦«| |¦«YŒ�wxYwt/|¦«|j |¦«t5t6¦«td¬¦«|D]}t9|¦«Œt|¬¦«dS�ŒÌ|dkrdS|t;t=j¦«¦«vrdStj  |¬¦«sdStj |¦«}|dd…D]�}t  d|¦« tj|¦«Œ3#t$rQtj |¦«rt |¦«| |¦«YŒ�wxYwt/|¦«td¬¦«|D]}t9|¦«ŒdS)u³Remove reseller from ve.cfg and from procfs. CLOS-4419: idempotent for orphan kernel LVPs. When no block is present, the function falls through to a recovery branch that distinguishes three states: * domain-isolated user — kernel LVP is legitimately maintained by _sync_map for the per-domain isolation feature; do not destroy. * already clean — neither block nor kernel LVP exist; return True so disable_reseller_limits reports OK instead of WARNING. * true orphan — block missing but kernel LVP exists with no isolation marker; destroy the LVP and re-parent any mapped LVEs to the host LVP. Trar-NrF)!r†rŒrkr,rMrOÚmap_lve_id_listrtrÒrr&r'r(rrcr¾rÂrCr¤r3Ú lve_existsrÚremoverâÚ parentNodeÚ removeChildrr>rKrrTrUrÜ)rbr�ÚusersrtÚusernamerqrs rEÚ_remove_resellerrðæso€õ�DÑÔÐÝ�vÐÑÔÐÝð4ñ4ˆÝ ¨bÐ 1Ñ 1Ô 1°VÒ ;Ñ ;Ý”H×,Ò,¨VÑ4Ô4ˆEõ" œG×5Ò5°fÑ=Ô=ˆMÝ*¨=Ñ9Ô9ð &ð &�ðÝœ, xÑ0Ô0Ô7�C�CøÝðððØ�Hðøøøå# CÑ(Ô(ð&¨S¸Ð-=Ð-=Ø—L’L Ñ%Ô%Ð%øð    œ(ð )ð )�Ý×"Ò" 1 fÑ-Ô-Ð-ð)Ý”L Ñ(Ô(Ð(Ð(øÝð)ð)ð)Ý”v×(Ò(¨Ñ0Ô0ð0ÝŸš¨Ñ/Ô/Ð/Ø—L’L Ñ(Ô(Ð(Ð(Ð(ð)øøøõ ˜Ñ Ô Ð ð ŒM× %Ò % bÑ )Ô )Ð )Ý •VÑ Ô Ð å ˜qÐ !Ñ !Ô !Ð !àð "ð "�ݘ&Ñ!Ô!Ð!Ð!Ý ˜vÐ &Ñ &Ô &Ð &Ø�4�4ñg <ðl�‚{€{àˆuØ ••YÔ;Ñ=Ô=Ñ>Ô>Ð>Ð>ð ˆuÝ Œ8× Ò  VÐ Ñ ,Ô ,ð ðˆtõ ŒH× $Ò $ VÑ ,Ô ,€Eؘ˜˜”(ð!ð!ˆÝ ×Ò˜1˜fÑ%Ô%Ð%ð !Ý ŒL˜Ñ Ô Ð Ð øÝð !ð !ð !ÝŒv× Ò  Ñ(Ô(ð (Ý—’ Ñ'Ô'Ð'Ø �LŠL˜Ñ Ô Ð Ð Ð ð !øøøõ�ÑÔÐÝ�qÐÑÔÐØððˆÝ�&ÑÔÐÐØ ˆ4s8ÂB)Â) B6Â5B6Ä DÄAE:Å9E:ÊJÊAK8Ë7K8có8—|t¦«vr%tj d|›d�¦«dSt j|¦«t  |¦«}t  d||¦«t j   |¬¦«s8t  d||¦«t  ||¦«ns|rqt j  ||¦«sQt  d||¦«t |¦«t  ||¦«t j  ¦«}t  |||¦«g}t j|¦« ¦«D]L}| |d¦«|kr0t ||¦«| |¦«ŒM|rt  d ||¦«dSdS) a×Enable per-domain LVE isolation for the given user. Creates an empty id_registry file (marking the user as domain-isolated), creates lvp (nested under the user's reseller LVP if any), and moves lve under it. Analogous to set-reseller for reseller limits. Any existing domain IDs in the registry are pre-mapped to lvp via lve_lvp_map so that subsequent lve_setup calls will place domain LVEs under the correct LVP automatically. CLOS-5716: a registered reseller is never a per-user isolation LVP, so it must not be marked here. Both marker-planting vectors reach this function -- `lvectl allow-domain-limits ` directly, and `cagefsctl --isolates-allow-all` which shells out to allow-domain-limits for every panel user (resellers included). A bare lvd_ids marker on a reseller UID makes is_isolation_lvp() true, and lve_apply_all() then skips the reseller LVP on boot, zeroing it and degrading every sub-user under it. The read-side filter in _isolation_lvp_ids() already excludes such markers from the isolation set; skipping here stops them being planted at all. Skip silently (the caller still exits 0) rather than raising: cagefs's per-user path (allow_website_isolation_for_user) does not guard the lvectl subprocess and would abort on a non-zero exit. Degrades to marking normally if ve.cfg can't be read (_reseller_lvp_ids() returns an empty set), same as the read-side filter. z3lvectl: skipping domain isolation for reseller uid=z4 (a reseller LVP is never a per-user isolation LVP) Nz-enable_domain_isolation: uid=%s parent_lvp=%srazAenable_domain_isolation: creating isolation LVP lvp%s under lvp%szQenable_domain_isolation: lvp%s exists but is not under lvp%s; recreating it thererzMenable_domain_isolation: pre-registered existing domain LVE(s) %s under lvp%s)rVrr†r…rÚcreate_empty_registryrMr:r9r;rOrÜrÂr<rérÝrtr=rrtrÍrÕr¾)rrHrÙÚpre_registeredÚ domain_ids rEÚenable_domain_isolationrõW s€ð4Õ"Ñ$Ô$Ð$Ð$Ý Œ ×Òð CÀ&ð Cð Cð Cñ ô ð ð ˆÝÔ(¨Ñ0Ô0Ð0Ý—’˜VÑ$Ô$€J݇H‚HÐ <¸fÀjÑQÔQÐQå Œ8× Ò  VÐ Ñ ,Ô ,ð2Ý �ŠÐTؘñ %ô %ð %å ×Ò˜f jÑ1Ô1Ð1Ð1Ø ð2�CœH×6Ò6°v¸zÑJÔJð2Ý �Šð'Ø(.° ñ <ô <ð <å ×Ò˜fÑ%Ô%Ð%Ý ×Ò˜f jÑ1Ô1Ð1å”X—\’\‘^”^€Nõ×Ò�f˜j¨.Ñ9Ô9Ð9ð €NÝ#Ô3°FÑ;Ô;×BÒBÑDÔDð-ð-ˆ Ø × Ò ˜i¨Ñ +Ô +¨vÒ 5Ð 5Ý × Ò ˜f iÑ 0Ô 0Ð 0Ø × !Ò ! )Ñ ,Ô ,Ð ,øØð8Ý �ŠðØ .°ñ 8ô 8ð 8ð 8ð 8ð8ð8rDcóà—tj |¬¦«s1t d|¦«t j|¦«dSt |¦«}t d||¦«tj |¦«D]:}t  d|||¦«t  ||¦«Œ;tj  ¦«}|  |d¦«|krt  ||¦«g}t j|¦« ¦«D]P}tj |¦«r/t |¦«| |¦«ŒQt d|||¦«t'|¦«t j|¦«dS)zýDisable per-domain LVE isolation for the given user. Moves lve back to the parent LVP (reseller or root), destroys domain LVEs, destroys lvp, and removes the id_registry file. Analogous to remove-reseller for reseller limits. razMdisable_domain_isolation: uid=%s has no isolation LVP, removing registry onlyNz?disable_domain_isolation: uid=%s, moving children back to lvp%sz:disable_domain_isolation: moving lve%s from lvp%s to lvp%srzEdisable_domain_isolation: uid=%s destroyed domain LVE(s) %s and lvp%s)rMrOrÜr9r;rÚremove_all_entriesr:rér2rÂrCrtrÍrrtrérr¾râ)rrHÚ child_lverÙrïrôs rEÚdisable_domain_isolationrù™ sÑ€õ Œ8× Ò  VÐ Ñ ,Ô ,ðõ �Šð*Ø+1ñ 3ô 3ð 3åÔ)¨&Ñ1Ô1Ð1؈嗒˜VÑ$Ô$€J݇H‚HÐ NØ �Zñ!ô!ð!õ”X×-Ò-¨fÑ5Ô5ð2ð2ˆ Ý � Š ÐNؘV Zñ 1ô 1ð 1å ×Ò˜: yÑ1Ô1Ð1Ð1å”X—\’\‘^”^€NØ×Ò˜& !Ñ$Ô$¨Ò.Ð.Ý ×Ò˜: vÑ.Ô.Ð.ð €IÝ#Ô3°FÑ;Ô;×BÒBÑDÔDð(ð(ˆ Ý Œ8× %Ò % iÑ 0Ô 0ð (Ý �OŠO˜IÑ &Ô &Ð &Ø × Ò ˜YÑ 'Ô 'Ð 'øÝ‡H‚HÐ TØ �Y ñ(ô(ð(õ�ÑÔÐÝÔ% fÑ-Ô-Ð-Ð-Ð-rDcóÒ—tj||¦«}t¦«tj ¦«}| |¦«|kr>t d|||¦«tj   ||¦«nt  d||¦«tj  |¦« |¦«dS)avRegister a single domain LVE under the user's LVP. Assigns a domain ID for *docroot* in the per-user registry, then pre-maps it to *owner_uid*'s LVP so that lve_setup will place the domain LVE under the correct LVP when it is first created. Also records the domain name in ``~/.lve/domains.json`` so we can obtain list of enabled domains for user. z>enable_domain_lve: mapping domain LVE %s to lvp%s (docroot %r)z8enable_domain_lve: domain LVE %s already mapped to lvp%sN)rÚassign_domain_idrŒrMrOrtrÍr9r;r3rÕr2rTÚ LvdConfigr Úadd_domain_by_docroot)Ú owner_uidÚdocrootrôÚproc_maps rEÚenable_domain_lverÆ sÉ€õÔ/° ¸7ÑCÔC€IÝ�M„M€MÝŒx�|Š|‰~Œ~€H؇|‚|�IÑÔ )Ò+Ð+Ý �ŠÐQؘI wñ 0ô 0ð 0å Œ×Ò˜9 iÑ0Ô0Ð0Ð0å � Š ÐLؘYñ (ô (ð (å Ô×Ò˜YÑ'Ô'×=Ò=¸gÑFÔFÐFÐFÐFrDcó—tj||¦«}t d|||¦«|�št ¦«t j |¦«rX t  |¦«n<#t$r/}tj tj d|›d|›�¦«Yd}~nd}~wwxYwtj ||¦«tj |¦« |¦«dS)z÷Unregister a single domain LVE and remove its registry entry. Destroys the kernel LVE (if it exists) and removes *docroot* from the per-user domain ID registry. Also removes the corresponding domain from ``~/.lve/domains.json``. z6disable_domain_lve: uid=%s docroot=%r domain_lve_id=%sNz*disable_domain_lve: failed to destroy lve r)rÚ get_domain_idr9r;rŒrMr3rêrr%rrAÚremove_domain_idrTrür Úremove_domain_by_docroot)rþrÿrôrJs rEÚdisable_domain_lverÝ s'€õÔ,¨Y¸Ñ@Ô@€I݇H‚HÐ EØ ˜ ñ,ô,ð,àÐ݉ Œ ˆ Ý Œ6× Ò ˜YÑ 'Ô 'ð 9ð 9Ý—’  Ñ*Ô*Ð*Ð*øÝð 9ð 9ð 9Ý” �fÔ0ð8Ø%.ð8ð8Ø25ð8ð8ñ9ô9ð9ð9ð9ð9ð9ð9øøøøð 9øøøõ Ô'¨ °7Ñ;Ô;Ð;Ý Ô×Ò˜YÑ'Ô'×@Ò@ÀÑIÔIÐIÐIÐIsÁ#A>Á> B7Â%B2Â2B7cóÌ— tj |¦«}n#t$rYdSwxYw|j|jdz|jdz|j|j|j |j dœS)zñThe limits the kernel holds for a domain LVE, or None if it has none. Units match `paneluserslimits --json --exact-limits` LIMITS: cpu in hundredths of a percent, memory in bytes, io in KB/s, the rest as the kernel counts them. Nrd)r�r•rmr“r–r’r—) rMr3Úlve_infor]r6r:rör9r;r8r<)rôrs rEÚ_kernel_domain_limitsr ô s�€ð Ý”6—?’? 9Ñ-Ô-ˆˆøÝ ððð؈tˆtðøøøðŒØÔ&¨Ñ-ØÔ" TÑ)ØÔ ØÔ"ØŒnØÔ ð ð ðs ‚"¢ 0¯0c ód—tj|¦«j}i}t|¦«pgD]K\}}| t j |¦«g¦« |¦«ŒLg}tj |¦«}t|  ¦«d„¬¦«D]|\}}t|¦«}t| t j |¦«dg¦«t¬¦«D]}| ||||du|dœ¦«Œ Œ}|S)aÂEffective kernel limits of every registered domain of *owner_uid*. Built for root-side readers (LVE Manager's admin view, CLOS-7520) that must not take the tenant-writable ~/.lve/domains.json as the answer: the domains come from the root-owned registry, the names from the panel, and the limits from the kernel. One row per panel domain name; a docroot the panel no longer attributes to the account keeps its row with ``domain`` None, so the registration is still visible. ``in_kernel`` False (``limits`` None) means the domain LVE does not exist yet: it is created on the first request or limits set, and until then the site runs within the account's own limits. có—|dS)NryrC)Úentrys rEr/z$list_domain_limits.. s €ÈÈaÌ€rD)r‡N)ÚdomainrÿrÚ in_kernelrr)r&r¤r¥rÚ setdefaultrËr¶Únormpathr¾rrÚsortedr…r rÍrA) rþrïÚnamesrprÿÚrowsÚentriesrôrrs rEÚlist_domain_limitsr sD€õŒ|˜IÑ&Ô&Ô.€HØ €EÝ$ XÑ.Ô.Ð4°"ðEðE‰ ˆˆgØ ×Ò�œ×)Ò)¨'Ñ2Ô2°BÑ7Ô7×>Ò>¸tÑDÔDÐDÐDà €DÝÔ,¨YÑ7Ô7€GÝ$ W§]¢]¡_¤_Ð:PÐ:PÐQÑQÔQð ð ш�Ý& yÑ1Ô1ˆÝ˜5Ÿ9š9¥R¤W×%5Ò%5°gÑ%>Ô%>ÀÀÑGÔGÍSÐQÑQÔQð ð ˆDØ �KŠKØØ"Ø#Ø#¨4Ð/Ø ð ðñ ô ð ð ð ð €KrDcóÚ—t|¦«rtj|¬¦«dStr+t ddd|›�g¦«t jd¦«dStd|›�¦«dS)z&Disable reseller limits and call hooksr0r-r_zno configuration found for LVP r®z(warning: no configuration found for LVP N)rðrÚ throw_eventr|r}rr€r~)rtrbs rEÚdisable_reseller_limitsr+ s‚€å˜ÑÔðGÝ%Ô1¸=ÐIÑIÔIÐIÐIÐIå ð GÝ ˜ )Ð-WÈvÐ-WÐ-WÐ!XÑ YÔ YÐ YÝ ŒH�R‰LŒLˆLˆLˆLå ÐE¸VÐEÐEÑ FÔ FÐ FÐ FÐ FrDcó—t|¦«td¦«t¦«d}tD]�}t |¬¦«|krkd}t |¦«t |¦«|j |¦«tt¦«t¦«t|¦«Œ‚|sFtr+tddd|›�g¦«tjd¦«dSt!d|›�¦«dSdS) NTFr-r-r_zno configuration found for VE r®z'warning: no configuration found for VE )r)r†rŒrjr,rrÖrìrírr>rKr|r}rr€r~)rÚDeletedr�s rEÚ lve_deleter8 s€Ý˜VÑ$Ô$Ð$Ý�DÑÔÐÝ�M„M€MØ€GÝððˆÝ ¨bÐ 1Ñ 1Ô 1°VÒ ;Ð ;؈GÝ ˜Ñ Ô Ð Ý �vÑ Ô Ð Ø ŒM× %Ò % bÑ )Ô )Ð )Ý •VÑ Ô Ð Ý ‰MŒMˆMÝ �fÑ Ô Ð øØ ðFÝ ð FÝ ˜ )Ð-VÈfÐ-VÐ-VÐ!WÑ XÔ XÐ XÝ ŒH�R‰LŒLˆLˆLˆLå ÐD¸FÐDÐDÑ EÔ EÐ EÐ EÐ Eð FðFrDcó—tj d¦«s?trt dddg¦«nt d¦«t jd¦«dSdS)Nú/proc/lve/enterr-r_zenter by name not supportedz$warning: enter by name not supportedr®)rËr¶rr|r}r~rr€rCrDrEÚlve_enter_checkrN sd€Ý Œ7�>Š>Ð+Ñ ,Ô ,ðÝ ð :Ý ˜ )Ð-JÐ!KÑ LÔ LÐ LÐ Lå Ð8Ñ 9Ô 9Ð 9Ý Œ�‰ Œ ˆ ˆ ˆ ð ðrDcóô—t¦« || ¦«z}tddd¬¦«5}| |¦«ddd¦«dS#1swxYwYdS#t$rYdSwxYw)NrÚwrÖr×)rrßrÝr…r;)Úsignrsr/ræs rEÚ enter_applyr"W sÍ€ÝÑÔÐð Ø�V—\’\‘^”^Ñ#ˆÝ Ð# S°7Ð ;Ñ ;Ô ;ð ¸qØ �GŠG�C‰LŒLˆLð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð øå ð ð ð Ø ˆˆð øøøs4�)A)¹AÁ A)ÁA Á A)Á#A Á$A)Á) A7Á6A7cóN—t¦«trTd}d}tD]2}| d¦«}|r|d|zdzz }d}Œ'|d|zdzz }Œ3|dz }t |¦«dSt d¦«tD]$}t | d¦«¦«Œ%dS) Nr§Tr¶r¯Fz,"r¨ÚBinaries)rŒr|rmr%r~)r‹Úfirstr�r¶s rEÚ list_binariesr&a sЀÝ�M„M€MÝ ð+؈؈Ýð ,ð ,ˆBØ—?’? 6Ñ*Ô*ˆDØð ,ؘ# ™* sÑ*Ñ*�Ø��à˜$ ™+¨Ñ+Ñ+��Ø�$‰ˆÝ ˆf‰ Œ ˆ ˆ ˆ å ˆjÑÔÐÝð +ð +ˆBÝ �"—/’/ &Ñ)Ô)Ñ *Ô *Ð *Ð *ð +ð +rDcó|—t¦«tD]%}td| d¦«¦«Œ&dS)Nú+r¶)rŒrmr"r%)r�s rEÚ load_binariesr)u sC€Ý�M„M€MÝð2ð2ˆÝ�C˜Ÿš¨Ñ0Ô0Ñ1Ô1Ð1Ð1ð2ð2rDcó¾—t¦«tddd¬¦«5}|D]}td|¦«Œ ddd¦«n #1swxYwYt¦«dS)NrrÕrÖr×ú-)rrÝr"r))rærçs rEÚreload_binariesr,{ s¬€ÝÑÔÐÝ Ð ¨wÐ 7Ñ 7Ô 7ð#¸1Øð #ð #ˆDÝ ˜˜TÑ "Ô "Ð "Ð "ð #ð#ð#ð#ñ#ô#ð#ð#ð#ð#ð#ð#øøøð#ð#ð#ð#õ�O„O€O€O€Os¡AÁAÁ AcóЗtd¦«t¦«t¦«d}tD]i}| d¦«|krNd}t d|¦«|j |¦«tt¦«t¦«Œj|sEtrtddd|›�g¦«ntd|›�¦«tjd ¦«dSdS) NTFr¶r+r-r_zno configuration found for z$warning: no configuration found for r®)r†rrŒrmr%r"rìrírr>r|r}r~rr€)rsÚdeletedr�s rEÚ del_binaryr/ƒ s÷€å�DÑÔÐÝÑÔÐÝ�M„M€MØ€GÝððˆØ �?Š?˜6Ñ "Ô " fÒ ,Ð ,؈GÝ ˜˜VÑ $Ô $Ð $Ø ŒM× %Ò % bÑ )Ô )Ð )Ý •VÑ Ô Ð Ý ‰MŒMˆMøØ ðÝ ð CÝ ˜ )Ð-SÈ6Ð-SÐ-SÐ!TÑ UÔ UÐ UÐ Uå ÐA¸ÐAÐAÑ BÔ BÐ BÝ Œ�‰ Œ ˆ ˆ ˆ ð ðrDcó„—td¦«t¦«tD]}| d¦«|krdSŒt d|¦«t  d¦«}| d|¦«t  |¦«tt ¦«t¦«dS)NTr¶r(rs) r†rŒrmr%r"r>r8r9rnr:r)rsr�Úbin_xmls rEÚ set_binaryr2˜ sµ€õ�DÑÔÐÝ�M„M€MÝððˆØ �?Š?˜6Ñ "Ô " fÒ ,Ð ,Ø ˆFˆFð -å��VÑÔÐÝ×"Ò" 8Ñ,Ô,€GØ ×Ò˜ Ñ(Ô(Ð(Ý× Ò  Ñ)Ô)Ð)Ý �VÑÔÐÝ�M„M€M€M€MrDcóR‡‡— |rt}n|rt}nt}ˆˆfd„|D¦«d}n#t$rYdSwxYw|rR‰dD]G}|dkrt |dd¦«}nt ||d¦«}|r|j |¦«ŒHdStt¦«‰dz }|D]¿} | dkr\t|  d¦«¦«dkr6| ‰vr1|  d¦«d  d¦«‰| <Œdt|  | ¦«¦«dkr5| ‰vr1|  | ¦«d  d¦«‰| <ŒÀ|rt‰d ¦«dSt‰d ¦«dS) a� Set given lve or package to default values for given parameters :param dict set_data: Arguments of lvectl call :param bool package_flag: Should we delete package or lve with given id :param callable is_needed: Function that takes xml element and set_data dict and returns whether current xml element contains info about needed ID from set_data có,•—g|]}‰|‰¦«¯|‘ŒSrCrC)rfrvÚ is_neededÚset_datas €€rErhz#lve_set_default..¸ s*ø€Ð 8Ð 8Ð 8�A  ¨1¨hÑ!7Ô!7Ð 8ˆaÐ 8Ð 8Ð 8rDrNú set-defaultr“r|r}r4Úve_id)rlrkrjr7rQrìrírÚLIMITS_LIST_NAMEràr6r%Ú plan_deleter) r6Ú package_flagr5rbrðr�Útag_ÚnÚto_keepr4s ` ` rEr÷r÷¨ sùøø€ð Ø ð ݈DˆDØ ð ݈DˆDåˆDØ 8Ð 8Ð 8Ð 8Ð 8˜Ð 8Ñ 8Ô 8¸Ô ;ˆˆøÝ ðððØˆˆðøøøà ð à˜]Ô+ð ,ð ,ˆDØ�tŠ|ˆ|Ý$ R¨°/ÑBÔB��å$ R¨¨wÑ7Ô7�Øð ,Ø” ×(Ò(¨Ñ+Ô+Ð+øØˆÝÕ"Ñ#Ô# h¨}Ô&=Ñ=€GØðZðZˆØ �DŠ=ˆ=�S ×!8Ò!8¸Ñ!AÔ!AÑBÔBÀQÒFÐFà˜HÐ$Ð$Ø"$×"9Ò"9¸'Ñ"BÔ"BÀ1Ô"E×"RÒ"RÐSbÑ"cÔ"c�˜‘øÝ �×(Ò(¨Ñ/Ô/Ñ 0Ô 0°1Ò 4Ð 4à˜HÐ$Ð$Ø"$×"9Ò"9¸%Ñ"@Ô"@ÀÔ"C×"PÒ"PÐQXÑ"YÔ"Y�˜‘øàð&Ý�H˜WÔ%Ñ&Ô&Ð&Ð&Ð&å�8˜GÔ$Ñ%Ô%Ð%Ð%Ð%s„05µ AÁAcóŽ—|dvrdSt|¦«}|dvrdS t|¦«}n#t$rg}YnwxYw||vrdSdS)a Checks is uid owned by reseller :param uid: uid for check :param reseller_name: Reseller name, None treats as root :return: True - valid reseller/user pair, False - else Special case: if reseller_name is None (root) - always valid )NÚrootT)r@rœF)rrr;)rqrtrïÚreseller_users_lists rEÚ_check_reseller_user_pairrBÖ sˆ€ð˜Ð&Ð&؈tõ(¨Ñ,Ô,€HØ�?Ð"Ð"àˆuð!å,¨]Ñ;Ô;ÐÐøÝ ð!ð!ð!à ÐÐÐð!øøøðÐ&Ð&Ð&؈tØ ˆ5s �-­ <»<c ór—|dkr!|ddkrt|d¦«|dkr0| dd¦«}|d}t||¦«sdStd¦«|rN||dkrBtj |¦«rt|d¬¦«ntt|¬¦«nc|dkrMt ¦«r4ttj  |d¦«¬¦«nt|¬¦« t¦«n#t$rYnwxYw t|d}t|¦«}|r|dnd}t||¬ ¦«n#t$r taYnwxYw|ddk�ržd}d „}d |vrt#|d||¬ ¦«d |vrt%|d ¦«} n td } d} d|vr*t'|d| ¬¦«} | t dkrd} |rt(} nt*} | D�]<} || |¦«�r,t,D�]+}||v�r# |dkrt/| dd||¦«nt/| |d||¦«ŒA#t0t2t4f$rÐ|dkr| }nt |||k}|s|dr¢|dkrDt6 d¦«}| dt=||¦«¦«nCt6 |¦«}| dt=||¦«¦«|  |¦«Y�Œ'wxYw�Œ-| dd¦«stAt6¦«d}|rN||dkrBtj |¦«rt|d¬¦«ntt|¬¦«nc|dkrMt ¦«r4ttj  |d¦«¬¦«nt|¬¦«tC|d|¬¦«�Œ<�Œ>|�sÖ|d�rÍ|rtDnd}t6 |¦«} |rZ|  dt=|¦«¦«|  d|d¦«|  tF¦«nr| d¦«r4|  dtIj%|d¦«j&¦«n)|  dt=|d¦«¦«t,D]Ò}||vrÌ|dkr| }nt |||k}|s|dr¢|dkrDt6 d¦«}| dt=||¦«¦«nCt6 |¦«}| dt=||¦«¦«|  |¦«ŒÓd}tND]}|j( )| |¦«d}|st6j* | ¦«| dd¦«stAt6¦«|�rtj |¦« }t|d¬¦«tC|d|¬¦«tV |tV ,d¦«¦«t|¬¦«tj- .|¦«}tj- /|¬¦«D]3}tj0 1||¦«tC||¬ ¦«Œ4|rtej3|¬ ¦«�ngt ¦«r4ttj  |d¦«¬¦«nt|¬¦«tC|d¦«nôt,D]›}||vr•|dkrHtF 4d¦«d dt=||¦«¦«ŒTtF 4|¦«d dt=||¦«¦«Œœ| dd¦«stAt6¦«t|¬¦«tC|d|¬¦«dS)Nrr8rtFT)rbr[raršr0có6—t|¬¦«|dkS)Nr-r8r.©r�r6s rEÚis_needed_userzlve_set..is_needed_user' s€Ý&°bÐ9Ñ9Ô9¸XÀgÔ=NÒNÐ NrDr7)r;r5rbr‘r�rr“r|r}r4Úsavezskip-update-cfgrMr#r$z save-username)5r)rÍrBr†rMrOrÜrŒrNrërþr;rýrÇr«r=r�r÷r@r rkrjr9rWrÑr7rÐr>r8r9rAr:rrKr!r5r&r¤r¥rlrìÚ insertBeforeÚ lastChildrÂrrtrÒÚlvp_lve_id_listr3rCrrr6)r6rbrtrrrrÊr•Úhas_verFrñÚcpu_is_differentÚ setted_cpuÚel_listr�r‡Ú is_differentrAÚel_nameÚaddedÚel2Úenables_reseller_limitsrãs rEÚlve_setrTù s� €ð�‚{€{�x Ô(¨AÒ-Ð-Ý  ¨'Ô!2Ñ3Ô3Ð3Ø �‚{€{à Ÿ š  _°dÑ;Ô;ˆ ؘ'Ô"ˆÝ(¨°Ñ?Ô?ð Ø�5å�DÑÔÐØ ð #�&˜H WÔ-Ò-Ð-å Œ8× Ò ˜fÑ %Ô %ð 'å ˜v°DÐ 9Ñ 9Ô 9Ð 9Ð 9õ ˜vÐ &Ñ &Ô &Ð &Ð &Ø �1Šˆ�×5Ò5Ñ7Ô7ˆå�3œ8×5Ò5°h¸wÔ6GÑHÔHÐIÑIÔIÐIÐIõ ˜6Ð"Ñ"Ô"Ð"ð ÝÑÔÐÐøÝ ð ð ð Ø ˆð øøøð!õ! ¨'Ô!2Ô3ˆÝ-¨gÑ6Ô6ˆ Ø#,Ð4�9˜Q”<�<°"ˆÝ˜7¨XÐ6Ñ6Ô6Ð6Ð6øÝ ð!ð!ð!Ý ˆ ˆ ˆ ð!øøøà�Ô˜AÒÑØˆð Oð Oð Oð ˜HÐ $Ð $Ý ˜H°5ÀNÐ[aÐ bÑ bÔ bÐ bØ �XРРݘ Ô(Ñ)Ô)ˆEˆEå Ô'ˆEð ÐØ �HÐ Ð Ý1°(¸5´/È5ÐQÑQÔQˆJØ�Z¨Ô.Ò.Ð.Ø#(Ð à ð ݈GˆGåˆGØð- ñ- ˆB؈~˜b (Ñ+Ô+ñ, Ý+ð5ñ5�Cؘh�‘ð5Ø" dš{˜{Ý 2°2°wÀÐQYÐZ]ÔQ^Ñ _Ô _Ð _Ð _å 2°2°s¸GÀXÈcÄ]Ñ SÔ SÐ SøøÝ *­J½ ÐBð5ð5ð5à" eš|˜|Ø/?    õ0:¸#¬À(È3Ä-Ò/O  Ø+ð5¨x¸Ô/?ð5Ø#&¨$¢; ;Ý+1×+?Ò+?ÀÑ+HÔ+H DØ$(×$5Ò$5°oÅcÈ(ÐSVÌ-ÑFXÔFXÑ$YÔ$YÐ$YÐ$Yå+1×+?Ò+?ÀÑ+DÔ+D DØ$(×$5Ò$5°g½cÀ(È3Ä-Ñ>PÔ>PÑ$QÔ$QÐ$QØ "§¢¨tÑ 4Ô 4Ð 4øùð5øøøñ 'ð, —|’|Ð$5°uÑ=Ô=ð%Ý�VÑ$Ô$Ð$à�Øð /˜f¨°Ô(9Ò9Ð9å”x×)Ò)¨&Ñ1Ô1ð3å#¨6ÀÐEÑEÔEÐEÐEõ$¨6Ð2Ñ2Ô2Ð2Ð2ؘq’[�[¥S×%AÒ%AÑ%CÔ%C�[å¥s¤x×'AÒ'AÀ(È7ÔBSÑ'TÔ'TÐUÑUÔUÐUÐUõ  vÐ.Ñ.Ô.Ð.ݘ( 7Ô+°FÐ;Ñ;Ô;Ð;Ñ;áàñ? -˜( 7Ô+ñ? -Ø*0Ð;Õ&Ð&°eˆGÝ×%Ò% gÑ.Ô.ˆBØð Bà—’ ¥c¨&¡k¤kÑ2Ô2Ð2Ø—’ ¨°Ô(8Ñ9Ô9Ð9Ø—’�zÑ*Ô*Ð*Ð*à—<’< Ñ0Ô0ðBØ—O’O F­C¬L¸À'Ô9JÑ,KÔ,KÔ,SÑTÔTÐTÐTà—O’O D­#¨h°wÔ.?Ñ*@Ô*@ÑAÔAÐAå'ð -ð -�ؘ(�?�?à˜e’|�|Ø'7˜ ˜ õ(2°#¤¸(À3¼-Ò'G˜ Ø#ð- x°Ô'7ð-Ø $š;˜;Ý#)×#7Ò#7¸Ñ#@Ô#@˜DØ ×-Ò-¨o½cÀ(È3Ä-Ñ>PÔ>PÑQÔQÐQÐQå#)×#7Ò#7¸Ñ#<Ô#<˜DØ ×-Ò-¨gµc¸(À3¼-Ñ6HÔ6HÑIÔIÐIØŸš tÑ,Ô,Ð,øàˆEÝ!ð ð �Ø”×+Ò+¨B¨sÑ3Ô3Ð3Ø�ØØð 1ÝÔ ×,Ò,¨RÑ0Ô0Ð0à—<’<Ð 1°5Ñ9Ô9ð !Ý�Ñ Ô Ð àñ -Ý.1¬h×.@Ò.@ÀÑ.HÔ.HÐ*HÐ'å 6¸Ð=Ñ=Ô=Ð=ݘ( 7Ô+°FÐ;Ñ;Ô;Ð;å×%Ò% f­e¯nªn¸QÑ.?Ô.?Ñ@Ô@Ð@å 6Ð*Ñ*Ô*Ð*Ý #¤× 9Ò 9¸&Ñ AÔ A� Ý"œw×6Ò6¸fÐ6ÑEÔEð?ð?�GÝ”F×'Ò'¨°Ñ8Ô8Ð8ݘg° Ð>Ñ>Ô>Ð>Ð>à*ðUÝ0Ô<ÀmÐTÑTÔTÐTùå×/Ò/Ñ1Ô1ð/Ý¥s¤x×'AÒ'AÀ(È7ÔBSÑ'TÔ'TÐUÑUÔUÐUÐUå vÐ.Ñ.Ô.Ð.ݘ( 7Ô+Ñ,Ô,Ð,øå#ð eð eˆCØ�hˆˆØ˜$’;�;Ý×3Ò3°GÑ<Ô<¸QÔ?×LÒLÈ_Õ]`ÐaiÐjmÔanÑ]oÔ]oÑpÔpÐpÐpå×3Ò3°CÑ8Ô8¸Ô;×HÒHÈÕQTÐU]Ð^aÔUbÑQcÔQcÑdÔdÐdøà�|Š|Ð-¨uÑ5Ô5ð Ý •VÑ Ô Ð å˜6Ð"Ñ"Ô"Ð"Ý�(˜7Ô#¨FÐ3Ñ3Ô3Ð3Ø ˆ4s7Ä!D0Ä0 D=Ä<D=Å?FÆFÆFÉ 7JÊC#M*Í)M*có8—td¦«t¦«t|d¦«}t|¦«dkrd}nt|¦«dkr|d}|�#tdkr||d<t |d¬¦«dSt |d¬¦«dS) zX Set package with some heuristic algorithm to simulate old package set behavior Tr8rNryrt©Ú is_resellerF)r†rŒrÇràroÚpackage_set_ext)r6rWÚ reseller_listr•s rEÚ package_setrZ» s´€õ�DÑÔÐÝ�M„M€Mõ.¨h°wÔ.?Ñ@Ô@€MÝ ˆ=ÑÔ˜QÒÐØˆˆÝ ˆ]Ñ Ô ˜qÒ Ð à  Ô#ˆðÐ¥°Ò 2Ð 2Ø$,ˆ�Ñ!ݘ¨dÐ3Ñ3Ô3Ð3Ð3Ð3嘨eÐ4Ñ4Ô4Ð4Ð4Ð4rDz/var/cpanel/packagesrrcó¨—|r|dvrtd|›�¦«‚d|vs#d|vstj |¦«rtd|›�¦«‚dS)a6 Reject package names that could escape a directory when interpolated into a path (path traversal). A package name is a single path component: no path separators, no `..`/`.` traversal tokens, not absolute, not empty. :raises ValueError: if the name is unusable as a single path component. )rÛz..zInvalid package name: ú/ú\N)rÑrËr¶Úisabs)rrs rEÚvalidate_package_namer_Õ sn€ð ð?�g Ð,Ð,ÝÐ=°'Ð=Ð=Ñ>Ô>Ð>Ø ˆg€~€~˜ ˜˜­B¬G¯MªM¸'Ñ,BÔ,B˜ÝÐ=°'Ð=Ð=Ñ>Ô>Ð>ð)˜rDc óœ—t|d¦«td¦«t¦«d}|rd„}nd„}d|vrt|d|¬¦«tD�]Õ}|||¦«�rÅt D�]U}||v�rM |dkrC| d ¦«d  d t||¦«¦«nB| |¦«d  d t||¦«¦«Œ•#tttf$r¦|dkrDt  d ¦«}| d t||¦«¦«nCt  |¦«}| d t||¦«¦«| |¦«Y�ŒQwxYw�ŒWtj¦«rRt#| d d¦«|d¦«}| t&t|¦«¦«d}�Œ×|�s~d}t  d¦«}| d|d¦«|r$| d|d ¦«|d }tj¦«r>t#||d¦«}| t&t|¦«¦«t D]¨}||vr¢|dkrDt  d ¦«}| d t||¦«¦«nCt  |¦«}| d t||¦«¦«| |¦«Œ©tj |¦«t+t¦«t¦«t-|¦«d|vrt/|d¦«} n t0d} d|vrt3|d| ¬¦«|d<|r|d nd} t5|d| ¬¦«dS)Nr8TFcó~—| d¦«|dko| d¦«|dkS)Nr#r8r•rtrœrEs rEržz'package_set_ext..is_needed_planí s=€à—’ Ñ%Ô%¨°'Ô):Ò:Ðw¸r¿ºÈzÑ?ZÔ?ZÐ^fÐgvÔ^wÒ?wð rDcól—| d¦«|dko| d¦« S)Nr#r8r•rœrEs rEržz'package_set_ext..is_needed_planò s3€Ø—?’? 4Ñ(Ô(¨H°WÔ,=Ò=ÐaÀbÇoÂoÐV`ÑFaÔFaÐBaÐ arDr7)r;r5r“r|rr}r4rtršrrr#r•r‘r�rr0)r_r†rŒr÷rlr9r6r9rArÑr7rÐr>r8r:rzÚis_pleskÚ_plesk_get_package_idrÍÚ XML_PLESK_IDrIrÚcopy_package_settings_to_cpanelr@r=r Ú plan_apply) r6rWÚ has_packageržr�r‡rAr1Úpackage_resellerrñr•s rErXrXä sR€Ý˜( 7Ô+Ñ,Ô,Ð,Ý�DÑÔÐÝ�M„M€MØ€Kððbð ð ð ð ð  bð bð bð˜Ð Рݘ¨t¸~ÐNÑNÔNÐNåðñˆØ ˆ>˜"˜hÑ 'Ô 'ñ Ý'ð -ñ -�ؘ(�?‘?ð -Ø $š;˜;Ø×3Ò3°GÑ<Ô<¸QÔ?×LÒLÈ_Õ]`ÐaiÐjmÔanÑ]oÔ]oÑpÔpÐpÐpà×3Ò3°CÑ8Ô8¸Ô;×HÒHÈÕQTÐU]Ð^aÔUbÑQcÔQcÑdÔdÐdøøÝ&­ µIÐ>ð-ð-ð-Ø $š;˜;Ý#)×#7Ò#7¸Ñ#@Ô#@˜DØ ×-Ò-¨o½cÀ(È3Ä-Ñ>PÔ>PÑQÔQÐQÐQå#)×#7Ò#7¸Ñ#<Ô#<˜DØ ×-Ò-¨gµc¸(À3¼-Ñ6HÔ6HÑIÔIÐIØŸš tÑ,Ô,Ð,Ð,Ñ,ð-øøøñ #õÔ#Ñ%Ô%ð =Ý0°·²¸oÈrÑ1RÔ1RÐT\Ð]dÔTeÑfÔf�Ø—’¥ ­c°(©m¬mÑ<Ô<Ð<؈KùØ ñ)ØÐÝ × !Ò ! )Ñ ,Ô ,ˆØ �Š˜˜h wÔ/Ñ0Ô0Ð0Ø ð 9Ø �OŠO˜J¨°Ô(AÑ BÔ BÐ BØ'¨Ô8Ð Ý Ô Ñ !Ô !ð 9Ý,Ð-=¸xÈÔ?PÑQÔQˆHØ �OŠO�L­#¨h©-¬-Ñ 8Ô 8Ð 8Ý#ð %ð %ˆCØ�hˆˆØ˜$’;�;Ý!×/Ò/°Ñ8Ô8�DØ×%Ò% oµc¸(À3¼-Ñ6HÔ6HÑIÔIÐIÐIå!×/Ò/°Ñ4Ô4�DØ×%Ò% g­c°(¸3´-Ñ.@Ô.@ÑAÔAÐAØ—’˜tÑ$Ô$Ð$øÝÔ×$Ò$ RÑ(Ô(Ð(å �VÑÔÐÝ�M„M€MÝ# HÑ-Ô-Ð-à �ÐÐÝ�H˜VÔ$Ñ%Ô%ˆˆå˜FÔ#ˆà �ÐÐÝ2°8¸E´?È%ÐPÑPÔPˆ�‰à,7ÐAˆx˜Ô(Ð(¸T€H݈x˜Ô ¨8Ð4Ñ4Ô4Ð4Ð4Ð4sÁ;B DÄB9GÇGr•cóÀ‡‡—t¦«}| ¦«} ttˆˆfd„|¦«¦«}|dS#t$rYdSwxYw)z7 Find the right package id from plesk DB query có4•—|d‰dhvo |d‰kS)Nrr@ryrC)rhrrr•s €€rEr/z'_plesk_get_package_id..: s"ø€�a˜”d˜x¨Ð0Ð0ÐD°Q°q´T¸W²_€rDrÚN)rÚlist_domain_packages_with_idr6r7Ú StopIteration)r•rrÚpanelrµÚpacks`` rErdrd2 s�øø€õ Ñ Ô €EØ×1Ò1Ñ3Ô3€HðÝ•FØ DÐ DÐ DÐ DÐ DØ ñ ô ñ ô ˆð�AŒwˆøÝ ððð؈tˆtðøøøs¦(AÁ AÁAcóh—t ¦«}td¦«t}|a|S)z¿ Retrives resellers to packages map from panel using /usr/bin/getcontrolpaneluserspackages :return: Dictionary: { 'reseller1' -> ['pack1', 'pack2'], 'reseller2' -> ['pack'] } r²)rýr¡rþ)Úpackages_users_copyÚreseller_packages_maps rEr¢r¢B s6€õ)×-Ò-Ñ/Ô/ÐÝÐ2Ñ3Ô3Ð3Ý*ÐØ(€NØ Ð rDcó„—|d}|d}t¦«}||vr|||vrt|d¬¦«dSdS)z½ Set reseller package limits :param set_data: input data dictionary :return: True - limits was set succesfully False - supplied provider has no supplied package rtr8TrVF)r¢rX)r6rtÚ package_namerrs rEÚreseller_package_setruP s^€ð˜_Ô-€MؘGÔ$€Lå5Ñ7Ô7ÐàÐ-Ð-Ð-°,ÐBWÐXeÔBfÐ2fÐ2f嘨dÐ3Ñ3Ô3Ð3؈tà ˆ5rDcó —|d}tj¦«sdSt›d|›�}tj t¦«}tj |¦«tj ||¦«krtdt›d|›�¦«‚tj |¦«sdSt|dd¬¦«5}|  ¦«}ddd¦«n #1swxYwY|dd…}i}|D]½}|  d ¦«rŠ|  ¦«  d ¦«} | d  d d ¦«  ¦«} | d dkr | d || <| tvr| |¦«|  d¦«rd|vrdSŒ¾dD]2} | |vr,t#j|| ¦«} | p t&| || <Œ3t)||¦«rdSt+|t,¦«} tD](} | | } d | ›d | ›d�}| |¦«Œ)t1d  |¦«|d¦«dS)zA Copy package limits from ve.cfg to cpanel packages data r8Nr\zPackage path escapes rrÕrÖr×Úlve_ú=rršryÚDEFAULTÚ_PACKAGE_EXTENSIONSrM)r•r”rmr„i¤)rzr{ÚCPANEL_PACKAGES_DIRrËr¶Úrealpathr_rÑr¼rÝrÁrerßrárùr9rër¿Úmemory_to_pager=Úis_limits_equalsÚcreate_cpanel_limitsrlr¾r')r6rrÚ package_pathÚ real_baseræÚcpanel_package_dataÚnew_cpanel_package_dataÚold_cpanel_datarçÚ line_partsÚ limit_nameÚmemory_page_valueÚ cpanel_dataÚ limit_valueÚ limit_lines rErfrfe sã€ð�wÔ€GÝ Ô Ñ "Ô "ð؈Ý)Ð5Ð5¨GÐ5Ð5€Lõ”× Ò Õ!4Ñ5Ô5€IÝ „w×Ò˜ Ñ%Ô%­¬¯ª°iÀÑ)IÔ)IÒIÐIÝÐSÕ1DÐSÐSÈÐSÐSÑTÔTÐTÝ Œ7�>Š>˜,Ñ 'Ô 'ðØˆÝ ˆl˜C¨'Ð 2Ñ 2Ô 2ð,°aØŸkšk™mœmÐð,ð,ð,ñ,ô,ð,ð,ð,ð,ð,ð,øøøð,ð,ð,ð,à1°!°!°!Ô4ÐØ€Oð$ð ð ˆØ �?Š?˜6Ñ "Ô "ð 5ØŸš™œ×+Ò+¨CÑ0Ô0ˆJØ# Aœ×.Ò.¨v°rÑ:Ô:×@Ò@ÑBÔBˆJؘ!Œ}  Ò)Ð)Ø.8¸¬m�  Ñ+ØÕ-Ð-Ð-Ø'×.Ò.¨tÑ4Ô4Ð4Ø �?Š?Ð0Ñ 1Ô 1ð °eÀ4Ð6GÐ6GØ ˆFˆFøà-ðWðWˆ Ø ˜Ð (Ð (Ý (Ô 7¸È Ô8SÑ TÔ TÐ Ø*;Ð*V½{È:Ô?VˆO˜JÑ 'øå˜¨Ñ2Ô2ð؈õ' wµ Ñ;Ô;€KÝ&ð3ð3ˆ Ø! *Ô-ˆ Ø8˜JÐ8Ð8¨Ð8Ð8Ð8ˆ Ø×&Ò& zÑ2Ô2Ð2Ð2ݘBŸGšGÐ$;Ñ<Ô<¸lÈEÑRÔRÐRÐRÐRsÃC=Ã=DÄDcóŽ—| ¦«D]/}|dvrŒ ||||krdSŒ#t$rYdSwxYwdS)zC check if new set of limits for package are equals to used )r8rGFT)r´r)Ú old_limitsÚ new_limitsr‡s rEr~r~™ sy€ð�ŠÑ Ô ððˆØ Ð#Ð #Ð #Ø ð Ø˜#Œ *¨S¤/Ò1Ð1Ø�u�uð2øåð ð ð Ø�5�5�5ð øøøà ˆ4s�3³ AÁAc óâ—i}|D�]h}| d¦«|k�rKtD�]B} |dkrQt| d¦«d d¦«¦« ¦«||<nÄ|dvrptt jt| |¦«d d¦«¦«¦«¦« ¦«||<nPt| |¦«d d¦«¦« ¦«||<�Œ!#tttf$r d||<Y�Œ@wxYw�Œj|S) z‰ create limits for cpanel package file use data from ve.cfg: limit = limit if found in ve.cfg or DEFAULT return dict r#r“r|rr})r”rmr•r4ry) r%r9rAr6rßr¿Úpage_to_memoryr@rÑr7rÐ)Ú package_idÚ xml_packagesÚ result_datar�r4s rErr¨ s€€ð€KØð3ñ3ˆØ �?Š?˜4Ñ Ô  JÒ .Ñ .Ý)ð 3ñ 3�ð3Ø ’}�}Ý-0Ø×3Ò3°GÑ<Ô<¸QÔ?×LÒLÈ_Ñ]Ô]ñ.ô.çš%™'œ'ð$ EÑ*Ð*ðÐ"9Ð9Ð9Ý-0Ý$Ô3Ý # B×$;Ò$;¸EÑ$BÔ$BÀ1Ô$E×$RÒ$RÐSZÑ$[Ô$[Ñ \Ô \ñôñ.ô.÷ š%™'œ'ð $ EÑ*Ð*õ .1°×1HÒ1HÈÑ1OÔ1OÐPQÔ1R×1_Ò1_Ð`gÑ1hÔ1hÑ-iÔ-i×-oÒ-oÑ-qÔ-q˜  EÑ*ùøÝ"¥Jµ Ð:ð3ð3ð3Ø)2�K Ñ&Ð&Ñ&ð3øøøùà Ðs­DE Å E*Å)E*c󇇗td¦«t¦«d}‰€ˆfd„}nˆˆfd„}tD]?}||¦«r2d}|j |¦«t t ¦«nŒ@|s†‰€At‰¦«}t|¦«dkrd}n|d}|�t‰|¦«dStr*tddd‰›�g¦«tj d ¦«ntd ‰›�¦«t¦«dS) NTFcób•—| d¦«‰ko| d¦« Sr›rœr s €rEÚis_needed_packagez&plan_delete..is_needed_packageË s.ø€Ø—?’? 4Ñ(Ô(¨GÒ3ÐW¸B¿OºOÈJÑ.is_needed_packageÎ s1ø€Ø—?’? 4Ñ(Ô(¨GÒ3Ðd¸¿ºÈ Ñ8SÔ8SÐWdÒ8dÐ drDrr-r_z no configuration found for plan r®z)warning: no configuration found for plan )r†rŒrlrìrírr>rÇràr:r|r}rr€r~rä)r�rtrr•r�Úresellers_listr•s`` rEr:r:Æ sˆøø€Ý�DÑÔÐÝ�M„M€MØ€GØÐð Xð Xð Xð Xð Xð Xð eð eð eð eð eð eõððˆØ Ð ˜RÑ Ô ð ØˆGØ ŒM× %Ò % bÑ )Ô )Ð )Ý •VÑ Ô Ð Ø ˆEð  ð ðIà Ð Ý6°wÑ?Ô?ˆNÝ�>Ñ"Ô" aÒ'Ð'Ø��ð*¨!Ô,�àÐ#ݘG XÑ.Ô.Ð.Ø�Ý ð IÝ ØØÐH¸wÐHÐHÐIñ ô ð õ ŒH�R‰LŒLˆLˆLå ÐG¸gÐGÐGÑ HÔ HÐ HÝ�O„O€O€O€OrDcó(—t||¬¦«dS)Nrs)r:)r�rts rEÚreseller_plan_deleter™ï s€Ý� }Ð5Ñ5Ô5Ð5Ð5Ð5rDcóô— t| |¦«d d¦«¦«S#ttf$r)|dkr t |nt |dz›d�cYSwxYw)Nrr4r�r˜r÷)rAr6r%rÑr7r=)r�r‡s rEÚ get_xml_limitr›ó sŒ€ðSÝ�2×*Ò*¨3Ñ/Ô/°Ô2×?Ò?ÀÑHÔHÑIÔIÐIøÝ � Ð #ðSðSðSà#&¨%¢< <�{˜3Ôн ÀCÔ8HÈCÑ8OÐ5RÐ5RÐ5RÐRÐRÐRðSøøøs‚:=½7A7Á6A7cóš—d„}|€dStjd|i¦«}||dd¦«}| d¦«}||dz|…S)zÑ Normalize string for JSON output. Example: - Input string: -_&[{}]'"`te\s/t - Output string: -_&[{}]'"`te\\s/t\a :param data_str: String for normalize :return: Normalied string có^—d}t|¦«D]\}}||kr|dz }||kr|cSŒdS)z÷ Get the index of the specified occurrence of character in string :param input_string: String :param char_to_search: Character to search :param ordinal: Required occurence number :return: Char index rryr®)r^)Ú input_stringÚchar_to_searchÚordinalÚcountÚidxÚchs rEÚ_get_char_indexz'_normalize_str.._get_char_index sR€ðˆÝ  Ñ.Ô.ð ð ‰GˆC�Ø�^Ò#Ð#à˜‘ �ؘGÒ#Ð#Ø�J�J�JøàˆrrDNrAr¯éry)rÎr0Úrfind)Údata_strr¤Újson_strÚtrd_idxÚlast_idxs rEr¢r¢û sl€ðððð$ÐØˆtÝŒz˜5 (Ð+Ñ,Ô,€Hðˆo˜h¨¨QÑ/Ô/€Gà�~Š~˜cÑ"Ô"€HØ �G˜a‘K Ð(Ô )Ð)rDcóD‡‡‡—‰�‰n‰rtntŠdˆˆˆfd„ }|S)a¡ Generate inner function with closured fields names, is_reseller flag and printer function :param list fields: List of strings that represent names of fields in final output :param boolean is_reseller: Format output with info about reseller or not :param callable printer: Function to format and print data for every entry :rtype: callable :return: function to format data for every user Nc ó<•‡‡‡—‰ r4t‰¦«tjt¦«Š‰‰d<ˆˆfd„}nˆfd„}tjt¦«Štrt ‰¦«n‰‰d<d„}|‰d¦«‰d<t dkr|‰d ¦«‰d <t D�]^}||¦«�rOt|d ¦«}|d kr|nttd ¦«‰d <ttt|d ¦«t‰d ¦«¬ ¦«dz¦«‰d< tt|  d¦«d  d¦«¦«¦«‰d<n#ttf$rYnwxYw|t|d ¦«¦«‰d <|t|d¦«¦«‰d<t|d¦«‰d<t|d¦«‰d<t|d¦«‰d<�Œ`‰ d¦«€‰d dz‰d<tt!‰d¦«¦«‰d <g}tr)d ˆfd„‰ D¦«¦«}d|›d�g}n‰ ˆfd„‰ D¦«Ž|S)a :param string package_name: Find and format data for this package name :param string reseller_name: reseller name, owner of supplied package :rtype: list :return: List of giver package's statistics data line or empty list r•cóh•—‰| d¦«ko| d¦«‰kSr›rœ)r�rtrts €€rEr•z>_package_formatter..wrapper..is_needed_package= s2ø€Ø# r§¢°tÑ'<Ô'<Ò<ÐmÀÇÂÐQ[ÑA\ÔA\Ð`mÒAmÐmrDcób•—‰| d¦«ko| d¦« Sr›rœ)r�rts €rEr•z>_package_formatter..wrapper..is_needed_packageA s/ø€Ø# r§¢°tÑ'<Ô'<Ò<Ð`ÀRÇ_Â_ÐU_ÑE`ÔE`ÐA`Ð`rDr#cóL—trt|¦«nt|¦«Sror€r�s rEr‚z?_package_formatter..wrapper..convert_mem_limitsH r›rDr”rmr™r•r‘ršr�rr˜rr|rr}r“r’r–r—Nrpc3óv•K—|]3}d|›d‰ | ¦«d¦«›d�V—Œ4dS)r¯r†rœN©rÍrŸr s €rErrz6_package_formatter..wrapper..g sMøèè€ÐTÐTÈÐC ÐCÐC d§h¢h¨q¯wªw©y¬y¸%Ñ&@Ô&@ÐCÐCÐCÐTÐTÐTÐTÐTÐTrDr‰rŠcó`•—g|]*}‰ | ¦«d¦«‘Œ+SrŒr±r s €rErhz7_package_formatter..wrapper..j s/ø€Ð>Ð>Ð>°!�d—h’h˜qŸwšw™yœy¨"Ñ-Ô-Ð>Ð>Ð>rD)r˜r¡r=r|r¢r¸rlr›rAr r@r6r%r7rÑrÍrr_) rtrtr•r‚r�rñr”rçrðr»rWr�s `` @€€€rEr£z#_package_formatter..wrapper/ s,øøøø€ð ð *å $ ]Ñ 3Ô 3Ð 3Ý”9�[Ñ)Ô)ˆDØ,ˆD�Ñ ð nð nð nð nð nð nð nð að að að að aõ”9�[Ñ)Ô)ˆDå59ÐK•^ LÑ1Ô1Ð1¸|ˆˆT‰ ð Vð Vð Vð*Ð)¨$¨u¬+Ñ6Ô6ˆˆV‰ Ý ˜Š?ˆ?Ø-Ð-¨d°6¬lÑ;Ô;ˆD�‰LÝð 9ñ 9ˆBØ Ð  Ñ$Ô$ñ 9Ý% b¨&Ñ1Ô1�Ø(-°ª ¨ ˜u˜u½½[ÈÔ=PÑ9QÔ9Q��V‘ Ý #Õ$<Ý! " eÑ,Ô,µC¸¸V¼ Ñ4EÔ4Eð%Gñ%Gô%GØJMñ%Nñ!ô!��W‘ ðÝ!$¥SØ×/Ò/°Ñ8Ô8¸Ô;×HÒHÈÑYÔYñ&ô&ñ"ô"�D˜‘J�Jøõ#¥JÐ/ðððØ�Dðøøøà1Ð1µ-ÀÀFÑ2KÔ2KÑLÔL��V‘ Ø1Ð1µ-ÀÀEÑ2JÔ2JÑKÔK��V‘ Ý*¨2¨tÑ4Ô4��T‘ Ý -¨b°'Ñ :Ô :��W‘ Ý,¨R°Ñ8Ô8��V‘ ùØ �8Š8�GÑ Ô Ð $à  œK¨3Ñ.ˆD�‰MÝÕ*¨4°¬=Ñ9Ô9Ñ:Ô:ˆˆU‰ àˆÝ ð @Ø—8’8ÐTÐTÐTÐTÈVÐTÑTÔTÑTÔTˆDØ ˜�=�=�=�/ˆCˆCà ˆGÐ>Ð>Ð>Ð>°vÐ>Ñ>Ô>Ð ?Ð ?؈ sÄ;A FÆFÆFro)rYrW)r»rWr�r£s``` rEÚ_package_formatterr³" sOøøø€ð!Ð,ˆgˆg¸{Ð2Yµ)°)ÕPY€Gð<ð<ð<ð<ð<ð<ð<ð<ðz €NrDcóæ—t¦«td¦«t ¦«}td¦«t ¦«}t t t ¬¦«}tt¦«dt ¬¦«}|D]}|||¦«z }Œtdkr#tt¦«dt ¬¦«}|  ¦«D]M\}}tj ¦«r|dkrŒ|D]+}tdkr||||¦«z }Œ|||¦«z }Œ,ŒNtr*td d  |¦«zd z¦«dSdS) Nr±r²©rŽF©rWr�ryTÚadminr§rpr¨)rŒrþrýr¡r•rWÚDEFAULT_PACKAGEr³r½ror…rzr£r|r~r_)rµÚreseller_packagesr‹r©rrrtÚ packages_listÚreseller_packages rEÚget_packages_listr¼p s‰€Ý�M„M€MݘÑ)Ô)Ð)Ý×"Ò"Ñ$Ô$€HÝÐ2Ñ3Ô3Ð3Ý&×+Ò+Ñ-Ô-Ðå � ­oÐ >Ñ >Ô >€FÝ"¥:¡<¤<¸UÍIÐVÑVÔV€IØð%ð%ˆØ�)�)˜GÑ$Ô$Ñ$ˆˆÝ˜ÒÐÝ&¥z¡|¤|ÀÍyÐYÑYÔYˆ à(9×(?Ò(?Ñ(AÔ(Að6ð6Ñ$ˆ �}å Ô Ñ Ô ð  =°GÒ#;Ð#;Ø Ø -ð 6ð 6Ð Ý Ò!Ð!ؘ)˜)Ð$4°mÑDÔDÑD��à˜)˜)Ð$4Ñ5Ô5Ñ5��ð  6õ  ð5Ý ˆk˜CŸHšH VÑ,Ô,Ñ,¨tÑ3Ñ4Ô4Ð4Ð4Ð4ð5ð5rDcóˆ—t¦«td¦«dg}t¦«|z}ttt ¬¦«}t |d¬¦«}t ¦«D]\}}|D]}||||¦«z }ŒŒtr*tdd  |¦«zdz¦«dSdS) Nr²r¸rµTrVr§rpr¨) rŒrþr½r•rWr¸r³rýr…r|r~r_)r�r»r‹r©rtrºr»s rEÚget_resellers_packages_listr¾� sä€Ý�M„M€MÝÐ2Ñ3Ô3Ð3à�,€KÝ ‰\Œ\˜KÑ '€FÝ � ­oÐ >Ñ >Ô >€Få" 6°tÐ<Ñ<Ô<€Iå(6×(<Ò(<Ñ(>Ô(>ðAðAÑ$ˆ �}Ø -ð Að AÐ Ø �i�iÐ 0°-Ñ@Ô@Ñ @ˆFˆFð Aõ ð5Ý ˆk˜CŸHšH VÑ,Ô,Ñ,¨tÑ3Ñ4Ô4Ð4Ð4Ð4ð5ð5rDcóV—t¦«td¦«t ¦«}td¦«t ¦«}dg}t ¦«|z}t t t|¬¦«}t|dt ¬¦«}|D]}|||¦«z }Œt|d¬¦«}|  ¦«D]\}}|D]} ||| |¦«z }ŒŒtr*td d   |¦«zd z¦«dSdS) Nr±r²r¸)rŽr�Fr¶TrVz {"data": [rpr¨) rŒrþrýr¡r½r•rYr¸r³r…r|r~r_) rµr¹r�r»r‹r©rrrtrºr»s rEÚget_all_packages_listrÀ  sP€Ý�M„M€MݘÑ)Ô)Ð)Ý×"Ò"Ñ$Ô$€HÝÐ2Ñ3Ô3Ð3Ý&×+Ò+Ñ-Ô-Ðà�,€KÝ ‰\Œ\˜KÑ '€Få � ­oÈ;Ð WÑ WÔ W€Få" 6°uÅiÐPÑPÔP€IØð%ð%ˆØ�)�)˜GÑ$Ô$Ñ$ˆˆå" 6°tÐ<Ñ<Ô<€Ià(9×(?Ò(?Ñ(AÔ(AðAðAÑ$ˆ �}Ø -ð Að AÐ Ø �i�iÐ 0°-Ñ@Ô@Ñ @ˆFˆFð Aõ ð6Ý ˆl˜SŸXšX fÑ-Ô-Ñ-°Ñ4Ñ5Ô5Ð5Ð5Ð5ð6ð6rDcó—i}|D]}|||<Œ|S)zó Converts package list to internal format :param package_list: Package list. Example: ['BusinessPackage', 'Package2'] :return: Package list as dictionary. Example: {'BusinessPackage': 'BusinessPackage', 'Package2': 'Package2'} rC)Ú package_listÚpackages_users_dictrrs rEÚ_convert_packages_listrÄ s-€ð ÐØð/ð/ˆØ'.ИGÑ$Ð$Ø ÐrDúlist-allcó€—|dvrdS|dvr|dkrdSddlm}m}m}m}m}m}m}  |dkrxt�D |t|d t|d d œia �n-#t$r |ddd œia Y�nwxYw ||¦«\} } n#t$rdx} } YnwxYw|| | d œia d S|d kr||||¦«ia d S|d kr1t€!|¦«} t| ¦«a ta nta d S|dkr"t€| ¦«a tanta d S|dkrt€ |¦«ata d S|dkr-t� t |kr||¦«} | a|a| a nta d S|dkrt"€ |¦«at"a d Sn1#t$$r}t'|¦«Yd}~nd}~wt($rYnwxYwdS)a¤ Parse output from GET_CP_PACKAGE_SCRIPT and get package and lve relations :param option: option for GET_CP_PACKAGE_SCRIPT. Option is one from the following possible values: 'userid', 'package', 'list-packages', 'list-resellers-packages' :type option: string :param lve_package_id: lve_id or package_name :type lve_package_id: string or int :param reseller: :type reseller: string )rÅr+rrr±r²rür¦F)r+rrršr)Úadmin_packagesÚget_reseller_usersÚget_uids_list_by_packageÚlist_allÚ list_usersÚreseller_package_by_uidÚresellers_packagesr+Nrrr•)rrr•Tr±r²rür¦rÅ)Úclcommon.cpapirÇrÈrÉrÊrËrÌrÍÚ cached_usersrýrrÑÚcached_list_packagesrÄÚcached_resellers_packagesÚcached_reseller_usersÚcached_resellerÚcached_defaultrr‚r])ÚoptionÚlve_package_idr•rÇrÈrÉrÊrËrÌrÍrtrrrÂÚreseller_users_dictrvs rErþrþÏ s€ð(ðVðVðVàˆuØ Ð&Ð&Ð&¨>¸RÒ+?Ð+?؈uðððððððððððððððððððQ Ø �XÒ Ð ÝÐ'ðWà&Ý'3°NÔ'CÀIÔ'NÝ(4°^Ô(DÀZÔ(Pð)ð)ð&�N‘Nøõ  ðWðWðWØ&4À"ÐRTÐ6UÐ6UÐ%V�N�N‘NðWøøøð1Ø-DÐ-DÀ^Ñ-TÔ-TÑ*�M 7 7øÝ!ð1ð1ð1à.0Ð0�M G G Gð1øøøð#1¸gÐS`Ð2aÐ2aÐ!b�Ø�tØ �yÒ Ð à,Ð.FÐ.FÀ~ÐW_Ñ.`Ô.`ÐaˆNØ�4Ø �Ò &Ð &õ$Ð+Ø-˜~Ñ/Ô/� å!7¸ Ñ!EÔ!E�Ý'5Ð$Ð$õ"6�Ø�4Ø Ð0Ò 0Ð 0õ)Ð0à!3Ð!3Ñ!5Ô!5�Ý,:Ð)Ð)õ";�Ø�4Ø �|Ò #Ð #õ Ð#Ø)˜z™|œ|� Ý)ˆNØ�4Ø Ð,Ò ,Ð ,õ%Ð,µÀ8Ò0KÐ0KØ&8Ð&8¸Ñ&BÔ&BÐ#ð)<Ð%Ø"*�Ø!4��õ"7�Ø�4Ø �zÒ !Ð !õÐ%Ø!) ¡¤�Ý+ˆNØ�4øøÝ ð'ð'ð'Ý# AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&øøøøÝ ð ð ð Ø ˆð øøøà ˆ5sˆ¦ F ´)AÁF ÁA4Á0F Á3A4Á4F Á8BÂF ÂBÂF ÂB F Â$F Â:5F Ã1&F ÄF Ä91F Å,F Æ F;ÆF+Æ+ F;Æ:F;cóF—t¦«tt¦«S)z2 Retrieves panel users count :return: )rþràrýrCrDrEÚget_panel_users_countrÙHs€õ ÑÔÐÝ �~Ñ Ô ÐrDcóª—td¦«td||¬¦«r/t|D]#}tt|¦«||¬¦«Œ"dSdS)Nrürrr0)rþrýrKr@)r�r•rqs rErgrgRsm€å˜Ñ&Ô&Ð&å˜I w¸ÐBÑBÔBð<Ý! 'Ô*ð <ð <ˆCÝ •c˜#‘h”h °(Ð ;Ñ ;Ô ;Ð ;Ð ;ð<ð<ð <ð rYr5rjr=rlr`rnrërCrDrEÚ get_globalsrìŠs(€õ­lÝ$Ý­[Ý$­SÝ 0ð  2ð 2ð2rDcó*—g}t ¦«}td¦«t ¦«}| ¦«a| ¦«D]&\}}|D]}||kr| |g¦«ŒŒ'|S)Nr²)rýr¡rþr…Úextend)rrr•Ú pkg_users_oldr¹rtrºÚpackage_name_in_keys rErÇrÇœs©€Ø€Hå"×'Ò'Ñ)Ô)€MÝÐ2Ñ3Ô3Ð3Ý&×+Ò+Ñ-Ô-ÐØ"×'Ò'Ñ)Ô)€Nð):×(?Ò(?Ñ(AÔ(Að1ð1Ñ$ˆ �}Ø#0ð 1ð 1Ð ØÐ-Ò-Ð-Ø—’  Ñ0Ô0Ð0øð 1ð €OrDcó~—tjtjdd¬¦«}|r•tj |¦«rxt ||¦«\}}|dkrad|›�}trtdd|g¦«d Sd|›�}tj   |›d �¦«tj |¦«d Sd Sd Sd S) z… Call Endurance's custom script :param args: list of arguments for pass to Endurance's custom script :return: None ÚENDURANCE_CUSTOM_SCRIPTrx)Ú separatorrz0Error while executing Endurance's custom script r-rxzerror: r„N) rzÚget_param_from_fileÚCL_CONFIG_FILErËr¶r¼rr|r}rr†r…r€)ÚargsÚendurance_custom_scriptÚret_codeÚstd_outrŒÚ err_messages rEÚcall_endurance_custom_scriptrû­sõ€õ*Ô=½kÔ>XØ>WØHKðMñMôMÐðð #¥2¤7§>¢>Ð2IÑ#JÔ#Jð #å(Ð)@À$ÑGÔGш�'Ø �qŠ=ˆ=ØTÈ7ÐTÐTˆGÝð #ݘG g¨wÐ%7Ñ8Ô8Ð8Ð8Ð8à1¨Ð1Ð1� Ý” × Ò  KÐ!3Ð!3Ð!3Ñ4Ô4Ð4Ý”˜Ñ"Ô"Ð"Ð"Ð"ð #ð #ð #ð #ð ˆ=rDcó€—tr)tt|tjz¦«¦«St |¦«S)a Convert page value to human-readable value or bytes, depending on BYTES_FLAG; E.g. >>> _page_to_memory_or_bytes(1233254) # BYTES_FLAG=False '100M' >>> _page_to_memory_or_bytes(1233254) # BYTES_FLAG=True 654321 :type value: int :rtype: str | int )r r@ríÚmmaprrlr�s rEÚ_page_to_memory_or_bytesrþÆs5€õð1Ý•5˜¥¤Ñ.Ñ/Ô/Ñ0Ô0Ð0Ý �5‰>Œ>ÐrDcóœ—g}ttj ¦«¦«}t ¦«t ¦«D]m} tj |¦«}||vr| |¦«Œ<#tttf$r| |¦«YŒjwxYw|D]}t|¦«ŒdS)zV Remove from LVE all resellers, which are absent from panel :return: None N) rçrMrtrÊrŒrQrÒr¾rr]rârð)Úreseller_id_list_for_deleteÚcpapi_resellers_listÚlve_reseller_idÚlve_reseller_nameÚreseller_id_for_deletes rEÚremove_absent_resellersr×sñ€ð #%Ðõ ¥¤× 1Ò 1Ñ 3Ô 3Ñ4Ô4ÐÝ�M„M€Må#™:œ:ð@ð@ˆð @Ý #¤× 9Ò 9¸/Ñ JÔ JÐ Ø Ð(<Ð<Ð<à+×2Ò2°?ÑCÔCÐCøøÝ�'¥7Ð+ð @ð @ð @à '× .Ò .¨Ñ ?Ô ?Ð ?Ð ?Ð ?ð @øøøð#>ð1ð1ÐÝÐ/Ñ0Ô0Ð0Ð0ð1ð1sÁ 8BÂ,B5Â4B5cóò—|�t||¦«dS|€t|¦«dS|r~tj|¦«5tj |¦«}| |¬¦«}|�||_| ¦«ddd¦«n #1swxYwY tj |¦«}n#t$rYdSwxYwtj |¦«}d} ||vr$|r"||vr||} tj |||¦«| �ät�ßtj | |¬¦«rt" | ¦«tj||¦«} | ��tj ¦«} |  | d¦«|krt" || ¦«t |¦«} t || ¬¦«dSdSdSdS)uÆUpdate LVD domain config, docroot-to-ID mapping, and kernel LVEs. Called after a control-panel hook detects a domain rename, document-root change, domain deletion, or user rename. Three modes of operation: **Deleted domain** (*deleted_domain* is given): Drops every registration the panel no longer backs — see _prune_domains_absent_from_panel(). Takes precedence over the other two: after a deletion there is no domain left to resolve. **Single-domain** (*domain* is given): 1. Rename domain in ~/.lve/domains.json (if *old_domain* given). Uses privilege drop so files stay user-owned. 2. Ensure the current docroot has a domain_id in the registry. If *old_docroot* is given, removes the old mapping and assigns a new domain_id for the new docroot. 3. Destroy the old domain LVE in the kernel (if it existed). 4. Map the new domain_id to the user's LVP and re-apply limits from domains.json so that per-domain limits keep working. **All domains** (*domain* is ``None``): Iterates every domain in the user's ``domains.json``, detects stale registry entries whose docroot no longer matches (e.g. after a user rename shifted the home directory), and performs the single-domain reassignment for each one. Args: uid: numeric user ID. domain: current (possibly renamed) domain name. When ``None``, all domains from the user's config are checked. old_domain: previous domain name if it was renamed. old_docroot: previous document root path if it changed. deleted_domain: domain the panel has just removed, if any. N©rprarr1)Ú _prune_domains_absent_from_panelÚ_regenerate_all_domainsrTÚ user_contextrür Ú find_domainrprGÚresolve_docrootr;rrÚreassign_docrootrMrOrérÂrrrtrÍrÕr>r@) rqr Ú old_domainÚ old_docrootÚdeleted_domainr(r rÿÚregistryÚ old_domain_idÚ new_domain_idrÙr2s rEÚregenerate_domainsrñsR€ðLÐ!Ý(¨¨nÑ=Ô=Ð=Øˆà €~Ý Ñ$Ô$Ð$؈àðÝ Ô # CÑ (Ô (ð ð ÝÔ(×-Ò-¨cÑ2Ô2ˆFØ×&Ò&¨JÐ&Ñ7Ô7ˆEØÐ Ø#�” Ø— ’ ‘ ” � ð  ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðÝÔ+¨FÑ3Ô3ˆˆøÝ ðððØˆˆðøøøõÔ-¨cÑ2Ô2€HØ€Mà�hÐÐØ ð G˜;¨(Ð2Ð2Ø$ [Ô1ˆMÝ Ô +¨C°¸gÑ FÔ FÐ FàÐ ¥S _Ý Œ8× %Ò % m¸CÐ %Ñ @Ô @ð -Ý × Ò ˜mÑ ,Ô ,Ð ,å&Ô4°S¸'ÑBÔBˆ Ø Ð $Ý œXŸ\š\™^œ^ˆNØ×!Ò! -°Ñ3Ô3°sÒ:Ð:Ý×!Ò! # }Ñ5Ô5Ð5Ý×.Ò.¨sÑ3Ô3ˆJÝ × 'Ò '¨¸ Ð 'Ñ CÔ CÐ CÐ CÐ Cð!Ð  _ _ð %Ð $s$¾ABÂB!Â$B!Â)B>Â> C à C c óN‡ — tj|¦«j}tt |¦«pg¦«Š nH#t t ttf$r(}t  d|||¦«Yd}~dSd}~wwxYw‰ st  d||¦«dSt‰   ¦«¦«}g}tj|¦«pi ¦«D]Ë\}}||vrŒ t �;t j ||¬¦«rt& |¦«tj||¦«nQ#t,t.t f$r7}t d||||t3d¦«¬¦«Yd}~Œ¬d}~wwxYw| ||f¦«ŒÌg} t7j|¦«5t6j |¦«} ˆ fd„| jD¦«}|D]} |   | ¦«Œ|r|  !¦«ddd¦«n #1swxYwYn;#t,t f$r'}t  d |||¦«Yd}~nd}~wwxYwt "d ||||¦«dS) aXDrop every per-domain registration the panel no longer backs. Runs from the ``post_delete_domain`` hook. The domain record is gone by then, so its docroot can no longer be resolved and the single-domain path above has nothing to work from; the panel's current docroot list is what tells which registrations outlived their domain. Without this the entry, its ``domains.json`` record and its kernel LVE stay behind for good, and every later apply re-reports the account (CLOS-7467). Removes only, never assigns. ``lvectl enable-domain-limits`` is the root-only step that mints a registry entry, while reaching this code takes no more than a panel user deleting one of their own domains -- so allocating here would let that deletion turn on per-domain limits the administrator never enabled. An empty panel answer means the panel could not be asked (no passwd entry, or ``userdomains()`` came back empty), not that every domain is gone, so it prunes nothing: the same reading ``_build_domain_map`` applies before it calls an entry orphaned. zjregenerate-domains: cannot list the domains of uid %s after deletion of %r; every registration is kept: %sNz¦regenerate-domains: the panel lists no domain for uid %s, which is an unanswerable query rather than an empty account; every registration is kept after deletion of %rrazdregenerate-domains: uid=%s could not drop the registration of deleted docroot %r (domain LVE %s): %szprune-deleted-domain)Úextracó0•—g|]}|j‰v¯ |j‘ŒSrCr)rfÚdÚdocroot_by_domains €rErhz4_prune_domains_absent_from_panel..„s(ø€ÐYÐYÐY !¸¼ÐGXÐ9XÐ9X�q”vÐ9XÐ9XÐ9XrDzQregenerate-domains: uid=%s could not update domains.json after deletion of %r: %szpregenerate-domains: uid=%s domain %r deleted in the panel -- dropped registration(s) %s and config entry(ies) %s)#r&r¤r¥rÿrrr]rrr9rBrrtrrr…rMrOrérÂrrr+r%rÇr)r¾rTr rür ÚdomainsÚ remove_domainrGr;) rqrrïrJÚpanel_docrootsÚremovedrÿrôÚdroppedr(rprs @rErrAs{ø€ð,Ý”< Ñ$Ô$Ô,ˆÝ ¥¨XÑ!6Ô!6Ð!<¸"Ñ=Ô=ÐÐøÝ •g�~Õ/DÐ EðððÝ � Š ð<Ø=@À.ÐRUñ Wô Wð Wàˆˆˆˆˆøøøøðøøøð ðÝ � Š ð3à47¸ñ Iô Ið Ið ˆåÐ*×1Ò1Ñ3Ô3Ñ4Ô4€NØ€GÝ-Ô=¸cÑBÔBÐHÀb×OÒOÑQÔQð-ð-ш�Ø �nÐ $Ð $Ø ð ݈¥3¤8×#=Ò#=¸iÐPSÐ#=Ñ#TÔ#TˆÝ×!Ò! )Ñ,Ô,Ð,Ý Ô +¨C°Ñ 9Ô 9Ð 9Ð 9øÝ�*¥gÐ.ð ð ð õ �IŠIð?à˜7 I¨sÝ3Ð4JÑKÔKð ñ Mô Mð Mð ˆHˆHˆHˆHøøøøð øøøð �Š˜ Ð+Ñ,Ô,Ð,Ð,ð€Gð DÝ Ô # CÑ (Ô (ð ð ÝÔ(×-Ò-¨cÑ2Ô2ˆFØYÐYÐYÐY v¤~ÐYÑYÔYˆGØð +ð +�Ø×$Ò$ TÑ*Ô*Ð*Ð*Øð Ø— ’ ‘ ” � ð  ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ •gÐ ðDðDðDõ � Š ð)Ø*-¨~¸sñ Dô Dð Dð Dð Dð Dð Dð Døøøøð Døøøõ‡H‚Hð;à �. '¨7ñ4ô4ð4ð4ð4skƒ7;»BÁA;Á;BÃ9AEÅFÅ(-FÆFÆ=I ÇA#IÈ4 I ÉIÉI ÉIÉI É JÉI?É?Jc óš—tj|¦«}|sdS tj |¦«}nD#t t f$r0}tjtjd|›d|›�¦«Yd}~dSd}~wwxYw|j r5tjtjd|›dt|¦«›d�¦«dSt¦«}|j D]p} |  tj|j¦«¦«Œ0#t $r4}tjtjd|j›d|›�¦«Yd}~Œid}~wwxYwt!| ¦«¦«D]a\}}||vrŒ t$�;t$j ||¬ ¦«rt* |¦«tj||¦«Œbd }|D]@} | |vrŒtj|| ¦«}t$�t* ||¦«d }ŒA|r?t$�:t$ |¦«} t$ || ¬ ¦«dSdSdS) a‡Synchronise the domain-ID registry with current docroots. Compares docroots currently reported by the control panel against the docroots stored in the registry. Orphaned entries (docroots no longer valid) are removed and their kernel LVEs destroyed; missing entries (current docroots not yet registered) get a fresh domain ID assigned and mapped to the user's LVP. Nz6regenerate-domains: failed to load LVD config for uid rz+regenerate-domains: the LVD config for uid z could not be read; leaving its z< registration(s) alone rather than treating them as orphanedz7regenerate-domains: cannot resolve docroot for domain 'z': raFTr1)rrrTrür r+r]rrAÚ unreadableràrrÚaddr rprçr…rMrOrérÂrrrûrÕr>r@) rqrr(rJÚcurrent_docrootsr Úold_drrôÚchangedÚdrr2s rEr r •sæ€õÔ-¨cÑ2Ô2€HØ ð؈ðÝÔ$×)Ò)¨#Ñ.Ô.ˆˆøÝ •gÐ ðððÝŒ •fÔ(ð.Ø!$ð.ð.Ø(+ð.ð.ñ /ô /ð /𠈈ˆˆˆøøøøð øøøð Ôð õ Œ •fÔ(ðEÀCðEðEÝ25°h±-´-ðEðEðEñ Fô Fð Fð ˆå‘u”uÐØ”ð?ð?ˆð ?Ø × Ò ¥Ô!:¸5¼:Ñ!FÔ!FÑ GÔ GÐ GÐ GøÝð ?ð ?ð ?Ý ŒM�&Ô,ð>Ø).¬ð>ð>Ø8;ð>ð>ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøøð ?øøøõ " (§.¢.Ñ"2Ô"2Ñ3Ô3ð5ð5ш� Ø Ð%Ð %Ð %Ø Ý ˆ?Ý”×*Ò*¨9¸SÐ*ÑAÔAð å × Ò ˜iÑ (Ô (Ð (ÝÔ'¨¨VÑ4Ô4Ð4Ð4à€GØððˆØ �ˆ>ˆ>Ø Ý"Ô3°C¸Ñ<Ô<ˆ Ý ˆ?Ý × Ò ˜c 9Ñ -Ô -Ð -؈ˆàð@•3�?Ý×*Ò*¨3Ñ/Ô/ˆ Ý ×#Ò# C°JÐ#Ñ?Ô?Ð?Ð?Ð?ð@ð@�?�?s-š:ºA;Á %A6Á6A;Ã,C?Ã? D=Ä *D8Ä8D=có2—t¦«}tj ¦«rt j¦«}tj ¦« ¦«D]¦\}}||vrŒ tj |¦«Œ #t$rz t  |¦«n[#t$rN tj |¦«t  |¦«n#t$rYnwxYwYnwxYwYŒ£wxYwdS)zM Remove from LVE all users, which absent in system :return: None N)rrMr3rrr rOrtr…r&r¤rrr%rÖ)rárrbs rEÚremove_absent_usersr'Ös.€õ #™uœu€NÝ „v×ÒÑ!Ô!ð=Ý'Ô:Ñ<Ô<ˆåœ(Ÿ,š,™.œ.×.Ò.Ñ0Ô0ðð‰ˆ�Ø �^Ð #Ð #Ø ð Ý ŒL˜Ñ Ô Ð Ð øÝð ð ð ð Ý—’ Ñ'Ô'Ð'Ð'øÝð ð ð ðÝ”F×%Ò% fÑ-Ô-Ð-Ý—O’O FÑ+Ô+Ð+Ð+øå!ðððØ�Dðøøøøøð  øøøøøð øøøð ðsZÁ;B DÂB6Â5DÂ6 DÃ9C;Ã:DÃ; D ÄDÄD ÄDÄ DÄ DÄDÄD)Fro)r)NN)rFT)T)NNN)NFNNrN)rZ)rzr@NF)rFN)FN)rÅršN)NNNN(Ú contextlibr¡rˆrÎrrýrËr&rër°rrróÚxml.dom.minidomÚdomÚminidomr<ÚbuiltinsrÚ functoolsrrÚtypingrrrr r r r¿r¿rzr[Úclcommon.constr rÎr rrrrÚclcommon.cpapi.cpapiexceptionsrrÚ clcommon.lockrÚclcommon.utilsrÚ clcontrollibrÚcleventsrrÚ cllimits.librÚ cllvectl.logrrÚclveconfig.ve_configrrrÚclveconfig.ve_lockrr r!r"r#r$r%Úsecureior&r'Úwebsiteisolationr(rTr)r*rÚwebsiteisolation.exceptionsr+ÚGET_CP_PACKAGE_SCRIPTrÞrîr¸r·r²r½rŠrìr9r@rÌrÍÚIS_DEBUGreÚLVErÂrMr5rKrQrWrVrcrirlrur‚r†r„rarrbr9r¸r|r r¤rÅr�rýr>rYr5rjrkr=rlr`rnrmroržr¢r¦r½rÈrÓrèrêrõrûrrr rÚcontextmanagerrr!r,r}rBrKrQrTrWrZrærerpryrAr‚r€rŒr‘r˜r«r·rÊrÐrÖrÙràrârrrrr rrrrrr!r;r#r)rKrSrUrWrYÚtuplerçrPrgrlrqryr•r¤rªr®r¶r¹rÂrËrÚrÿrÞrärÎrÑrðrõrùrrr rrrrr"r&r)r,r/r2r÷rBrTrZr{r_rXrdr¢rurfr~rr:r™r›r¢r³r¼r¾rÀrÑrÐrÏrÒrÓrÔrÄrþrÙrgrßrárærérìrÇrûrþrrrr r'rCrDrEúrAsRððÐÐÐØ € € € Ø € € € Ø € € € Ø € € € Ø € € € Ø € € € Ø € € € Ø € € € ØÐÐÐØ € € € Ø € € € Ø€€€ØÐÐÐÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?à€€€à€€€ØÐÐÐØ € € € Ø"Ð"Ð"Ð"Ð"Ð"ð9ð9ð9ð9ð9ð9ð9ð9ð9ð9ð9ð9ð9ð9àHÐHÐHÐHÐHÐHÐHÐHØ&Ð&Ð&Ð&Ð&Ð&Ø0Ð0Ð0Ð0Ð0Ð0Ø*Ð*Ð*Ð*Ð*Ð*ØPÐPÐPÐPÐPÐPÐPÐPØ%Ð%Ð%Ð%Ð%Ð%ØGÐGÐGÐGÐGÐGÐGÐGØOÐOÐOÐOÐOÐOÐOÐOÐOÐOØEÐEÐEÐEÐEÐEÐEÐEØDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø0Ð0Ð0Ð0Ð0Ð0Ø4Ð4Ð4Ð4Ð4Ð4Ø:Ð:Ð:Ð:Ð:Ð:Ø0Ð0Ð0Ð0Ð0Ð0ð@Ðà €Ø€ Ø€à €à €Ø:Ðà€ Ø€ ð ИkÑ*Ô*€à ˆ3ˆrŒz�~Š~˜m¨QÑ/Ô/Ñ 0Ô 0€à€ à!Ð! '¤+Ñ.Ô.ðØ €EØ €C€Cà ˆE˜Ð !Ñ !Ô !€EØ ˆ#�ˆ-‰-Œ-€Cððððð�Yñôðð ¨ð ð ð ð ðððð!Uð!Uð!UðHððð6*ð*ð*ð Hð Hð Hð %ð%ð%ðKðKðKð =ððððð$3ð3ð3ð3ð*ððð Ø Ø Ø Ø Ø Ø Ø ð ð € ð€ð Ø Ø Ø Ø Ø Ø Ø ð ð € ðOÐNÐNÐà€ Ø €Ø € Ø€ ð€ Ø € ð €ð €Ø€ Ø € Ø €Ø €Ø€ Ø € Ø €ØÐØ € Ø€ðððð ððð %ð%ð%ðððð,+ð+ð+ð+ð, ð ð ð1ð1ð1ðD&Ð%Ñ'Ô'Ð9¨<¨<©>¬>€ ððððð,ððð$ððð*ððððððð* 0ð 0ð 0ð Ôð"ð"ñÔð"ð(  >ð ð ð ð ð&ððððððð& ð ð ð[ð[ð[ððððð2ð2ð2ð2ð2ð2ð ð ð ð& ð&°Dð&ð&ð&ð&ðRkðkðkð"ið"ið"iðJ3  d¨3°¨8¤nð3 ð3 ð3 ð3 ðl ð ð ð &ð &ð &ð &ð %ð%ð%ð Lð Lð Lð LðEAðEAðEAðEAðP Ið Ið Ið!ð!ð!ðH ?ð ?ð ?ð 0ð 0ð 0ð 0ð 4ð 4ð 4ð 4ðððð4 fð fð fð!1ð!1ð!1ðJ"pð"pð"pð"pðJ!ð!ð!ðNÐØDÐØZÐð>nð>nð>nð>nðB6ð6ð6ð88 Sð8¨Tð8ð8ð8ð8ð$ / ð /ð /ð /ð /ðIðIðIðIðI�yñIôIðIð  Sð ¨Tð ð ð ð ð6XYØðP-ðP-ðP-ðP-ðfððð ð ð ððððððð%ð%˜5ð%°ð%¸Sð%È#ð%ð%ð%ð%ð6ððð,ððð:Ø Ø Ø Ø Ø Ø ððÐð#ið#ið#ið#iðLPTØ#ð%ð%ð%ð%ðP%,¸EðRðRðRðRðn5ð5ð5ð5ð6ðððððð$5ð5ð5ð(ððð".ð.ð.ð.ðbJ ðJ ðJ ðZ  Tð °3ð ¸4ð ð ð ð ðoðoðoðd$ e¨D°$¨JÔ&7ð$ð$ð$ð$ð>ð>ð>ð>ð>ð,nðnðnðb?8ð?8ð?8ðD*.ð*.ð*.ðZGðGðGð.JðJðJð.ððð*ðððD Gð Gð GðFðFðFð,ððð ð ð ð+ð+ð+ð(2ð2ð2ð ðððððð* ð ð ð +&ð+&ð+&ð+&ð\ðððFððððD5ð5ð5ð5ð.-Ðð ? 3ð ?¨4ð ?ð ?ð ?ð ?ðK5ðK5ðK5ðK5ð\  Cð °#ð ¸(À3¼-ð ð ð ð ð !ð !ð !ðððð*1Sð1Sð1Sðh ð ð ðððð<&ð&ð&ð&ðR6ð6ð6ðSðSðSð$*ð$*ð$*ðNJðJðJðJð\5ð5ð5ð:5ð5ð5ð&6ð6ð6ð4!ÐØ ÐØ € Ø ÑØ �Ø �ð ð ñ ðvðvðvñvðrðñð<ð<ð<ñ<ð ð ñ ððñð(ðñðSðSñSð2ð2ñ2ð$ ð ñ ð"#ð#ñ#ð2ðñð"1ð1ñ1ð4GKØ&*ðMDðMDðMDñMDð`Q4ðQ4ñQ4ðh>@ð>@ñ>@ðBðñððrD