0efddlZddlZddlZddlZddlZddlmZddlmZddl m Z m Z ddl m Z ddlmZddlZddlZddlmZddlmZdd lmZmZmZmZdd lmZdd lmZdd lm Z dd l!m"Z"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)dZ*dZ+da,Gdde-Z.Gdde/Z0Gdde-Z1dS)N bisect_left) defaultdict)IterableList)etree)SQLAlchemyError)getuser)_get_uid_for_select)configdbengine lveinfolib uidconverter)SvgChart) ramerdouglas)dateutil) period_type2 ParseDatetime) setup_logging) VWSimplifier) svg_to_pngshaman localhostc &eZdZdZddedefdZedZedZ d Z dd Z d e e e deee fdZde e e deee fdZdZdddddddddf dZdZdZdZdZddZdZdS)Rendererz Renders data to file  aquamarinemax_points_on_graph fault_colorcztjd|_t|_||_||_dS)NzChart Renderer)logging getLoggerlogr svg_chart_max_points_on_graph _fault_color)selfrr s /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/chart/__init__.py__init__zRenderer.__init__-s6$%566!$7!'c|SN)args r)_nopz Renderer._nop3s r+cddg}tj|}tj|}||tS)Nz%b-%dz %b-%d %I:%M%p)runixtimestamp_to_gm_datetime gm_to_localstrftime format_index)tsformatsgmlos r) _ts_to_strzRenderer._ts_to_str7sEO,  22 6 6  !" % %{{7<0111r+c|dkrdadSdS)Ni r)r5)r( period_secs r)set_period_seczRenderer.set_period_sec?s    LLL r+@rc|}|}d}tdD]Q}t||}|} t|}|| kr|cS||jkr |dkr|cS|}n|}|}||zdz }R|S)Nr r>)rangerlenr&) r(points epsilon_max epsilon_minepsilon_default points_output points_lenipoints_optimisedpoints_len_previouss r)_optimisation_ramerdouglasz#Renderer._optimisation_ramerdouglasEs%  r ? ?A+FODD ", -..J000$$$$T66666++++- 0 - *[8B>OOr+rCreturncXt|}||j}|Sr-)r from_numberr&)r(rC simplifierresults r)_optimisation_polysimplifyz#Renderer._optimisation_polysimplify\s*!&)) ''(ABB r+linect||jkr,||d}||}|S)Ngffffff?)rD)rBr&rLrR)r(rSs r)optimise_pointszRenderer.optimise_pointsasF t99t0 0 0224S2IID22488D r+cZt||}||dz }||}|dz |||fS)z? :type x_value: float :type line: list rr)r(rSx_valueposbeforeafters r)get_two_closestzRenderer.get_two_closestgs< $((cAgS QwU**r+Nc|Sr-r.)vs r)zRenderer.|sr+c||| ||\}}}}|j|||||||| | |j|| | ||jdS)aP :type message: None|str :type unit: None|str :type y_legend_converter: (float) -> float :type max_y: None|float :type min_y: None|float :type title: str :type legend: dict :type x_values: list :type faults: (str, str, str) :type data: defaultdict ) title minimum_y maximum_yx_legendx_legend_generatey_legendy_legend_converterx_legend_converternamesunitmessage fault_linesr N) _add_graphr% add_graphr:r')r(datar`legendx_valuesmin_ymax_yx_labelsgenerate_n_xlabelsy_labelsrfrirjfaultscolorsdatasetsrkrhs r)rmzRenderer.add_graphqs604tVVU]/^/^,+u    01##) ! + + + + +r+cg}g}g}i}|D]\} } | \} } n#t$r| \} } |jYnwxYwfd|| D} t t || }||}||||| <|| || |||||}|r/|d||j ~||||fS)z :type legend: dict :type x_values: list :type faults: (str, str, str) :type data: defaultdict :rtype (list, list, list, list) c&g|] }|Sr.r.).0ymodifiers r) z'Renderer._add_graph..s!??? ???r+rv) items ValueErrorr0lowerlistziprUappendget_faults_linesr')r(rnrvrorprxrhrwdatasets_dictionarykeymetainfo legend_titlecolory_valuesrSline_optimisedrkr}s @r)rlzRenderer._add_graphst %||~~ ! !OS( %08- eXX % % %&.# e9 %@???T#))++->???HHh//00D!11$77N OON + + +/=  , LL & & & MM% ++D2EvxXX   - LL " " " MM$+ , , , xe33s+AAc2g}|d|D\}}}||vr||vrdt|||D} tt||\} } tt||\} } | D]} ||| | }||| | }|d|dkr||f|vr|||fa#t$r+|jdt|YwxYw|S)z :type x_values: list :type faults: (str, str, str) :type datasets_dictionary: dict :type data: defaultdict :rtype list Nc6g|]}|Sr.)r)r{xs r)r~z-Renderer.get_faults_lines..s 0K0K0Kq0K0K0Kr+c$g|] \}}|dk |Srr.)r{rr|s r)r~z-Renderer.get_faults_lines..s"SSS$!QQQRUUAUUUr+rzCan't get fault line: %s)rrget_dotr IndexErrorr$errorstr)r(rnrrvrprk fault_name data_name limit_namefaults_x average_timesaverage limit_timeslimitfault average_dot limit_dots r)rzRenderer.get_faults_linessb  0K0KF0K0K0K -J :000YBU5U5USS#hZ8H*I*ISSS)-c3Fy3Q.R)S)S& w%)#/B:/N*O%P%P" U%OOEO&*ll5'=&Q&Q $(LL{$K$K &q>IaL88k9=U]h=h=h'.. Y/GHHH%OOO'A3u::NNNNNOsAC2DDcF||dkr ||dfS||dkr ||dfS ||||f}nU#t$rH|||\}}}}||z ||z z ||||z z||z} || f}YnwxYw|S)z :type line_times: list :type line: list :type fault_time: float :rtype (float, float) r)indexrr[) r( fault_timerS line_timesdot before_indexrY after_indexrZdot_ys r)rzRenderer.get_dots B ' 'tBx' ' A & &tAw& & &tJ$4$4Z$@$@ABCC & & &7;7K7KJXb7c7c 4L&+uf$6># $tL'99;|$%  u%CCC & sA ABBcJ|j|||jdS)N)rpnumberrg)r% _add_x_legendr:)r(rpns r)add_common_x_legendzRenderer.add_common_x_legends6 $$# %     r+c<|j||dS)z/ add empty rectangle with text N)r% add_text_box)r(text font_sizes r)rzRenderer.add_text_boxs" ##D)44444r+c4|jSr-)r%dump)r(s r)renderzRenderer.renders~""$$$r+)rr)r>rr-)__name__ __module__ __qualname____doc__intrr* staticmethodr0r:r=rLrfloatrrRrUr[rmrlrrrrrr.r+r)rr(s((C(C(((( \22\2 .(5/1JtTXY^T_O` HXe_$=$tE{BS +++ #*{,+,+,+,+\!4!4!4F20   5555 %%%%%r+rceZdZfdZxZS) UserNotFoundcJtjd|dg|Ri|dS)NzUser z not found)superr*)r( user_nameargskwargs __class__s r)r*zUserNotFound.__init__s<6666HHHHHHHHHr+)rrrr* __classcell__)rs@r)rrsAIIIIIIIIIr+rceZdZdZedZedZdZdZ ddZ ddZ e j j jjdd Zd Zd Zd ZdZd S) ChartMainc||_||_t||tj|_||_tj|_dS)N) console_level) prog_name prog_descrr"ERRORr$cfgr is_normalized_user_cpu)r(rrcnfs r)r*zChartMain.__init__ sF"" iw}MMM&,&C&E&E###r+ctt}|D]c}tt||}|D]/\}}||t |pd0d|S)Nr)rrdictrrrr)rn show_columnsdata_collectedrowrow_dictkr]s r)convert_dbdata_to_dictz ChartMain.convert_dbdata_to_dicts$T** 8 8CC c2233H"..** 8 8Aq!((qvA7777 8r+ctt}|D]\}}d|D||<|S)Nc0g|]}t|pdSr)r)r{r]s r)r~z5ChartMain.convert_lvedata_to_dict.. s"7771qvA777r+)rrr)rnby_keyrvaluess r)convert_lvedata_to_dictz!ChartMain.convert_lvedata_to_dictsJT""::<< 8 8KQ77777F1II r+c|jdt}tjt j|jd|j}| dtj ddd| dd fd d | d d tdd| ddtdd| ddd|| dddd| dddd d!"| d#d$d%d&gd'd(| d)d*d+d,gd-d,(| d.d/td0d1| d2t j3| d4t j3| d5t j3|S)6N server_idT)progadd_help descriptionz --versionzVersion numberversion)rhelpdestactionz--periodzTime period specify minutes with m, h - hours, days with d, and values: today, yesterday 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, as well as todayc$t|Sr-)r)value datetime_nows r)r^z'ChartMain.make_parser..2s|E

>>JX->??? r+ct)z` :type parser: argparse.ArgumentParser :rtype : argparse.ArgumentParser NotImplementedError)r(rs r)customize_parserzChartMain.customize_parserfs "###r+Fct)a: Extracts data from database , in form of a tuple: (dict, list) where dict is { 'cpu': [0, 5, 10 , 95.2, ...] -- values 'io': [0, 5, 10 , 95.2, ...] -- values 'foo': , } and a list of timestamps for all that collected values: 2) [1, 2 ,3 ...] :param show_all: :rtype : tuple :type engine: sqlalchemy.engine :type from_ts: datetime.datetime :type to_ts: datetime.datetime :type server: str :type user_id: int r )r(enginefrom_tsto_tsruser_idrs r)get_chart_datazChartMain.get_chart_datams@"###r+ct)z :rtype : None :type renderer: Renderer :type data_collected: dict :type times: list :type lve_version: str :type show_all: bool :type is_user: bool. True for user, False - admin r )r(rendererrtimes lve_versionris_users r) add_graphszChartMain.add_graphss"###r+Nc|}||}||}ng tj|j}nL#tj$r:}t jt|dzYd}~dSd}~wwxYw| t|}|j r,t|j|jfrt!ddS|j r |j \}}nFt"j} |jp| t#jdz }|jp| }||r|||nt-j} t1dkr:| r8| t-jkr!t jddS|jr[|j} t5| | } t7| t8rn.| | vr*d | d | d } t j| dS |||||j| \}}}nN#t>t@f$r:}t jt|dzYd}~dSd}~wwxYw|!|||||}|"||dS) N rz2--period and [--from, --to] are mutually exclusiverr@)minutesrootzPermission denied z Permission denied. User with id z does not belong reseller `z` )r)#rr r make_db_enginerMakeDbExceptionsysstderrwriter parse_argsrperiodanyrrprintrr timedelta_has_user_arguments_obtain_user_idosgetuidr rr isinstancerrrrr _render_output)r(r debug_enginerreoptsftrr reseller_namereseller_users error_msgrrr<exrendered_graphs r)mainzChartMain.mains!!##&&v..  #!FF !0::+      Q$///qqqqq   d,, ; 3 DG455  F G G G1 ; (;DAqq#,0022L KlX-?-K-K-KKA'***qs/A B/BB0#IJ%/JJc 2|j} |j}n#t$rd}YnwxYw|d}t}||t j||j} ||||| ||dk| } | S)Nrr)r) rrAttributeErrorrr=rget_lve_versionrrr) r(rrr0r<rrrrrr7s r)r,zChartMain._renders= JEE   EEE  =E:: +++ 0EE  .%h %  1 1 1!**s   c|jdkr|jdkr tj|d}tj|d}nL#t ttf$r2}|j dt|Yd}~nd}~wwxYw|jdkrt|}|jdkrt|trItjjtjj|dStj|dS t|trd}nd }t)|j|5}||ddddS#1swxYwYdS#t*$r$|j d |jYdSwxYw) Nrrutf8T) pretty_printz3Can not use pretty print for svg xml formatting; %srwbwzUnable to create file: %s)rrr fromstringencodetostring ImportErrorrUnicodeEncodeErrorr$debugrrr+bytesrstdoutbufferflushr!openIOErrorr)r(r0r7 root_noder/ write_moders r)r-zChartMain._outputs% ;%  DK3$6$6 ^!,^-B-B6-J-JKK !& !M!M!M-?@ ^ ^ ^TVYZ[V\V\]]]]]]]] ^ ;%  '77N ;#  .%00 1 !''))) !''77777   00000 Ine44%!%JJ!$J$+z221fLL000111111111111111111 I I I:DKHHHHHH IsM=AB-(BB/F&6F F&FF& F!F&&*GGc |j}n#t$rd}YnwxYw |j}n#t$rd}YnwxYw|*tj||jd|j|pd}|S)Nr)usernamelocal_server_idr db_enginer)rr:rrusername_to_uidrr)r(rr0rrs r)r(zChartMain._obtain_user_ids lGG   GGG  II   III  ?"2"DH[4I+999?<> s % 44c^t|dr|jpt|do|jS)Nrr)hasattrrr)r(r0s r)r'zChartMain._has_user_argumentss1i((9T\mwt[?Y?Y?l^b^lmr+)Fr-)rrrr*rrrrr rrrlibcommons decorators no_sigpiper8r,r-r(r'r.r+r)rr sFFF\\AAAF$$$!& $ $ $ $D $ $ $ $\$/<<<0/<| III8 nnnnnr+r)2rr"rrr)bisectr collectionsrtypingrrlxmlrsqlalchemy.excr rlvestats.lib.commons.decoratorsclcommon.cpapi.pluginlibr "lvestats.lib.cloudlinux_statisticsr lvestats.libr r rrlvestats.lib.chart.svggraphrlvestats.lib.chart.rdprlvestats.lib.commonsr#lvestats.lib.commons.argparse_utilsrrlvestats.lib.commons.logsetuprlvestats.lib.chart.polysimplifyrlvestats.lib.chart.svg2pngr __author__rr5objectr Exceptionrrr.r+r)rms2 ######!!!!!!!!******&&&&,,,,,,BBBBBBCCCCCCCCCCCC000000//////))))))KKKKKKKK777777888888111111   Y%Y%Y%Y%Y%vY%Y%Y%xIIIII9III NnNnNnNnNnNnNnNnNnNnr+