
    6j                        d Z ddlmZ ddlZddlZddlmZmZ ddlmZ ddl	m
Z
  ed          Z e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Zd*d Zd+d"ZdS ),a&  Safe aggregate host resource metrics for the WebUI VPS panel (#693).

The browser only needs coarse CPU/RAM/disk usage. Keep this module intentionally
small and dependency-free: no process lists, command strings, user identities,
environment variables, or filesystem topology leave the server.
    )annotationsN)datetimetimezone)Path)Anyz
/proc/statz/proc/meminfog?returnstrc                 b    t          j        t          j                                                  S N)r   nowr   utc	isoformat     '/root/hermes-webui/api/system_health.py_checked_atr      s     <%%//111r   valuer   floatc                    	 t          |           }n# t          t          f$ r Y dS w xY w|dk     rd}|dk    rd}t          |d          S )N        r   d         Y@   )r   	TypeError
ValueErrorround)r   numerics     r   _clamp_percentr      sg    ,,z"   ss{{}}!s    ''tuple[int, int]c                    t                               dd          5 } |                                                                                                 }ddd           n# 1 swxY w Y   |r|d         dk    rt          d          d |d	d         D             }t          |          d
k     rt          d          |d         t          |          d
k    r|d
         ndz   }t          |          }|dk    rt          d          ||fS )z7Return (idle_ticks, total_ticks) from Linux /proc/stat.rutf-8encodingNr   cpuproc_stat_unavailablec                ,    g | ]}t          |          S r   )int).0parts     r   
<listcomp>z'_read_proc_stat_cpu.<locals>.<listcomp>,   s    ...Dc$ii...r   r         )
_PROC_STATopenreadlinestripsplitRuntimeErrorlensum)handlefirstvaluesidletotals        r   _read_proc_stat_cpur;   &   s@   	w	/	/ 26!!''))//112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4E!H%%2333..E!""I...F
6{{Q2333!9S[[1__q		!<DKKEzz2333;s   9A""A&)A&startendc                    |d         | d         z
  }|d         | d         z
  }|dk    rdS t          d|t          d|          z
            }t          ||z  dz            S )Nr   r   r   r   )maxr   )r<   r=   
idle_deltatotal_delta
busy_deltas        r   _cpu_delta_percentrC   6   sl    Q%("Ja&58#KasQc!Z&8&8899J:3u<===r   c                     t                      } t          j        t                     t                      }t	          | |          S )zSample aggregate CPU usage without psutil.

    A short local sample avoids storing cross-request state and returns a stable
    percentage on the first poll. Unsupported platforms raise a safe error code.
    )r;   timesleep_CPU_SAMPLE_SECONDSrC   )r<   r=   s     r   _cpu_percentrH   ?   s;      !!EJ"###


CeS)))r   dict[str, int]c                 ^   i } t                               dd          5 }|D ]r}|                    d          \  }}}|r|s |                                                                }|sI	 t          |d                   | |<   c# t          $ r Y ow xY w	 d d d            n# 1 swxY w Y   | S )Nr!   r"   r#   :r   )_PROC_MEMINFOr/   	partitionr1   r2   r(   r   )datar6   linekey_restpartss          r   _read_meminfo_kibrT   K   s   D			C'		2	2 f 
	 
	D>>#..LCD d JJLL&&((E aMMS		   
	               Ks6   AB",BB"
BB"BB""B&)B&dict[str, int | float]c                 \   t                      } t          |                     d          pd          dz  }|dk    rt          d          |                     d          }|r|                     dd          |                     dd          z   |                     dd          z   |                     d	d          z   |                     d
d          z
  }t	          dt          |          dz            }t	          dt          |||z
                      }||t          ||z  dz            dS )NMemTotalr   i   meminfo_unavailableMemAvailableMemFreeBuffersCachedSReclaimableShmemr   
used_bytestotal_bytespercent)rT   r(   getr3   r?   minr   )meminfor:   available_kib	availableuseds        r   _memory_usageri   \   s6   !!GJ'',1--4Ezz0111KK//MKK	1%%kk)Q''(kk(A&&' kk.!,,- kk'1%%	& 	 As=))D011Iq#eUY.//00D!4%<5"899  r   c                     t          j        d          } t          | j                  }|dk    rt	          d          t          | j                  }||t          ||z  dz            dS )N/r   disk_unavailabler   r_   )shutil
disk_usager(   r:   r3   rh   r   )usager:   rh   s      r   _disk_usagerp   s   so    c""EEzz-...uz??D!4%<5"899  r   metricexc	Exceptiondict[str, str]c                0    | t          |          j        dS )N)rq   code)type__name__)rq   rr   s     r   _safe_errorry      s     d3ii&8999r   dict[str, Any]c            	        d d d dg } t           t          t          d}|                                D ]\  }}	  |            }|dk    rdt	          |          i|<   n^t          dt          |d                             t          dt          |d                             t	          |d                   d|<   # t          $ r-}|                     t          ||                     Y d }~d }~ww xY wt          fdD                       }|r| sd	n|rd
nd}||t                      d         d         d         | dS )N)r%   memorydiskr%   rb   r   r`   ra   r_   c              3  ,   K   | ]}|         d uV  d S r   r   )r)   namemetricss     r   	<genexpr>z.build_system_health_payload.<locals>.<genexpr>   s,      BB$GDM-BBBBBBr   okpartialunavailabler|   r}   )statusrg   
checked_atr%   r|   r}   errors)rH   ri   rp   itemsr   r?   r(   rs   appendry   anyr   )	r   
collectorsr   collectr   rr   rg   r   r   s	           @r   build_system_health_payloadr      s   &*dDIIG#%F  J
 $))++ 2 2g	2GIIEu}}!*N5,A,A B #&aU<-@)A)A"B"B#&q#eM.B*C*C#D#D-eI.>??! !
  	2 	2 	2MM+dC0011111111	2 BBBB'BBBBBI\v\TT	3\99}F!mmu~(#  s   BB==
C4#C//C4)r   r	   )r   r   r   r   )r   r   )r<   r   r=   r   r   r   )r   r   )r   rI   )r   rU   )rq   r	   rr   rs   r   rt   )r   rz   )__doc__
__future__r   rm   rE   r   r   pathlibr   typingr   r.   rL   rG   r   r   r;   rC   rH   rT   ri   rp   ry   r   r   r   r   <module>r      si    # " " " " "   ' ' ' ' ' ' ' '             T,
_%% 2 2 2 2	 	 	 	    > > > >	* 	* 	* 	*   "   .
 
 
 
: : : :! ! ! ! ! !r   