PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB` sh-3ll

HOME


sh-3ll 1.0
DIR:/usr/share/l.v.e-manager/cpanel/original/
Upload File :
Current File : //usr/share/l.v.e-manager/cpanel/original/CloudLinux.cgi
#!/usr/local/cpanel/3rdparty/bin/perl
# CloudLinux - whostmgr/docroot/cgi/CloudLinux.cgi Copyright(c) 2010 CloudLinux, Inc.
#                                                                All rights Reserved.
#                                          		    http://www.cloudlinux.com
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#WHMADDON:lvemanager:CloudLinux Manager
#ACLS:all

use strict;
use Whostmgr::ACLS          ();
use Whostmgr::HTMLInterface ();
use Cpanel::Encoder::Tiny   ();
use Cpanel::Form            ();
use Cpanel::Locale          ('lh');
use XML::LibXML             ();
use Cpanel::SafeRun::Errors ();
use Whostmgr::Theme         ();

Whostmgr::ACLS::init_acls();

my %FORM      = Cpanel::Form::parseform();
my $cgiaction = $FORM{'cgiaction'};
if ( $cgiaction eq 'chartpng' ) {
    print "Content-type: image/png\r\n\r\n";
    drawChart( $FORM{'lveid'}, $FORM{'timeframe'} );
    exit;
}

print "Content-type: text/html\r\n\r\n";

Whostmgr::HTMLInterface::defheader( lh()->maketext('[asis,LVE] Manager'), '/themes/x/icons/cloudlinux_lve_manager.png', '/cgi/CloudLinux.cgi' );

# Check privileges
if ( !Whostmgr::ACLS::hasroot() ) {
    print qq{
<br />
<br />
<div><h1>Permission denied</h1></div>
</body>
</html>
    };
    exit;
}

my $theme = Whostmgr::Theme::gettheme();
my $self  = 'CloudLinux.cgi';

if ( $cgiaction eq 'editlve' ) {
    editLVE( $FORM{'lveid'} );
}
elsif ( $cgiaction eq 'savelve' ) {
    saveLVE();
}
elsif ( $cgiaction eq 'del' ) {
    delLVE( $FORM{'lveid'} );
}
elsif ( $cgiaction eq 'stats' ) {
    showStats( \%FORM );
}
elsif ( $cgiaction eq 'history' ) {
    showHistory( $FORM{'lveid'}, $FORM{'timeframe'}, $FORM{'username'} );
}
elsif ( $cgiaction eq 'chart' ) {
    showChart( $FORM{'lveid'}, $FORM{'timeframe'} );
}
else {
    showLVEUsage();
}

print "</body></html>\n";

sub delLVE {
    my $lveid = shift;
    Cpanel::SafeRun::Errors::saferunallerrors( '/usr/sbin/lvectl', 'delete', $lveid );
    showLVEUsage("Saved settings...");
}

# Returns true if all the characters in a string are digits
sub isnum { return $_[0] =~ /^\d+$/; }

sub saveLVE {
    my $lveid    = $FORM{'lveid'};
    my $cpu      = trim( $FORM{'cpu'} );
    my $mep      = trim( $FORM{'mep'} );
    my $persist  = $FORM{'persist'};
    my $username = trim( $FORM{'username'} );
    my $mem      = trim( $FORM{'mem'} ) . $FORM{'mem_unit'};
    my $ncpu     = trim( $FORM{'ncpu'} );

    if ( $lveid eq 'custom' ) {
        my $uid = getpwnam($username);
        $lveid = ( defined $uid ) ? $uid : $username;
        if ( !isnum($lveid) ) {
            showLVEUsage("Error! Please, enter valid LVE Id or username.");
            return;
        }
    }

    my @lvectl = ( '/usr/sbin/lvectl', 'set', $lveid );
    if ( isnum($cpu) ) {
        push @lvectl, '--cpu', $cpu;
    }
    if ( isnum($ncpu) ) {
        push @lvectl, '--ncpu', $ncpu;
    }
    if ( isnum( trim( $FORM{'mem'} ) ) ) {
        push @lvectl, '--mem', $mem;
    }
    if ( isnum($mep) ) {
        push @lvectl, '--maxEntryProcs', $mep;
    }
    if ( $persist eq 'on' ) {
        push @lvectl, '--save';
    }
    Cpanel::SafeRun::Errors::saferunallerrors(@lvectl);
    if ( $lveid eq 'default' ) {
        Cpanel::SafeRun::Errors::saferunallerrors( '/etc/init.d/lvectl', 'reload' );
    }
    showLVEUsage("Saved settings...");
}

sub editLVE {
    my $lveid = shift;
    return 1 if ( !$lveid );
    my $safe_lveid = Cpanel::Encoder::Tiny::safe_html_encode_str($lveid);
    my $LVE        = parseLVE();
    my $lve        = $LVE->{$lveid};
    my $dlve       = $LVE->{'default'};
    my $isDefault  = 'default' eq $lveid;
    my $isCustom   = 'custom' eq $lveid;
    my $isSet      = $lve;
    $lve = $lve ? $lve : $dlve;
    printHeader( '', $isDefault ? 'edit_default' : 'edit_custom' );
    print '<fieldset><legend>';

    if ($isDefault) {
        print 'Modify default LVE settings';
    }
    else {
        print "Modify settings for LVE $safe_lveid";
    }
    print <<"EOM";
</legend><form action=$self method=POST>
<table width="90%" padding="10"><tr><td>
   <input type=hidden name=cgiaction value=savelve>
   <input type=hidden name=lveid value="$safe_lveid">
EOM

    if ($isCustom) {
        print 'Username or LVE Id: <input type="text" size="20" name="username"/><br/>';
    }

    my $mem = RoundMemInt( $lve->{'mem'} << 2 );

    # Determine and select appropriate memory unit
    my $selectedK = '';
    my $selectedM = '';
    my $selectedG = '';
    my $unit      = chop($mem);
    if ( $unit eq 'K' ) {
        $selectedK = 'selected';
    }
    elsif ( $unit eq 'M' ) {
        $selectedM = 'selected';
    }
    else {
        $selectedG = 'selected';
    }

    print <<"EOM";
   CPU: <input type="text" size="5" name="cpu" value="$lve->{'cpu'}"/><br/>
   MEM: <input type="text" size="11" name="mem" value="$mem"/>
   <SELECT name="mem_unit">
   <option value="K" $selectedK>KB</option>
   <option value="M" $selectedM>MB</option>
   <option value="G" $selectedG>GB</option>
   </SELECT>
   <br/>
   Concurrent  Connections: <input type="text" size="5" name="mep" value="$lve->{'mep'}"/><br/>
   Number of Cores Per LVE*: <input type="text" size="5" name="ncpu" value="$lve->{'ncpu'}"/>  *requires server reboot for existing LVEs<br/>
   Persist: <input type="checkbox" name="persist" checked/>
   <blockquote><input class='btn-primary' type=submit value='save'>
EOM

    if ( !$isDefault && $isSet ) {
        print "<input class='btn-secondary' type='button' value='reset to default' onClick='location.href=\"$self?cgiaction=del&lveid=$safe_lveid\"'>";
    }

    print <<"EOM";
<input class='btn-cancel' type="button" value='back' onClick='location.href="$self"'>
   </blockquote>
</td><td valign="top" align="right" width="40%">
EOM

    my $dmem = RoundMemInt( $dlve->{'mem'} << 2 );

    if ( !$isDefault ) {
        print "<fieldset><legend>Defaults</legend>CPU: $dlve->{'cpu'}%<br/>MEM: $dmem<br/>Concurrent Connections: $dlve->{'mep'}<br/>Number of Cores Per LVE: $dlve->{'ncpu'}</fieldset>";
    }

    print "</td></tr></form></fielset>";
}

sub printLinks {
    my $page = shift;
    if ( $page eq 'usage' ) {
        print '[Home]';
    }
    else {
        print "[<a href=\"${self}\">Home</a>]";
    }
    print '&nbsp;&nbsp;&nbsp;';
    if ( $page eq 'edit_default' ) {
        print '[Edit Default Settings]';
    }
    else {
        print "[<a href=\"${self}?cgiaction=editlve&lveid=default\">Edit Default Settings</a>]";
    }
    print '&nbsp;&nbsp;&nbsp;';
    if ( $page eq 'edit_custom' ) {
        print '[Edit Settings For Specific LVE]';
    }
    else {
        print "[<a href=\"${self}?cgiaction=editlve&lveid=custom\">Edit Settings For Specific LVE</a>]";
    }
    print '&nbsp;&nbsp;&nbsp;';
    print "[<a href='#' onClick='toggleStats()'>Stats</a>]";
    print '&nbsp;&nbsp;&nbsp;';
    print "[<a href='#' onClick='toggleHistory()'>History</a>]";
}

sub getSelectedTimeOptions {
    my $period = shift;
    my $val    = '';
    foreach my $p ( '10m', '30m', '1h', '4h', 'today', 'yesterday', '7d', '30d' ) {
        $val = $period eq $p ? "${val}:SELECTED" : "${val}:";
    }
    return $val;
}

sub printTimeframe {
    my $opts = getSelectedTimeOptions(shift);
    my @op = split /:/, $opts;
    shift @op;
    print <<"EOM";
Timeframe: <select name='timeframe' size='1'><option value='10m' $op[0]>Last 10 minutes</option><option value='30m' $op[1]>Last 30 minutes</option><option value='1h' $op[2]>Last hour</option><option value='4h' $op[3]>Last 4 hours</option><option value='today' $op[4]>Today</option><option value='yesterday' $op[5]>Yesterday</option><option value='7d' $op[6]>Last 7 days</option><option value='30d' $op[7]>Last 30 days</option></select>
EOM
}

# sub printHistoryHeader {
#    my $lveid = shift;
#    my $cgiaction = shift;
#    my $period = shift;
#    print "<form action='${self}' method='GET'><input type='hidden' name='cgiaction' value='$cgiaction'>";
#    printTimeframe($period);
#    print "<input type=\"submit\"><input type=\"hidden\" name=\"lveid\" value=\"$lveid\"></form>";
# }

# $_[1] = message
# $_[2] = current page name
sub printHeader {
    my $safe_message = Cpanel::Encoder::Tiny::safe_html_encode_str(shift);
    my $page         = shift;
    my $period       = shift;
    my $isStats      = $page eq 'stats' ? 'true' : 'false';
    my $isHistory    = $page eq 'history' ? 'true' : 'false';

    if ($safe_message) {
        print "<h3>$safe_message</h3><br/>\n";
    }
    print <<"EOM";
    <br />
	<script type="text/javascript" src="/js/sorttable.js"></script>
<script type="text/javascript">
var shown=$isStats;
var h=$isHistory;
function toggleStats() {
    if (h) { toggleHistory(); }
    document.getElementById('stats_div').style.display=shown?'none':'block';
    document.getElementById('stats_div').style.visibility=shown?'hidden':'visible';
    shown = !shown;
}
function toggleHistory() {
    if (shown) { toggleStats(); }
    document.getElementById('history_div').style.display=h?'none':'block';
    document.getElementById('history_div').style.visibility=h?'hidden':'visible';
    h = !h;
}

</script>
	<div class="topboxmargin"></div>
        <div align="left">
EOM
    printLinks $page;
    if   ( $page eq 'stats' ) { print '</div><div id="stats_div" style="border:1px solid black">'; }
    else                      { print '</div><div id="stats_div" style="display:none;border:1px solid black">'; }
    print <<"EOM";
<form action="${self}" method="GET">
<input type='hidden' name='cgiaction' value='stats'>
EOM
    printTimeframe($period);
    print <<"EOM";
<br/>
<input type='radio' name='st' value='order-by' CHECKED>Show TOP LVEs By <select name='order-by' size='1'>
<option value=cpu_max>Max CPU</option><option value=cpu_avg>Average CPU</option><option value=mep_max>Max EP</option><option value=mep_avg>Average EP</option><option value=mem_max>Max MEM</option><option value=mem_avg>Average MEM</option>
<option value='total_mem_faults'>Memory Faults</option><option value='total_mep_faults'>Entry Procs Faults</option></select> Limit: <select name='limit' size='1'><option>10</option><option>25</option><option>50</option><option>100</option></select> <br/>
<input type='radio' name='st' value='by-usage'>Show LVEs Approaching Limit <select name='by-usage' size='1'>
<option value=cpu_max>Max CPU</option><option value=cpu_avg>Average CPU</option><option value=mep_max>Max EP</option><option value=mep_avg>Average EP</option><option value=mem_max>Max MEM</option><option value=mem_avg>Average MEM</option>
</select> Using: <select name='percentage' size='1'><option>50</option><option>75</option><option selected="selected">90</option><option>95</option></select>% <br/>
<input type='radio' name='st' value='by-fault'>By Fault <select name='by-fault' size='1'><option value='mep'>Max Entry Processes</option><option value='mem'>Max Memory Limit</option></select> Treshold: <select name='threshold' size='1'><option>1</option><option>10</option><option>50</option><option>75</option><option>1000</option>%</select><br/>
<input type="submit"><input type='reset'><br/>
</form>
</div>
<br/>
EOM

    #History div
    if ( $page eq 'history' ) {
        print '<div id="history_div" style="border:1px solid black">';
    }
    else {
        print '<div id="history_div" style="display:none;border:1px solid black">';
    }

    print <<"EOM";
<form action="$self" method="GET"><input type="hidden" name="cgiaction" value="history">
<input type='hidden' name='lveid' value='custom'>
Username or LVE Id: <input type="text" size="20" name="username"/><br/>
EOM
    printTimeframe($period);
    print '<input type="submit"></form></div>';
}

sub lveIdLink {
    my $safe_lveid  = Cpanel::Encoder::Tiny::safe_html_encode_str(shift);
    my $safe_period = Cpanel::Encoder::Tiny::safe_html_encode_str(shift);
    return "<nowrap><a href=\"$self?cgiaction=editlve&lveid=$safe_lveid\">$safe_lveid</a>&nbsp;(<a href=\"$self?cgiaction=history&timeframe=$safe_period&lveid=$safe_lveid\">?</a>)(<a href=\"$self?cgiaction=chart&timeframe=$safe_period&lveid=$safe_lveid\">c</a>)</nowrap>";
}

sub getUserDomain {
    my $id     = shift;
    my $name   = getpwuid($id);
    my $domain = '';
    if ( $name ne "" && -e "/var/cpanel/users/$name" ) {
        open FILE, "/var/cpanel/users/$name";
        while (<FILE>) {
            if (/^DNS=(.*)/) { $domain = $1; last; }
        }
    }
    return ( $name, $domain );
}

sub showChart {
    my $lveid       = shift;
    my $safe_lveid  = Cpanel::Encoder::Tiny::safe_html_encode_str($lveid);
    my $period      = shift;
    my $safe_period = Cpanel::Encoder::Tiny::safe_html_encode_str($period);
    printHeader( '', 'chart' );

    #   printHistoryHeader($lveid, 'chart', $period);
    print "<br/><a href='${self}?cgiaction=history&lveid=$safe_lveid&timeframe=$safe_period'>[History]</a><br/>";

    #    drawChart($lveid, $period);
    #    exit;
    print <<"EOM";
    <img src="${self}?cgiaction=chartpng&lveid=$safe_lveid&timeframe=$safe_period">
EOM
}

sub drawChart {
    my $lveid  = shift;
    my $period = shift;
    my @params = ( '/usr/sbin/lvechart', "--period=$period", "--id=$lveid", '--width=9', '--height=9', '--dpi=100' );
    my $out    = Cpanel::SafeRun::Errors::saferunallerrors(@params);
    print $out;
}

# Parameters: $FORM{'lveid'}, $FORM{'timeframe'}, $FORM{'username'}
sub showHistory {
    my $lveid       = shift;
    my $safe_lveid  = Cpanel::Encoder::Tiny::safe_html_encode_str($lveid);
    my $period      = shift;
    my $safe_period = Cpanel::Encoder::Tiny::safe_html_encode_str($period);
    my $username    = shift;
    printHeader( '', 'history', $period );
    if ( $lveid eq 'custom' ) {
        my $uid = getpwnam($username);
        $lveid = ( defined $uid ) ? $uid : $username;
        if ( !isnum($lveid) ) {
            print "<h3>Error! Please, enter valid LVE Id or username.</h3>";
            return;
        }
    }

    my @params  = ( '/usr/sbin/lveinfo', '--csv', "--period=$period", "--id=$lveid" );
    my $INPUT   = Cpanel::SafeRun::Errors::saferunallerrors(@params);
    my @results = split( /\n+/, $INPUT );
    my $bg      = 2;
    shift @results;

    #   printHistoryHeader($lveid, 'history', $period);
    print "<br/><a href='${self}?cgiaction=chart&lveid=$safe_lveid&timeframe=$safe_period'>[Chart]</a>";

    print <<"EOM";
	<table id="lveps" class="sortable" width="60%" cellspacing="1" cellpadding="0" border="0">
    <tr>
    <th>From</th>
    <th>To</th>
    <th>aCPU</th>
    <th>mCpu</th>
    <th>lCPU</th>
    <th>aEP</th>
    <th>mEP</th>
    <th>lEP</th>
    <th>aMem</th>
    <th>mMem</th>
    <th>lMem</th>
    <th>MemF</th>
    <th>MepF</th>
    </tr>
EOM

    foreach my $i (@results) {

        # From,To,aCPU,mCPU,lCPU,aEP,mEP,lEP,aMem,mMem,lMem,MemF,MepF
        my ( $from, $to, $acpu, $mcpu, $lcpu, $aep, $mep, $lep, $aMem, $mMem, $lMem, $memf, $mepf ) = split ',', $i;
        $aMem = RoundMemB($aMem);
        $mMem = RoundMemB($mMem);
        $lMem = RoundMemB($lMem);
        print <<"EOM";
    <tr class="tdshade${bg}">
    <td>$from</td>
    <td>$to</td>
    <td>$acpu</td>
    <td>$mcpu</td>
    <td>$lcpu</td>
    <td>$aep</td>
    <td>$mep</td>
    <td>$lep</td>
    <td>$aMem</td>
    <td>$mMem</td>
    <td>$lMem</td>
    <td>$memf</td>
    <td>$mepf</td>
  </tr>
EOM
        $bg = $bg eq '1' ? '2' : '1';
    }
    print "</table></div>\n";
}

sub showStats {
    my $FORM   = shift;
    my $period = $FORM->{'timeframe'};
    printHeader( $FORM->{'message'}, 'stats', $period );
    my $st = $FORM->{'st'};
    my @params = ( '/usr/sbin/lveinfo', '--csv', "--period=$period" );
    if ( $st eq 'order-by' ) {
        push @params, "--order-by=$FORM->{'order-by'}", "--limit=$FORM->{'limit'}";
    }
    elsif ( $st eq 'by-usage' ) {
        push @params, "--by-usage=$FORM->{'by-usage'}", "--percentage=$FORM->{'percentage'}";
    }
    elsif ( $st eq 'by-fault' ) {
        push @params, "--by-fault=$FORM->{'by-fault'}", "--threshold=$FORM->{'threshold'}";
    }
    else {
        push @params, "--id=$FORM->{'lveid'}";
    }
    my $INPUT   = Cpanel::SafeRun::Errors::saferunallerrors(@params);
    my @results = split( /\n+/, $INPUT );
    my $bg      = 2;
    shift @results;
    print <<"EOM";
	<table id="lveps" class="sortable" width="60%" cellspacing="1" cellpadding="0" border="0">
    <tr>
    <th>LVE Id</th>
    <th>User</th>
    <th>Domain</th>
    <th>aCPU</th>
    <th>mCpu</th>
    <th>lCPU</th>
    <th>aEP</th>
    <th>mEP</th>
    <th>lEP</th>
    <th>aMem</th>
    <th>mMem</th>
    <th>lMem</th>
    <th>MemF</th>
    <th>MepF</th>
    </tr>
EOM

    foreach my $i (@results) {

        # ID,aCPU,mCPU,lCPU,aEP,mEP,lEP,aMem,mMem,lMem,MemF,MepF
        my ( $lveid, $acpu, $mcpu, $lcpu, $aep, $mep, $lep, $aMem, $mMem, $lMem, $memf, $mepf ) = split ',', $i;
        $aMem = RoundMemB($aMem);
        $mMem = RoundMemB($mMem);
        $lMem = RoundMemB($lMem);
        my ( $name, $domain ) = getUserDomain($lveid);
        print "<tr class=\"tdshade${bg}\"><td>";
        print lveIdLink( $lveid, $period );
        print "</td>";
        print <<"EOM";
    <td>$name</td>
    <td>$domain</td>
    <td>$acpu</td>
    <td>$mcpu</td>
    <td>$lcpu</td>
    <td>$aep</td>
    <td>$mep</td>
    <td>$lep</td>
    <td>$aMem</td>
    <td>$mMem</td>
    <td>$lMem</td>
    <td>$memf</td>
    <td>$mepf</td>
  </tr>
EOM
        $bg = $bg eq '1' ? '2' : '1';
    }
    print "</table></div>\n";
}

# Function converts kilobytes to megabytes or gigabytes (if needed)
# and appends appropriate suffix (K, M, G). Rounds down and returns integer value of memory.
# Parameter $_[1] = memory in kilobytes
sub RoundMemInt {
    my $mem = shift;

    if ( ( $mem % ( 1024 * 1024 ) ) == 0 ) {
        $mem >>= 20;
        return "$mem" . 'G';
    }

    if ( ( $mem % 1024 ) == 0 ) {
        $mem >>= 10;
        return "$mem" . 'M';
    }

    return "$mem" . 'K';
}

# Function converts kilobytes to megabytes or gigabytes (if needed)
# and appends appropriate suffix (K, M, G)
# Parameter $_[1] = memory in kilobytes
sub RoundMemK {
    my $mem = shift;

    if ( $mem >= ( 1024 * 1024 ) ) {
        return sprintf( "%.1fG", $mem / ( 1024 * 1024 ) );
    }

    if ( $mem >= 1024 ) {
        return sprintf( "%.1fM", $mem / 1024 );
    }

    return "$mem" . 'K';
}

# Function converts bytes to kilobytes, megabytes or gigabytes (if needed)
# and appends appropriate suffix (K, M, G)
# Parameter $_[1] = memory in bytes
sub RoundMemB {
    my $mem = shift;

    if ( $mem >= ( 1024 * 1024 * 1024 ) ) {
        return sprintf( "%.1fG", $mem / ( 1024 * 1024 * 1024 ) );
    }

    if ( $mem >= 1024 * 1024 ) {
        return sprintf( "%.1fM", $mem / ( 1024 * 1024 ) );
    }

    if ( $mem >= 1024 ) {
        return sprintf( "%.0fK", $mem / 1024 );
    }

    return "$mem";
}

# $_[1] = message
sub showLVEUsage {
    printHeader( shift, 'usage' );

    print <<"EOM";
	<table id="lveps" class="sortable" width="60%" cellspacing="1" cellpadding="0" border="0">
          <tr>
             <th>LVE Id</th>
             <th>User</th>
	     <th>Domain</th>
	     <th>Concurrent Connections</th>
	     <th>Processes</th>
             <th>Threads</th>
             <th>CPU %</th>
             <th>Memory</th>
         </tr>
EOM

    my $INPUT = Cpanel::SafeRun::Errors::saferunallerrors( '/usr/sbin/lveps', '-d', '-n', '-c', '1' );
    my @results = split( /\n+/, $INPUT );
    shift @results;
    my $bg = "2";

    foreach my $i (@results) {
        my ( $lveid, $ref, $pno, $tno, $cpu, $mem, $io ) = split ' ', $i;
        my $name   = getpwuid($lveid);
        my $domain = '';
        if ( $name ne "" && -e "/var/cpanel/users/$name" ) {
            open FILE, "/var/cpanel/users/$name";
            while (<FILE>) {
                if (/^DNS=(.*)/) { $domain = $1; last; }
            }
            close FILE;
        }

        my $rmem = RoundMemK($mem);

        print "<tr class=\"tdshade${bg}\"><td>", lveIdLink( $lveid, 'today' ), "</td>";
        print <<"EOM";
    <td>$name</td>
    <td>$domain</td>
    <td>$ref</td>
    <td>$pno</td>
    <td>$tno</td>
    <td>$cpu</td>
    <td>$rmem</td>
  </tr>
EOM

        $bg = $bg eq '1' ? '2' : '1';
    }
    print "</table></div>\n";

}

sub trim {
    my $string = shift;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;
    return $string;
}

# 4:LVE   EP      lCPU    lIO     CPU     MEM     IO      lMEM    lEP     nCPU    fMEM    fEP
# 0       0       25      25      0       0       0       262144  20      1       0       0

sub parseLVE {
    my $file = '/proc/lve/list';
    my $line;
    my %lves;
    my @values;

    open( my $file_handle, '<', $file ) or die( "\n" . 'Error opening file ' . $file . " $!\n" );

    # Skip first line (header)
    $line = <$file_handle>;

    while ( defined( $line = <$file_handle> ) ) {
        @values = split( /\s+/, $line );
        my %hash = ( cpu => $values[2], mep => $values[8], mem => $values[7], ncpu => $values[9] );
        if ( $values[0] == 0 ) {
            $lves{'default'} = \%hash;
        }
        else {
            my $lveid = $values[0];
            $lves{$lveid} = \%hash;
        }
    }

    close($file_handle);

    return \%lves;
}

__END__

use strict;
use XML::LibXML;

sub parseLVEValues {
  my $lve = shift;

  my @cpu_node = $lve->getElementsByTagName('cpu');
  my $cpu = trim @cpu_node[0]->getAttribute('limit');

  my @mem_node = $lve->getElementsByTagName('mem');
  my $mem = trim @mem_node[0]->getAttribute('limit');

  my @ncpu_node = $lve->getElementsByTagName('ncpu');
  my $ncpu = trim @ncpu_node[0]->getAttribute('limit');

  my @mep_node = $lve->getElementsByTagName('other');
  my $mep = trim @mep_node[0]->getAttribute('maxentryprocs');

  my %val = ( cpu => $cpu, mep => $mep, mem => $mem, ncpu => $ncpu );
  return \%val;
}

sub parseLVE {
  my $parser = XML::LibXML->new();
  my $tree = $parser->parse_file('/etc/container/ve.cfg');
  my $root = $tree->getDocumentElement;
  my %lves;
  my @default = $root->getElementsByTagName('defaults');
  $lves{'default'} = parseLVEValues $default[0];
  my @lve_nodes = $root->getElementsByTagName('lve');
  foreach my $lve (@lve_nodes) {
    my $lve_id = trim $lve->getAttribute('id');
    $lves{$lve_id} = parseLVEValues $lve;
  }
  return \%lves;
}