5/9ex `ddlmZddlmZddlmZddlmZddlmZmZddl m Z m Z ddl m Z mZmZmZmZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmcmZ ddl!Z!dd l"m#Z#ddl$Z$ddl%Z%dd lm&Z&ddl'Z'ddl(Z(dd l)m*Z*dd l+m,Z,m-Z-m.Z.m/Z/dd l0m1Z1ddl2Z2ddl3m4Z4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddlZ>ddl'm?Z?m@Z@mAZAmBZBmCZCddlDmEZEddlFmGZGdZHdZIdZJdZKdZLdZMdZNdZOdZPeQejRSddZTdZUe/e*jVsdZWdZXne@eT ZWe?eW!ZXd"ZYd#ZZd$Z[d%e1fd&Z\dd'Z]d(Z^d)d*d)d+dd,dd-d.Z_d,Z`d/d*ddddddd.Zagd0Zbd1acdaddaed2afd2agiahd2aid2ajd2akd2ald2amd2and2aod3apd2aqd2ard2asd4Ztd5Zud6Zvdd7Zwd8Zxd9Zyexp eyZzdd:Z{d;Z|d<Z}d=Z~dd>Zd?Zejd@Z ddAZdBZddCZdDZdEZddFZdGZdHZdIZdJeQdKefdLZdMZdNZdOe eeQffdPZdQZddSZdTZddUZddVZdWZdXZdYZddZZdd[Zd\Zd]Zd^Zdd_Zd`ZddaZdbZdcZddZdeZdfZdgZdhZddkZefdlZddmZdnZdoZdpZdqZddrZdsZdtZduZdvZdwZdxZdyZdzZd{Zd|Zd}Zdd~ZdZddZddZddZdededeeQfdZdZdZdZdZdZddZdZdZdZddZdZdZdZdadadadadadZddZdZddZdZdZdZdZdZdZdZdZdZdZdS))print_function)absolute_import)division)range) basestringunicode) iteritemsreraise)DictListTupleOptionalTextN)partial)PAGESIZE)Feature)adminsreseller_usersget_main_username_by_uidis_panel_feature_supported) EncodingError)reseller_limits_disabled_postreseller_limits_enabled_post) exec_utility)get_xml_configsave_xmlBadVeConfigException)setup_global_lockLockFailedException)LvePyLveLVP_XML_TAG_NAME PyLveErrorNameMap)detect_panelclass)write_file_via_tempfilez%/usr/bin/getcontrolpaneluserspackagesz /proc/cpuinfoi' VE_DEFAULTFz /bin/umountz"/etc/container/exclude_mounts.confmultisingle PYLVE_DEBUGplesk_id)debug)pycttrtjSgS)z-Helper function for easy mocking in unittests)lvereseller_limit_supportedproc lvp_id_listpy/lvectllib.pylvp_listr6Ns/ ##%%x##%%% r4cnt}||S)zf Get list of resellers with activated reseller limits :return: list of pairs (name, uid) )r$ link_xml_nodeload_from_node)name_maps r5get_active_resellersr;Vs1 yyH   " " $ $$r4c6|dtDvS)z] Check whether giver reseller has activated reseller limits or not :return: bool c3 K|] \}}|V dSNr3).0nameuids r5 z,is_active_reseller_limits..fs&JJidCTJJJJJJr4)r; reseller_names r5is_active_reseller_limitsrEas% JJ3G3I3IJJJ JJr4ectjst|tr t ddt |gnt |tjddS)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_cpanelr JSON json_formatstrprintsysexitrFs r5raise_cpanel_encoding_errorrSjsm  " "  Gc!ff% ' ' ' ' aHQKKKKKr4ch 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 rIzcan`t get lockN)rrcheck_result_and_exit)writes r5get_global_lockrW|sP3%     333a!12222223s 11c|tj krj|dkrftr(ttddt |zgnt dt |ztj|dSdSdS)NrrHz lvectl: %szlvectl: Error: ) errnoENOSYSrLrM MULTI_FORMATrNrOrPrQ)resultmessages r5rUrUs EL= v{{  3  w s7||0K&L M M M M #S\\1 2 2 2  ! {{r4rIi)cpuncpuioepmempmemnprociopsd)rbrarcrerfrgrhrdfalsec |adSr>)rL) json_flags r5set_jsonros DDDr4c |adSr>) BYTES_FLAG) bytes_flags r5 set_bytesrss JJJr4ctrtdkrd}ntdkrd}ntdkrd}nd}gdgdgdgd d |}tr1|d d z}|d|d gz||dzS|S)Nnoiops_8864)IDSPEEDPMEMVMEMEPNPROCIO)r{r|r}r~rrrIOPS)r{r|r~rr)rvrwryrzr|rICPU)NOIOPS LVE_VERSIONrLindex)versionfields speed_idxs r5 get_fieldsrs +""      BBB B B B ; ; ; , , ,   F  CLL))!+ z z"eW,vijj/AAB Mr4c|3tj}|dtd|dan|at}|stdtadS)Nrzget_lve_version failedzinit_lve() failed.)clcommonget_lve_version Exceptionrpylve initializeliblve_settings lve_settings)lve_ver lve_statuss r5initrs}*,, 1: 344 4aj  !!##J .,---((**LLLr4ctjd}|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' formatrI) osenvirongetjsonloads TypeError ValueErrorrOrNrPrQ)packed_cpu_datarFs r5_get_cpu_data_from_envr sjnnZ00Otz/*** z " @#a&&III  s9B 1BBci}i}d} ttd}nK#t$r>tdt tzdzt jdYnwxYw|D]}|s||d|z<|dz}i}&t| ddkr\| dd|| dd<d || dd<||d d gS) zF Parse /proc/cpuinfo return [NumProc, frequency in MHZ] rrzlvectl: Error: Can`t open .rIzproc%s:rkproc0zcpu MHz) openCPUINFOIOErrorrOrNrPrQstriplensplit)cpuinfoprocinfonprocsflines r5 get_cpu_datarsQGH F #    *S\\9C?@@@   : :zz|| :)1GHv% &aZFHH4::c??##q((7;zz#q7I7O7O7Q7QC+11334479C+113344 GG$Y/ 00sAA&%A&c\t|}|pd}t}t|d}tjd|}|et|}|dkrP|dkrJtt 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?$Nri)rN CPUINFO_DATAintrematchround CORE_WEIGHTmin)datalncpucpu_datarb cpu_percentfrom_cpu_limits r5convert_from_old_cpur8s t99D JQEH x{  D(=$//K4yy 1HH43;; {c'9D'@4'G!H!HIINzz%%u{*N;; ; 4r4cJt|}t}t|d}tjd|}|`t |dd}||dzkr|dz}|dkr'tttdz|zSdSdS)zd Try converting cpu limit from SPEED in percentage of one CORE format to kernel format. rz\d+(?:\.\d+)?%$N%rkri) rNrrrrfloatreplacerr)rrrbpercents r5convert_from_speed_percentrNs t99DH x{  Dh)400G S"--.. TCZ  SjG Q;;u[C/'9::;; ;t 4r4ct|}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. rrIz,(?P\d+(?:\.\d+)?)(?Pmhz|ghz)+$NsuffixfreqGHZi) rNrrrrcompile IGNORECASErgroupupperrr)rrrbcpu_freqpatternrrrs r5convert_from_speed_hzr`s t99DH x{  DXa[!!HjH"-XXG MM$  E X&&U[[(()) <<>>U " "$;D (T/ ! !d?D !88uTK/(:;;<< < 4r4c>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 r5convert_from_speedrus$ #4(( '  & &r4czt||}||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 r5convert_to_kernel_formatrsV$D%00H3D99%!!)$//M  4r4c 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*)rrrNrlstrip)speedrrgs r5speed_to_old_cpurs H   E JJE e||SU3u||C'8'8#9#9U#BCCDDEEEE3uSZZ501122333r4c#Ktt} t||n1#t$r$t jt jd|zwxYw |Vt|dS#t|wxYw)zF Run subprocess in lve with pseudo-random id and given limits zKUnable to setup lve with id %i, something is wrong, check dmesg for detailsN)rrget_available_lve_id lve_setupr#syslog LOG_ALERT lve_destroy)settingslve_ids r5 temporary_lvers    ' ' ) )F ))))  f&)VX^)_ ` ` `  "  &!!!!!&!!!!sA.BB$$Cct}t|||_||_||_||_||_ttj 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) rg?) rrrls_cpuls_io ls_entersls_nprocls_iopsrmathceilr ls_memory_phy)rls_cpusrrrrrss r5make_liblve_settingsrsm A'g>>>AHAGAKAJAI$)B$6$ABBCCAO Hr4ct|d}|s.|d}tj|j}t |S)Niduser)rN getAttributepwdgetpwnampw_uidr)ve_lve_elementuser_uid user_names r5get_ve_lve_user_uidrsV>..t4455H 2"//77 < **1 x==r4cdt|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 statusrrImsgN)rNr[updaterOrdumps) error_typer extensionsr\s r5rMrMslDG %F\!!DG u  j!!! $*V  r4c tt|dd||<dS#tt t f$rg||||<||}|dt|| |j |YdS#YYdSxYwwxYw)Nrlimit) r ve_defaultgetElementsByTagNamerr IndexErrorr createElement setAttributerN appendChild)xml ve_defaultsve_cfgvaldefaultnodes r5check_def_valuers z>>sCCAFSST[\\]] C  I ."3< C##C(( '#gcl"3"3444  COD ! ! ! ! ! !  DDDs%AAA C(B;;C=CCc*fd|jDS)Nc^g|])}t|tj|jk'|*Sr3) isinstancerElementtagName)r?_tags r5 z"xml_filter_tag..s7 Z Z Z!*Q *D*D ZVYIYIYAIYIYIYr4) childNodes)rrs `r5xml_filter_tagrs Z Z Z Zt Z Z ZZr4ct||D]9}|||s||||kr6|cSdSr>)r hasAttributer)rrattrattr_val child_nodes r5xml_filter_firstr$sn$T3//  J$;$;D$A$A    J$;$;D$A$AX$M$M  r4cpt|||}|t||S)N)rrr!)r$r r)rrr!filtered_child_nodes r5get_child_tag_atrrr's;*#DIII"ll  + +D 1 11r4cxt||d}||t|dS)z Find in children nodes node with tag and setup attribute insted el.getElementsByTagName not search recursiveli in tree rN)rr rN)rrr!rfirst_child_nodes r5set_child_tag_atrrr*s; &dC003!!$C11111r4c t\aadS#t$rg}tr%t t dt|gntt|tj dYd}~dSd}~wwxYw)zLoad config from ve.cfgrHrIN) rr ve_lveconfigrrLrMr[rNrOrPrQrRs r5_load_config_wrapperr-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 truedefaultsrrr(WARNINGzdefault section error in ve.cfgrIz(warning: default section error in ve.cfg)ubcrr,r LVE_DEFAULTrr  LVP_DEFAULTr$r"rNr  cloneNoder rLrMrPrQrO)r.r/defaults_root_nodes r5_load_default_limitsr9 s  C> ' jAA!DJ   --j99J -l>>  > )-N!O P P P HQKKKK < = = = > s#B8"B8 A,B88ADDc |tdttttt t fDS)Nc3"K|] }|dkV dS)rkNr3)r?xs r5rBz._all_config_elements_loaded..Gs&jj1qBwjjjjjjr4)allve_lveve_lvp ve_package ve_binaryve_enter_by_nameve_cfg_versionr3r4r5_all_config_elements_loadedrDFs. jjYHXZh ijjj j jjr4ctdatdattat jj ttd}t|dkr |da n9t da tttdatd}t|dkrt!|djjndadS) z$Load all config elements from ve.cfgr/packagez enter-by-namerbinaryrrIN)r,r r>r@r"r?r/mapr:r8rrBrr r rAr firstChild nodeValuerC)enter_by_name_elemscfg_version_elemss r5_load_config_elementsrMIs . .u 5 5F229==J  . ./? @ @FG""<000&;;OLL !##.q1!//@@  !1222 55h??I%99)DDGJK\G]G]`aGaGaS*1-8BCCCghNNNr4default_limitsc iattdttt|}|d tddd}t|tdtd<n#tttf$rt|dtdtd<t d}| dt|d t|n#YnxYwYnwxYw ttd dd td <n#tttf$ry|d td <t d }| d t|d  t|n#YnxYwYnwxYw|d t d kr |dn|ddt"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 N)rrrrrrb)rrarrrother maxentryprocsrdrcre)rrrfrgrh)rrrrrr rrrr rr r rNr rrMEM_DEFAULT_CL5_check_defaults_for_nones)rN check_def_valrrards r5_load_ve_defaultsrVnsKTz{SYcqsssMMf //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 & & & &  DMd +aMMe]]uW\^mVn5o5o5oMfMgMfsWABBD;D10D;1D53D;:D;?AFA*H3H HHHHctD]^\}}|d|d}trtdd|gn"tj|dt jd_dS)z*Check that all default values are not NoneNzERROR: Incorrect z default valuer(rH rI)ritemsrLrMrPstderrrVrQ)keyvalueerr_msgs r5rTrTs"''))   U   9c999  - '7!3 4 4 4 4 J  ^^^ , , ,    r4Tctt||}|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)r-r9rDrMrV)r.r/load_config_elementsrNs r5 get_XML_cfgr`sW )&,??N #>#@#@ n%%%%%r4c tt||d}|||<|S#tttf$rt||cYSwxYw)Nrrr!)rr'rr r)relr setup_datar\s r5 check_valueresm%&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 r_N)lveapir$r8get_idr`)resellerxml_config_load_elementsr: reseller_ids r5_load_resellers_xml_datarmsN~H //(++K 2JKKKKKKr4c tjtaYt}|vr|vrfd}nt jr| t j|}d|jd}t|5}| }dddn #1swxYwYn#t$rd}YnwxYwd|vr3tj tj d|dfd }tD]n} || r]t!d | tt} t#t%t'| d d | } | td <n#t(t*t,f$rYnwxYwt!d| ttt.dkrt!d| ttn dtd< t#t'| dd } | td<n#t(t*t,f$rYnwxYwt!d| ttt!d| ttt!d| 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|dkSNrrjr)rcplan_idrjs r5z$prepare_setup_data..s0(=(=(H(tR__]gMhMhltMtr4z"/usr/local/directadmin/data/users/z /user.confrkzpackage=customzNPackage for user with id {} is incorrect, please recover it using Note from {}zYhttps://docs.cloudlinux.com/cloudlinux_os_components/#installation-enabling-and-disablingcb|dko|d Srprqrcrrs r5rsz$prepare_setup_data..s0(=(=(H(lQSQ`Q`akQlQlMlr4rbrarrbrrcr1rerrPrQrdrgrfrh)copyrrdget_reseller_packages_maprJis_dargetpwuidpw_namerreadrrrformatr@rerrr'rr rr4) rrrjr res_pkg_dictis_needed_planuser_pwdfilenamertextrcrrards `` r5prepare_setup_datars;''J022   H $<$<LYaLbAbAbtttttNN "" v'9"|F33H`HDT```Hh(1 vvxx((((((((((((((( DDD $4//M(hoo"wmlllN  A AB~b!! A#FB ZHH67I"RW^e7f7f7fnstttuuC(+Ju%%"J :DD"k:>>>6MMr; CCCC()Ju%/oVVVWWB')Jt$$"J :DGRjAAAFB Z@@@FB Z@@@i@ A AsZ.B5B) B5)B--B50B-1B55 CC68E//F F )HHHc  tjtd|gtjtj}||jdkS#t $r#tddtddd|dYdSwxYw)Nz-l)stdoutrZrzfailed to run " ") subprocessPopenUMOUNTPIPE communicate returncodeOSErrorrU)pathps r5 umount_dirrsU  fdD1*/R\Ra b b b |q  UUUbbddd"STTTTTTUsAA)BBcJtjtsdSg} t td5}|D]?}|}|r'|tj|@ dddn #1swxYwYn(#t$rtddtzYnwxYw|sdStj tj  t dd5}d| D}dddn #1swxYwYn'#ttf$rtddYnwxYwd}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 Nrrzfailed to read %sz /proc/mountscBg|]}|dS)rI)r)r?ms r5rz"prepare_mounts..6s$:::qaggiil:::r4zfailed to parse /proc/mounts F)rrisfileEXCLUDE_MOUNTS_CONFrrappendrrrrUunshare CLONE_NEWNS readlinesr rsearchr) reg_exp_listconfrrrmountsATTEMPTSrerrormountreg_exprs r5prepare_mountsr"s 7>>- . .LM %s + + =t = =''))= '' 7(;(;<<< = = = = = = = = = = = = = = = = MMMb"58K"KLLLLLM  OG'(((B .# & & ;!::AKKMM:::F ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;  BBBb"@AAAAABH 8__    E'  NN5))&u--6EE  EE   skBAB BBBBB"C?C&D-6D! D-!D%%D-(D%)D--!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 settingsr]N)rcallrrOrr lve_start) MOUNT_CMDs r5rrFs?I5 +FFFFF 555 ()444445 OO=O>>>>>s 99cft|d||dS)zs Create LVE container for given ID :type lve_id: int :type ignore_error: bool :return: Nothing z8lvectl: Can`t create lve with id {}; error code {{code}}r] ignore_errorN)r lve_creater|)rrs r5rrSsB VW^^_eff".00000r4cft|d||dS)zs Create LVP container for given ID :type lvp_id: int :type ignore_error: bool :return: Nothing z8lvectl: Can`t create lvp with id {}; error code {{code}}rN)rlve_lvp_creater|)r.rs r5 lvp_creater_sB ![!b!bci!j!j&244444r4ct}tD]F}t|d|||G|S)N9lvectl: Can`t destroy lvp with id {}; error code {{code}}r)listr6rlve_lvp_destroyr|r)destroyed_listr.s r5destroy_lvp_allrksoVVN**&& f&a&h&hio&p&p  r r rf%%%% r4c|dkrtdSt|d|dS)Nr=rr)rrrr|r.s r5 lvp_destroyrts]  f&a&h&hio&p&p  r r r r rr4cd|}d|}d}|dkrtrtt }t t tjdkr@tjD] }t ||d}!nd}ntj |s=tj r>tj |t ||d}n!tj |sd}|r!trttdgdSdStrtt d |gdSt#d |dS) Nz/Can't remove lve {} from kernel - error code -3z1Can`t destroy lve with id {}; error code {{code}}Fr=rrTOKWARNz warning: {})r|r/r0boolrrrr1 lve_id_listrcheck_inside_listresellers_supporteddetect_inside_lvprLrM SINGLE_FORMATr[rO)rcant_remove_msgcant_destroy_msg destroyedid_s r5rr}sHOOPVWWOJQQRXYYI   ' ' ) ) 0_..//I tCH((**++ , ,q 0 0x++-- ! !-=>>>  !II 8 % %f - - --// 33F;;G OOF, $ tQ;;)) 6^6e6efl6m6m*oooo'' 6g6n6nou6v6v(xxxx1%%l. s 34 H H HF Rr4rFrjrjrbrarrbrrcr1rerPrQrdrgrfrh)rjrrl)rrrr`r?r>nextfilter NameErrorrrrerrdrr'rr rr4rr) rrrr\rjout_noder.rnew_packages_usersrc node_listrs ` r5 lve_applyrs$( {{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  )&(((((())sHBB('B(,B;;CC)D//E E ='G%%G?>G?c$t|dS)a Sometimes python is confused about which encoding we should use to print message. E.g. when we use "command | grep" to find something in the output. According to python docs, "Software should only work with Unicode strings internally, converting to a particular encoding on output." So let's convert all unicode into str using our "magic" byteify method :param string: :return: N)rO)strings r5_print_string_saferDs" &MMMMMr4ctdd|ddDd|dzgzdS)zz Command to print data with only last column 30 symbols wide Useful to print data that contains package name. rkcg|]}d|zSz%8sr3r?rs r5rz_pprint..]???a ???r4Nr%30srjoinrs r5_pprintrXsM rww??6#2#;???6FSUJCVBWWXXYYYYYr4c tdd|ddDd|dzd|dzgzdS)z Command to print data with two last columns 30 symbols wide. Useful to print full data of every user with package name and reseller name. rkcg|]}d|zSrr3rs r5rz_pprint_f..err4Nrrrrs r5 _pprint_fr`s\ rww??6#2#;???6FSUJCVX^aghjakXkBllmmnnnnnr4c tdd|dzgd|ddDzdS)ze Command to print data with first column 30 symbols wide. Useful to print packages data. rkrrcg|]}d|zSrr3rs r5rz_pprint_p..ms6U6U6UQuqy6U6U6Ur4rINrrs r5 _pprint_prhsO rww 236U6U&QRQSQS*6U6U6UUVVWWWWWr4c tdd|dzgd|ddDzd|dzgzdS)z Command to print data with first column and last column are 30 symbols wide. Useful to print data with user names and package names. rkrrcg|]}d|zSrr3rs r5rz_pprint_r..us6W6W6WQuqy6W6W6Wr4rIrNrrs r5 _pprint_rrpsd rww 236W6W&QRSUQU,6W6W6WW[adjkmdn[nZooppqqqqqr4c t|}t|ttfvr|drdnd}|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 rTFrkirz*{})rNtyper startswithrrr|)r\ was_changeds r5_pmem_vmem_to_bytes_valuerxs JJEu++#w77E)>abb   JJ rr ETME qyy..A.. 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| zg}n||| fd|D|S)z^ Generate header and default package data either as print to stdout or as json string raric0|dS)Nrkr)r[r2s r5rsz_formatter..s8<<R00r4rkcLtrt|nt|Sr>rqrrr\s r5rsz_formatter..s& (*'@'G'G'G"5>>r4rbrfrerdrgrcrh) r{r|rNCPUr}r~rrrrPACKAGEN,c3RK|]!}d|d|ddV"dS)r":"rkNr r?r fields_maps r5rBz_formatter..sBQQQQqqq*..B*?*?*?*?@QQQQQQr4{%s}c<g|]}|dSrkr rs r5rz_formatter..s'888A*..B''888r4)rrvrrNrrLr) printer default_iddefault_package more_fieldsget_data_cpuconvert_mem_limitsresrrr2rs @@r5 _formatterr!s!!Huo,HUO0000H0820E0E HHUOO , , ,2D**3xx#7#74yy#hhv&6&6"7"7&&xx'7'788993GYGYZbZbchZiZiGjGjCkCk((4..!!C0A0A,B,B#hhW[nnJ]J]HHV$$%%/ J C \\F+ :xxQQQQ&QQQQQ}o888888899 Jr4cfd}|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|zg}n fdD|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 rkrFrjNrIrF)rkrgT)rrrjr\ct|tt|krdtt|znt|S)Nr)rNrd)r[rs r5rsz2_user_formatter..wrapper..sO49~~Z_!5!555%(JsO(<(<$<$<;>tCy>>r4cLtrt|nt|Sr>r rs r5rsz2_user_formatter..wrapper..&,.+DU+K+K+K&u~~r4rrarbrfrevmemrdrcrgrhN/Arrirrc3ZK|]%}d|d|dV&dS)rrNlowerr?rrs r5rBz3_user_formatter..wrapper..s>OO11111d17799ooo>OOOOOOr4rcDg|]}|Sr3r*r,s r5rz4_user_formatter..wrapper..s%666!d17799o666r4)rrCrrmr`rvrdrrNrL_normalize_strrrrr) rrFrj check_changedrr rrrrs @r5wrapperz _user_formatter..wrappers&  &y1!$' 3 r>>H Q   w 6 6 6 6 6#)ERRRRR 7777 w : : : :y$$$(4HHHHJJJJ ..YYT --..//U ==0011V --mmF.C.CDDEEV --mmE.B.BCCDDV t,,--T t,,--T MM'2233W ==0011V  &,W55DOO%DO  (,4uu"D  'D  $u+  #c$u+*<*rrrkeysr)r>packagess r5panelpackagesdictrD=sp,+++++H)))!%n&9&9&;&;!.ns%III#,t,,3IIIr4c$i|] \}}|v || Sr3r3)r?r[r\uids_da_adminss r5 z(_filtering_da_admins..os*```*#ucQ_F_F_3F_F_F_r4)rJ getCPNamerr )ve_dictrLs @r5_filtering_da_adminsrPcsV-//IIIII```` '0B0B``` Nr4c ttt}|rHtjj fdtD}n#t}YnxYw|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 || Sr3r3)r?krcfg_lvp_id_lists r5rMz&prepare_apply_data..{s)___1!J^J^q!J^J^J^r4Tr)rrjrrr)rrrr/rHr:id_listrYr?r6r>r1rrrrPguess_reseller_by_package) r.packages_users_rrUrOrrrApkg resellersrTs @r5prepare_apply_datarZts!~..  `!g.6688O____0D0D0F0F___O!&& ~~ ** (&&f&55 G__FJY]<^<^#488899??  '+>>GFO O!!'w//" B BC'!!s|F+!#&C1#66I9~~!!)-IaLII )-DAA Ns A,A00Bc ttdt}tr&t tni}tjd5| D]F}| |ddkr*t|||d||dG dddn #1swxYwYtdtsdStd}tj }| D]}t|dd t|||d||d| t|d td| tj |}tj|D]o}t%j|j}| |d|kr)tj||d|d|dt||pdS)NrT)rrrrj)rrj)rF)r.r/r_)rrrjr.)r.r_rr.zCan`t move lve_id=z to lvp_id=; error code {code}r)rrj)r`rrZr/r0rlve_id_lvp_id_pairsr-context_ignore_errorrBrrr1rHget_reseller_namercpapirrrr lve_lvp_move)rO lve_lvp_maprkernel_mappinglvp_id_rDrlve_id_s r5 lve_apply_allrgsMMM&&& ""G585Q5Q5S5S[$s..00111Y[K  $ $$ $ 7 7jjllnn j jFvq))Q..&76?6+BWU[_]gMhiiii jjjjjjjjjjjjjjjj Q  ' ' ) ) &&GX\\^^N<<>>>> 7ERRRR"7+F3"7+J7  " " " " 7????7++++11':: N11-@@ > >Dl4((/G!!'1--88##cccWccc$ W} = = = = = >>>s AC66C:=C: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)rWr`r?rr/r1map_lve_id_listrrbrryrr- lve_existsrremover parentNode removeChildrrr)r.rcusersrs r5_remove_resellerrosDv b 1 1 1V ; ;H,,V44E( ) )""1f---)L(((()))v((000///LL((((()     M % %b ) ) ) V    q ! ! ! ! " "&!!!! v & & & &44) <* 5sBAC65C6ct|rtj|dStr+t ddd|zgt jddStd|zdS)z&Disable reseller limits and call hooksrr(r3z!no configuration found for LVP %srz*warning: no configuration found for LVP %sN)ror throw_eventrLrMrPrQrO)rDr.s r5disable_reseller_limitsrrs}I%1=IIIIII  I )-PSY-Y!Z [ [ [ HRLLLLL >G H H H H Hr4ctdtd}tD]}t||krkd}t |t ||j|tttt||sFtr+tddd|zgtjddStd|zdSdS) NTFrr(r3z no configuration found for VE %srz)warning: no configuration found for VE %s)rWr`r>rrrrlrmrrrrLrMrPrQrO)rDeletedrcs r5 lve_deleterusDMMMG b 1 1 1V ; ;G     v    M % %b ) ) ) V    MMM f    J  J +MQW+X Y Z Z Z HRLLLLL =H I I I I I JJr4ctjds?trt dddgnt dt jddSdS)N/proc/lve/enterr(r3zenter by name not supportedz$warning: enter by name not supportedr)rrexistsrLrMrOrPrQr3r4r5lve_enter_checkrysd 7>>+ , ,  : )-J!K L L L L 8 9 9 9  r4ct ||z}tdd}|||dS#YdSxYw)Nrww)ryrrrVclose)signrGrrs r5 enter_applyr~se 6<<>>! "C ( (      s AA""A'cNttrTd}d}tD]2}|d}|r|d|zdzz }d}'|d|zdzz }3|dz }t |dSt dtD]$}t |d%dS) Nr5TrrFz,"r6Binaries)r`rLrArrO)r\firstrcrs r5 list_binariesr(sMMM + , ,B??6**D ,#*s**$+++$ f  j + +B "//&)) * * * * + +r4c|ttD]%}td|d&dS)N+r)r`rAr~r)rcs r5 load_binariesr<sCMMM22C00111122r4cttdd}|}||D]}t d|t dS)Nrwr-)ryrrr|r~r)rlinesls r5reload_binariesrBsg $$A KKMMEGGIII COOOOOr4ctdttd}tD]i}|d|krNd}t d||j|tttj|sEtrtddd|zgntd|ztjd dSdS) NTFrrr(r3zno configuration found for %sz&warning: no configuration found for %sr)rWryr`rArr~rlrmrrrLrMrOrPrQ)rGdeletedrcs r5 del_binaryrLsDMMMG ??6 " "f , ,G V $ $ $ M % %b ) ) ) V    MMM   G )-LPV-W!X Y Y Y Y :fE F F F  r4ctdttD]}|d|krdSt d|t d}|d|t |tt tdS)NTrrrG) rWr`rArr~rr r rBr r)rGrcbin_xmls r5 set_binaryrasDMMM ??6 " "f , , FF -V""8,,G (((  ))) VMMMMMr4cR |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|]}||Sr3r3)r?rF is_neededset_datas r5rz#lve_set_default..s* 8 8 8A1h!7!7 8a 8 8 8r4rN set-defaultrdrPrQrve_id)r@r?r>r r$rlrmsetLIMITS_LIST_NAMErr r plan_deleteru) r package_flagrr.rrctag_nto_keeprs ` ` r5rrqs   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 #g}YnxYw||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)rr(F)rr)rArDusernamereseller_users_lists r5_check_reseller_user_pairrst&&t(,,H?""u!,];;! &&&t 5s-3c |dkr0|dd}|d}t||sdStd|rN||dkrBtj|rt |dntt |nc|dkrMtr4t tj|dnt | tn#YnxYw t|d}t|}|r|dnd}t|| n#taYnxYw|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,t.t0f$r|dkr| }nt|||k}|s|dr|dkrDt2d}|dt9||nCt2|}|dt9||| |Y'wxYw-|ddst=t2d}|rN||dkrBtj|rt |dntt |nc|dkrMtr4t tj|dnt |t?|d|<>|s|dr|rt@nd}t2|} |rZ| dt9|| d|d| tBnr|dr4| dtEj#|dj$n)| dt9|dt(D]}||vr|dkr| }nt|||k}|s|dr|dkrDt2d}|dt9||nCt2|}|dt9||| |d}tJD]}|j&'| |d}|st2j(| |ddst=t2|rtj| }t |dt?|d|tR|tR*dt |tj+,|}tj+-|D]3}tj./||t?|| 4|rtaj1| ngtr4t tj|dnt |t?|dnt(D]}||vr|dkrHtB2dddt9||TtB2|ddt9|||ddst=t2t |t?|d|dS)NrrDrFT)r.r/rrkrc6t||dkS)Nrrrrcrs r5rszlve_set..s.AQS.T.T.TX`ahXi.ir4r)rrr.rbrarrdrPrQrsavezskip-update-cfgr/rrz save-username)3rrrWr/r1rr`r0rrrrVrrrdrrrr?r>rr*rr rrr r rNr rrr"rrryrzr@rl insertBefore lastChildrlve_inforHr`lvp_lve_id_listr-rbrrqr )rr.rDrrFrYrjhas_veis_needed_userrcpu_is_different setted_cpuel_listrcr[ is_differentrel_nameaddedel2enables_reseller_limitsrfs r5lve_setrs& {{ _d;; '"(?? 5D #&HW--- 8  f % % ' vD 9 9 9 9 9 v & & & & & 155773855hw6GHHIIIII 6""""   !!'!23-g66 #,49Q<<"7X66666! Aii 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)NrrrjrDrqrs r5rsz!package_set_ext..s?bood.C.CxPWGX.X/V__Z88H_.s7bood.C.CxPWGX.X/=!#!"h ' ' ' - -(?? -$;;33G<---$;;#)#7#7#@#@D --oc(3->P>PQQQQ#)#7#7#<#.s"adx00DQqTW_r4rN)r%list_domain_packages_with_idrr StopIteration)rjrFpanelrCpacks`` r5rrs   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'] } r@)rrvr)packages_users_copyreseller_packages_maps r5rwrws6)--//2333*(N  r4c|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 rDrTrF)rwr)rrD package_namers r5reseller_package_setrs`_-MG$L577---,BWXeBf2f2fd3333tur4c|d}tjsdSd|}tj|sdSt |}|dd}i}|D]}|dr| d}|d dd}|dd kr |d||<|tvr| ||d rd |vrdSd D]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/lve_=rrkrIDEFAULT_PACKAGE_EXTENSIONSr/)rfrer'rXi)rJrKrrrrrrrrrrrkrmemory_to_pageris_limits_equalscreate_cpanel_limitsr@rr&r) rrF package_pathcpanel_package_datanew_cpanel_package_dataold_cpanel_datar line_parts limit_namememory_page_value cpanel_data limit_value limit_lines r5rrswG  " "4744L 7>>, ' '|,,66881!!!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$;<>SF]]  #*S/11uu2   555  4s; A  A c 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 rrdrPrrQ)rer'rfrr) rrrNr rrpage_to_memoryrrr r) package_id xml_packages result_datarcrs r5rrPsK33 ??4 J . .) 3 3 3}}-033G<.rs0rt'<'<'G'kPRP_P_`jPkPkLkr4ch|dko|dkSrprq)rcrrrDs r5rszplan_delete..ts0rt'<'<'G'xBOO\fLgLgkxLxr4rr(r3z"no configuration found for plan %srz+warning: no configuration found for plan %s)rWr`r@rlrmrrrVrrrLrMrPrQrOrg)rrrDrtis_needed_packagercresellers_listrjs`` r5rrms\DMMMGkkkkxxxxx  R  G M % %b ) ) ) V    E   M  6w??N>""a''*!,#GX...  M @GLM    HRLLLL ?7K L L LOOOOOr4c(t||dS)NrC)r)rrrDs r5reseller_plan_deleters}555555r4c t||ddS#ttf$r9|dkr t |n"dt |dzcYSwxYw)Nrrraz{}%ri)rNr rrr rr|)rcr[s r5 get_xml_limitrsY2**3//2??HHIII  #YYY#&%<<{3U\\+cBRTWBW5X5XXXXYs:=ABBcd}|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 rrIr) enumerate) input_stringchar_to_searchordinalcountidxchs r5_get_char_indexz'_normalize_str.._get_char_indexsR ..  GC^## G##JJJrr4NrNrrI)rrrfind)data_strrjson_strtrd_idxlast_idxs r5r.r.sl$tz5(+,,HohQ//G~~c""H GAIh& ''r4cDnrtntdfd }|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|zg}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 rjch|dko|dkSrprq)rcrrDs r5rsz5_package_formatter..wrapper..s5<2??4;P;P+P,Q$&OOJ$?$?=$Pr4cb|dko|d Srprq)rcrs r5rsz5_package_formatter..wrapper..s3<2??4;P;P+P,D(* (C(C$Cr4rcLtrt|nt|Sr>r rs r5rsz5_package_formatter..wrapper..r&r4rer'rjrfrbrkrarrirrPrrQrdrcrgrhNrc3vK|]3}d|d|ddV4dS)rrr(Nrr+r,s r5rBz6_package_formatter..wrapper.. sJZZaa111dhhqwwyy%.H.H.H.HIZZZZZZr4rc`g|]*}|d+Srr r,s r5rz7_package_formatter..wrapper.. s/>>>!dhhqwwyy"-->>>r4)rmrvrrLr.rr@rrNrrr rr rrrr) rrDrrrcrr rrrrrs `` @r5r0z#_package_formatter..wrappers  * $] 3 3 39[))D,D !Q!Q!Q!Q!Q  !D!D!D!D 9[))D59K^L111|T ..))$u+66V ??--d6l;;DL 9 9B  $$ 9%b&11(- uu[=P9Q9QV #$<!"e,,CV 4E4E%G%G%GHK%L!!W !$S//88;HHYY&&""DJJ#J/D11-F2K2KLLV 11-E2J2JKKV *2t44T -b' : :W ,R88V 88G   $ K,DM*4=99::U   @88ZZZZSYZZZZZDD=/CC G>>>>v>>> ? ? s;A FFFr>)rr)rrrr0s``` r5_package_formatterrsO!,gg{2Y))PYG::::::::v Nr4cttdt}tdt}t t t }ttdt }|D]}|||z }tdkr#ttdt }t|D]M\}}tj r|dkr|D]+}tdkr||||z }|||z },Ntr*td d |zd zdSdS) Nr?r@rFrrrITadminr5rr6)r`rrrvr!rDEFAULT_PACKAGErrrCr rJrxrLrOr)rCreseller_packagesr\r7rFrD packages_listreseller_packages r5get_packages_listr sMMM)))""$$H2333&++--  o > > >F":< > >F"6t<<R+?+?uSSSSSSSSSSSSSSSSSSP 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: )rrrr3r4r5get_panel_users_countr3 s  ~  r4ctdtd||r/t|D]#}tt|||"dSdS)NrrFr)rrrr)rrrjrAs r5rr sm&&&IwBBB<!'* < BB!c tt|t||dt|zdzt|zdzdS)NzCan`t put proccess with pid z in lve r]r)rlve_enter_pid_flagsrrN)LVEidPIDflagss r5 limit_pidrA s`  E CHHe.S9JFUSVkkr4cxtt|dt|zdS)NzCan`t release process with pid r)r lve_leave_pidrrN)r?s r5 release_pidrD s4 C*KcRUhh*VWWWWWr4c htttttt t tdS)Nrr,rr>rr@r4rBrFr3r4r5 get_globalsrG" s(l$[$S 0  2 22r4c g}t}tdt}|at|D]&\}}|D]}||kr||g'|S)Nr@)rrvrr extend)rFrj pkg_users_oldrrDrpackage_name_in_keys r5rVrV4 sH"''))M2333&++--"''))N)22C(D(D11$ }#0 1 1 ---000 1 Or4ctjtjdd}|rtj|rt ||\}}|dkrqd|}trtdd|gd Sd|z}tj d |ztj |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)fileName paramName separatorrz2Error while executing Endurance's custom script {}r(rHz error: %sz%s N)rJget_param_from_fileCL_CONFIG_FILErrrrr|rLrMrPrZrVrQ)argsendurance_custom_scriptret_codestd_outr] err_messages r5call_endurance_custom_scriptrXE s*={GaHaHKMMM #27>>2I#J#J #()@$GG' q==LSST[\\G #Ggw%788888)G3    +!5666""""" # # # # =r4ctr)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 )rqrrmmaprrrs r5_page_to_memory_or_bytesr[^ s515.//000 5>>r4ct}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) rr/rHrYr`r6r`rrrrro)reseller_id_list_for_deletecpapi_resellers_listlve_reseller_idlve_reseller_namereseller_id_for_deletes r5remove_absent_resellersrbo s #'&&  1 1 3 344MMM#::@@ @ # 9 9/ J J  (<<<+22?CCC'7+ @ @ @ ' . . ? ? ? ? ? @#>11/000011s8B,CCcttjD]\}} t j|#t $rz t|n[#t$rN tj |t|n#t$rYnwxYwYnwxYwYwxYwdS)zM Remove from LVE all users, which absent in system :return: None N) r r/r1rHrryrrr#r-rr\s r5remove_absent_usersrd s $CHLLNN33    L     ''''   F%%f---OOF++++!D     sYA C A-,C - C89B21C2 B? <C>B? ?CC CC  C )Fr>)r)rrrrrrr)NN)rFT)T)NNN)NFNNr)rrN)FN)r rkN) __future__rrrbuiltinsr past.builtinsrr future.utilsr r typingr r r rr contextlibrrvrrYrrrrZrPrxml.dom.minidomdomminidomrr functoolsrrrrrhrclcommon.constrr)rrrrclcommon.cpapi.cpapiexceptionsrrJcleventsrr cllimits.librclveconfig.ve_configrrrclveconfig.ve_lockrrr r!r"r#r$ clcontrollibr%secureior&GET_CP_PACKAGE_SCRIPTrrrrrrr[rrrrIS_DEBUGrLVErr/r6r;rErSrWrUr5rSr6rrrLrqrrdrrr,rr>r?rr@r4rBrArCrorsrrrrrrrrrrrcontextmanagerrrrrMrrr$r'r*r-rr9rDrMrNrVrTr`rermrrrrrrrrrrrrrrrrrrrr!r1r8r<rDrGrPrZrgrorrruryr~rrrrrrrrrrrrwrrrrrrrr.rrrrr,r+r*r-r.rrr3rr9r;rArDrGrVrXr[rbrdr3r4r5r{s &%%%%%&&&&&&--------++++++++44444444444444     """"""gggggggggggg888888PPPPPPPP%%%%%%OOOOOOOOOOEEEEEEEEDDDDDDDDDDDDDD******,,,,,,?    :  3rz~~mQ// 0 0 !!'+.. E CC E ! ! !E #---C%%%KKK=$3333*             ONN                 ,++++,   111<&%''9<<>> ,$** 4 4 4 """(BC>?    (&   [[[222222   ##D####Lkkk"i"i"iJ+ d38n+ + + + \    & & & & %%% L L L LAAAAAAAAHUUU!!!H ? ? ? 0 0 0 0 4 4 4 4rrr999F"p"p"p"pJ!!!LV)V)V)V)r(ZZZoooXXXrrr,6>%,KKKK`55556$555("....d,>,>,>^: I I IJJJ*   +++(222 *    +&+&+&+&\Fzzzzz55552E5E5E5E5P C # (3-     ! ! !,*S*S*SZ   :####L666YYY$($($(NHHHHX555:555&6664!       mmmm`<<<<   (XXX222$   "###2"1114r4