g2 ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mcmZddlmZddlmZddlmZddlmZmZmZmZmZmZddlZddlZddlZddl Z ddl!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'ddl(m)Z)dd l*m+Z+dd l,m-Z-dd l.m/Z/m0Z0dd l1m2Z2dd l3m4Z4ddl5m6Z6m7Z7m8Z8ddl9m:Z:m;Z;ddl mZ>m?Z?m@Z@ddlAmBZBmCZCdZDdZEdZFdZGdZHdZIdZJdZKdZLeMejNOddZPdZQe&e"jRsdZSdZTne?ePZSe=eSZTGdd eZUd!eUfd"ZVd#ZWd$ZXd%ZYd&e)fd'ZZdd(Z[d)Z\d*d+d*d,dd-dd.d/Z]d-Z^d0d+ddddddd/Z_gd1Z`d2aadabdacd3add3aeiafd3agd3ahd3aid3ajd3akd3ald3amd4and3aod3apd3aqd5Zrd6Zsd7Ztdd8Zud9Zvd:Zwevp ewZxdd;Zyd<Zzd=Z{d>Z|dd?Z}d@Z~ejdAZdBeUfdCZdDZddEZdFZdGZddHZdIZdJZdKZdLeMdMefdNZdOZdPZdQeeeMffdRZdSZddUZdVZddWZddXZdYZdZZd[Zdd\Zdd]Zd^Zd_Zd`ZddaZdbZiadcZddZddeZdfZddgZdhZdiZdjZdkZddmednedoeMd!efdpZdqZdrZdduZefdvZddwZdxZdyZdzZd{Zdd|Zd}Zd~Zd!eeeffdZddZdZdZdZdZdZdZdZdZdZdZddZdZddZddZddZdeded!eeMfdZdZdZdZdZdZddZdZdZdZddZdZdZdZdadadadadadZddZdZddZdZdZdZdZdZdZdZdZdZdZdS)N)range)partial)PAGESIZE)DictListOptionalTextTuple TypedDict)Feature)adminsget_main_username_by_uidis_panel_feature_supportedreseller_users) EncodingError) acquire_lock)detect_panelclass)reseller_limits_disabled_postreseller_limits_enabled_post) exec_utility)get_subprocess_logger)BadVeConfigExceptionget_xml_configsave_xml)LockFailedExceptionsetup_global_lock)LVP_XML_TAG_NAMELveNameMapPyLve PyLveError)create_dir_securewrite_file_via_tempfilez%/usr/bin/getcontrolpaneluserspackagesz /proc/cpuinfoi' VE_DEFAULTFz /bin/umountz"/etc/container/exclude_mounts.confmultisingle PYLVE_DEBUGplesk_id)debug)pyc\eZdZUeezed<eed<eed<eed<eed<eed<eed<dS) LiblveSettingsls_cpuls_cpusls_io ls_enters ls_memory_phyls_nprocls_iopsN)__name__ __module__ __qualname__intstr__annotations__py/lvectllib.pyr,r,IsY #I LLL JJJNNNMMM LLLLLr;r,returnc Ddddddddd}|||S)Nr)r-r.r/r0r1r2r3)update)kwargsdefaultss r<create_liblve_settingsrBSs<  H OOF Or;cttrtjSgS)z-Helper function for easy mocking in unittests)lvereseller_limit_supportedproc lvp_id_listr:r;r<lvp_listrHas/ ##%%&x##%%% Ir;cnt}||S)zf Get list of resellers with activated reseller limits :return: list of pairs (name, uid) )r link_xml_nodeload_from_node)name_maps r<get_active_resellersrMhs1 yyH   " " $ $$r;c6|dtDvS)z] Check whether giver reseller has activated reseller limits or not :return: bool c3 K|] \}}|V dSNr:).0nameuids r< z,is_active_reseller_limits..xs&JJidCTJJJJJJr;)rM reseller_names r<is_active_reseller_limitsrWss% JJ3G3I3IJJJ JJr;ectjs|tr tddt |gnt |t jddS)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%ERRORN) cldetectlib is_cpanelJSON json_formatr8printsysexitrXs r<raise_cpanel_encoding_errorrd|sg  " " Gc!ff% ' ' ' ' aHQKKKKKr;ch t|dS#t$rtddYdSwxYw)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 r[zcan`t get lockN)rrcheck_result_and_exit)writes r<get_global_lockrhsP3%     333a!12222223s 11c|dtj fvrJtrttdd|gnt d|t j|dSdS)NrrZzlvectl: zlvectl: Error: )errnoENOSYSr^r_ MULTI_FORMATr`rarb)resultmessages r<rfrfst a%,'''  /  w0D70D0D&E F F F F -G-- . . .  ('r;r[i)cpuncpuioepmempmemnprociopsd)rsrrrtrvrwrxryrufalsec |adSrP)r^) json_flags r<set_jsonrs DDDr;c |adSrP) BYTES_FLAG) bytes_flags r< set_bytesrs JJJr;ctrtdkrd}ntdkrd}ntdkrd}nd}gdgdgdgd d |}tr1|d d z}|d|d gz||dzS|S)Nnoiops_8864)IDSPEEDPMEMVMEMEPNPROCIO)rrrrrrrIOPS)rrrrr)rrrrrr[CPU)NOIOPS LVE_VERSIONr^index)versionfields speed_idxs r< get_fieldsrs +""      BBB B B B ; ; ; , , ,   F  CLL))A- z z"eW,vijj/AAB Mr;c|3tj}|dtd|dan|at}|stdtadS)Nrzget_lve_version failedzinit_lve() failed.)clcommonget_lve_version RuntimeErrorrpylve initializeliblve_settings lve_settings)lve_ver lve_statuss r<initrs}*,, 1: 788 8aj  !!##J 1/000((**LLLr;ctjd}|dS tj|S#t t f$r<}tdt|tj dYd}~dSd}~wwxYw)z-Get cpu information from environment veriableCPU_DATANz.Invalid environment variable 'CPU_DATA' formatr[) osenvirongetjsonloads TypeError ValueErrorr`r8rarb)packed_cpu_datarXs r<_get_cpu_data_from_envrsjnnZ00Otz/*** z " @#a&&III  s9B 1BBci}i}d} ttdd5}|D]}|s||d|<|dz}i}&t|ddkr\|dd||dd<d ||dd< d d d n #1swxYwYn<#t $r/t d td tjdYnwxYw||d dgS)zF Parse /proc/cpuinfo return [NumProc, frequency in MHZ] rrutf-8encodingrFr[:r|Nzlvectl: Error: Can`t open .proc0zcpu MHz) openCPUINFOstriplensplitIOErrorr`rarb)cpuinfoprocinfonprocsflines r< get_cpu_datar)sGH F '3 1 1 1 BQ B Bzz|| B/7GO6OO,#aZF!HH4::c??++q00?Czz#q?Q?W?W?Y?YC!3!9!9!;!;<\d+(?:\.\d+)?)(?Pmhz|ghz)+$NsuffixfreqGHZi) r8rr7rrcompile IGNORECASErgroupupperrr)rrrscpu_freqpatternrrrs r<convert_from_speed_hzrvs t99DH x{  DXa[!!HjH"-XXG MM$  E X&&U[[(()) <<>>U " "$;D (T/ ! !d?D !88uTK/(:;;<< < 4r;c>t|pt|S)z} Try converting cpu limit value from either SPEED limit format (percentage of CORE or mhz/ghz) to kernel format. )rr)rs r<convert_from_speedrs$ #4(( '  & &r;czt||}||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)rrr)rrfrom_cpufrom_speed_percent from_speed_hzs r<convert_to_kernel_formatrsV$D%00H3D99%!!)$//M  4r;c pt}t|d}t|}d|vrOdtttt|d|zzStttt||zS)zm convert speed to old cpu format args: cpu limit in speed value return: old cpu limit format r*)rr7r8rlstrip)speedrrxs r<speed_to_old_cpurs H   E JJE e||SU3u||C'8'8#9#9U#BCCDDEEEE s5Uu,--.. / //r;c#Ktt} t||n2#t$r%t jt jd|dwxYw |Vt|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)rrget_available_lve_id lve_setupr!syslog LOG_ALERT lve_destroy)settingslve_ids r< temporary_lvers    ' ' ) )F ))))  f&)Vv)V)V)V W W W  "  &!!!!!&!!!!sA/BB%%CrcRt}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) r-r.rr/r0r2r3g?r1) rrrr-r/r0r2r3r7mathceilrr1)rss r<make_liblve_settingsrs A'(:(9BUVVVAHwAG;'AK*%AJ#AI$)B/)B$BX$MNNOOAO Hr;ct|d}|s.|d}tj|j}t |S)Niduser)r8 getAttributepwdgetpwnampw_uidr7)ve_lve_elementuser_uid user_names r<get_ve_lve_user_uidr sV>..t4455H 2"//77 < **1 x==r;cdt|di}|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 statusrr[msgN)r8rlr?r`rdumps) error_typer extensionsrms r<r_r_slDG %F\!!DG u  j!!! $*V  r;c tt|dd||<dS#tt t f$rp||||<||}|dt|| |j |YdS#t$rYYdSwxYwwxYw)Nrlimit) r7 ve_defaultgetElementsByTagNamerr IndexErrorr createElement setAttributer8 appendChild Exception)xml ve_defaultsve_cfgvaldefaultnodes r<check_def_valuer s z>>sCCAFSST[\\]] C  I ."3< C##C(( '#gcl"3"3444  COD ! ! ! ! ! !    DDD  s+AAA C(B;; C C C  Cc*fd|jDS)Nc^g|])}t|tj|jk'|*Sr:) isinstancerElementtagName)rQ_tags r< z"xml_filter_tag.. s7 Z Z Z!*Q *D*D ZVYIYIYAIYIYIYr;) childNodes)rr's `r<xml_filter_tagr*s Z Z Z Zt Z Z ZZr;ct||D]9}|||s||||kr6|cSdSrP)r* hasAttributer)rr'attrattr_val child_nodes r<xml_filter_firstr0 sn$T3//  J$;$;D$A$A    J$;$;D$A$AX$M$M  r;cpt|||}|t||S)N)rr'r-)r0rr)rr'r-filtered_child_nodes r<get_child_tag_atrrr3s;*#DIII"ll  + +D 1 11r;cxt||d}||t|dS)z Find in children nodes node with tag and setup attribute insted el.getElementsByTagName not search recursiveli in tree rN)r*rr8)rr'r-rfirst_child_nodes r<set_child_tag_atrrr6s; &dC003!!$C11111r;c t\aadS#t$rg}tr%t t dt|gntt|tj dYd}~dSd}~wwxYw)zLoad config from ve.cfgrZr[N) rr ve_lveconfigrr^r_rlr8r`rarbrcs r<_load_config_wrapperr9%s -//     wA&7 8 8 8 8 #a&&MMM  s BABBlvp_id lvp_defaultscda |s"ttddatS|r!t datStttdt|}|r| ddant tatS#t$r@tr'tdddgt!jdnt%d YnwxYwtS) zLoad 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 truerArrr%WARNINGzdefault section error in ve.cfgr[z(warning: default section error in ve.cfg)ubcr*r8r LVE_DEFAULTrr LVP_DEFAULTr0rr8r cloneNoderr^r_rarbr`)r:r;defaults_root_nodes r<_load_default_limitsrD4s  C> ' jAA!DJ   --j99J -l>>  > )-N!O P P P HQKKKK < = = = > s#B8"B8 A,B88ADDc |tdttttt t fDS)Nc3"K|] }|dkV dS)r|Nr:)rQxs r<rTz._all_config_elements_loaded..[s&jj1qBwjjjjjjr;)allve_lveve_lvp ve_package ve_binaryve_enter_by_nameve_cfg_versionr:r;r<_all_config_elements_loadedrOZs. jjYHXZh ijjj j jjr;ctdatdattat jj ttd}t|dkr |da n9t da tttdatd}t|dkrt!|djjndadS) z$Load all config elements from ve.cfgrDpackagez enter-by-namerbinaryrr[N)r8rrIrKrrJrDmaprLrJrrMrrrrLr7 firstChild nodeValuerN)enter_by_name_elemscfg_version_elemss r<_load_config_elementsrX]s . .u 5 5F229==J  . ./? @ @FG""<000&;;OLL !##.q1!//@@  !1222 55h??I%99)DDGJK\G]G]`aGaGaS*1-8BCCCghNNNr;default_limitsc0iattttt|}|d tddd}t|tdtd<n#tttf$rt|dtdtd<t d}| dt|d t|n#t$rYnwxYwYnwxYw t!tddd 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|dt'dS)z~Create ve_defaults dict with default values for all limits :param dict default_limits: default limits for lve or lvp )rrrrrs)rrrrrrother maxentryprocsrurtrv)rrrwrxryN)rrr rrrrrrrrrrr8rrr7rMEM_DEFAULT_CL5_check_defaults_for_nones)rY check_def_valrrrrus r<_load_ve_defaultsrasK  MMf //66q9FFwOO5e;vCVWWW E  I .5nU6KS^_eSfggg E""5)) #nU&;"<"<===   " "3 ' ' ' '    D    ? ? H H K X XYh i ijj D  I .*40 D  ! !' * * ^D-A)B)BCCC   " "2 & & & &    D  MdQ %      %%)ABBBBMfMgMfsoABBED0/E0 D=:E<D==EEAFA*H);HH) H# H)"H##H)(H)ctD]^\}}|d|d}trtdd|gn"tj|dt jd_dS)z*Check that all default values are not NoneNzERROR: Incorrect z default valuer%rZ r[)ritemsr^r_rastderrrgrb)keyvalueerr_msgs r<r_r_s"''))   U   9c999  - '7!3 4 4 4 4 J  ^^^ , , ,    r;Tctt||}|ststt |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)r9rDrOrXra)r:r;load_config_elementsrYs r< get_XML_cfgrksW )&,??N #>#@#@ n%%%%%r;c tt||d}|||<|S#tttf$rt||cYSwxYw)Nrr'r-)r7r3rrr)relr setup_datargs r< check_valuerpsm%&rsAAABB 3  I .%%%;s#$$$$$%s%(,AActj}|||}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 rjN)lveapirrJget_idrk)resellerxml_config_load_elementsrL reseller_ids r<_load_resellers_xml_datarxsN~H //(++K 2JKKKKKKr;c tjtaKt}|vr|vrfd}nt jr| t j|}d|jd}t|d5}| }dddn #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| ttt,dkrtd| ttn dtd< t!t%| dd} | td<n#t&t(t*f$rYnwxYwtd| tttd| tttd| ttndSdS)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. Nch|dko|dkSNrrur)rnplan_idrus r<is_needed_planz*prepare_setup_data..is_needed_plans1t,,7cBOOJ.is_needed_plans/t,,7[PZ@[@[<[[r;rsrrrrmrrtr=rvrr[r\rurxrwry)copyrroget_reseller_packages_mapr\is_dargetpwuidpw_namerreadrrrrKrpr7rr3rrrr?) r}rur res_pkg_dictr~user_pwdfilenamertextrnrrrrus `` r<prepare_setup_datars.;''J022   H $<$<LYaLbAbAb d d d d d d d "" v'9"|F33H`HDT```Hh999(Q vvxx((((((((((((((( DDD $4//M(tFttt \ \ \ \ \ A AB~b!! A#FB ZHH67I"RW^e7f7f7fnstttuuC(+Ju%%"J :DD"k:>>>6MMr; CCCC()Ju%/oVVVWWB')Jt$$"J :DGRjAAAFB Z@@@FB Z@@@qH A AsZ0B7 B+ B7+B//B72B/3B77 CC(8E!!E;:E; )G77HHc 6 tjtd|gtjtj5}||jdkcdddS#1swxYwYdS#t $r tddtd|dYdSwxYw)Nz-l)stdoutrerzfailed to run "z -l ") subprocessPopenUMOUNTPIPE communicate returncodeOSErrorrf)pathrFs r< umount_dirr8s I   T4 ??    (      ?a'  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( IIIb"GF"G"G"G"G"GHHHHHHIs43A.A! A.!A%%A.(A%)A..&BBcRtjtsdSg} t tdd5}|D]?}|}|r'|tj|@ dddn #1swxYwYn(#t$rtddtYnwxYw|sdStj tj  t ddd5}d| D}dddn #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 Nrrrrzfailed to read z /proc/mountscBg|]}|dS)r[)r)rQms r<r(z"prepare_mounts..Zs$:::qaggiil:::r;zfailed to parse /proc/mounts F)rrisfileEXCLUDE_MOUNTS_CONFrrappendrrrrfunshare CLONE_NEWNS readlinesrrsearchr) reg_exp_listconfrrrmountsATTEMPTSr&errormountreg_exprs r<prepare_mountsrFs 7>>- . .LK %sW = = = = = =''))= '' 7(;(;<<< = = = = = = = = = = = = = = = = KKKb"I4G"I"IJJJJJK  OG'(((B .# 8 8 8 ;A::AKKMM:::F ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;  BBBb"@AAAAABH 8__    E'  NN5))&u--6EE  EE   slBAB BBBBB"CC(D1:D% D1%D))D1,D)-D11!EEcd} tj|ddn #t$rtd|YnwxYwt t ddS) 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 settingsrhN)rcallrr`rr lve_start) MOUNT_CMDs r<rrjs?I5 +FFFFF 555 ()444445 OO=O>>>>>s 99cHt|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}rh ignore_errorN)r lve_create)rrs r<rrws> V^^^^".00000r;cHt|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 rrN)rlve_lvp_create)r:rs r< lvp_creaters> !bV!b!b!b&244444r;ctd}g}tD]M}|d|t|d|d||N|S)N lvectllibz*destroy_lvp_all: destroying LVP with id %s"lvectl: Can`t destroy lvp with id rr)rrHr)rlve_lvp_destroyr)loggerdestroyed_listr:s r<destroy_lvp_allrs "; / /FN**&& A6JJJ f&h6&h&h&h  j j jf%%%% r;ctd}|dkrtdS|d|t|d|ddS)NrrHz&lvp_destroy: destroying LVP with id %srrr)rrr)rr)r:rs r< lvp_destroyrsz "; / /F  LL96BBB &"dv"d"d"dfffffr;ctd}d|d}d|d}d}|dkrtrtt }t t tjdkrVtjD]6}| d |t || d }7nd }ntj |s=tj rTtj |5| d |t || d }n!tj |sd }|r!trtt d gdSdStrtt"d|gdSt%d|dS)NrzCan't remove lve z from kernel - error code -3zCan`t destroy lve with id rFrHrz*lve_destroy all: destroying LVE with id %srTz&lve_destroy: destroying LVE with id %sOKWARNz warning: )rrDrEboolrrlistrF lve_id_listr)rcheck_inside_listresellers_supporteddetect_inside_lvpr^r_ SINGLE_FORMATrlr`)rrcant_remove_msgcant_destroy_msg destroyedid_s r<rrs "; / /FO6OOOOQFQQQI   ' ' ) ) 0_..//I tCH((**++ , ,q 0 0x++-- ! ! I3OOO-=>>>  ! II 8 % %f - - --// 47H4N4Nv4V4V4b LLA6 J J J OOF, $ lQ;;)) 6f^d6f6f*hhhh'' 6nQW6n6n6n(pppp1%%l3I61J 6I;;J  JJcd}d}t}tdt}|at|trL ||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-usersrurQ)packages_usersGetControlPanelUsersr#dictKeyError)rrQruold_packages_users temp_packages r<"get_package_and_reseller_by_lve_idrsGH'&&&"L'N,%% #F+J7H    HHH  "6*95G    GGG  H s#A AA A33 BBz+/var/run/cloudlinux/effective-normal-limitsz;/opt/cloudlinux/flags/enabled-flags.d/burstable-limits.flagcttjtsdS tjt }tj|s2tj|}t|ddd|n(#t$r}td|d|d}~wwxYwtt d}|5|ri}n tj t rDtt dd 5}tj|}dddn #1swxYwYni}nZ#tj$r }td t d|d}~wt$r }td t d|d}~wwxYw|t" t%tj|t dn1#t$r$}td t d|Yd}~nd}~wwxYwddddS#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 Nirz#Error: failed to create the folder z: z.lockrutf8rz=Error: failed to parse the effective normal limit cache file z>4 5 5(<== w}}]++ G'//-88K mUAq+ F F F  HMHHQHHIII (+?(F(F(FGG nn  !   7>>"677*2C&III?X+/9X+>+>(???????????????(*$'   qVjqqnoqqrrr   pUippmnppqqq   7888 n #DJ/?$@$@BVX] ^ ^ ^ ^ n n n lQellijll m m m m m m m m n)nnnnnnnnnnnnnnnnnnsA5B C(B>>CH-&;E!E6 EE E E EH-F( E;; F(F##F((H-(G/.H-/ H9HH-HH--H14H1c>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)rorr8rs r<cache_effective_limitsr^s0,6CKK(((r;cHt}dkrtdt|c}atdkrt|d}||}n1|rtnt } t tfd| 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|ttt&dkrtd|ttn dtd< t)t|dd td<n#t t"t$f$rYnwxYwtd|tttd|tttd|ttn't||t&dkr dtd<|s"t+t-|dSdS)a  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 ruseridr|r:Nc,t|kS)Nrr )rrs r<zlve_apply..s 34 H H HF Rr;rQrurursrrrrmrrtr=rvr[r\rurxrwry)rurr})rrrrkrJrInextfilter NameErrorrrrprrorr3rrrr?r7rr) rr}rmruout_noder:rnew_packages_usersrn node_listrs ` r< lve_applyr{s$( {{Xv...-;=O*N ||6"""" B $0FF&  RRRRT] ^ ^    {{ (0;GG8$   GGG  )&1*=HH8$   HHH  ~7X6666FB Z@@  89KBTY`g9h9h9hpu v v vJu  J 2    D  e  $ +E 2Ju D"k:666 &== r; ; ; ; ; !Ju  "#5bgO#\#\#\]]Jt  J 2    D  GRj999FB Z888FB Z8888 7XfEEEE '>> !Ju  )v&&&&(((((())sHBB('B(,B;;CC)D//E E ='G%%G?>G?cht|t|dz g}t|dS)zt Print data with the last column 30 symbols wide. Useful for printing data that contains package names. r[ wide_indicesN_format_fieldsrr`rformatted_strings r<_pprintrs9 &fCKK!O;LMMM r;ct|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. rr[r Nr r s r< _pprint_frsO &&kkAos6{{Q7 r;cHt|dg}t|dS)zb Print data with the first column 30 symbols wide. Useful for printing packages data. rr N)r r`r s r< _pprint_prs. &fA3??? r;cjt|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. rr[r Nr r s r< _pprint_rrs; &fAs6{{Q;OPPP r;rr widthcg}t|D]J\}}t|}||vr||d|3||dKd|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|) enumerater8rjoin)rr rformatted_fieldsrfield field_strs r<r r s!&))77 uJJ L  # #y$;5$;$;$; < < < <  # #y$5$5 6 6 6 6 77# $ $$r;ct|}t|to|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|ir)r8r# startswithrr7)rg was_changeds r<_pmem_vmem_to_bytes_valuer"s JJEUC((BU-=-=c-B-BK MM#r " "E E   & 1KKKKEE Lr;cd}d}t|tr!|dr |dd}d} t|}n#t$rYdSwxYw|rd}|dzdz}|d kr||d }n ||dzd }|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|Frr[NTr{rqrMK)r#r8r r7r)rgrmr!vs r<_mb_memr'-sFK%%"2"23"7"7abb   JJ rr ETME qyy$E$$$$AE$$$ MsA AA0rc. t ddz d< fd}|ddkrt|dnd}d}|t|dt|t|dt||dt||dt|d t|d t|d t|d |d g}t }|||z }t r)d fd|D} d| dg}n||| fd|D|S)z^ Generate header and default package data either as print to stdout or as json string rrrzc0|dS)Nr|r)rfrAs r<get_dataz_formatter..get_dataPs||C$$$r;r|cLtrt|nt|SrPrr"r'rgs r<convert_mem_limitsz&_formatter..convert_mem_limitsUs!3=Q(///75>>Qr;rsrwrvrurxrtry) rrrNCPUrrrrrrPACKAGEN,c3RK|]!}d|d|ddV"dS)r":"r|Nr+rQr fields_maps r<rTz_formatter..dsEKKq:A::*..B"7"7:::KKKKKKr;{}c<g|]}|dSr|r+r6s r<r(z_formatter..hs'888A*..B''888r;)rrrr8rr^r) printer default_iddefault_package more_fieldsr,_cpur0resrrrAr7s @@r< _formatterrBHs!!Huo,HUO%%%%%1920E0E HHUOO , , ,2DRRR3xx#7#74yy#hhv&6&6"7"7&&xx'7'788993GYGYZbZbchZiZiGjGjCkCk((4..!!C0A0A,B,B#hhW[nnJ]J]HHV$$%%/ J C \\F+ :xxKKKKFKKKKKD}}}o888888899 Jr;cfd}|S)aA 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 :rtype: callable :return: function to format data for every user cdt|d}t|d}|dkrd}tdkrt|dn5|t|dnt d t||t jt t|||d fd }d }t|d<t|dd<t|dd<t||dd<t||dd<t|dd<t|dd<t|dd<t|dd<trt|d<n|d<|trdndd<n|d<ddvr?dttd ddzzd<ntddzd<dd<ttdd<g}tr)dfdD}d|dg}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|rQruNr[rF)rvrrT)r}rurmct|tt|krdtt|znt|S)Nr)r8ro)rfrs r< check_changedz7_user_formatter..wrapper..check_changedsP14T#Y3zRUCWCW1W1W3Z_----]`aefiaj]k]k kr;cLtrt|nt|SrPr.r/s r<r0z<_user_formatter..wrapper..convert_mem_limits!7AU,U333wu~~ Ur;rrrrsrwrvvmemrurtrxryN/Arrzrr3c3ZK|]%}d|d|dV&dS)rr5NlowerrQrrs r<rTz3_user_formatter..wrapper..sCIIQ888d17799o888IIIIIIr;r8r9cDg|]}|Sr:rLrNs r<r(z4_user_formatter..wrapper..s%666!d17799o666r;)rrNrrxrkrrorr8r^_normalize_strr7rrr) rrQrurFr0rArrrr<s @r<wrapperz _user_formatter..wrapperus5  &y1!$' 3 r>>H Q   w 6 6 6 6 6#)ERRRRR 7777 w : : : :y$$$(4HHHH l l l l l V V VYYT --..//U ==0011V --mmF.C.CDDEEV --mmE.B.BCCDDV t,,--T t,,--T MM'2233W ==0011V  &,W55DOO%DO  (,4uu"D  'D  $u+  #c$u+*<*.s%III#,t,,3IIIr;c$i|] \}}|v || Sr:r:)rQrfrguids_da_adminss r< z(_filtering_da_admins..s)]]]*#u3nC\C\3C\C\C\r;)r\ getCPNamer rd)ve_dictrms @r<_filtering_da_adminsrq sV-//IIIII]]]] ]]] Nr;c ttt}|rHtjj fdtD}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 || Sr:r:)rQkr&cfg_lvp_id_lists r<rnz&prepare_apply_data.."s)___1!J^J^q!J^J^J^r;Tr)rrurrr)rrrrDrSrLid_listrdrrJrHrIrFrr rrqguess_reseller_by_package) r:packages_users_rrvrprrrSpkg resellersrus @r<prepare_apply_datar{s~..  `!g.6688O____0D0D0F0F___O ~~ ** (&&f&55 G__FJY]<^<^#488899??  '+>>GFO O!!'w//" B BC'!!s|F+!#&C1#66I9~~!!)-IaLII )-DAA NsA,A00 A?>A?c 0t\}}ttj}|D]}||ddkr||2||vr/t|||tj d5t|||d||ddddn #1swxYwYtdt rtd}ttj}|D]E}||vr/t|||t#||tj|}tj}t(j|D]} t/j| j}||vr/t|||||d|kr)tj ||d|d |d  t|| G|D]}t||D]}t|dS) NrTrrrurrurCan`t move lve_id= to lvp_id=rrrru)_get_lve_ve_dict_and_lvp_mapsetrDrFrrcrdiscardrr*context_ignore_errorrrEr{rGrr&_create_if_necessary_and_configure_lvprSget_reseller_namercpapirrrr lve_lvp_move) lve_ve_dict lve_lvp_mapremaning_alive_lvesr lvp_ve_dictremaining_alive_lvpsr:rVkernel_mappingrs r<lve_destroy_and_recreate_allrLsX;==Kch224455""$$ ??61 % % * *  ' ' / / /  ( ( ( OOF # # #  ' ' / / / V ( (d ( ; ;   $V,V4$V,Z8                   Q ##%%*(.. "38#7#7#9#9::"&&(( A AF---%%f---$,,V444 2; G G G G55f==M X\\^^N 55mDD A Ad++2000OOF+++'//777!%%fa00F::F'' eV e e e e e( -@@@@@ A+ * *F  ! !& ) ) ) ) &     s+D  D D c t\}}tjd5|D]F}||ddkr*t |||d||dG dddn #1swxYwYt dtsdStd}tj }|D]}t||tj |}tj|D]o}t!j|j}||d|kr)tj||d|d |d  t || pdS) NTr}rrrur~rrrrrr)rrDr*rrcrrrEr{rFrSrrrrrrrrr)rprrrlvp_id_rVrlve_id_s r< lve_apply_allrs)799G[  $ $$ $ 7 7jjllnn j jFvq))Q..&76?6+BWU[_]gMhiiii jjjjjjjjjjjjjjjj Q  ' ' ) ) &&GX\\^^N<<>>>>.w@@@11':: N11-@@ > >Dl4((/G!!'1--88##cccWccc$ W} = = = = = > >>sABB"Bcttdt}tr&t tni}||fS)Nr)rkrr{rDrErlve_id_lvp_id_pairs)rrs r<rrs_MMM&&&$&&K585Q5Q5S5S[$s..00111Y[K  ##r;ct|ddt|||d||d|t|dtd| dS) NTF)r:r;rjrru)rrrur:)r:rjr)rr:)rkr)rpr:s r<rrs{vDuMMMM Vvv.vz2 vE:::: Qv&&&&&&r;ctdt|tD]F}t||kr.tj|}|ddD]}td| tj |3#t$rQtj |rt|||YwxYwt!||j|t't(td|D]}t+|t|dSHdS)z,Remove reseller from ve.cfg and from procfs.TrrNrF)rhrkrJr rDrFmap_lve_id_listrrrrrr* lve_existsrremover parentNode removeChildrrr)r:rnusersrs r<_remove_resellerrsDv b 1 1 1V ; ;H,,V44E( ) )""1f---)L(((()))v((000///LL((((()     M % %b ) ) ) V    q ! ! ! ! " "&!!!! v & & & &44) <* 5sBAC65C6ct|rtj|dStr+t ddd|gt jddStd|dS)z&Disable reseller limits and call hooksrr%r>zno configuration found for LVP rz(warning: no configuration found for LVP N)rr throw_eventr^r_rarbr`)rVr:s r<disable_reseller_limitsrsG%1=IIIIII  G )-Wv-W-W!X Y Y Y HRLLLLL EVEE F F F F Fr;ctdtd}tD]}t||krkd}t |t ||j|tttt||sFtr+tddd|gtjddStd|dSdS) NTFrr%r>zno configuration found for VE rz'warning: no configuration found for VE )rhrkrIr rrrrrrrr^r_rarbr`)rDeletedrns r< lve_deleters DMMMG b 1 1 1V ; ;G     v    M % %b ) ) ) V    MMM f    F  F )-Vf-V-V!W X X X HRLLLLL DFDD E E E E E FFr;ctjds?trt dddgnt dt jddSdS)N/proc/lve/enterr%r>zenter by name not supportedz$warning: enter by name not supportedr)rrrr^r_r`rarbr:r;r<lve_enter_checkrsd 7>>+ , ,  : )-J!K L L L L 8 9 9 9  r;ct ||z}tddd5}||ddddS#1swxYwYdS#t$rYdSwxYw)Nrwrr)rrrrgr)signrRr rs r< enter_applyr s V\\^^# #S7 ; ; ; q GGCLLL                        s4)A)A A)A  A)#A $A)) A76A7cNttrTd}d}tD]2}|d}|r|d|zdzz }d}'|d|zdzz }3|dz }t |dSt dtD]$}t |d%dS) NrVTrrFz,"rWBinaries)rkr^rLrr`)rmfirstrnrs r< list_binariesrsMMM + , ,B??6**D ,#*s**$+++$ f  j + +B "//&)) * * * * + +r;c|ttD]%}td|d&dS)N+r)rkrLrr)rns r< load_binariesr)sCMMM22C00111122r;cttddd5}|D]}td| dddn #1swxYwYtdS)Nrrrr-)rrrr)rrs r<reload_binariesr/s w 7 7 7#1 # #D T " " " " ################OOOOOsAA Actdttd}tD]i}|d|krNd}t d||j|tttj|sEtrtddd|gntd|tjd dSdS) NTFrrr%r>zno configuration found for z$warning: no configuration found for r)rhrrkrLrrrrrrr^r_r`rarb)rRdeletedrns r< del_binaryr7sDMMMG ??6 " "f , ,G V $ $ $ M % %b ) ) ) V    MMM   C )-S6-S-S!T U U U U AAA B B B  r;ctdttD]}|d|krdSt d|t d}|d|t |tt tdS)NTrrrR) rhrkrLrrrrrrMrr)rRrnbin_xmls r< set_binaryrLsDMMM ??6 " "f , , FF -V""8,,G (((  ))) VMMMMMr;cR |rt}n|rt}nt}fd|Dd}n#t$rYdSwxYw|rRdD]G}|dkrt |dd}nt ||d}|r|j|HdSttdz }|D]} | dkr\t| ddkr6| vr1| dd d| <dt| | dkr5| vr1| | d d| <|rtd dStd 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|]}||Sr:r:)rQrX is_neededset_datas r<r(z#lve_set_default..ls* 8 8 8A1h!7!7 8a 8 8 8r;rN set-defaultrur[r\rve_id)rKrJrIrr0rrrLIMITS_LIST_NAMErrr plan_deleter) r package_flagrr:rrntag_nto_keeprs ` ` r<rr\s   DD  DDD 8 8 8 8 8 8 8 8 ;  ]+ , ,Dt||$R/BB$Rw77 , ((+++"##h}&==GZZ D==S!8!8!A!ABBQFFH$$"$"9"9'"B"B1"E"R"RSb"c"c ((// 0 01 4 4H$$"$"9"9%"@"@"C"P"PQX"Y"Y&HW%&&&&&8G$%%%%%s05 AAc|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 )NrootT)rrJF)rrr)rSrVusernamereseller_users_lists r<_check_reseller_user_pairrs&&t(,,H?""u!,];; !!! !&&&t 5s - <<c $|dkr0|dd}|d}t||sdStd|rN||dkrBtj|rt |dntt |nc|dkrMtr4t tj|dnt | tn#t$rYnwxYw t|d}t|}|r|dnd}t|| n#t$r taYnwxYw|ddkrd}d }d |vrt!|d|| d |vrt#|d } n td } d} d|vr*t%|d| } | tdkrd} |rt&} nt(} | D]<} || |r,t*D]+}||vr# |dkrt-| dd||nt-| |d||A#t.t0t2f$r|dkr| }nt|||k}|s|dr|dkrDt4d}|dt;||nCt4|}|dt;||| |Y'wxYw-|ddst?t4d}|rN||dkrBtj|rt |dntt |nc|dkrMtr4t tj|dnt |tA|d|<>|s|dr|rtBnd}t4|} |rZ| dt;|| d|d| tDnr|dr4| dtGj$|dj%n)| dt;|dt*D]}||vr|dkr| }nt|||k}|s|dr|dkrDt4d}|dt;||nCt4|}|dt;||| |d}tLD]}|j'(| |d}|st4j)| |ddst?t4|rtj| }t |dtA|d|tT|tT+dt |tj,-|}tj,.|D]3}tj/0||tA|| 4|rtcj2| ngtr4t tj|dnt |tA|dnt*D]}||vr|dkrHtD3dddt;||TtD3|ddt;|||ddst?t4t |tA|d|dS)NrrVrFT)r:r;rr|rc6t||dkS)Nrrrrnrs r<is_needed_userzlve_set..is_needed_users&b999Xg=NN Nr;r)rrr:rsrrrrur[r\rsavezskip-update-cfgrDrrz save-username)4rrrhrDrFrrkrErrrrrwrrrorr7rrJrIrr6rrrrrrr8rrrrrrrrrKr insertBefore lastChildrlve_inforSrlvp_lve_id_listr*rrrr)rr:rVrrQrzruhas_verrcpu_is_different setted_cpuel_listrnrf is_differentrel_nameaddedel2enables_reseller_limitsrs r<lve_setrsV {{ _d;; '"(?? 5D #&HW--- 8  f % % ' vD 9 9 9 9 9 v & & & & & 155773855hw6GHHIIIII 6""""       !!'!23-g66 #,49Q<<"7X66666 !!! !A O O O H $ $ H5N[a b b b b X  ())EE'E  H  1(5/5QQQJZ...#(  GGG- - B~b(++, +55Ch5"d{{ 22wQYZ]Q^ _ _ _ _ 22sGXc] S S S *J B555"e||/? 0:#(3-/O +5x/?5#&$;;+1+?+?+H+HD$($5$5oc(SV-FXFX$Y$Y$Y$Y+1+?+?+D+DD$($5$5gc(3->P>P$Q$Q$Q "t 4 4 45 ', ||$5u==%V$$$ /f(999x))&113#6EEEEE$622222q[[S%A%A%C%C[sx'A'A(7BS'T'TUUUUU v....(7+F;;;;;? -(7+? -*0;&&eG%%g..B Bc&kk222(8999z****<<00BOOFCL'9J,K,K,STTTTOOD#hw.?*@*@AAA' - -(??e||'7 (2#(3-'G #-x'7-$;;#)#7#7#@#@D --oc(3->P>PQQQQ#)#7#7#<#>>>>*U0t!||d}|t$t|tD]}||vr|dkrDt d}|d t||nCt |}|d t||| |tj |t)ttt+|d|vrt-|d} n t.d} d|vrt1|d| |d<|r|d nd} t3|d| dS)NTFc~|d|dko|d|dkS)NrrrurVr|rs r<r~z'package_set_ext..is_needed_plans=%%')::wrz?Z?Z^fgv^w?w r;cl|d|dko|d S)Nrrrur|rs r<r~z'package_set_ext..is_needed_plans3??4((HW,==abooV`FaFaBa ar;r)rrrur[rr\rrVr|rrQrrursrrrr)rhrkrrKrrrr8rrrrrrr\is_plesk_plesk_get_package_idr XML_PLESK_IDrrcopy_package_settings_to_cpanelr7rr plan_apply) rr has_packager~rnrfrr(package_resellerrrus r<rrs=DMMMKb      b b b  t~NNNN >"h ' ' ' - -(?? -$;;33G<---$;;#)#7#7#@#@D --oc(3->P>PQQQQ#)#7#7#<#.s"adx00DQqTW_r;rN)rlist_domain_packages_with_idrr StopIteration)rurQpanelrdpacks`` r<rrs   E1133HF D D D D D     Aw tts(A AAcht}tdt}|a|S)z Retrives resellers to packages map from panel using /usr/bin/getcontrolpaneluserspackages :return: Dictionary: { 'reseller1' -> ['pack1', 'pack2'], 'reseller2' -> ['pack'] } ra)rrr)packages_users_copyreseller_packages_maps r<rrs6)--//2333*(N  r;c|d}|d}t}||vr|||vrt|ddSdS)z Set reseller package limits :param set_data: input data dictionary :return: True - limits was set succesfully False - supplied provider has no supplied package rVrTrF)rr)rrV package_namers r<reseller_package_setrs^_-MG$L577---,BWXeBf2f2fd3333t 5r;c|d}tjsdSd|}tj|sdSt |dd5}|}dddn #1swxYwY|dd}i}|D]}|dr| d}|d  dd } |d d kr |d || <| tvr| ||d rd|vrdSdD]2} | |vr,tj|| } | p t| || <3t!||rdSt#|t$} tD](} | | } d| d| d} || )t)d ||ddS)zA Copy package limits from ve.cfg to cpanel packages data rNz/var/cpanel/packages/rrrlve_=rr|r[DEFAULT_PACKAGE_EXTENSIONSrD)rwrvrIrci)r\r]rrrrrr rrrrrrmemory_to_pageris_limits_equalscreate_cpanel_limitsrKrr#r)rrQ package_pathrcpanel_package_datanew_cpanel_package_dataold_cpanel_datar line_parts limit_namememory_page_value cpanel_data limit_value limit_lines r<rr szwG  " "4744L 7>>, ' ' lC' 2 2 2,akkmm,,,,,,,,,,,,,,,1!!!4O$   ??6 " " 5++C00J#A..vr::@@BBJ!} )).8m +---'..t444 ??0 1 1 e46G6G FF-WW  ( ( ( 7 8S T T *;*V{:?VOJ '22'w ;;K&33 !*- 8J88888 &&z2222BGG$;<A;c|D]/}|dvr ||||krdS#t$rYdSwxYwdS)zC check if new set of limits for package are equals to used )rrFT)rcr) old_limits new_limitsrfs r<rr2 sy   # # #  #*S/11uu2   555  4s3 AAc i}|D]h}|d|krKtD]B} |dkrQt|ddd||<n|dvrptt jt||dd||<nPt||dd||<!#tttf$r d||<Y@wxYwj|S) z create limits for cpanel package file use data from ve.cfg: limit = limit if found in ve.cfg or DEFAULT return dict rrur[rr\)rvrIrwrr) rrr8rrrpage_to_memoryr7rrr) package_id xml_packages result_datarnrs r<rrA sK33 ??4 J . .) 3 33}}-033G<.is_needed_packaged s.??4((G3WBOOJ.is_needed_packageg s1??4((G3d 8S8SWd8d dr;rr%r>z no configuration found for plan rz)warning: no configuration found for plan )rhrkrKrrrrrwrrr^r_rarbr`r)r}rVrrrnresellers_listrus`` r<rr_ sDMMMG X X X X X X e e e e e e  R  G M % %b ) ) ) V    E   I  6w??N>""a''*!,#GX...  I HwHHI    HRLLLL GgGG H H HOOOOOr;c(t||dS)NrU)r)r}rVs r<reseller_plan_deleter s}555555r;c t||ddS#ttf$r)|dkr t |nt |dzdcYSwxYw)Nrrrrrzr)r8rrrrr)rnrfs r< get_xml_limitr sS2**3//2??HHIII  #SSS#&%<<{3 C8HC8O5R5R5RRRRSs:=7A76A7cd}|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|cSdS)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 rr[r)r) input_stringchar_to_searchordinalcountidxchs r<_get_char_indexz'_normalize_str.._get_char_index sR ..  GC^## G##JJJrr;Nr8rr[)rrrfind)data_strr(json_strtrd_idxlast_idxs r<rPrP sl$tz5(+,,HohQ//G~~c""H GaK( ))r;cDnrtntdfd }|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 < r4ttjtd<fd}nfd}tjttrt nd<d}|dd<t dkr|d d <t D]^}||rOt|d }|d kr|nttd d <ttt|d td  dzd< tt| dd dd<n#ttf$rYnwxYw|t|d d <|t|dd<t|dd<t|dd<t|dd<`dd dzd<tt!dd <g}tr)dfd D}d|dg}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 ruch|dko|dkSr{r|)rnrrVs r<rz>_package_formatter..wrapper..is_needed_package s2#rt'<'<<mQ[A\A\`mAmmr;cb|dko|d Sr{r|)rnrs r<rz>_package_formatter..wrapper..is_needed_package s/#rt'<'<<`R__U_E`E`A``r;rcLtrt|nt|SrPr.r/s r<r0z?_package_formatter..wrapper..convert_mem_limits rHr;rvrIr{rwrsr|rrrrzrr[rr\rurtrxryNr3c3vK|]3}d|d|ddV4dS)rr5rJNrrMrNs r<rTz6_package_formatter..wrapper.. sMTTCCCdhhqwwyy%&@&@CCCTTTTTTr;r8r9c`g|]*}|d+Sr;r5rNs r<r(z7_package_formatter..wrapper.. s/>>>!dhhqwwyy"-->>>r;)rxrrr^rPrrKrr8rr7rrrrrrr) rrVrr0rnrrArrrrr<s `` @r<rQz#_package_formatter..wrapper s,  * $] 3 3 39[))D,D  n n n n n n n a a a a a9[))D59K^L111|T  V V V*)$u+66V ??--d6l;;DL 9 9B  $$ 9%b&11(- uu[=P9Q9QV #$<!"e,,CV 4E4E%G%G%GJM%N!!W !$S//88;HHYY&&""DJJ#J/D11-F2K2KLLV 11-E2J2JKKV *2t44T -b' : :W ,R88V 88G   $ K3.DM*4=99::U   @88TTTTVTTTTTD ===/CC G>>>>v>>> ? ? s;A FFFrP)rr)rrr<rQs``` r<_package_formatterr7 sO!,gg{2Y))PYG<<<<<<<<z Nr;cttdt}tdt}t t t }ttdt }|D]}|||z }tdkr#ttdt }| D]M\}}tj r|dkr|D]+}tdkr||||z }|||z },Ntr*td d |zd zdSdS) Nr`rar=Frr<r[TadminrVr3rW)rkrrrrBrDEFAULT_PACKAGEr7rrNrdr\rr^r`r)rdreseller_packagesrmrXrQrV packages_listreseller_packages r<get_packages_listr@ sMMM)))""$$H2333&++--  o > > >F":<r?s r<get_resellers_packages_listrB& sMMM2333,K \\K 'F  o > > >F"6t<<(>AA$ } - A A  ii 0-@@ @FF A 5 kCHHV,,,t34444455r;cVttdt}tdt}dg}t |z}t t t|}t|dt }|D]}|||z }t|d}| D]\}}|D]} ||| |z }tr*td d |zd zdSdS) Nr`rarg)r=r?Fr:Trz {"data": [r3rW) rkrrrrrBrr<r7rdr^r`r) rdr=r?rrmrXrQrVr>r?s r<get_all_packages_listrD9 sPMMM)))""$$H2333&++--,K \\K 'F  o; W W WF"6uiPPPI%%))G$$$"6t<<R+?+?uP X  'W&'3N'CI'N(4^(DZ(P))&NN  WWW&4"RT6U6U%VNNNW1-D-D^-T-T*M77!111.00MGGG1#1gS`2a2a!bt y ,.F.F~W_.`.`aN4  & &$+-~// !7 !E!E'5$$"64 0 0 0)0!3!3!5!5,:))";4 | # # #)z|| )N4 , , ,%,&8&8&B&B#)<%!4"74 z ! !%!)+N4 '''#A&&&&&&&&      5s F)AFA40F3A44F8BFBFB F$F:5F1&FF9$FF F. F F.-F.cFtttS)z2 Retrieves panel users count :return: )rrrr:r;r<get_panel_users_countr\ s  ~  r;ctdtd||r/t|D]#}tt|||"dSdS)NrrQr)rrrr7)r}rurSs r<rr sm&&&IwBBB<!'* < package_name_in_keys r<rwrw2 sH"''))M2333&++--"''))N):(?(?(A(A11$ }#0 1 1 ---000 1 Or;c~tjtjdd}|rtj|rxt ||\}}|dkrad|}trtdd|gd 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_SCRIPTr) separatorrz0Error while executing Endurance's custom script r%rZzerror: rcN) r\get_param_from_fileCL_CONFIG_FILErrrrr^r_rarergrb)argsendurance_custom_scriptret_codestd_outrn err_messages r<call_endurance_custom_scriptr~C s*=k>X>WHKMMM #27>>2I#J#J #()@$GG' q==T7TTG #Ggw%788888111    K!3!3!3444""""" # # # # =r;ctr)tt|tjzSt |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 )rr7rmmaprr'r/s r<_page_to_memory_or_bytesr\ s515.//000 5>>r;cg}ttj}t t D]m} tj|}||vr||<#tttf$r||YjwxYw|D]}t|dS)zV Remove from LVE all resellers, which are absent from panel :return: None N) rrDrSrzrkrHrrrrrr)reseller_id_list_for_deletecpapi_resellers_listlve_reseller_idlve_reseller_namereseller_id_for_deletes r<remove_absent_resellersrm s #%  1 1 3 344MMM#::@@ @ # 9 9/ J J  (<<<+22?CCC'7+ @ @ @ ' . . ? ? ? ? ? @#>11/000011s 8B,B54B5ctjD]} tj|#t $rz t|n[#t$rN tj |t|n#t$rYnwxYwYnwxYwYwxYwdS)zM Remove from LVE all users, which absent in system :return: None N) rDrFrSrrrrr!r*rrs r<remove_absent_usersr s (,,..    L     ''''   F%%f---OOF++++!D     sW7 B;AB; B5(9B"!B5" B/ ,B5.B/ /B52B;4B55B;:B;)FrP)r)NN)rFT)T)NNN)NFNNr)r)r(rN)r=N)FN)rIr|N) contextlibrrjrrrrrrrrarrxml.dom.minidomdomminidomrbuiltinsr functoolsrrtypingrrrr r r rrr\rsclcommon.constr rRr rrrclcommon.cpapi.cpapiexceptionsr clcommon.lockr clcontrollibrcleventsrr cllimits.libr cllvectl.logrclveconfig.ve_configrrrclveconfig.ve_lockrrrrrr r!secureior"r#GET_CP_PACKAGE_SCRIPTrrr<rrrrlrr7rrIS_DEBUGrLVErrDr,rBrHrMrWrdrhrfr@r^rArrr^rrrorrr8rrIrJrrKr?rMrLrNrrrrrrrrrrrrrcontextmanagerrrr r_r r*r0r3r6r9rrDrOrXr8rar_rkrprxrrrrrrrrrrrrrrrrrrrrrtuplerr r"r'rBrRrYr]rerhrqr{rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrPr7r@rBrDrUrTrSrVrWrHrr\rrbrdrirlrorwr~rrrr:r;r<rsc   ???????????????? """"""gggggggggggg888888&&&&&&******PPPPPPPP%%%%%%......OOOOOOOOOOEEEEEEEEDDDDDDDDDDDDDD?????????    :  3rz~~mQ// 0 0 !!'+.. E CC E ! ! !E #---CY     %%%KKK=$3333*             ONN                 ,++++,   111D&%''9<<>> ,$** 0 0 0 """( >    &&   [[[222222   ##D####Lkkk"i"i"iJ3 d38n3 3 3 3 l    & & & & %%% L L L LEAEAEAEAP I I I!!!H ? ? ? 0 0 0 0 4 4 4 4    f f f!1!1!1J"p"p"p"pJ!!!NDZ>n>n>n>nB666:V)V)V)V)r   %%5%%S%#%%%%6,6!!!!H%,NNNNf55556$555("....b< < < @>>>D$eD$J&7$$$$ ' ' ' ': G G GFFF*   +++(222 *    +&+&+&+&\F}}}}@55552H5H5H5H5V C # (3-     ! ! !*+S+S+S\   <&&&&R666SSS$*$*$*NJJJJ\555:555&6664!       ttttn<<<<   (SSS222$   "###2"1114r;