o
    Ìv›a67  ã                   @   sT   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 G dd„ deƒZ
dS )z Curses browser interface class .é    N)Ú_GlancesCurses)Úlogger)ÚTimerc                       s¸   e Zd ZdZd#‡ fdd„	Zedd„ ƒZejdd„ ƒZedd	„ ƒZejd
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„ Z			d$dd„Zdd „ Zd#d!d"„Z‡  ZS )%ÚGlancesCursesBrowserz+Class for the Glances curse client browser.Nc                    sz   t t| ƒj|d | j| j| j| j| jdœ}| j |¡ d| _	|j
| _d| _d| _d| _d| _d| _d| _d| _d| _dS )zInit the father class.)Úargs)ÚUNKNOWNÚSNMPÚONLINEÚOFFLINEÚ	PROTECTEDTr   NF)Úsuperr   Ú__init__Zno_colorZdefault_color2ZifCRITICAL_color2ZifWARNING_color2Úcolors_listÚupdateÚ
first_scanÚtimeÚ#_GlancesCursesBrowser__refresh_timeÚcursor_positionÚ_active_serverÚ_current_pageÚ	_page_maxÚ_page_max_linesÚis_endÚ_revesed_sortingÚ_stats_list)Úselfr   Z_colors_list©Ú	__class__© úH/usr/lib/python3/dist-packages/glances/outputs/glances_curses_browser.pyr   "   s$   û
zGlancesCursesBrowser.__init__c                 C   ó   | j S )z:Return the active server or None if it's the browser list.©r   ©r   r   r   r   Úactive_serverD   ó   z"GlancesCursesBrowser.active_serverc                 C   ó
   || _ dS )z4Set the active server or None if no server selected.Nr!   )r   Úindexr   r   r   r#   I   ó   
c                 C   r    )zGet the cursor position.©r   r"   r   r   r   ÚcursorN   r$   zGlancesCursesBrowser.cursorc                 C   r%   )zSet the cursor position.Nr(   )r   Zpositionr   r   r   r)   S   r'   c                 C   s,   | j | jd krt|ƒ| j }|S | j}|S )Né   )r   r   Úlenr   )r   ÚstatsZ
page_linesr   r   r   Úget_pagelinesX   s
   ÿz"GlancesCursesBrowser.get_pagelinesc                 C   s\   i }|D ]}|d }|  |d¡d ||< qd}| ¡ D ]}||d t|| ƒ d 7 }q|S )NÚstatusr   r*   Ú z: ú )ÚgetÚkeysÚstr)r   r,   ZcountsÚitemZcolorÚresultÚkeyr   r   r   Ú_get_status_count_   s   z&GlancesCursesBrowser._get_status_countc                 C   s4   d }| j d ur| j }|j| jdd„ d |S |}|S )Nc                 S   s   ddddddœ  | d d¡S )	Nr   r*   é   é   é   )r   r
   r   r   r	   r.   éc   )r1   )Úxr   r   r   Ú<lambda>p   s    üz1GlancesCursesBrowser._get_stats.<locals>.<lambda>)Úreverser6   )r   Úsortr   )r   r,   Ú
stats_listr   r   r   Ú
_get_statsk   s   
ÿ	þzGlancesCursesBrowser._get_statsc                 C   sp   d| j d kr|  j d8  _ dS | jd dk r)| jd | _t|ƒd | j | _ dS |  jd8  _| jd | _ dS )ú+Set the cursor to position N-1 in the list.r   r*   N)r   r   r   r+   r   ©r   r,   r   r   r   Ú	cursor_upz   s   zGlancesCursesBrowser.cursor_upc                 C   sV   | j d |  |¡k r|  j d7  _ dS | jd | jk r#|  jd7  _nd| _d| _ dS )rB   r*   r   N)r   r-   r   r   rC   r   r   r   Úcursor_down†   s   
z GlancesCursesBrowser.cursor_downc                 C   s4   | j d dk r| jd | _ n|  j d8  _ d| _dS )zSet prev page.r*   r   N©r   r   r   rC   r   r   r   Úcursor_pageup’   s   
z"GlancesCursesBrowser.cursor_pageupc                 C   s0   | j d | jk r|  j d7  _ nd| _ d| _dS )zSet next page.r*   r   NrF   rC   r   r   r   Úcursor_pagedownš   s   
z$GlancesCursesBrowser.cursor_pagedownc                 C   sú  |   | j¡| _d}| jdkrt d| j ¡ | jtdƒks$| jtdƒkr1|  ¡  t d¡ d| _n¼| jdkrM| j	| j
 | j | _t d	 | jt|ƒ¡¡ n | jtjksX| jd
krl|  |¡ t d	 | jd t|ƒ¡¡ n| jtjksw| jdkr‹|  |¡ t d	 | jd t|ƒ¡¡ nb| jtjkr¤|  |¡ t d | j	d | j¡¡ nI| jtjkr½|  |¡ t d | j	d | j¡¡ n0| jtdƒkrÊd | _d}n#| jtdƒkrÜd| _| ¡ | _d}n| jtdƒkríd| _| ¡ | _d}|rúd| _	d| _|  |¡ | jS )NFéÿÿÿÿzKey pressed. Code=%súÚqzStop Glances client browserTé
   zServer {}/{} selectedéA   r*   éB   zPageUP: Server ({}/{}) pages.zPageDown: Server {}/{} pagesÚ1Ú2Ú3r   )Zget_keyÚterm_windowÚ
pressedkeyr   ÚdebugÚordÚendÚinfor   r   r   r   r#   Úformatr+   ÚcursesZKEY_UPrD   r)   ZKEY_DOWNrE   Z	KEY_PPAGErG   r   Z	KEY_NPAGErH   r   r   ÚcopyÚflush)r   r,   Zrefreshr   r   r   Z__catch_key¢   sN   









z GlancesCursesBrowser.__catch_keyr9   Fc                 C   sŽ   t  d |¡¡ |  |¡ d}t| jƒ}| ¡ sD|sD|  |¡}|tdƒkp.|tdƒkp.|dk}|s:|dkr:|  |¡ |  	¡  | ¡ sD|r| j
S )z˜Update the servers' list screen.

        Wait for __refresh_time sec / catch key every 100 ms.

        stats: Dict of dict with servers stats
        zServers list: {}FrJ   rK   rL   rI   )r   rT   rX   r[   r   r   ZfinishedÚ _GlancesCursesBrowser__catch_keyrU   Úwaitr#   )r   r,   ZdurationÚ	cs_statusZreturn_to_browserZexitkeyZ	countdownrS   r   r   r   r   Ø   s   


ÿ
özGlancesCursesBrowser.updatec                 C   s   |   ¡  |  |¡ dS )zYUpdate the servers' list screen.

        stats: List of dict with servers stats
        N)ZeraseÚdisplayrC   r   r   r   r[   ø   s   zGlancesCursesBrowser.flushc                 C   sî  |   ¡  | j ¡ d }| j ¡ d }|d }t|ƒ}|| _tt || ¡ƒ| _d}d}|dkr?| j	r<| j
js<d}	d| _	nd}	nt|ƒdkrHd}	nd |¡}	| j
jrU|	d	7 }	|dkr}| j |||	|| | jd
 ¡ d |  |¡¡}	| j |d ||	|| ¡ ||kr¤|dkr¤d |  |¡| jd | j|  |¡¡}	| j |d ||	|| ¡ |dkrªdS g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g}
d}|d }t|
ƒD ],\}}||k rú||k rú|d durú| j |||d || | jd ¡ ||d | j 7 }qÎ|d7 }| jt|ƒd krt|ƒd | _|  |¡}| j| j }||  |¡ }|||… }d}|D ]È}||kr5q,i }|
D ]Y}z||d  ||d < W n$ tyk } zt d |d |¡¡ d||d < W Y d}~nd}~ww z|d dkr…||d  dur…||d  |d< W q9 ty’   Y q9w d}|}|| jkr¬| j ||d|| | jd ¡ |d7 }|
D ]8}||k rå||k rå|d durå| j ||t||d  ƒ|d | j|d  ¡ ||d | j 7 }|d7 }q²|d7 }|d7 }q,dS )z²Display the servers list.

        Return:
            True if the stats have been displayed
            False if the stats have not been displayed (no server available)
        r*   r   r9   z0Glances is scanning your network. Please wait...FzNo Glances server availablezOne Glances server availablez{} Glances servers availablez (auto discover is disabled)ZTITLEz{}r8   z{} servers displayed.({}/{}) {})ÚnameÚNameé   )ÚaliasNN)Z	load_min5ZLOADé   )Zcpu_percentzCPU%é   )Zmem_percentzMEM%re   )r.   ZSTATUSé	   )ZipZIPé   )Zhr_nameZOSrb   NZBOLDz/Cannot grab stats {} from server (KeyError: {})ú?rc   r`   ú>r.   T)Zinit_line_columnZscreenZgetmaxyxr+   r   ÚintÚmathZceilr   r   r   Zdisable_autodiscoverrX   rR   Zaddnstrr   r7   r-   r   Ú	enumerateZspace_between_columnr)   rA   ÚKeyErrorr   rT   )r   r,   r^   Zscreen_xZscreen_yZ	stats_maxZ	stats_lenr<   ÚyÚmsgZ
column_defZxcZcptÚcr@   Z
start_lineZend_lineZcurrent_pageÚlineÚvZserver_statÚer   r   r   r_      sØ   

ýþýþ÷
ý€

ÿ€ý €ÿÿ"$ÿzGlancesCursesBrowser.display)N)r9   NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr#   Úsetterr)   r-   r7   rA   rD   rE   rG   rH   r\   r   r[   r_   Ú__classcell__r   r   r   r   r      s2    "



8
ü r   )rw   Úsysrk   rY   Zglances.outputs.glances_cursesr   Zglances.loggerr   Zglances.timerr   r   r   r   r   r   Ú<module>   s   