o
    Ìv›aÐ   ã                   @   sN   d Z ddlZddlmZ ddlmZ ddlmZmZ G dd„ deƒZ	e	ƒ Z
dS )zAManage Glances events (previously Glances logs in Glances < 3.1).é    N)Údatetime)Úrange)Úglances_processesÚ
sort_statsc                   @   sn   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
	ddd„Zdd„ Zdd„ Zddd„ZdS )ÚGlancesEventsaÕ  This class manages events inside the Glances software.

    Events is a list of event (stored in the self.events_list var)
    event_state = "OK|CAREFUL|WARNING|CRITICAL"
    event_type = "CPU*|LOAD|MEM|MON"
    event_value = value

    Item (or event) is defined by:
      ["begin",
       "end",
       "WARNING|CRITICAL",
       "CPU|LOAD|MEM",
       MAX, AVG, MIN, SUM, COUNT,
       [top3 process list],
       "Processes description",
       "top sort key"]
    c                 C   s   d| _ g | _dS )zInit the events class.é
   N)Ú
events_maxÚevents_list©Úself© r   ú0/usr/lib/python3/dist-packages/glances/events.pyÚ__init__1   s   
zGlancesEvents.__init__c                 C   s   | j S )zReturn the raw events list.)r	   r
   r   r   r   Úget9   s   zGlancesEvents.getc                 C   s
   | j  ¡ S )z-Return the number of events in the logs list.)r	   Ú__len__r
   r   r   r   Úlen=   s   
zGlancesEvents.lenc                 C   sB   t |  ¡ ƒD ]}| j| d dk r| j| d |kr|  S qdS )z¯Return the event position, if it exists.

        An event exist if:
        * end is < 0
        * event_type is matching
        Return -1 if the item is not found.
        é   r   é   éÿÿÿÿ)r   r   r	   )r   Ú
event_typeÚir   r   r   Z__event_existA   s
   $€zGlancesEvents.__event_existc                 C   s,   |  d¡r	d}|S |  d¡rd}|S d}|S )zReturn the process sort keyZMEMZmemory_percentZ
CPU_IOWAITZio_countersZcpu_percent)Ú
startswith)r   r   Úretr   r   r   Úget_event_sort_keyN   s   

úÿz GlancesEvents.get_event_sort_keyc                 C   s   t jrt  |  |¡¡ dS dS )z5Define the process auto sort key from the alert type.N)r   Ú	auto_sortÚset_sort_keyr   )r   r   r   r   r   Úset_process_sort\   s   ÿzGlancesEvents.set_process_sortc                 C   s   t jr
t  d¡ dS dS )z Reset the process auto sort key.ÚautoN)r   r   r   r
   r   r   r   Úreset_process_sorta   s   ÿz GlancesEvents.reset_process_sortNÚ é   c              	   C   sX   |pt  ¡ }|  |¡}|dk r|  ||||||¡ |  ¡ S |  |||||||¡ |  ¡ S )zãAdd a new item to the logs list.

        If 'event' is a 'new one', add it at the beginning of the list.
        If 'event' is not a 'new one', update the list .
        If event < peak_time then the alert is not set.
        r   )r   ZgetlistÚ_GlancesEvents__event_existÚ_create_eventÚ_update_eventr   )r   Úevent_stater   Úevent_valueÚ	proc_listÚ	proc_descÚ	peak_timeÚevent_indexr   r   r   Úaddf   s   

ÿýÿzGlancesEvents.addc                 C   st   |dks|dkr8|   |¡ t t ¡  ¡ ¡d||||||dg |tjg}| j 	d|¡ |  
¡ | jkr6| j ¡  dS dS )z{Add a new item in the log list.

        Item is added only if the criticity (event_state) is WARNING or CRITICAL.
        ZWARNINGÚCRITICALr   r   r   TF)r   ÚtimeÚmktimer   ÚnowÚ	timetupler   Zsort_keyr	   Úinsertr   r   Úpop)r   r$   r   r%   r&   r'   r(   Úitemr   r   r   r"   }   s(   
ô
zGlancesEvents._create_eventc           
      C   sd  |dks|dkr4|   ¡  t t ¡  ¡ ¡}|| j| d  |kr)|| j| d< dS | j | j| ¡ dS |  |¡ |dkrD|| j| d< t	| j| d |ƒ| j| d< t
| j| d |ƒ| j| d< | j| d	  |7  < | j| d
  d7  < | j| d	 | j| d
  | j| d< |dkr©|  |¡}	t||	ƒdd… | j| d< |	| j| d< || j| d< dS )zUpdate an event in the listZOKZCAREFULr   r   r+   é   r    é   é   é   é   r   é	   é   r   T)r   r,   r-   r   r.   r/   r	   Úremover   ÚminÚmaxr   r   )
r   r)   r$   r   r%   r&   r'   r(   ZendtimeZevents_sort_keyr   r   r   r#   £   s@   "á
äÿÿÿ
ÿÿzGlancesEvents._update_eventFc                 C   s^   g }|   ¡ dkr(| j ¡ }|d dk s|s"|d  d¡r"| d|¡ |   ¡ dks|| _|   ¡ S )z¤Clean the logs list by deleting finished items.

        By default, only delete WARNING message.
        If critical = True, also delete CRITICAL message.
        r   r   r3   r+   )r   r	   r1   r   r0   )r   ZcriticalZclean_events_listr2   r   r   r   ÚcleanÒ   s   
ýzGlancesEvents.clean)Nr   r    )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r   r   r   r*   r"   r#   r=   r   r   r   r   r      s    
ÿ&/r   )rA   r,   r   Zglances.compatr   Zglances.processesr   r   Úobjectr   Zglances_eventsr   r   r   r   Ú<module>   s    
G