§ Ù@ªjöãóZ—ddlZddlZddlZddlZddlmZmZmZdZGd„de ¦«Z dS)éN)ÚDictÚIterableÚUnionzAleksandr Shyshatskycóx—eZdZdZdZdZd„Zd„Zd„Zd„Z d„Z d „Z e d „¦«Z d „Zd „Zd „Zd„Zd„Zd„ZdS)ÚNotificationsHelperza Helper for our StatsNotifier plugin, contains logic related to notification periods z/var/lve/statsnotifier_last.tsz%/var/lve/statsnotifier_timestamps.bincó”—i|_i|_d|_tjt ¦«|_| ¦«dS)Néÿÿÿÿ)Ú_users_notification_infoÚ_resellers_notification_infoÚ_admin_notify_timeÚloggingÚ getLoggerÚ__name__Ú_logÚ_load_from_persistent_storage©Úselfs úŒ/builddir/build/BUILDROOT/lve-stats-5.0.5-1.el8.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/notifications_helper.pyÚ__init__zNotificationsHelper.__init__sF€Ø(*ˆÔ%Ø,.ˆÔ)Ø"$ˆÔÝÔ%¥hÑ/Ô/ˆŒ ð ×*Ò*Ñ,Ô,Ð,Ð,Ð,ócó4—| ¦«|_tj |j¦«sdS t |jdd¬¦«5}tj|¦«}ddd¦«n #1swxYwYnƒ#t$r|  ¦«YdStj $r$|j   d|j¦«YdSttf$r|j   d¦«YdSwxYw d„|d ¦«D¦«}d „|d  ¦«D¦«}n8#t"t$t&f$r|j   d¦«YdSwxYw||_||_dS) z¼ Load information about periods from persistent storage. Admin timestamp contains in separate file, in order to make it backwards-compatible with old logic NÚrúutf-8©Úencodingu#Corrupted JSON in %s — discardingú(Cannot load data from persistent storagecó4—i|]\}}t|¦«|“ŒS©©Úint©Ú.0ÚkÚvs rú zENotificationsHelper._load_from_persistent_storage..?s$€ÐAÐAÐA¡4 1 a•S˜‘V”V˜QÐAÐAÐArÚuserscó4—i|]\}}t|¦«|“ŒSrrr!s rr%zENotificationsHelper._load_from_persistent_storage..@s$€ÐIÐIÐI¡t q¨!�˜Q™œ ÐIÐIÐIrÚ resellers)Ú_read_ts_from_filer ÚosÚpathÚexistsÚRESELLERS_NOTIFICATIONS_STORAGEÚopenÚjsonÚloadÚUnicodeDecodeErrorÚ_migrate_from_pickleÚJSONDecodeErrorrÚ exceptionÚIOErrorÚOSErrorÚitemsÚKeyErrorÚ TypeErrorÚ ValueErrorr r )rÚfÚdatar&r(s rrz1NotificationsHelper._load_from_persistent_storage#s€ð#'×"9Ò"9Ñ";Ô";ˆÔåŒw�~Š~˜dÔBÑCÔCð Ø ˆFð Ý�dÔ:¸CÈ'ÐRÑRÔRð $ÐVWÝ”y ‘|”|�ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $øøå!ð ð ð à × %Ò %Ñ 'Ô 'Ð 'Ø ˆFˆFÝÔ#ð ð ð Ø ŒI× Ò Ø5ØÔ4ñ ô ð ð ˆFˆFÝ�Ð!ð ð ð Ø ŒI× Ò Ð JÑ KÔ KÐ KØ ˆFˆFð øøøð ØAÐA¨4°¬=×+>Ò+>Ñ+@Ô+@ÐAÑAÔAˆEØIÐI¨t°KÔ/@×/FÒ/FÑ/HÔ/HÐIÑIÔIˆIˆIøÝ�)¥ZÐ0ð ð ð Ø ŒI× Ò Ð JÑ KÔ KÐ KØ ˆFˆFð øøøð).ˆÔ%Ø,5ˆÔ)Ð)Ð)sUÁBÁA9Á- BÁ9A=Á=BÂA=ÂBÂDÂ&.DÃ*DÄDÄ AEÅ1FÆFcó`—ddl} t|jd¦«5}| |¦«\|_|_ddd¦«n #1swxYwY| ¦«|j d¦«dS#t$r|j  d¦«YdSwxYw)z4One-time migration of legacy pickle storage to JSON.rNÚrbz;Migrated notification timestamps from pickle to JSON formatr) Úpickler.r-r0r r Úsave_to_persistent_storagerÚinfoÚ Exceptionr4)rr?r;s rr2z(NotificationsHelper._migrate_from_pickleGs€ð ˆ ˆ ˆ ð LÝ�dÔ:¸DÑAÔAð bÀQØSY×S^ÒS^Ð_`ÑSaÔSaÑP�Ô-¨tÔ/Pð bð bð bñ bô bð bð bð bð bð bð bøøøð bð bð bð bà × +Ò +Ñ -Ô -Ð -Ø ŒI�NŠNØMñ ô ð ð ð øõð Lð Lð LØ ŒI× Ò Ð JÑ KÔ KÐ KÐ KÐ KÐ Kð Løøøs3†B›#A ¾ BÁ AÁBÁAÁ1BÂ$B-Â,B-cóΗ| |j¦« tj|jtjtjztjzd¦«}tj|dd¬¦«5}tj |j |j dœ|¦«ddd¦«dS#1swxYwYdS#tttf$r|j d¦«YdSwxYw)zÀ Save information about periods on disk. Admin timestamp contains in separate file, plain text. Resellers info is serialized as JSON and saved into other file. i€Úwrr)r&r(Nz+Unable to save resellers timestamps to file)Ú_save_ts_to_filer r*r.r-ÚO_WRONLYÚO_CREATÚO_TRUNCÚfdopenr/Údumpr r r5r6r9rÚwarning)rÚfdr;s rr@z.NotificationsHelper.save_to_persistent_storageUsR€ð ×Ò˜dÔ5Ñ6Ô6Ð6ð MÝ”˜Ô=Ýœ¥r¤zÑ1µB´JÑ>ÀñGôGˆB唘2˜s¨WÐ5Ñ5Ô5ð O¸Ý”  DÔ$AØ(,Ô(IðKðKØLMñOôOðOð Oð Oð Oñ Oô Oð Oð Oð Oð Oð Oð Oð Oøøøð Oð Oð Oð Oð Oð Oøõ�¥)Ð,ð Mð Mð MØ ŒI× Ò ÐKÑ LÔ LÐ LÐ LÐ LÐ Lð Møøøs6œAB/Á2#B" B/Â"B&Â&B/Â)B&Â*B/Â/1C$Ã#C$có— t|jdd¬¦«5}| t|¦«¦«ddd¦«dS#1swxYwYdS#t$r|j d¦«YdSwxYw)NrDrrz&Unable to save admin timestamp to file)r.ÚSTATSNOTIFIER_LAST_TSÚwriteÚstrr5rrK)rÚtsr;s rrEz$NotificationsHelper._save_ts_to_filegsØ€ð HÝ�dÔ0°#ÀÐHÑHÔHð !ÈAØ—’�˜B™œÑ Ô Ð ð !ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð !ð !øåð Hð Hð HØ ŒI× Ò ÐFÑ GÔ GÐ GÐ GÐ GÐ Gð Høøøs3‚A™#A ¼ AÁ A Á AÁA ÁAÁ$A>Á=A>cót— t|jdd¬¦«5}t| ¦« ¦«¦«}|cddd¦«S#1swxYwYdS#t $rYdSt $r9}|j d|jt|¦«¦«Yd}~dSd}~wwxYw)Nrrrr zUnable to read %s (%s)) r.rNÚfloatÚreadlineÚrstripr5r:rrKrP)rr;rQÚes rr)z&NotificationsHelper._read_ts_from_fileos€ð Ý�dÔ0°#ÀÐHÑHÔHð ÈAݘ1Ÿ:š:™<œ<×.Ò.Ñ0Ô0Ñ1Ô1�Øð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð øõð ð ð Ø�2�2Ýð ð ð Ø ŒI× Ò Ð6¸Ô8RÕTWÐXYÑTZÔTZÑ [Ô [Ð [Ø�2�2�2�2�2øøøøð øøøs@‚A(™5AÁ A(ÁAÁA(Á"AÁ#A(Á( B7Á5 B7Á>.B2Â2B7có(—tj¦«S)zr Get current timestamp. In future, we may do some things here, like "round(time / 60**2)" )ÚtimerrrÚ_get_current_timestampz*NotificationsHelper._get_current_timestamp{s€õŒy‰{Œ{Ðrcó„—| ¦«}|D](}|j d||¦«||j|<Œ)dS)zY Mark resellers as notified. S aves current timestamp in memory. z(Reseller marked as notified at %s for %sN)rYrÚdebugr ©rÚ resellers_idrQÚ reseller_ids rÚmark_resellers_notifiedz+NotificationsHelper.mark_resellers_notified„s[€ð × (Ò (Ñ *Ô *ˆØ'ð @ð @ˆKØ ŒI�OŠOÐFÈÈKÑ XÔ XÐ XØ=?ˆDÔ -¨kÑ :Ð :ð @ð @rcó„—| ¦«}|D](}|j d||¦«||j|<Œ)dS)zT Mark users as notified. Saves current timestamp in memory. z%Users marked as notified at %s for %sN)rYrr[r r\s rÚmark_users_notifiedz'NotificationsHelper.mark_users_notified�sW€ð × (Ò (Ñ *Ô *ˆØ'ð <ð <ˆKØ ŒI�OŠOÐCÀRÈÑ UÔ UÐ UØ9;ˆDÔ )¨+Ñ 6Ð 6ð <ð rus–ðð € € € Ø€€€Ø € € € Ø € € € Ø(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(à #€ ðjWðjWðjWðjWðjW˜&ñjWôjWðjWðjWðjWr