"\WddlZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z m Z mZddlmZdZGdde ZGd d e ZGd d e ZdS) N)ExternalProgramFailed run_command)LveStatsPlugin)atomic_write_csvatomic_write_strdeserialize_lve_id)mempages_to_bytesiseletskc8eZdZddZdZedZdZdS) FileSaver /var/lve/infocF||_tjd|_dS)z:type fname: strzplugin.file_saverNfnamelogging getLoggerlogselfrs /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/plugins/generic/persistors.py__init__zFileSaver.__init__s  $%899c t|j|dS#t$r,}|jd|j|Yd}~dSd}~wwxYw)z9 :type output: list :rtype: None %Error during saving the "%s" file: %sN)rrOSErrorrerror)routputes rwritezFileSaver.writesq  S TZ 0 0 0 0 0 S S S HNNBDJPQ R R R R R R R R R Ss A!A  Ac|j|jkpR|j|jkpB|j|jkp2|j|jkp"|j|jkp|jdz|jk}|dkr|j|jk}nd}|p|S)z :type lve_usage: lvestats.plugins.generic.aggregators.AggregatedLveUsage :type lve_stat: lvestat.LVEStat :type lve_version: int F)lepcpulcpulmemlmemphylnprocioliops)lve_stat lve_usage lve_versionres1res2s rcompare_limitszFileSaver.compare_limits's LIM ) 2|y~- 2} . 29#44 2)"22  2 {T!Y\1  ??>Y_4DDD|trc`|d}|di}|d}g}|D]"\}}g}||t|jt|jt|jt|jt|jt|j t|j t|j t|j t|j t|jt|jt|jt|jdt|jdzt|jdzg|dkr;|t|jt|jg|dgdt-|z z||j||j||j||$|D]\}} t7|\}} | r|r||vrd|vr|jd B|| |d| rAg}||dt| jdt| jdt| j ddt| j ddt| jddddt| jg|dkr)|t| jdg|dgdt-|z z|d|d|d||| |d S) z:type lve_data: dict LVE_VERSION lve_usage_5sstatsrr!z/No defaults collected to compare with, skipping)r+r,r-N)!getitemsextendintmepr# cpu_usager% mem_usager& mem_fault mep_faultr'memphy memphy_faultr(nproc nproc_faultio_usager)r*iopslenappend cpu_fault iops_faultio_faultrrwarningr0r$r) rlve_datar-usagesnew output_rowslve_idvdata new_lvestat is_resellers rexecutezFileSaver.execute=s}- nb11w ' %' %IFAD KKJJJJ $$KK $$KK $$ $$ NNMM''MMLL && OOt+II%%   ,a AG AF  KKSYY/ 0 0 0 KK $ $ $ KK % % % KK # # #   t $ $ $ $#&99;;5 -5 - FK"4V"<"< FK / -&..F??H$$%VWWW&& vay^i&jj'-DKK" 00 00 011 344 233 //%,#a'' #K$5 6 6 !KKSYY 7888KKNNNKKNNNKKNNN&&t,,, ;rN)r )__name__ __module__ __qualname__rr staticmethodr0rVrrr r si:::: SSS\*e e e e e rr cleZdZdZddZdZdZedZdZ dZ d Z d Z d Z d Zd ZdZdS)MySQLTopFileSaverz/usr/sbin/dbtop/var/lve/cloudlinux_dbtop.jsonc||_d|_tjd|_||_|jr|dSdS)Nz/var/lve/governor.tsz"plugin.cloudlinux_dbtop_file_saver)r touch_fnamerrr_check_dbtop_exist _dbtop_exist_create_touch_filers rrzMySQLTopFileSaver.__init__se 1$%IJJ 3355   &  # # % % % % % & &rcn||j||jdS)z* Try delete created files N)_try_unlink_filer`rrs r__del__zMySQLTopFileSaver.__del__s7 d./// dj)))))rcN|jd| tj|dS#t$r8}|jdkr"|jd||Yd}~dSYd}~dSd}~wt$r'}|jd||Yd}~dSd}~wwxYw)zb Try delete file; push warning to log if wrong :param fname: path to file zDelete %s filezCan't delete %s file; %sN)rdebugosunlinkrerrnorL SystemError)rrrs rrez"MySQLTopFileSaver._try_unlink_files '/// D Ie      H H Hw!||  !>>                  HT%sC 0 0 0 HT%u - - - - -! Q Q Q HNN5t7GQ P P P P P P P P P Qs^C&AC&#A<9C&;A<<C&B$ C&$B((C&+B(,8C&&D07.D++D0cd}d}|dvr||fSd|vrd}nd|vrd}n d|vrd}nd} t|dd }n2#ttf$r|jd |YnwxYw||fS) z= :rtype: (str, int) :type value: str -r)rr6r$readrunknown/rpz could not parse cause string: %s)r;splitrr}rr)rr~cause_of_restricttime_of_restricts r_parse_dbtop_causez$MySQLTopFileSaver._parse_dbtop_causes   I  $&66 6 E>> %   u__ &      '   )  F"5;;s#3#3B#788  *% F F F HNN=u E E E E E F "222s(A,A=<A=c|jd|jtj|jS)zO Check if dbtop util exist :return bool: True if exist zCheck exist %s file)rrjdbtoprkpathexistsrfs rraz$MySQLTopFileSaver._check_dbtop_exists3 ,dj999w~~dj)))rc  |}nR#t$rE}dt|vr(|jdt|icYd}~Sd}~wwxYwi}|ddD]} |\}}}}} nM#t $r@}|jdt|t|Yd}~dd}~wwxYw|| \} } t|dd| |dd| |ddz| | d||<|S) zT Try obtain and parse data from dtop -c output :rtype: dict zCan't connect to socketzdbtop execution is failed: %sNzCan't unpack output: %s %srr)r$r)rr) _get_dbtop_outputrrrrrr}rr;r) r dbtop_outputrresultruserr$rrcauserrs rget_dbtop_infoz MySQLTopFileSaver.get_dbtop_info s  1133LL$   (A66>AGGGIIIIII "122&  F 06 -c4   >!,--,,TZZ__Q-?@@4CYCYZ_ZeZefiZjZjklZmCnCnn%6$4 F4LL  s2 A&:A!A&!A&9B C6CCc|jdg}|jdd|t |}|dS)zJ Run dbtop -c and split output :return list[str]: z-czRun "%s" command  )rrrjjoinrstripr)rcmdrs rrz#MySQLTopFileSaver._get_dbtop_output&s^ z4  )388C==999"3'' !!##))$///rc|jd|jtj|} t |j|dS#t tf$r,}|jd|j|Yd}~dSd}~wwxYw)za Dump datat to file as json string :param result dict: data to need dump zDump data to %s filerN) rrjrjsondumpsrrrrrr json_resultrs r_outputzMySQLTopFileSaver._output0s -tz:::j((  S TZ 5 5 5 5 5! S S S HNNBDJPQ R R R R R R R R R SsA B !BB ctj|jo5t jtj|jjz dkS)z Check needed dump data to file. If touch file exist and was touched last 60 seconds we need dump data :return bool: <)rkrrr`timestatst_mtimerfs r _need_dumpzMySQLTopFileSaver._need_dump<sA w~~d.//jDIKK"'$JZB[B[Bd4dhj4jjrc|jr?|r-|d|idSdSdS)N dbgov_data)rbrrr)rrMs rrVzMySQLTopFileSaver.executeDsa   @!2!2 @ LL,(;(;(=(=> ? ? ? ? ? @ @ @ @rN)r^)rWrXrYrrrgrerZrrcrrarrrrrVr[rrr]r]s E&&&&*** D D D < <\ <QQQ.333.***6000 S S Skkk@@@@@rr]c"eZdZddZdZdZdS)CloudLinuxTopFileSaver/var/lve/cloudlinux_top.jsoncF||_tjd|_dS)Nz plugin.cloudlinux_top_file_saverrrs rrzCloudLinuxTopFileSaver.__init__Js  $%GHHrctj|} t|j|dS#tt f$r,}|jd|j|Yd}~dSd}~wwxYw)Nr)rrrrrrrrrs rrzCloudLinuxTopFileSaver._outputNsj((  S TZ 5 5 5 5 5! S S S HNNBDJPQ R R R R R R R R R Ss-A*!A%%A*c v|d}|di}gg}}t|D]\}}t|\}} |dkr||jd|jdz id|jit|j|j d|j d|j dz id|j it|j |jdd} |dkr |j| d d <|j| d d <| r|| || |||d dS) Nr2r3rallgY@)epr$r)mempno)idusagelimitr5rrFr)users resellers)r8listr9rr<r=rEr rArCr#r%r)r'r(rFr*rHr) rrMr-rNrrrrrQrUrs rrVzCloudLinuxTopFileSaver.executeUsj}- nb11ryv||~~.. ' 'JC"4S"9"9 FKzz#i %u'>?$en50>>${ $i %uzE'9:$eh/0??$| &!##,1JDM&),1KDM&)'$$T****LL&&& u9==>>>>>rN)r)rWrXrYrrrVr[rrrrIsMIIIISSS"?"?"?"?"?rr)rrrrkrrclcommon.utilsrrlvestats.core.pluginrlvestats.lib.commons.funcrrrlvestats.lib.commons.sizeutilr __author__r r]rr[rrrs>  ========//////\\\\\\\\\\;;;;;;  K K K K K K K K \a@a@a@a@a@a@a@a@H.?.?.?.?.?^.?.?.?.?.?r