8mScddlZddlZddlZddlZddlmZddlmZddlmZm Z m Z m Z m Z ddl Z ddlZddlmZddlmZddlmZmZmZddlmZdd lmZmZdd lmZmZdd l m!Z!dd l"m#Z#dd l$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1m2Z2m3Z3dZ4Gdde5Z6dZ7d dZ8dZ9ej:fdZ;ej<j=j>j?d!dZ@d"dZAdZBdS)#N) defaultdict)datetime)DictListOptionalTupleUnion)cpapi)getuser)GovernorStatus MySQLGovernorMySQLGovException)config)dateutilfunc)deserialize_lve_idget_users_for_reseller) setup_logging)g_users_manager)make_db_engine)main_)LVEList)HistoryShowUnion)HistoryShowDBGov)setup_statistics_parser)username_to_uid_localreseller_to_uiduid_to_usernamezN/Ac eZdZ d!dZedZd Zd Zd Zd Z d Z dZ dZ dZ dZdZedZdZdZedZedZdZdZdZdZd"dZedZdZd ZdS)#CloudLinuxStatisticsN?r<c d|_d|_||_||_d|_d|_| |_| |_|jdup t|jttf|_ g|_ g|_ g|_d|vrgd}d|D|_|||_||_|||jg|_g|_d|_d|_||jr| |_n| |_| |_d|_d|_||||_||_t?|_ tCj"|j#j$|_%|&|_'tQdkr|)n tU|_+dS)z Initializes statistics object used by SPA UI. Note, that if we set order_by to mysql_*, and set by_usage or by_fault, end result will will not be ordered by mysql_ column, using uid for ordering instead Nrall) cpuepvmempmemnprocioiopsr+mysqlc6g|]}|S)lower).0ss /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/cloudlinux_statistics.py z1CloudLinuxStatistics.__init__..Ls ===1QWWYY===root), order_by_lve order_by_gov server_idengine limit_gov limit_lveuid time_unit isinstancelisttuple is_many_uids _lve_results _gov_results_resellers_results show_columnsnormalize_by_faultby_faultorder_by init_order_by_show_columns_lve_show_columns_gov_gov_key_index_lve_key_indexinit_show_columnslimit by_usage_lve by_usage_gov init_by_usageby_usage_percentage thresholdr mysql_governorlogging getLogger __class____name__log _show_mysql show_mysqlr _get_admin_uidsset _admins_uids) selfr;rGrJr:by_usagerUrIrVrQr>r?s r4__init__zCloudLinuxStatistics.__init__+s$! " " H,S 48dE]0S0S"$ L aaaL== ===//99    8T]333!#!#""      #"DNN"DN    8$$$#6 "+oo$T^%<==**,,6=ii66I6ID00222suur6c tdtjDdhz S#tjtf$rtcYSwxYw)Nc34K|]}t|VdSN)r)r2admins r4 z7CloudLinuxStatistics._get_admin_uids..hs+PP,U33PPPPPPr6)r`r admins NotSupportedAttributeErrorr0r6r4r_z$CloudLinuxStatistics._get_admin_uidsesc PPPPPPPTXSYY Y"N3   55LLL s-0$AAcF|jod|jvS)Nr.)rWis_governor_presentrG)rbs r4r]z CloudLinuxStatistics._show_mysqlls$"6688YWHY=YYr6c8||vr||SdSrg)index)rblist_keys r4 _index_ofzCloudLinuxStatistics._index_ofps$ %<<;;s## # usernames r4 get_usernamez!CloudLinuxStatistics.get_usernames&"3 TT(=(r6ctt}|jD]}|dkr d||d<|jrd|dd<d|dd<|S)zS Return default info about user usage (mysql) :rtype: dict r.lver'r,)rdictrGr^)rb usage_fieldrs r4_get_default_user_usagez,CloudLinuxStatistics._get_default_user_usagesl "$'' ' 1 1F  -0 F#E* ? -*-K w '),K g &r6ctt}|jD]}|dkr d||d<|jr.||\}}||dd<||dd<|S)zT Return default info about user limits (mysql) :rtype: dict r.rrr'r,)rrrGr^get_user_limits_safe)rbr limit_fieldr cpu_limitio_limits r4_get_default_user_limitsz-CloudLinuxStatistics._get_default_user_limitss "$'' ' 1 1F  -0 F#E* ? 2"&";";H"E"E Ix*3K w ')1K g &r6c8i}|jD]}|dkrddi||<|S)Nr.rr)rG)rb fault_fieldrs r4_get_default_user_faultsz-CloudLinuxStatistics._get_default_user_faultss9 ' 1 1F  ',aj F#r6c |jr(t|\}}||}n1t|j\}}||j}|||d}|jdgkr||d<|jrl|r|||dn|||tj |dpttj |dptdn:|t|t||jzd|S) N)usagelimitsr.r)rwnameF) raise_exc)rwrdomainreseller)rurv)rCrrr>rrrGrupdater get_domainr get_resellerintr?)rbikey_ is_resellerritems r4get_itemzCloudLinuxStatistics.get_items~   3/55NA{((..HH/99NA{((22H113333H==     ) )!::<joinrGr:r;rJrIrDrE)rb lve_results gov_results period_from period_tofrom_gov_to_lve_indexesfrom_lve_to_gov_indexesgov_keyslve_keysnot_in_gov_indexesnot_in_lve_indexeslendifffrom_formatted to_formatteds r4 process_dataz!CloudLinuxStatistics.process_data sn6:5I5I+Wb5c5c 3!8 k k  2 f{++KK   f334K[ZlmmKK   f334K[ZlmmKK'+'7'7+xYd'e'e $K{##c+&6&66 a<<(112BCCN$--.>??L H  8.,*++T^ T]DM   ('r6c,d}d}t|}t|}g}g} t||zD]W} ||kr<|dg||z z| ||dn||kr;| dg||z z|||dn||||krA|||| |||dz }|dz }||||kr7|d| |||dz }"| d||||dz }Y| |fS)Nrr#)rrangeextendappend) rrrrlve_posgov_poslve_lengov_lenrDrErs r4rz CloudLinuxStatistics.sort_by_key*sk""k""  w())  A'!!##TFg.?$@AAA##K$9:::'!!##TFg.?$@AAA##K$9::: HW$555##K$8999##K$89991 1 '"Xg%666##D)))##K$89991 ##D)))##K$89991 \))r6cg}|D]5}||d|||6|D]}||||}|Srg)r)indexesresultsnot_in_indexes_resultsrps r4rz)CloudLinuxStatistics.sort_by_another_listNs} 0 0E}%%%%////# , ,E OOGEN + + + +r6c jrd|D fd|D}jsjrd|D fd|D}fd|D}fd|D}||}dt |D}||}dt |D}||||||||fS) Ncg|] }|d Srr0r2rs r4r5z8CloudLinuxStatistics.process_indexes.._222!222r6c(g|]}|dv |Srr0)r2rgov_uidss r4r5z8CloudLinuxStatistics.process_indexes..`'LLL3Q89K9K39K9K9Kr6cg|] }|d Srr0rs r4r5z8CloudLinuxStatistics.process_indexes..brr6c(g|]}|dv |Srr0)r2rlve_uidss r4r5z8CloudLinuxStatistics.process_indexes..crr6c*g|]}|jSr0)rNr2rrbs r4r5z8CloudLinuxStatistics.process_indexes..d!@@@qAd)*@@@r6c*g|]}|jSr0)rOrs r4r5z8CloudLinuxStatistics.process_indexes..err6cg|] \}}|| Srgr0r2irs r4r5z8CloudLinuxStatistics.process_indexes..g"\\\DAqRSR[aR[R[R[r6cg|] \}}|| Srgr0rs r4r5z8CloudLinuxStatistics.process_indexes..irr6)rSrRrI get_indexes enumerate) rbrrrrrrrrrrs ` @@r4rz$CloudLinuxStatistics.process_indexes\s7   M22k222HLLLL+LLLK   M  M22k222HLLLL+LLLK@@@@K@@@@@@@K@@@"&"2"28X"F"F\\I6M,N,N\\\"&"2"28X"F"F\\I6M,N,N\\\&(? k k  23 3r6c$fd|DS)Nc<g|]}|Sr0)rs)r2r> second_uidsrbs r4r5z4CloudLinuxStatistics.get_indexes..qs'GGGS{C00GGGr6r0)rb first_uidsrs` `r4rz CloudLinuxStatistics.get_indexesos!GGGGGJGGGGr6c|rL||j||j}|||j|S|jr ||jkr|jsL||j||j}|||j|S|js|jr|j |}|7|||j }| ||n+||j||j}|||j|S|j|}|7|||j}|||n+||j ||j }| ||j |St)zS :type resellers: bool :type key: int :rtype: dict ) rrFrOrrQr^rDr9r<rErNr IndexError)rbrr resellersrrs r4 get_valuezCloudLinuxStatistics.get_valuess  ==!8!=d>Q!RSSD%%dD,CC,HII I sTZ//? H}}T%6s%;D? " # #r6c|r@|dr|tdd|_dSd|zf|_dSdS)Nr.rrx)rrrSrR)rbrcs r4rTz"CloudLinuxStatistics.init_by_usages[  4""7++ 4$,S]]^^$<!!!$'(NO!!!  4 4r6c*tj|}tj|}|jr|t|j|||j|j|j|j|j|j |j |j |j |j  }||}ng}|jr[t#|j|||j|j|j|j|j|j |jd|j }ng}|jrbg}|D][} t1| |j\} } | |jvr)| r|j| F|| \|}|||||dS)zGenerate statistics.) dbenginerrr>r?rGr:rJrcrUrIrVrQT) rrrr?r:rGrJrcrUrQreverser>N)r local_to_gmrLrr;r>r?r:r8rRrUrIrVr=set_normalised_outputproceedr^rrMr9rSr<history_dbgov_showrCrrOrarFrr) rbrrperiod_from_gm period_to_gm history_showrrusersrr>rs r4generate_statisticsz(CloudLinuxStatistics.generate_statisticss"-k::+I66  ! +*lH.!3.**$($<.n & & &L  . . 0 0 0&..00KKK ? **&..!3**$($<nH   ! "" KK   E# ' '#5d4;N6O#P#P [$+++'+2248888LL&&&&K +{KKKKKKr6) r!NNr"Nr#rNr$)F)r[ __module__ __qualname__rd staticmethodr_r]rsrPrKrrrrrrrrrrrrrrrrrHrTrr0r6r4r r *s  #8U8U8U8Ut\ ZZZ$$$ QQQ4 9 9 9)))      :     \ (((@!*!*\!*F  \ 333&HHHB$$$ **** ##\#4445L5L5L5L5Lr6r c tdkrtjStj||rt |p t}t ttt tt|}t|p t}|r||vs||kr|ngS|| |n|}|S)z= Get uid that should be selected from history table; r7) r osgetuidrbuild_users_cacherrAfilterboolmaprrr) for_resellerr> users_listid_ reseller_uids r4_get_uid_for_selectr.s yyFy{{%l333 +L,EGIIFF 6$S)> %K%K L LMMNN&|'@wyyAA   D**|(;(;33 C  # JJ| $ $ $ Jr6c|jsdSt|j|j}t ||||}t |}|dfS)z Get command response and exitcode. :type log: None | logging.Logger :type engine: sqlalchemy.engine.base.Engine :rtype: (str, int) )z Only JSON mode supported for nowr)jsonr.r*rwget_statistics dump_json)r;optionsr\r, statistics json_datas r4executer7 sR <655 g2GJ ? ?CS'::J*%%I a<r6c.tj|}|Srg)r1dumps)r5r6s r4r3r3s :&&I r6c d|d}|j'|j |gkrd|jd|jd}||d<|S t||j|j|j|j|jdz |j|j |j ||j  }| t|d |jt|}t|d } |jr ||d <| |d <n||d<nM#t"$r@} t%| |d<|r"|t%| Yd} ~ nd} ~ wwxYwt)j\} } | |d<| t,jkr| j|d<| j|d<|S)Nsuccess)r timestampz Permission denied. User with id z does not belong reseller ``rgY@) rGrJr:rcrUrIrVrQr>r?ruT)rrrusermySqlGovrr)r*rwr showrJr:rc percentagerIrVrQr?rgetattrrvrrC Exceptionstrerrorrget_governor_statusr ERRORr r) r;r,r\r4r<r error_msgstatlvelistlvelist_resellersrstatusrEs r4r2r2#sF'GJ,Bsbyy Nz N N6=6J N N N %x #  %'% ' 2T 9%'-' ) ) )   &!9!97:FFF$--#DD999   %%F7O"3F;  $F6N q66x   IIc!ff    ,..MFEF: %%%!My!My MsB*C D**6D%%D* localhostc|'tidtjtj}t ||}t |||\}}t ||S)z- Execute command and return exitcode Nr ) caller_name file_level console_levelr\)rrXWARNINGFATALrr7print)r;argv_r:r\r4json_str exit_codes r4mainrY]sh  { .!-     &eY77G!&'s;;;Hi (OOO r61dcRtj}t|}|dd}dddd|zg}t ||}t ||d\}}t j|}|d } |d } t| t| fS) z: Return amount of users and resellers with faults r:rMz --by-faultr--jsonz --period=NrRrr) r read_configrgetrr7r1loadsr) periodcnfrr:opt_listr4rWrr6rrs r4#get_users_and_resellers_with_faultsrcqs    Cc""H [11IeX{V/CDH%h ::G(G666KHa 8$$I+&I g E u::s9~~ %%r6cvttjddt|dddtt t j|dz dzg}|rtj|} td |d D}n#ttf$rd}YnwxYw|S) Nr\z--idz--show-columnsmPMemz--periodr$m)rVc3&K|] }|dV dS)reNr0)r2xs r4riz)get_max_memory_for_lve..s&??aqz??????r6data) rrr]rDrmathceilr1r_max ValueErrorKeyError)lve_idperiod_secondsri parsed_datamax_pmems r4get_max_memory_for_lverss V.> CDInr6I,J,J(K(K$L$Ls$RT   D  'j&& ??;v+>?????  ! OsB B65B6rg)rMN)rZ)Cr1rXrjr$ collectionsrrtypingrrrrr sqlalchemylvestats.lib.commons.decoratorslvestatsclcommonr clcommon.cpapi.pluginlibr clcommon.libr r r lvestats.librlvestats.lib.commonsrrlvestats.lib.commons.funcrrlvestats.lib.commons.logsetupr"lvestats.lib.commons.users_managerrlvestats.lib.dbenginerlvestats.lib.info.lveinfomainrlvestats.lib.lve_listrlvestats.lib.lveinfolibrlvestats.lib.lveinfolib_govr1lvestats.lib.parsers.cloudlinux_statistics_parserrlvestats.lib.uidconverterrrrrobjectr r.r7r3gm_datetime_to_unixtimestampr2libcommons decorators no_sigpiperYrcrsr0r6r4rs  ######55555555555555&&&&,,,,,,IIIIIIIIII////////PPPPPPPP777777>>>>>>000000//////))))))444444888888UUUUUU  DLDLDLDLDL6DLDLDLN4$8(799 7777t  +,+& & & & &     r6