o
    Ìv›ac2  ã                   @   sŒ   d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dZd	ZG d
d„ deƒZG dd„ deƒZdS )zSensors plugin.é    N)Úlogger)Ú	iteritemsÚto_fahrenheit)ÚCounter)ÚPlugin)ÚGlancesPluginÚCÚRc                       s\   e Zd ZdZd‡ fdd„	Zdd„ Zejejdd„ ƒƒZ	d	d
„ Z
‡ fdd„Zddd„Z‡  ZS )r   zÝGlances sensors plugin.

    The stats list includes both sensors and hard disks stats, if any.
    The sensors are already grouped by chip type and then sorted by name.
    The hard disks are already sorted by name.
    Nc                    sÂ   t t| ƒj||g d tƒ }| ¡  tƒ | _t d 	| 
¡ ¡¡ | ¡  t||d| _t d 	| 
¡ ¡¡ | ¡  t||d| _t d 	| 
¡ ¡¡ d| _|  ¡ |jkr_|  |  ¡ d ¡ dS dS )	zInit the plugin.)ÚargsÚconfigZstats_init_valuez/Generic sensor plugin init duration: {} seconds)r
   r   z/HDDTemp sensor plugin init duration: {} secondsz/Battery sensor plugin init duration: {} secondsTé   N)Úsuperr   Ú__init__r   ÚresetÚGlancesGrabSensorsÚglancesgrabsensorsr   ÚdebugÚformatÚgetÚHddTempPluginÚhddtemp_pluginÚBatPercentPluginÚbatpercent_pluginZdisplay_curseZget_refreshÚtimeZset_refresh)Úselfr
   r   Zstart_duration©Ú	__class__© úA/usr/lib/python3/dist-packages/glances/plugins/glances_sensors.pyr   ,   s$   þÿzPlugin.__init__c                 C   s   dS )zReturn the key of the list.Úlabelr   ©r   r   r   r   Úget_keyM   s   zPlugin.get_keyc           	   
   C   sÐ  |   ¡ }| jdkr¶g }z|  | j d¡d¡}W n ty0 } zt d| ¡ W Y d}~n
d}~ww | |¡ z|  | j d¡d¡}W n ty[ } zt d| ¡ W Y d}~n
d}~ww | |¡ z|  | j	 
¡ d¡}W n ty… } zt d| ¡ W Y d}~n
d}~ww | |¡ z|  | j 
¡ d	¡}W n ty¯ } zt d
| ¡ W Y d}~nd}~ww | |¡ n| jdkr¼	 |   ¡ | _|D ]!}|  |d  ¡ ¡rÏqÃ|  |d  ¡ ¡}|rÞ||d< | j |¡ qÃ| jS )z,Update sensors stats using the input method.ZlocalÚtemperature_corez%Cannot grab sensors temperatures (%s)NÚ	fan_speedzCannot grab FAN speed (%s)Ztemperature_hddz Cannot grab HDD temperature (%s)Úbatteryz Cannot grab battery percent (%s)Zsnmpr   )Zget_init_valueZinput_methodÚ_Plugin__set_typer   r   Ú	Exceptionr   ÚerrorÚextendr   Úupdater   ÚstatsZis_hideÚlowerZ	has_aliasÚappend)	r   r*   ZtemperatureÚer#   ZhddtempZ
batpercentÚstatÚaliasr   r   r   r)   Q   sd   
ÿ€ÿ
ÿ€ÿ
ÿ€ÿ
ÿ€ÿ

zPlugin.updatec                 C   s.   |D ]}|  d|i¡ |  d|  ¡ i¡ q|S )zýSet the plugin type.

        4 types of stats is possible in the sensors plugin:
        - Core temperature: 'temperature_core'
        - Fan speed: 'fan_speed'
        - HDD temperature: 'temperature_hdd'
        - Battery capacity: 'battery'
        ÚtypeÚkey)r)   r!   )r   r*   Úsensor_typeÚir   r   r   Z
__set_type–   s   	zPlugin.__set_typec                    sô   t t| ƒ ¡  | jD ]m}|d sq
|d dkrK| jd|d dsK|d du r)d}nA|d |d kr4d}n6|d	 du r=d}n-|d |d	 krHd
}n"d}n|d dkr_| jd|d  |d d}n| j|d |d d}|| j||  ¡   d d< q
dS )zUpdate stats views.Úvaluer0   r"   Úcritical)Z	stat_nameNZDEFAULTZCRITICALÚwarningZWARNINGZOKr$   éd   )ÚcurrentÚheaderÚ
decoration)r   r   Úupdate_viewsr*   Zis_limitZ	get_alertZviewsr!   )r   r3   Zalertr   r   r   r;   §   s.   
ÿ
ÿêzPlugin.update_viewsc           	      C   sn  g }| j r	|  ¡ r|S |d }djd|d}| |  |d¡¡ | j D ]’}|d dkr1|d g kr1q"| |  ¡ ¡ dj|d	 d
|… |d}| |  |¡¡ |d dv rnd |d ¡}| |  || j||  ¡  ddd¡¡ q"|jr†|d dkr†|d dkr†t	|d ƒ}d}n|d }|d }zd ||¡}| |  || j||  ¡  ddd¡¡ W q" t
tfy´   Y q"w |S )z2Return the dict to display in the curse interface.é   z
{:{width}}ZSENSORS)ÚwidthZTITLEr0   r$   r4   r   N)s   ERRs   SLPs   UNKs   NOSz{:>13}r:   )Úitemr1   Úoptionr#   ÚFÚunitz{:>13.0f}{})r*   Zis_disabledr   r,   Zcurse_add_lineZcurse_new_lineZ	get_viewsr!   Z
fahrenheitr   Ú	TypeErrorÚ
ValueError)	r   r
   Z	max_widthÚretZname_max_widthÚmsgr3   r4   rA   r   r   r   Ú	msg_curseÆ   sR   
ÿþÿ
ÿþ
ÿÿzPlugin.msg_curse)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r   Z_check_decoratorZ_log_result_decoratorr)   r%   r;   rF   Ú__classcell__r   r   r   r   r   $   s    !Cr   c                   @   s:   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„ZdS )r   zGet sensors stats.c                 C   s’   d| _ i | _zt ¡ | _W n ty   t d¡ Y n	w d| _ t d¡ d| _	i | _
zt ¡ | _
W n ty?   t d¡ Y nw d| _	|  ¡  dS )zInit sensors stats.Fz1Cannot grab temperatures. Platform not supported.TÚignorez/Cannot grab fans speed. Platform not supported.N)Ú	init_tempÚstempsÚpsutilÚsensors_temperaturesÚAttributeErrorr   r   ÚwarningsÚfilterwarningsÚinit_fanÚsfansÚsensors_fansr   r    r   r   r   r   ý   s$   ÿ
ÿzGlancesGrabSensors.__init__c                 C   s
   g | _ dS )zReset/init the stats.N)Úsensors_listr    r   r   r   r     s   
zGlancesGrabSensors.resetc                 C   s>   |   ¡  | js
| jS | j |  t¡¡ | j |  t¡¡ | jS )zUpdate the stats.)r   rM   rW   r(   Úbuild_sensors_listÚSENSOR_TEMP_UNITÚSENSOR_FAN_UNITr    r   r   r   Ú
__update__  s   zGlancesGrabSensors.__update__c                 C   s   g }|t kr| jr| j}t ¡ | _n|tkr"| jr"| j}t ¡ | _n|S t	|ƒD ]e\}}d}|D ]\}i }|j
dkrD|d t|ƒ |d< n|j
|d< tt|ddƒrVt|ddƒndƒ|d< t|dd	ƒ}	|	d	urit|	ƒnd	|d
< t|dd	ƒ}
|
d	ur{t|
ƒnd	|d< ||d< | |¡ |d7 }q0q(|S )zBuild the sensors list depending of the type.

        type: SENSOR_TEMP_UNIT or SENSOR_FAN_UNIT

        output: a list
        é   Ú ú r   r8   r   r4   ZhighNr6   r5   rA   )rY   rM   rN   rO   rP   rZ   rT   rU   rV   r   r   ÚstrÚintÚgetattrr,   )r   r0   rD   Z
input_listZchipnameZchipr3   ZfeatureZsensors_currentr6   r5   r   r   r   rX   /  s2   

$

ðz%GlancesGrabSensors.build_sensors_listr"   c                 C   sV   |   ¡  |dkrdd„ | jD ƒ}|S |dkr dd„ | jD ƒ}|S t d| ¡ g }|S )zGet sensors list.r"   c                 S   ó   g | ]
}|d  t kr|‘qS ©rA   )rY   ©Ú.0Úsr   r   r   Ú
<listcomp>X  ó    z*GlancesGrabSensors.get.<locals>.<listcomp>r#   c                 S   rb   rc   )rZ   rd   r   r   r   rg   Z  rh   zUnknown sensor type %s)r[   rW   r   r   )r   r2   rD   r   r   r   r   T  s   úþzGlancesGrabSensors.getN)r"   )	rG   rH   rI   rJ   r   r   r[   rX   r   r   r   r   r   r   ú   s    %r   )rJ   rO   rR   Zglances.loggerr   Zglances.compatr   r   Zglances.timerr   Z*glances.plugins.sensors.glances_batpercentr   r   Z'glances.plugins.sensors.glances_hddtempr   Zglances.plugins.glances_pluginr   rY   rZ   Úobjectr   r   r   r   r   Ú<module>   s    W