Y^c%)ddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z ddl mZddlmZddlmZddlmZdd lmZd Zd Zd Zd ZejjjjddZdZ GddZ!dS)N)dbengine uidconverter)dateutil)prepare_data_json)lve_read_snapshot_parser)Snapshot)incident)or_) sessionmakerz?Snapshots collected starting from %s to %s for lve id %d @ %s: zDone.. localhostcJ|jr |j\}}n|jr |j}|dz}nz tjd|j}tjd|j}n #t$rtdYdSwxYw||fS)Ng !? z:please use [YY]YY-MM-DD[ HH:MM] format for --from and --to)NN) period timestampr parse_datejoinffromto ValueErrorprint)optsstartends /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/snapshots/reader.py_calculate_periodrs { [ ss  h '(<(<==E%chhtw&7&788CC    N O O O::  #:sABBBc zt}||}|js,|js%|t ddS|j|jr|jst ddS tj |}n,#tj $r}t |Yd}~dSd}~wwxYw| dt}|jrBB<"B77B<ct|tjr&tjtj|S|S)z Convert local datetime to unix timestamp, or just passes unix timestamp as output if specified. :param o: :return: ) isinstancedatetimergm_datetime_to_unixtimestamp local_to_gm)os r_try_convert_to_timestampr@`s;!X&''N4X5I!5L5LMMM HceZdZ ddZddZdZdZdZed e j fd Z ed Z d Z d ZdZdZdZdZdZdZedZdZdS)r+FNc ||_||_||_||_t ||_t ||_||_||_| |_ dddddddd|_ d S) a :param start: datetime.datetime | int (unix timestamp) :param end: datetime.datetime | int (unix timestamp) :param uid: :param server_id: :param output_file: filename :param do_json: boolean :param compact_mode: boolean - truncate SQL queries for memory efficiency :param snap_sql_item: int - index of specific SQL query to return (only with --timestamp) CPUzVirtual memoryEPzPhysical memoryNPROCIOIOPS) cpu_fault mem_fault mep_fault memphy_fault nproc_faultio_fault iops_faultN) r5do_json output_filer7r@rrr compact_moder$ fault_names) selfr5rrr7rrQrPrRr$s r__init__zLVEReadSnaphot.__init__ns.  &.u55 ,S11"(*)-"   rAc|s|Sg}|D]{}t|dkrQ|d|d|d}}}t||kr |d|dz}||||gf||||S)a  Truncate SQL queries for compact mode to reduce memory usage. :param snap_sql: List of SQL query arrays [cmd, time, sql_query] :param max_length: Maximum length for SQL query strings :return: List of truncated SQL query arrays rrNz...)lenappend)rTsnap_sql max_length truncated query_entrycmdtimesqls rtruncate_sql_queriesz#LVEReadSnaphot.truncate_sql_queriess O # . .K;1$$!,QQQ3Ts88j((kzk*U2C  #tS!12222  ----rAct|}|s+|d|dSt|dkr+|d|dS|d}|dg}|jdks|jt|krLd|jdt|dz }|d |d |dS||j}d|d }|t j|d |d|dS)z Handle --snap-sql-item request: return specific SQL query by index. :param snapshots_generator: Generator of snapshot data :param out: Output stream :return: None (writes JSON directly to output) zI{"success": 0, "error": "No snapshot found for the specified timestamp"} Nrz\{"success": 0, "error": "--snap-sql-item only works with --timestamp for single snapshots"} rr\zSQL item index z$ out of range. Available indices: 0-z{"success": 0, "error": "z"} )successdatarY)indent )r.writeflushrZr(r$r%dumps) rTsnapshots_generatoroutsnapshots_list snapshot_datar\ error_msgsql_itemresults r_handle_sql_item_requestz'LVEReadSnaphot._handle_sql_item_requestsj122  IIb c c c IIKKK F ~   " " IIu v v v IIKKK F&q)  $$Z44   ! !T%73x==%H%Hu$*<uubefnboborsbsuuI IIC9CCC D D D IIKKK FD./11 $*VA.../// $ rAc |ttj|jktj|jkt tj|j|j tj |j|j  tj SN) queryr filterr7rr incident_start_timebetweenrrincident_end_timeorder_byall)rTsessions r get_incidentszLVEReadSnaphot.get_incidentss MM( # # V ("dn4088TXNN.66tz48LLXh2 3 3 SUU rAc g}||D]T}||jt|j|jpdd|j||dU|S)Nrrfromr incidents snapshotsduration)r~r[rxmax dump_timerzsnapshot_count get_duration)rTr}rris rstats_by_incidentz LVEReadSnaphot.stats_by_incidents##G,,  A MM1ak1+>+C!DD!"!"!1 $ 1 1! 4 4      rArct|j|}tt|j|jpd|}||z S)Nr)rrxminrrz)rfrom_to_s rrzLVEReadSnaphot.get_durationsAA)511#ak1#6#;!< >ddHDVW[W_D`D`dddeee @ @D IIg    IIE!3DL!A!AEEE F F F IIAx1$t*==AAA B B B II;d;&7;;; < < < II;d;&7;;; < < < II>T*%5>>> ? ? ? ? rAc. tj|}|j|jz |kr|j|z |_d}n#t$rd}|dk}|sYnwxYwt |j} |r||}n|||}| |j r| |n| || dS#| wxYw)NFauto)bind)r parse_period2rrrr r5rr expunge_allrPrrclose)rTstats_unit_strrgroup_by_incidentr}r/s rr/zLVEReadSnaphot.stats;s@  .~>>Ix$*$y00!X 1 %     I .& 8 $     1,DK00022   D..w77//CC    ! ! !| (%%e,,,,  ''' MMOOOOOGMMOOOOs8;AA4A4C>>Dctd|ji}|||j|jdS)Nr7)rr7report get_snapshotsrr)rT snapshots_objs rr1zLVEReadSnaphot.runXsB %!233  M// DHEEFFFFFrAc ptd|ji}||j|j}|}|jr#|t|n|dtj |jdtj |jd|jd|D]>}|tj ||d?|t| dS)Nr7zSnapshots timestamp list; from rz for lve id rh) rr7 get_ts_listrrrrPrirrr REPORT_FOOTERrj)rTrrnrmtss rr.zLVEReadSnaphot.list\s0eTX.// "..tz48DDiikk < % II'77 8 8 8 8 IIM(2DTZ2P2PMM(22MM@DMMM   %   (,R00111 $ IIm $ $ $ rAc|}|jr|j|||dS|dd}|D]l}|jr"d|vr||d|d<|s|dnd}|tj|m|d|d| dS|ttj |j tj |j|j|jfzd}|D]F}|jr"d|vr||d|d<||||d z }G|dkr|d |t$| dS) Nz&{"success": 1, "data": {"snapshots": [Tr\z, Fz]}}rhrrz2No snapshots found for the specified time period. )rrPr$rsrirRrcr%rkrj REPORT_HEADERrrrrr7rformat_snapshotr)rTrlrmfirst_snapshotrors rrzLVEReadSnaphot.reportmsiikk < !---.A3GGG II> ? ? ?!N!4 5 5 $e})D)D040I0I-XbJc0d0dM*-%+IIdOOOO%*N $*]334444 IIe    IIdOOO IIKKK F X/ ;;X=OPTPX=Y=Y[_[ceiest t   0  M  aZ=%@%@,0,E,EmT^F_,`,` j)  m 4 4 4 a NN Q   IIK L L L -    rAcx|jr( t|jddS#t$rYnwxYwtjS)Nwzutf-8)encoding)rQrIOErrorsysstdout)rTs rrzLVEReadSnaphot.opensT    D,cGDDDD    zs  --ci}|D]B\}}d|vr0|d}i}||d<|d|d<||d<|d|d<|||<:|d}|ddkr,t|ddd|d<|ddkrt|d|d<||vr|ddkr@||ddkr||dxx|dz cc<n|d||d<|ddkrA||ddkr||dxx|dz cc<*|d||d<=|||<Dt|}|S)a Aggregate process data by PID by summing CPU % and MEM for same PIDs :param process_data: input data. Dictionary: { u'151048': {u'MEM': u'1', u'CMD': u'bash', u'PID': u'151048', u'CPU': u'0%'}, u'151047': {u'MEM': u'1', u'CMD': u'su cltest1', u'PID': u'151047', u'CPU': u'0%'}, u'153642': {u'MEM': u'1', u'CMD': u'./threads', u'PID': u'153640', u'CPU': u'0%'}, u'153641': {u'MEM': u'1', u'CMD': u'./threads', u'PID': u'153640', u'CPU': u'0%'}, u'153640': {u'MEM': u'1', u'CMD': u'./threads', u'PID': u'153640', u'CPU': u'5%'} } :return: Output data - List of dictionaries: [ {u'MEM': u'1', u'CMD': u'bash', u'PID': u'151048', u'CPU': u'0%'}, {u'MEM': u'1', u'CMD': u'su cltest1', u'PID': u'151047', u'CPU': u'0%'}, {u'MEM': u'3', u'CMD': u'./threads', u'PID': u'153640', u'CPU': u'5%'}, ] PIDCMDMEMrDN/A%)itemsintreplacer.values) process_data thread_dict_ proc_datapidprocess_data_newout_datas r_process_data_aggregatez&LVEReadSnaphot._process_data_aggregates0 (..00! -! -LAyI%% &#% *- '*3E*: '*- '*3E*: '#3 C E"C5((#&y'7'?'?R'H'H#I#I % 5((#&y'7#8#8 % k!!U#u,,"3'.%77#C(///9U3CC////2;E2B C(/U#u,,"3'.%77#C(///9U3CC////2;E2B C(/$- C   **,,--rAc |dtj|dd|dd|d|dD]:\}}|d|j||d |d;|d rz|d t jgd }tt|j |d || |d t}t|d D]; t D]}||>> rz, UID r7rhz Faults: snap_faultsz * z: r\z SQL Queries: )rTimez SQL-queryz Processes: snap_procrrz Memory (Mb)rDzCPU (%)rlc<g|]}|dS)r)r().0krfs r z2LVEReadSnaphot.format_snapshot..s'AAA!488Au--AAArAz snap_httpzHttp requests: )PidDomainz Http typePathz Http versionr)rirrrrSr( prettytable PrettyTabler.mapadd_row get_stringsetrkeysaddr[alignrstr)rTrmrorv sql_tablefieldskey data_keys table_columnstablesnap_proc_aggr http_tablerfs @rrzLVEReadSnaphot.format_snapshots g+M+,FGGgg}]bOcggghhh -   !-06688 B BDAq II@T-11!Q77@@1@@@ A A A A  $ . II( ) ) )#/0L0L0LMMI Y& j(ABB C C C IIi**,, - - - "###{3::<<==  DDIIKK((   3 %MM  F??   / / /   U # # # F??   + + +   U # # # F??   ' ' '   U # # #' 66 M ! !!$EK 55mK6PQQ" C CD MMAAAAyAAA B B B B #e** &  %  II( ) ) )$01o1o1oppJ Z'{)CDD E E E IIc*oo & & & IIf        rA)FN)rV)__name__ __module__ __qualname__rUrcrsr~r staticmethodrmaxsizerrrrrr/r1r.rrrrrArr+r+ms\) ) ) ) V0"""H       S[\ ,,\,$6   :GGG"///b<<\<|33333rAr+ru)"r<r%rlvestats.lib.commons.decoratorslvestatsr lvestats.librrlvestats.lib.commonsrlvestats.lib.jsonhandlerr/lvestats.lib.parsers.lve_read_snapshot_argparserlvestats.lib.snapshotrlvestats.orm.incidentr sqlalchemyr sqlalchemy.ormr rrr)rlibcommons decorators no_sigpiper9r@r+rrArrsg &&&&////////))))))666666TTTTTT************''''''R        +/ / / ,+/ d    mmmmmmmmmmrA