F(_ddlZddlZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z ddl mZddlmZddlmZddlmZdd lmZmZmZmZmZmZmZdd lmZmZdd lm Z m!Z!m"Z"dd l#m$Z$dd l%m&Z&m'Z'm(Z(m)Z)ddl*m+Z,ddl-m.Z.ddl/m0Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;mZ>ddl?m@Z@ddlAmBZBmCZCmDZDmEZEmFZFddlGmHZH ddlIm0Z0n#eJ$rdZ0YnwxYwdZKdZLdZMdZNdZOdZPdZQd ZRd!ZSe,ZTd"ZUd#geCzd$gzeBzeDzZVed%d&eWfd'eWfgZXed(d)eYfd*eYfd+eYfd,eYfd-eYfd.eYfgZZed/d0eeYfd1eeYfd2eeYfd3eeYfd4eZfd5eXfd6eXfd7ee[fd8ee[fd9e[fd:ee[fg Z\ed;d3eYfd1eYfde j^j_j`ZaGd?d@e5ZbdAZcdS)BN)datetime timedelta)message_from_string)Header) MIMEMultipart)MIMEText)reduce)groupby)DictIterableIteratorList NamedTupleOptionalTuple)ALL PrettyTable)clemailclproccpapi) LIMIT_LVP_ID)adminscpinfoget_admin_localeget_user_login_url)get_admin_email) MailHelper)get_notification)NameMap)LveStatsPlugin)dateutil)deserialize_lve_idgcd get_hostname merge_dictsserialize_lve_iduser_should_be_notifiedmempages_to_bytes) FIELD_AVERAGE FIELD_FAULT FIELD_LIMITHistoryShowUnionget_lve_version)NotificationsHelpercdSNresellers /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/plugins/generic/statsnotifier.pyrr<sten_USzadmin_notify.txtzadmin_notify.htmlzuser_notify.txtzuser_notify.htmlzreseller_faults_notify.txtzreseller_faults_notify.htmlzreseller_notify.txtzreseller_notify.htmlz"Hosting account resources exceededIDanyFNotifySettingsNOTIFY_MIN_FAULTSNOTIFY_INTERVALNotifyFaultsOptions NOTIFY_CPU NOTIFY_IO NOTIFY_IOPS NOTIFY_MEMORY NOTIFY_EP NOTIFY_NPROC AdminSettings NOTIFY_ADMINNOTIFY_CUSTOMERS_ON_FAULTSNOTIFY_RESELLER_CUSTOMERS#NOTIFY_RESELLER_ON_CUSTOMERS_FAULTSNOTIFY_FAULTS_TYPESNOTIFY_OPTIONS_SELFNOTIFY_OPTIONS_CUSTOMERNOTIFY_FROM_EMAILREPORT_ADMIN_EMAILNOTIFY_SUBJECTNOTIFY_CHARSET_EMAILResellerSettingsNOTIFY_RESELLER_ON_TOTAL_FAULTSceZdZdS)StatsNotifierTemplateErrorN)__name__ __module__ __qualname__r2r6r5rSrSsDr6rSc eZdZdZdZdZdZdZdZdZ dZ dBd Z d Z d Z d ZdZdZdZdZdZdZedZedZdCdZedZdZdZdZdZdededeeeffd Z dCd!e!d"ed#efd$Z"dCd!e!d"ed#ede#fd%Z$d&Z%dCd!e!d"ed#efd'Z&d(Z'd)Z(d*Z)d+Z*d,Z+d-Z,d.Z-d/Z.d0ede/fd1Z0ed2Z1d3Z2d4Z3dDd6Z4d7Z5d8Z6d9Z7d:Z8d;Z9d<Z:d=Z;d>ZdAZ?dS)E StatsNotifieriiz/usr/share/lve/emails/z/etc/cl.emails.d/rzlocale_defines.jsonc d|_d|_d|_tjd|_|t|_t|_ i|_ tj |_t|_ t#t%j|_n/#t$jt*f$rt#|_YnwxYwt-|_dS)N statsnotifier) server_id db_engine lve_versionlogging getLoggerlog_load_plugin_settingsr$hostnamer _mail_helper_reseller_settings_cacherProcLve _proc_lver _name_mapsetr resellers NotSupportedAttributeErrorr/_notificationsselfs r5__init__zStatsNotifier.__init__s$_55 ""$$$$ &LL(*%))  # !2!233DNN"N3 # # # UUDNNN #133s%C)C.-C.c||_||_|jjj}|jjj}tt||tj g|_ | |j d|jj|j d|jj|j d|jj|j d|jj|j d|jjj|j d|jjj|j d|jjj|j d|jjj|j d |jjj|j d |jjj|j d |jjj|j d |jjj|j d |jjj|j d|jjj|j d|jj|j d|jj|j d|jj|j d|jj|j d|jddS)z[Re]load all plugin settingszConfig: NOTIFY_ADMIN=%sz%Config: NOTIFY_CUSTOMERS_ON_FAULTS=%sz$Config: NOTIFY_RESELLER_CUSTOMERS=%sz.Config: NOTIFY_RESELLER_ON_CUSTOMERS_FAULTS=%szConfig: NOTIFY_CPU=%szConfig: NOTIFY_IO=%szConfig: NOTIFY_IOPS=%szConfig: NOTIFY_MEMORY=%szConfig: NOTIFY_EP=%szConfig: NOTIFY_NPROC=%sz(Config: NOTIFY_INTERVAL_ADMIN=%s secondsz"Config: NOTIFY_MIN_FAULTS_ADMIN=%sz'Config: NOTIFY_INTERVAL_USER=%s secondsz!Config: NOTIFY_MIN_FAULTS_USER=%szConfig: NOTIFY_FROM_EMAIL=%szConfig: REPORT_ADMIN_EMAIL=%szConfig: NOTIFY_SUBJECT=%szConfig: NOTIFY_CHARSET_EMAIL=%szr?r@rArBrCr;rLrMrNrO mail_headers)ronotify_interval_adminnotify_interval_userss r5rbz#StatsNotifier._load_plugin_settingss#6688*.*L*L*N*N'!% 4 H X $ 4 L \S#8:OQ^Qi"jkk  **,,,  /1E1RSSS  =t?S?nooo  R>lmmm  R>v     -t/C/W/bccc  ,d.B.V.`aaa  .0D0X0deee  0$2F2Z2hiii  ,d.B.V.`aaa  /1E1Y1fggg  68L8`8p     :D - - / / X#~99;; X X $ 7 7 D D  (H$$K# $($>$>}$M$M!!#4#W8WWWWWW  :#T%99 9 9 9 9 9 : :r6cZd}fd}t||S)z We do not need resellers with disabled NOTIFY_CUSTOMERS_ON_FAULTS notifications, also we do not need those resellers, whose customers were notified recently. Let's remove such resellers from check-list. Trcf|\}}|jo$j||jjSr1)rFrmusers_need_notificationrKr<)reseller_notify_settingsrnotify_optionsros r5 _filter_by_enabled_notificationszWStatsNotifier._get_customers_options_filtered.._filter_by_enabled_notificationss?,D )[.!<ATAlAl^CSBB r6rfilterroresellers_settingsrs` r5_get_customers_options_filteredz-StatsNotifier._get_customers_options_filteredsI"99T9JJ     68JKKKr6cLd}t||S)z If some resellers have same settings for notify we can send notifications to their users using only one database request. For that, we must group them by customers settings c(|\}}|j|jfSr1)rKrI)customers_notify_settings_rs r5_group_by_customers_optionszQStatsNotifier._get_customers_options_grouped.._group_by_customers_optionss"; Q!9>;]] ]r6)r r)rors r5_get_customers_options_groupedz,StatsNotifier._get_customers_options_groupeds3 ^ ^ ^ t;;==?Z[[[r6cV}fd}t||S)z We do not need resellers with disabled notifications at all also we do not need resellers that were notified recently. Let's remove such resellers from check-list. cf|\}}|jo$j||jjSr1)rQrmreseller_need_notificationrJr<)reseller_notify_optionsrrros r5rzWStatsNotifier._get_resellers_options_filtered.._filter_by_enabled_notificationss?,C )[.!AdFYFtFt^?OGG r6rrs` r5_get_resellers_options_filteredz-StatsNotifier._get_resellers_options_filteredsD"99;;     68JKKKr6cP|}d}t||S)z If some resellers have same settings for notifywe can send them notifications using only one database request. For that, we must group them by settings c(|\}}|j|jfSr1rJrI)reseller_options_groupedrrs r5_group_by_self_optionszLStatsNotifier._get_resellers_options_grouped.._group_by_self_options#s": Q!5~7YY Yr6)rr rorrs r5_get_resellers_options_groupedz,StatsNotifier._get_resellers_options_groupeds<"AACC Z Z Z )+ABBBr6cZd}fd}t||S)z5Get resellers with enabled NOTIFY_ON_CUSTOMERS_FAULTSTrcf|\}}|jo$j||jjSr1)rHrmrrJr<)rrrros r5rzgStatsNotifier._get_reseller_customers_faults_options_filtered.._filter_by_enabled_notifications/s>,> )[.B'BB!C!S r6rrs` r5/_get_reseller_customers_faults_options_filteredz=StatsNotifier._get_reseller_customers_faults_options_filtered*sI"99T9JJ     68JKKKr6cP|}d}t||S)Nc(|\}}|j|jfSr1r)reseller_customers_settingsrrs r5rz]StatsNotifier._get_resellers_customers_faults_options_grouped.._group_by_self_options?s"= Q!5~7YY Yr6)rr rs r5/_get_resellers_customers_faults_options_groupedz=StatsNotifier._get_resellers_customers_faults_options_grouped;s:!QQSS Z Z Z )+ABBBr6c:d|jjpti|_dS)Nrr)rtrNDEFAULT_SUBJECTr{rns r5ryz+StatsNotifier._prepare_default_mail_headersFs$ t+:Mo r6c<|dd|_dS)Nr\ localhost)getr\)roconfigs r5 set_configzStatsNotifier.set_configLsK==r6cH||_t||j|_dSr1)r]r.r\r^)roengines r5 set_db_enginezStatsNotifier.set_db_engineOs#*64>BBr6cX t|S#tj$r d|dcYSwxYw)Nzhttp:///)rrrk)domains r5_get_panel_login_urlz"StatsNotifier._get_panel_login_urlSsJ '%f-- -! ' ' '&V&&& & & & 's ))ctj|dd}tjd|st S|S)N.rz\A[a-zA-Z0-9_]+\Z)locale normalizesplitrematchDEFAULT_LOCALE) localename normalizeds r5 get_localeszStatsNotifier.get_locales[sH%j1177<z1StatsNotifier.get_users_fault..sB SBBB*3//47BBBr6c(i|]\}}|dv ||dzS))aIOlIOrr2rs r5rz1StatsNotifier.get_users_fault..s.jjj83TW[iTiTic3$;TiTiTir6) rutcnowr_get_faults_keysr-r]r\ FIELDS_ALL proceed_dictupdateitemsappend) rorxnotify_min_faultsnotify_faults_typesuids period_to period_from by_fault_arg history_showusers_fault_data users_stats user_stats r5get_users_faultzStatsNotifier.get_users_faultcs8 O%% )F";";";; ,,-@AA  I' N  n#!'    (4466 ) * *I"(Ih    $-OO$5$5      jjy?P?Pjjj k k k   y ) ) ) )r6c tjgd|j|j|j|j|j|j|jg}t|S)z Get list of keys for 'by_faults'; If reseller_settings is not None, use admin settings; Else - use reseller's settings; )CPUfVMemFPMemFEPfNprocFIOfIOPSf) itertoolscompressr>rArBrCr?r@list)notify_types_optionsrs r5rzStatsNotifier._get_faults_keyss^!) G G G$/$2$2$.$1$.$0    L!!!r6c#hK|D]}t|d\}}|j||d< tj|dddd}n!#tjjtf$rYywxYw|d|d<||dpd |d <|Vd S) z< Get information about reseller's accounts; r8LOGINmailrFkeylssearch_sys_usersrTOMAILenLOCALEN) r"rhrrrcpapiexceptionsrk IndexErrorr)ro faults_data reseller_datarr cp_userinfos r5_get_resellers_dataz!StatsNotifier._get_resellers_datas ) M/ d0CDDNK%)^%<%<[%I%IM' " #l=+AI[nstttuvw )6 C    '2!nM( #&*&6&6{1~7M&N&NM( #     s#A!!A?>A?cg}|D]g}tt|d\}} tj|}|j|d<|jdd|d<n#t$rYwwxYw tj |ddd}n!#ttj j f$rYwxYw|d|d<|d |d <| |d pd |d <|d|d<|d|d<|j|d<||d |d<||d|d<||i|S)z< Get information about end user's accounts; r8r,rTONAME)rdnsrr4rrrDOMAINrrRESELLERHOSTNAME LOGIN_URLFROMMAIL)r"intpwdgetpwuidpw_namepw_gecosrKeyErrorrrr rrkrrcr_get_notify_from_mailr)rofault_users_data users_data user_datauser_idr user_pwd_datar s r5get_users_datazStatsNotifier.get_users_datas  ) ) )I+C $,@,@AAJGQ  # W 5 5 %2%: '"&3&<&B&B3&G&G&J (##     #l9W+=Ejkkklmn  5 BC    #.a.Ih "-a.Ih "&"2"2;q>3IT"J"JIh $/NIj !%0NIj !$(MIj !%)%>%>{1~%N%NIk "$($>$>y?T$U$UIj !   i ( ( ( (s$AA00 A=<A="B$$CCc|jj}||jvra tj|dddd}n<#t tjjf$r|j d|YnwxYw|S)z If reseller is admin -> send email from admin's mail If reseller is reseller -> send email from reseller's mail )rFrrz/can't obtain notify_from_mail for %s from cpapi) rtrLrjrrr rrkra exception)ror4 from_mails r5r z#StatsNotifier._get_notify_from_mails (: t~ % % `!LUZ[[[\]^_`a  5 BC ` ` `""#TV^_____ `s#;6A43A4c |jjptj}n#tj$rd}YnwxYw|s"t }|jd||S)z Determine server admin email; Priority: 1. report_admin_email from config 2. cpapi.get_admin_email() 3. DEFAULT_ADMIN_MAIL NzQCan't obtain admin email from control panel. System admin email will be used '%s')rtrMrrrkDEFAULT_ADMIN_MAILrar)roemails r5_detect_admin_emailz!StatsNotifier._detect_admin_emails} (;Vu?T?V?VEE!   EEE  &E H  c    s "66 locale_nametempl_filenamereturnc`tj|j|}tj||}tj|r||fStj|j|}|tj||fS)a Detects path for specified file. Checks directories in order: 1. self.TEMPLATE_CUSTOM_DIR = '/etc/cl.emails.d/' 2. self.TEMPLATE_DIR = '/usr/share/lve/emails/' :param locale_name: locale name to check :param templ_filename: template filename (without path) :return: Tuple: (file_dir, full_path_to_file) )ospathjoinTEMPLATE_CUSTOM_DIRexists TEMPLATE_DIR)ror.r/ templates_dir full_filenames r5_detect_path_for_filez#StatsNotifier._detect_path_for_files T%={KK  ]NCC 7>>- ( ( 0 -/ / T%6 DD bgll=.IIIIr6 templ_datatext_templ_namehtml_templ_namec |dt}|||\}}tj|rtj|s:t jd||t|t|\}}|rWtj||}tj|st jd|d}nd}|}| |} | d|d|d<n#t$rYnwxYw tj |d\} } | d| } n#t$r| } YnwxYw| d| |d<n#t$rYnwxYwd} tj||\}}|r&|}tj||\}} nr#tjjjt&f$rO}t)d |d d tj||d ||d}~wwxYw| d |}||| fS)Nra"Unable to find templates for locale '%s': file '%s' does not exist. Statsnotifier will use default templates with locale %s. See https://docs.cloudlinux.com/cloudlinux_os_components/#customize-lve-stats2-notifications in order to find how to create localized template and hide this warning.aUnable to find optional HTML message template '%s'. Sending email with only TEXT part.You can safely ignore this message if you do not want to use HTML email templates.See https://docs.cloudlinux.com/cloudlinux_os_components/#customize-lve-stats2-notificationsr user_typer )r;z#Can not generate message for user "rz "; template "z ". Jinja2: NOTIFY_FROM_SUBJECT)rrr:r2r3r6r_rzr4_load_locales_datarr!seconds_to_human_viewrClEmailgenerate_mail_jinja2jinja2 exceptions TemplateErrorIOErrorrS)ror;r<r=r.r8text_templ_pathhtml_templ_path _templ_namelocale_definesnumber english_namelocalized_period_name html_bodysubject text_bodyre s_subjects r5generate_msg_bodyzStatsNotifier.generate_msg_bodys nnX~>> )-)C)CKQ`)a)a& w~~m,, iBGNN?4S4S i L\   .2-G-GXg-h-h *M?  # gll=/JJO7>>/22 ' s $ #'"O% 00?? #1(#;J{(>z?\k(l(l%I  @!(()=)RTghhoo$9I"(()=)RTghhoo$9I ..C JJx 7D4H4]^^ _ _ _ JJx 643G3\]] ^ ^ ^ ^!(()=)RTghhoo$9I&i00C NN>+o4CWCl+o+o+o p p p NN6 ? ? ?  G4+z*StatsNotifier.send_msg..{s <<z+StatsNotifier._has_fault..s-<.s999ifa6999r6r)NNcg}D]Y}g}D]=\}}t||d}||>||Z|S)Nz---)rprr)table_bdata table_liner user_data_keycell table_columnsr"s r5gen_table_bodyz:StatsNotifier._generate_table_data..gen_table_bodys|G" + + (5,,$A}txx u==>>D%%d++++z****Nr6=T)formatborderhrulesvrules)rrr>ryrArBrCr?extendsumr^r@lenrhorizontal_char junction_charrmapadd_row get_stringget_html_stringr) ror"radditional_columnscolumnsrtables_table s_html_tablers ` @r5_generate_table_dataz"StatsNotifier._generate_table_datas-\[[ &/)+AB,.FG,.FG$&:;*,FG*,@A  %/WDOOFJ4W4W$2[twPZ7[7[$2[twPZ7[7[$.U4??5*3U3U$1[doohPZ6[6[$.U4??5*3U3U    $ S!3R88999  a  #/ ZDOOGZ4X4X Z$$&=?W%XYYY99=999 z??a  :      G$$ #! S 0 0 1 1222""$$,,DcZ],^^  $$r6ct|d|D}|d|D|S)z Extend keys in new mode register ('aCPU' => 'acpu'), correct 'aVMem', 'aPMem', 'lVMem', 'lPMem' for backward compatibility with old templates c>i|]\}}||Sr2)lower)rkvs r5rz8StatsNotifier._prepare_template_data..s&1]1]1]41a!''))Q1]1]1]r6c(i|]\}}|dv ||dzSrr2)rrvars r5rz8StatsNotifier._prepare_template_data..s- t t tcOsHsHsS#*HsHsHsr6)r%rr)ror#templ_data_dicts r5_prepare_template_dataz$StatsNotifier._prepare_template_datask&i1]1]9??K\K\1]1]1]^^  t t_-B-B-D-D t t t   r6c|D]h}d|d<|dstjd1||}||t t idS)z Send email to each user in 'users_data', with given template path in 'templ_name' :type users_data: collections.Iterable[dict] :return: Nothing customerr?rz,User %s has not set email, skip notificationr;r<r=N)rr_debugrrq USER_TEMPLUSER_TEMPL_HTML)ror"r;user_template_datas r5 _notify_userszStatsNotifier._notify_userss%  J&0J{ #>>(++  LMMM!%!|jjrt|jjsdS|j|jjjsdS|j|jjj}| ||jjj |jjt|j d}||}|sdS|||jj\}}|s|jddS|||jj|t)||dd|jd }||t0t2d S) Nrrxrrrr!z6During admin check, no users faults found. Skipping... Administratoradmin) STATS STATS_HTMLrrrrrr?rrT)rtrErwrIrmadmin_need_notificationrJr<mark_admin_notifiedrr;rrg lve_id_listr&rrarrLrrr-rcrq ADMIN_TEMPLADMIN_TEMPL_HTML)rorxrr" s_text_tableradmin_template_datas r5 _check_adminzStatsNotifier._check_admins$1 c$:N:b6c6c  F"::4;O;c;stt  F //111%9I//"2FX $ 4 Hdn003344 0  ((:J(KK   F%)%>%>z4K_Ks%t%t" l  HNNS T T T F"&,>&&'7'9'9::..00%      *KYi    tr6c tj|ddd}n)#tttjjf$ricYSwxYw|d||dpd|dS)NrFrrrr)rrRESELLER_USERNAME)rrrIr rrkr)roreseller_loginpanel_user_datas r5get_panel_reseller_dataz%StatsNotifier.get_panel_reseller_datas #l>ASfklllmnoOO    ! .     III  &a(&&q'9'ATBB!/   s #AAcr i}|D]}|d}|r ||jvr#||vrO||}|dsRt|dg|dd|||<v||d|dg}|D]|\} | d<||p|j}| fd|D|j \}} |sS| d<| d <|j d <| }|S) Nrrrr)USERSrrc4g|]}|ddv|S)rrr2)rurs r5rjz8StatsNotifier.prepare_resellers_data..-s+FFFq!G*W *E*E*E*E*Er6rrr) rrjrr%rrrrvrrIrc) ror"resellers_datar#rr resultrrrrs @r5prepare_resellers_dataz$StatsNotifier.prepare_resellers_datas# S SI&]]:66N! ^4>%I%I^33 $ < <^ L L $((221<(12i>QRR!22~.. ~.w7>>y?QRRRR$2$8$8$:$: ND*DM $ : :> J J mdNm )-)B)BFFFFJFFFHYHm** &L,  (DM!-D #}D  MM$     r6c#K|D]_}|d}|s||}|dsEtd|ji||V`dS)z With enabled second-level of resellers's limits we have information about reseller's faults; Here we prepare information about such resellers; :type resellers_data: collections.Iterable[dict] :return: dict rrrN)rrr%rc)rorr r panel_datas r5_prepare_resellers_summary_dataz-StatsNotifier._prepare_resellers_summary_data7s, V VM*..w77N! 55nEEJ>>(++ z4=9=*UU U U U U V Vr6r8cNtj||j} t |d5}t j|cdddS#1swxYwYn@#t$r3}|j d|t|Yd}~nd}~wwxYwiS)z Load locales data from specified directory (file /usr/share/lve/emails//locale_defines.json) :param templates_dir: Directory name to search json file :return: Dictionary loaded from JSON file r^)encodingNz/Can't read/parse email localization file %s: %s) r2r3r4LOCALE_DEFINES_FILEopenjsonload Exceptionrarrp)ror8locale_defines_file json_filerTs r5rBz StatsNotifier._load_locales_dataKs!gll=$:RSS m)G<<< , y++ , , , , , , , , , , , , , , , , , m m m H  NPcehijekek l l l l l l l l m s:A%A A%AA% A!A%% B"/)BB"c#PK|D] }||p|||<|V!dSr1)r) data_listrrrs r5add_default_datazStatsNotifier.add_default_data[sB  D ,DIJJJJ  r6c^t}|d}|d}|d}|d} tj|d}tj|d}nT#ttf$r@}|j}|j}|jdt|Yd}~nd}~wwxYw|d } t|d |d |d |d t|d|d|d|d|d|dt|d|t|d|| dpt| dpd| dpd| dpd } | S)z Read admin settings config (using shared code in lve-utils) and map it into our namedtuple structure :rtype: AdminSettings faultsNotificationfaultsToIncludeminimumNumberOfFaultsToNotifynotifyrrtz:Can't set interval to admin. Period value is incorrect: %sNr, notifyAdminnotifyCustomersnotifyResellersnotifyResellerCustomerscpuioiopsmemconcurrentConnectionsnprocr>r?r@rArBrCr;r<notifyFromEmailreportAdminMail notifySubject notifyCharsetzus-ascii) rErFrHrGrIrJrKrLrMrNrO)get_admin_notificationr!time_dict_to_seconds ValueError TypeErrorDEFAULT_PERIODrarrprDr=r:rr+) roraw_datanotification_datafaults_to_include min_to_notifyperiodsr|notify_interval_userrTemail_settingssettingss r5rsz StatsNotifier.get_admin_settingsas *++$%9:-.?@)*IJ #H- c$,$A''BR$S$S !#+#@#Q#Q I& c c c#'#6 $($7 ! H  Y[^_`[a[a b b b b b b b b c+73 *=9'89J'K0ABS0T&78Q&R 3,U3+D1-f5/6+,CD.w7 !!!!/"/"8J_!!!%3"/"7I]%%%-001BCCYGY-112CDDJ)--o>>D"!/!3!3O!D!D!R -   0s4A%%B666B11B6ct|jj|jj|jj|jj|jj|jjS)NrHrFrQrIrJrK)rPrtrHrGrIrJrKrns r5ruz+StatsNotifier.get_default_reseller_settingssO040D0h'+';'U,0,@,d $ 4 H $ 4 H$($8$P     r6Tc|r||jvr |j|St|}|rd|vr|r d|j|<dS|d}|d}|d}|d} tj|d}tj|d} nU#tt f$rA} |j} |j}|jd|t| Yd} ~ nd} ~ wwxYwt|d|d |d t|d |d |d |d|d|dt|d|t|d| } |r | |j|<| S)Nrrrrr4rz@Can't set interval to reseller %s. Period value is incorrect: %snotifyResellerOnCustomersrnotifyResellerrrrrrrrrr) rerr!rrrrrarrprPr=r:) ror4 use_cacherrrrrnotify_interval_resellernotify_interval_customerrTress r5rz#StatsNotifier.get_reseller_settingss  ;T%BBB0: :#H-- /x?? ?:>-h7 F$%9:-.?@)*IJ #H- s'/'DWZEX'Y'Y $'/'DWZEX'Y'Y $ $I& s s s'+': $'+': $ H  _aiknopkqkq r r r r r r r r s0AB]0^'89J'K,=>N,O 3,U3+D1-f5/6+,CD.w7 !!!!/"/ ";Me!!!%3"/ ";Me%%%#   *  :69D )( 3 s4BC$#7CC$c||}|sdS||dd}|D]?}d|d<|ds||tt @dS)z Decide and send mails to resellers as resellers (doesn't include notification to reseller about it's personal account as a customer) :return: Nothing NrResellerr4r?rr)rrrrqRESELLER_TEMPLRESELLER_TEMPL_HTML)rousers_data_resellerr reseller_infos r5_process_resellers_mailsz&StatsNotifier._process_resellers_mailss 445HII  F..~xTT+  M)3M+ & $$X..   " "(.Zm #       r6c||}||dd}|D]}d|d<||dS)z When second level of reseller limits is enabled we collect summary info about reseller; When total load makes fault, we notify reseller about it; rr r4r?N)rr_notify_reseller_summary_faults)rorresellers_faults_datar s r5%_process_resellers_summary_info_mailsz3StatsNotifier._process_resellers_summary_info_mailssp!% D D^ T T $ 5 56KXWa b b2 @ @M)3M+ &  0 0 ? ? ? ? @ @r6ct||}||ttdS)z0Prepare data for reseller_faults_notify templaterN)rrqRESELLER_FAULTS_TEMPLRESELLER_FAULTS_TEMPL_HTML)ror s r5rz-StatsNotifier._notify_reseller_summary_faultssG33MBB  $6K]w      r6cV|ddD]s}|d}t|d}|jjo|}||jvr%||p|j}|jo|}|s||st|||dddS)z Decide and send mails to customers(including resellers personal account notification as a customer) :return: Nothing NrrrCustomer) r'rtrFrjrrvremoverr)ror" user_info account_owneruser_notification_enabled do_notifyrs r5_process_users_mailsz"StatsNotifier._process_users_mailss $AAA  I%j1M(? '@R(S(S %,GeLeI..$($>$>}$M$M$pQUQp!-HfMf  !!),,,   400XzRRSSSSSr6c#KD]c\\}}}d|D}j|tfd|Dg}|||VddS)z Find all customers that might cause faults from /proc/lve/list, get additional data from control panel and return it cg|]\}}|Sr2r2rrrs r5rjz=StatsNotifier._iter_customers_faults_data..!N!N!N.+q+!N!N!Nr6c3fK|]+}tj|V,dSr1)rrgr)rrros r5rvz.s;ee;dn00==>>eeeeeer6N)rrmmark_users_notifiedr)_StatsNotifier__get_customers_faults_data)ronotify_settingsrrjnotified_resellersusers_to_checks` r5_iter_customers_faults_dataz)StatsNotifier._iter_customers_faults_data sBFAdAdAfAf i i = 2_1I!N!NI!N!N!N    3 34F G G G!eeeeRdeeegiN22>CVXghh h h h h i ir6cx||j|j||}||}|S)Nrr)rr<r;r&)ror'rr%rr"s r5__get_customers_faults_dataz)StatsNotifier.__get_customers_faults_datasP //"2-? 3 0  ((:J(KK r6c^|D]}||dSr1)r(r)ror"s r5 _check_userszStatsNotifier._check_users,s>::<< 2 2J  % %j 1 1 1 1 2 2r6c#K|D]_\\}}}d|D}d|D}||j|j||}||}||fV`dS)z Find all resellers that might cause faults from /proc/lve/resellers, get additional data from control panel and return it cg|]\}}|Sr2r2r s r5rjz=StatsNotifier._iter_resellers_faults_data..9sJJJnk1kJJJr6c8g|]}tt|Sr2)r&r)rrs r5rjz=StatsNotifier._iter_resellers_faults_data..;s$!p!p!pR]"2<"M"M!p!p!pr6r)r N)rrr<r;r )ror%rrjresellers_uidsresellers_to_checkr rs r5_iter_resellers_faults_dataz)StatsNotifier._iter_resellers_faults_data0sBFAdAdAfAf 1 1 = 2_1IJJ JJJN!p!pao!p!p!p ..&6"1"C$7' /K"55+5NNN .0 0 0 0 0 1 1r6c#K|D]e\\}}}d|D}g}|D]/}||j|0||||}||fVfdS)Ncg|]\}}|Sr2r2r s r5rjzGStatsNotifier._iter_reseller_users_list_faults_data..Mr!r6)rrrgrr$)ror%rrjr&r'rcustomers_faultss r5%_iter_reseller_users_list_faults_dataz3StatsNotifier._iter_reseller_users_list_faults_dataIsAEAuAuAwAw 7 7 = 2_1I!N!NI!N!N!N  N1 O O %%dn&@&@&M&MNNNN#??Pcetuu "$66 6 6 6 6 7 7r6cft}|D]/\}}||||0|D]/\}}||||0|j|dSr1)rir2rrr6rrmmark_resellers_notified)ror&r reseller_idsr"s r5_check_resellerszStatsNotifier._check_resellersWs UU,0,L,L,N,N 4 4 (NL  6 6~ F F F  % %l 3 3 3 3(,(R(R(T(T 4 4 $J   ) )* 5 5 5  % %l 3 3 3 3 334FGGGGGr6ci|_|jd||||jdS)NF)r)rerh link_xml_noder,r:rrmsave_to_persistent_storage)rolve_datas r5executezStatsNotifier.executehsv )+% $$u$555    6688888r6)Fr1)T)@rTrUrVrrwr7r5rrrprbrrrrrrrryrr staticmethodrrrrr r&r r-rprr:dictrVrrfrnrqryrrrrrrrr rBrrsrurrrrrr(r$r,r2r6r:r?r2r6r5rXrXs5!NJ+L-L/444*(t(t(tT::::(LLL,\\\ LLL$CCC"LLL" C C C   >>>CCC''\'\****X""\"*   &!!!F *JJcJeTWY\T\oJJJJ$F/F/DF/3F/Y\F/F/F/F/PtcTWcp@xxx%%D%3%Y\%%%%===0%0%0%d $(((T       DVVV( \ ---^    ----^& @ @ @   TTT.iii(   2221112 7 7 7HHH" 9 9 9 9 9r6rXcd}t|d}|r|dd}t}|tvr*||p|}n|}|jS)z! Gets parameter for user rootr3rr)rrXrrrursrF)rtdefault_resellerr4 stat_notifierrs r5get_stats_notifier_parametersrFxsd-000H*#A;q>!OOMvxx''  / /0@ A A r]EpEpErEr !3355  ..r6)drrrr_r2rrrrr,r email.headerremail.mime.multipartremail.mime.textr functoolsr r typingr r r rrrr prettytablerrclcommonrrrclcommon.clprocrclcommon.cpapirrrr clcommon.cpapi.plugins.universalrsystem_admin_emailclcommon.mail_helperrclconfig.lve_stats2_librrlveapirlvestats.core.pluginr lvestats.lib.commonsr!lvestats.lib.commons.funcr"r#r$r%r&r'lvestats.lib.commons.sizeutilr)lvestats.lib.lveinfolibr*r+r,r-r.!lvestats.lib.notifications_helperr/ clconfig.lve_stats2_reseller_lib ImportErrorrrrrrrrr r r+rrrr:boolr=rprDrPrFrGrHrSrXrFr2r6r5r^s   ((((((((%%%%%%......$$$$$$NNNNNNNNNNNNNNNNNN((((((((++++++++++((((((OOOOOOOOOOOORRRRRR++++++NNNNNN//////))))))<;;;;;nnnnnnnnnnnnnnAAAAAAAAAAAAA  &  $4:&,''))6Vk !VH ,} <{ J  c" C !j t d  $ d      $( %x~6 $htn5 .?  34 / "N3 hsm, x}- 3 #/  ": .5 %t, *D1  34 / "N3        !:!H   o9o9o9o9o9No9o9o9d/////sCC C