ó
    W&Jj��  ã                  óT  • % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJr  S SKJrJr  S SKJr  \" S5      r0 qS\S	'   \R*                  " 5       rSqS
\S'   \R0                  " 5       qSqS\S'   SqS\S'   \R*                  " 5       rSqS\S'   SqS\S'   \R*                  " 5       rSq S\S'   Sq!S\S'   0 q"S\S'   Sq#S\S'   S,S jr$S-S jr%S.S jr&S/S jr'S/S jr(S0S  jr)S0S! jr*S/S" jr+S1S# jr,S0S$ jr-S0S% jr.S2S& jr/S3S4S' jjr0S5S( jr1S6S5S) jjr2S7S* jr3S/S+ jr4g)8é    )ÚannotationsN)ÚPath)ÚAny)ÚThreadPoolExecutorÚas_completed)Ú
get_loggerÚmetricsúdict[str, Any]Ú_metrics_cachezthreading.Thread | NoneÚ_updater_threadzlist[dict[str, Any]] | NoneÚ_docker_cache_dataç        ÚfloatÚ_docker_cache_timeÚ_ssl_cache_dataÚ_ssl_cache_timez(tuple[float, float, float, float] | NoneÚ_last_cpu_timesz dict[str, dict[str, Any]] | NoneÚ_last_net_statszdict[int, dict[str, Any]]Ú_last_proc_statsztuple[float, float] | NoneÚ_last_disk_statsc                 ó8  • 0 n  [        SSSS9 nU HH  nUR                  5       R                  S5      n[        U5      S:¼  d  M3   US   U [	        US   5      '   MJ     S	S	S	5        U $ ! [
         a     Mc  f = f! , (       d  f       U $ = f! [         a     U $ f = f)
z1Parse /etc/passwd into a uid -> username mapping.z/etc/passwdÚrúutf-8©ÚencodingÚ:é   r   é   N)ÚopenÚstripÚsplitÚlenÚintÚ
ValueErrorÚ	Exception)Úuid_mapÚfÚlineÚpartss       Ú1D:\Programs\laragon\www\wolf\agent\src\metrics.pyÚget_uid_mapr+   (   s¨   € à€Gð
Ü�- ¨wÒ7¸1Û�ØŸ
™
›×*Ñ*¨3Ó/�Ü�u“: •?ðØ16°q±˜¤ E¨!¡H£Ó.ñ	 ÷ 8ð €Nøô	 &ó Úðú÷ 8Ô7ð €Nûô ó ØØ€NðúsR   „B �2A9ÁA(ÁA9ÁB Á(
A6Á2A9Á5A6Á6A9Á9
BÂB ÂB Â
BÂBc                óÊ   • SSK n[        R                  " U S   5      (       d  g UR                  U SSSSS9nUR                  S:w  a  gUR
                  $ ! [         a     gf = f)zGHelper to run command and capture output (similar to discovery.system).r   NTé   F)Úcapture_outputÚtextÚtimeoutÚcheck)Ú
subprocessÚshutilÚwhichÚrunÚ
returncodeÚstdoutr%   )Úcmdr2   Úresults      r*   Úrun_readonlyr:   9   sq   € ãÜ�<Š<˜˜A™×ÑØðØ—‘ØØØØØð  ð 
ˆð ×Ñ Ó!ØØ�}‰}ÐøÜó Ùðús   ¥#A Á	A Á
A"Á!A"c                óŽ  • U (       d  g[         R                  " S5      nUR                  SU 5      n U R                  5       n/ nSn1 Skn[	        U5       GH]  u  pgU(       ad  SnUR                  S5      (       a  SnO1UR                  S5      (       a  SnOUR                  S5      (       a  SnUR                  S	U-   5        SnMq  UR                  5       n	X•;   a'  UR                  U5        US
-   [        U5      :  a  SnM­  UR                  S5      (       a"  [        U5      S:”  a  UR                  S5        Må  Sn
U HU  nU	R                  UR                  5       S-   5      (       d  M,  UR                  UR                  SS
5      S   S-   5        Sn
  O   U
(       a  GML  UR                  U5        GM`     SR                  U5      $ )z3Mask sensitive parameters in process command lines.Ú z„(?i)(password|passwd|pwd|token|secret|api_key|apikey|access_token|refresh_token|authorization|bearer|--password|--token)\s*=\s*(\S+)z\1=***F>   ÚpwdÚtokenÚapikeyÚbearerÚpasswdÚsecretÚapi_keyÚpasswordÚaccess_tokenÚauthorizationÚrefresh_tokenú-pú--pwdú--tokenú--apikeyú--passwdú--secretú	--api-keyú	--api_keyú
--passwordÚ'Ú"Ú)z***é   TrH   r   z-p***r   r   z:***Ú )ÚreÚcompileÚsubr!   Ú	enumerateÚendswithÚappendÚlowerr"   Ú
startswithÚjoin)ÚcmdlineÚ
pattern_eqr)   Ú	sanitizedÚ	skip_nextÚsensitive_keysÚiÚpartÚsuffixÚ
part_lowerÚ
matched_eqÚks               r*   Úsanitize_cmdlinerj   M   sž  € æØô —’ð 	Pó€Jð �n‰n˜Y¨Ó0€Gð �M‰M‹O€EØ€IØ€Iò€Nô ˜U×#‰ˆÞØˆFØ�}‰}˜S×!Ñ!Ø‘Ø—‘˜s×#Ñ#Ø‘Ø—‘˜s×#Ñ#Ø�Ø×Ñ˜U V™^Ô,ØˆIÙà—Z‘Z“\ˆ
ØÓ'Ø×Ñ˜TÔ"Ø�1‰u”s˜5“zÓ!Ø �	Ùà�?‰?˜4× Ñ ¤S¨£Y°£]Ø×Ñ˜WÔ%Ùàˆ
ÛˆAØ×$Ñ$ Q§W¡W£Y°¡_×5Ó5Ø× Ñ  §¡¨C°Ó!3°AÑ!6¸Ñ!?Ô@Ø!�
Ùñ	  ö
 Úà×Ñ˜×ñC $ðF �8‰8�IÓÐó    c                 ó¢  • [         R                  " 5       =(       d    Sn / n [        [         R                  " 5       5      nSnSnSn [         R                  R                  S5      (       Ga¯  [        SSSS9 nUR                  5       nSSS5        WR                  S5      (       Gat  UR                  5       R                  5       nUS	S  Vs/ sH  n[        U5      PM     n	nU	SS
 u  p«pÍpïnnXÞ-   n[        U	SS
 5      n[        c®  UUUU4q[         R"                  " S5        [        SSSS9 nUR                  5       nSSS5        WR                  S5      (       aX  UR                  5       R                  5       nUS	S  Vs/ sH  n[        U5      PM     n	nU	SS
 u  p«pÍpïnnXÞ-   n[        U	SS
 5      n[        bZ  [        u  nnnnUU-
  nUS:”  aD  UU-
  n[%        SUU-  -
  S-  S	5      n[%        UU-
  U-  S-  S	5      n[%        UU-
  U-  S-  S	5      nUUUU4q[-        S[/        SU5      5      U U[-        S[/        SU5      5      [-        S[/        SU5      5      S.$ ! [        [
        4 a     GN2f = f! , (       d  f       GNõ= fs  snf ! , (       d  f       GNV= fs  snf ! [&         a   n[(        R+                  SU5         SnAN®SnAff = f)zFCollect CPU usage percent, core count, load average, steal and iowait.r   r   ú
/proc/statr   r   r   Nzcpu rT   é   çš™™™™™©?g      ð?ç      Y@zCPU collector error: %s)Úusage_percentÚcoresÚload_averageÚsteal_percentÚiowait_percent)ÚosÚ	cpu_countÚlistÚ
getloadavgÚOSErrorÚAttributeErrorÚpathÚexistsr   Úreadliner]   r    r!   r   Úsumr   ÚtimeÚsleepÚroundr%   ÚlogÚdebugÚmaxÚmin)rr   Úload_avgrq   rt   ru   r'   r(   r)   ÚxÚvalsÚuserÚniceÚsystemÚidleÚiowaitÚirqÚsoftirqÚstealÚidle_allÚtotalÚf2Úline2Ú
last_totalÚlast_idle_allÚ
last_stealÚlast_iowaitÚ
total_diffÚ	idle_diffÚexcs                                r*   Úcollect_cpur�   ‹   sÇ  € ô �LŠL‹N×˜a€EØ€HðÜœŸš›Ó(ˆð €MØ€MØ€Nð%2Ü�7‰7�>‰>˜,×'Ò'Ü�l C°'Ò:¸aØ—z‘z“|�÷ ;à�‰˜v×&Ò&ØŸ
™
›×*Ñ*Ó,�à*/°°©)Ó4©) Qœ˜až©)�Ð4ØHLÈRÈaÈÑE�˜F¨&°wÀà™=�Ü˜D  !˜H›�ô #Ñ*Ø',¨h¸¸vÐ&F�OÜ—J’J˜tÔ$Ü˜l¨C¸'ÒBÀbØ "§¡£˜÷ Cà×'Ñ'¨×/Ñ/Ø %§¡£× 3Ñ 3Ó 5˜Ø27¸¸±)Ó<±)¨Q¤ a¦±)˜Ð<ØPTÐUWÐVWÐPXÑM˜ F°&¸wÈØ#'¡=˜Ü # D¨¨! H£˜ä"Ñ.ÜIXÑF�J ¨z¸;Ø!&¨Ñ!3�JØ! A“~Ø$,¨}Ñ$<˜	Ü(-¨s°iÀ*Ñ6LÑ/MÐQVÑ.VÐXYÓ(Z˜Ü(-°¸
Ñ0BÀjÑ/PÐTYÑ.YÐ[\Ó(]˜Ü).°¸+Ñ1EÈÑ0SÐW\Ñ/\Ð^_Ó)`˜à#(¨(°E¸6Ð"B�ô
 ˜S¤# e¨]Ó";Ó<ØØ Ü˜S¤# e¨]Ó";Ó<Ü˜c¤3 u¨nÓ#=Ó>ñð øô] ”^Ð$ó Úðú÷ ;Ö:üò
 5÷ CÖBüò  =øô ó 2Ü�	‰	Ð+¨S×1Ñ1ûð2úsu   ¢I Á0J$ Á7I6ÂAJ$ ÃJÃ AJ$ Ä-JÄ>AJ$ ÆJÆBJ$ ÉI3É2I3É6
JÊ J$ Ê
JÊJ$ Ê$
KÊ.K	Ë	Kc            	     óˆ  • SSSSSSSSS.S.n  0 n[         R                  R                  S5      (       Ga;  [        SSSS9 nU Hv  nUR	                  S5      n[        U5      S	:X  d  M%  US   R                  5       nUS
   R                  5       R	                  5       nU(       d  Mb   [        US   5      S-  X'   Mx     SSS5        UR                  SS5      nUR                  SS5      nUR                  SS5      n	UR                  SS5      n
[        SXx-
  U
-
  U	-
  5      nUR                  SS5      nUR                  SS5      n[        SXÍ-
  5      nXpS'   X°S'   X€S'   X�S'   X S'   UUUS.U S'   U $ ! [         a     GM=  f = f! , (       d  f       NÍ= f! [         a!  n[        R                  SU5         SnAU $ SnAff = f)z0Collect RAM and Swap metrics from /proc/meminfo.r   )r“   ÚusedÚfree)r“   rŸ   r    ÚcachedÚbuffersÚswapz/proc/meminfor   r   r   r   r   rT   i   NÚMemTotalÚMemFreeÚCachedÚBuffersÚ	SwapTotalÚSwapFreer“   rŸ   r    r¡   r¢   r£   zRAM collector error: %s)rv   r|   r}   r   r!   r"   r    r#   r$   Úgetr…   r%   rƒ   r„   )Úram_infoÚvaluesr'   r(   r)   ÚkeyÚ	val_partsr“   r    r¡   r¢   rŸ   Ú
swap_totalÚ	swap_freeÚ	swap_usedrœ   s                   r*   Úcollect_ramr²   É   sÑ  € ð ØØØØØ Q°Ñ2ñ€Hð$2ØˆÜ�7‰7�>‰>˜/×*Ò*Ü�o s°WÒ=ÀÛ�DØ ŸJ™J s›O�EÜ˜5“z Q•Ø# A™hŸn™nÓ.˜Ø$)¨!¡H§N¡NÓ$4×$:Ñ$:Ó$<˜	ß$˜9ð%Ü.1°)¸A±,Ó.?À$Ñ.F £ñ ÷ >ð —J‘J˜z¨1Ó-ˆEØ—:‘:˜i¨Ó+ˆDØ—Z‘Z ¨!Ó,ˆFØ—j‘j ¨AÓ.ˆGÜ�q˜%™,¨Ñ0°6Ñ9Ó:ˆDàŸ™ K°Ó3ˆJØŸ
™
 :¨qÓ1ˆIÜ˜A˜zÑ5Ó6ˆIà %�WÑØ#�VÑØ#�VÑØ!'�XÑØ")�YÑà#Ø!Ø!ñ ˆH�VÑð €Oøô3 $.ó %Û $ð%ú÷ >Õ=ûô@ ó 2Ü�	‰	Ð+¨S×1Ð1Ø€Oûð2úsZ   �2F Á$FÁ)9FÂ'E3Â:FÂ>B3F Å3
FÅ=FÆFÆFÆ
FÆF Æ
GÆ F<Æ<Gc                 óø  • / n  [         R                  R                  S5      (       Ga  [        SSSS9 nU GH  nUR	                  5       R                  5       n[        U5      S:¼  d  M3  US   US   US   penUR                  S	5      =(       d    US
;   nU(       d  Mg  UR                  S5      (       a  M   [        R                  " U5      n[         R                  " U5      n	U	R                  n
U	R                  nX«-
  nU R                  UUUUR                  UR                  UR                   U
UUS.	5        GM     SSS5        U $  [        R                  " S5      nU R                  SSSUR                  UR                  UR                   SSSS.	5        U $ ! ["         a     GMp  f = f! , (       d  f       U $ = f! ["         a     U $ f = f! ["         a!  n[$        R'                  SU5         SnAU $ SnAff = f)z8Collect disk usage and inode count for each mount point.z/proc/mountsr   r   r   r   r   rT   r   z/dev/)ÚzfsÚbtrfsÚxfsÚext4Úext3Úext2Úf2fs)z	/boot/efiz/var/lib/docker)	Úmount_pointÚdeviceÚ
filesystemr“   rŸ   r    Úinodes_totalÚinodes_usedÚinodes_freeNÚ/ÚrootÚunknownzDisk collector error: %s)rv   r|   r}   r   r    r!   r"   r]   r3   Ú
disk_usageÚstatvfsÚf_filesÚf_ffreer[   r“   rŸ   r    r%   rƒ   r„   )Úmountsr'   r(   r)   Údevr»   Úfs_typeÚis_physicalÚusageÚstatvr¾   rÀ   r¿   rœ   s                 r*   Úcollect_diskrÎ   û   sà  € à€Fð33Ü�7‰7�>‰>˜.×)Ò)Ü�n c°GÒ<ÀÜ�DØ ŸJ™J›L×.Ñ.Ó0�EÜ˜5“z Q•Ø49¸!±H¸eÀA¹hÈÈaÉ¨'˜àŸN™N¨7Ó3÷ _Ø#Ð'^Ñ^ð $÷ '˜;¨{×/EÑ/EÐFf×/gÓ/gð%Ü(.×(9Ò(9¸+Ó(F Ü(*¯
ª
°;Ó(? à/4¯}©} Ø.3¯m©m Ø.:Ñ.H à &§¡Ø3>Ø.1Ø29Ø-2¯[©[Ø,1¯J©JØ,1¯J©JØ4@Ø3>Ø3>ñ
/"÷ 
!#ñ# ÷ =ðd €Mð#Ü×)Ò)¨#Ó.�Ø—‘Ø#&Ø$Ø"+Ø"Ÿ[™[Ø!ŸJ™JØ!ŸJ™JØ$%Ø#$Ø#$ñ
ô 
ð €Møô+ $-ó %Û $ð%ú÷; =Ô<ðd €Mûô	 ó Øð €Mð	ûäó 3Ü�	‰	Ð,¨c×2Ð2Ø€Mûð3ús„   „0G ´2F+Á*0F+ÂF+Â7BFÄ8F+Ä=G ÅAF= Æ
F(Æ#F+Æ'F(Æ(F+Æ+
F:Æ5G Æ:G Æ=
GÇG Ç
GÇG Ç
G9ÇG4Ç4G9c                 ó  • / n [         R                   " 5       n 0 n[        R                  R                  S5      (       GaR  [	        SSSS9 nUR                  5       nSSS5        WSS  Hñ  nUR                  S5      n[        U5      S:X  d  M%  US   R                  5       nUS	:X  a  M@  US
   R                  5       R                  5       n[        U5      S:¼  d  Mr   [        US   5      n	[        US
   5      n
[        US   5      n[        US   5      n[        US   5      n[        US   5      n[        US   5      n[        US   5      nU	U
UUUUUUUS.	X''   Mó     UR                  5        GH  u  nnSnSn[        (       aQ  U[        ;   aG  [        U   nUUS   -
  nUS:”  a0  [        SUS   US   -
  U-  5      n[        SUS   US   -
  U-  5      nSnSU S3n[        R                  R                  U5      (       a<   [	        USSS9 n[        UR                  5       R                  5       5      nSSS5        U R!                  UUS   US   US   US   US   US   US   US   [        US-  5      [        US-  5      US.5        GM      UqU $ ! , (       d  f       GN?= f! [         a     GMK  f = f! , (       d  f       N‰= f! [         a     N˜f = f! [         a!  n["        R%                  S U5         SnAU $ SnAff = f)!zDCollect network traffic details and rate metrics for each interface.z/proc/net/devr   r   r   Nr   r   r   ÚlorT   é   r   rn   é	   é
   é   )	Úrx_bytesÚ
rx_packetsÚ	rx_errorsÚrx_dropsÚtx_bytesÚ
tx_packetsÚ	tx_errorsÚtx_dropsÚ	timestampr   rÝ   rÕ   rÙ   éÿÿÿÿz/sys/class/net/z/speedrÖ   rÚ   r×   rÛ   rØ   rÜ   )Ú	interfacerÕ   rÙ   rÖ   rÚ   r×   rÛ   rØ   rÜ   Úrx_rate_bpsÚtx_rate_bpsÚ
speed_mbpszNetwork collector error: %s)r€   rv   r|   r}   r   Ú	readlinesr!   r"   r    r#   r$   Úitemsr   r…   Úreadr%   r[   rƒ   r„   )Ú
interfacesÚnowÚcurrent_statsr'   Úlinesr(   r)   ÚifaceÚcolsrÕ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   ÚstatsÚrx_rateÚtx_rateÚlastÚ	time_diffrâ   Ú
speed_pathÚsfrœ   s                             r*   Úcollect_networkró   5  s  € ð €JÜ
�)Š)‹+€CðI6ØˆÜ�7‰7�>‰>˜/×*Ò*Ü�o s°WÒ=ÀØŸ™›�÷ >à˜a˜b›	�ØŸ
™
 3›�Ü�u“: •?Ø! !™HŸN™NÓ,�EØ “}Ù Ø  ™8Ÿ>™>Ó+×1Ñ1Ó3�DÜ˜4“y B•ð!Ü'*¨4°©7£|˜HÜ),¨T°!©W«˜JÜ(+¨D°©G«˜IÜ'*¨4°©7£|˜HÜ'*¨4°©7£|˜HÜ),¨T°!©W«˜JÜ(+¨D°©H«˜IÜ'*¨4°©8£}˜Hð -5Ø.8Ø-6Ø,4Ø,4Ø.8Ø-6Ø,4Ø-0ñ
4˜MÓ0ñ% "ð@ !.× 3Ñ 3× 5‘��uØ�Ø�ß"’? u´Ó'?Ü*¨5Ñ1�DØ # d¨;Ñ&7Ñ 7�IØ  1“}Ü"% c¨E°*Ñ,=ÀÀZÑ@PÑ,PÐT]Ñ+]Ó"^˜Ü"% c¨E°*Ñ,=ÀÀZÑ@PÑ,PÐT]Ñ+]Ó"^˜à�
Ø.¨u¨g°VÐ<�
Ü—7‘7—>‘> *×-Ñ-ðÜ! *¨c¸GÒDÈÜ),¨R¯W©W«Y¯_©_Ó->Ó)?˜J÷ Eð
 ×!Ñ!Ø!&Ø % jÑ 1Ø % jÑ 1Ø"'¨Ñ"5Ø"'¨Ñ"5Ø!& {Ñ!3Ø!& {Ñ!3Ø % jÑ 1Ø % jÑ 1Ü#& w°¡{Ó#3Ü#& w°¡{Ó#3Ø",ñ#÷ ñ' !6ðD ,ˆOð Ð÷O >Ö=ûô>  *ó !Û ð!ú÷" EÕDûä$ó Ùðûô& ó 6Ü�	‰	Ð/°×5Ð5ØÐûð6ús¥   ™2K ÁJÁ.K ÂA	K ÃA>J&ÅB'K ÈK	È(J8È5K	È=AK Ê
J#ÊK Ê&
J5Ê0K Ê4J5Ê5K Ê8
K	ËK	ËK ËK	Ë	
KËK ËKËK Ë
LË#K?Ë?Lc                 ó|  • / n / n[         R                   " 5       n  [        R                  " S5      n [        R                  " S5      nSn[        R
                  R                  S5      (       a`  [        SSSS	9 nU HF  nUR                  S
5      (       d  M   [        UR                  5       R                  5       S   5      n  O   SSS5        [        5       n/ n	[        R
                  R                  S5      (       Ga°  [        R                  " S5       GH•  n
U
R                  5       (       d  M  [!        U
5      nSU
 3n [        U S3SSS9 nUR#                  5       R                  5       nSSS5        WR%                  S5      nUS:w  a1  USU nXÿR'                  S5      S-   S nXÞS-   S R                  5       nO+UR                  5       n[)        U5      S:”  a  US   OSnUSS n[)        U5      S:¼  a²  [!        US   5      n[!        US   5      n[!        US   5      n[!        US   5      nUU-   nUU-  nUUU-  -   nSn[*        (       a>  U[*        ;   a4  [*        U   nUUS   -
  nUUS   -
  nUS:”  a  [-        UU-  U-  S-  S5      nU	R/                  UU
UUUUUUS .5        GM•  GM˜     U	(       d  / / S!.$ [5        U	S" S#S$9SS% n[5        U	S& S#S$9SS% n[7        5       n/ n UU-    H3  n!U!S'   U;  d  M  UR9                  U!S'   5        U R/                  U!5        M5     0 n"U  GH·  n!U!S'   nU!S(   nSn# [        U S)3SSS9 n$U$ HF  nUR                  S*5      (       d  M   [!        UR                  5       R                  5       S   5      n#  O   SSS5        Sn%Sn& [        U S+3SSS9 n'U' H‡  nUR                  S,5      (       a,  [!        UR                  5       R                  5       S   5      n%ME  UR                  S-5      (       d  M]  [!        UR                  5       R                  5       S   5      n&M‰     SSS5        S.n( [        U S/3SSS9 n)U)R#                  5       R=                  S0S15      R                  5       n(SSS5        U((       a  [?        U(5      n(U((       a  U(OU!S2   n*U!S2   RA                  5       n+S3U+;   a  S4n,S5/n-OˆS6U+;   d  S7U+;   a  S4n,S8/n-OvS9U+;   a  S:n,S;/n-OjS<U+;   d  S=U+;   a  S>n,S?/n-OXS@U+;   a  S>n,SA/n-OLSBU+;   a  S>n,SC/n-O@SDU+;   a  S4n,SE/n-O4SFU+;   a  S4n,SG/n-O(SHU+;   a  S4n,SI/n-OSJU+;   a  S:n,SK/n-OSLU+;   a  S:n,SM/n-OSNn,/ n-Sn.[*        (       aG  U[*        ;   a=  [*        U   nUUS   -
  nUS:”  a&  SOU;   a   U%USO   -
  U&USP   -
  -   n/[C        SU/U-  5      n.U*U,U-URE                  U#[G        U#5      5      U!S   U!SQ   U!SR   U%U&UU!SS   U.ST.U"U'   GMº     0 n0U	 H4  n!U!S'   nUU";   a  U!S   UU"U   SO   U"U   SP   SU.U0U'   M)  U!S   USV.U0U'   M6     [*        (       d)  U	(       a"  U0q[         RH                  " SW5        [K        5       $ U0q/ n1U"RM                  5        Hô  u  nn2UU2SR   -
  n3U3SX:  a  SYn4OAU3SZ:  a  [!        U3SX-  5       S[3n4O)U3S\:  a  [!        U3SZ-  5       S]3n4O[!        U3S\-  5       S^3n4U1R/                  0 S_[G        U5      _S'[G        U5      _S2U2S2   _S`U2S`   _SaU2Sa   _SbU2SS    Sc3_SSU2SS   _Sd[-        U2SQ   Se-  S5       Sf3_SQU2SQ   _SgS#_ShSY_SiU4_Sj[-        U2Sk   Se-  S5       Sl3_SmU2S`    SnU2Sa    3_SoU2So   _Sp/ _5        Mö     [5        U1Sq S#S$9SSr n [5        U1Ss S#S$9SSr nU US!.$ ! [        [        4 a    Sn GNdf = f! [        [        4 a    Sn GNff = f! [        [        4 a     GNf = f! , (       d  f       GN
= f! , (       d  f       GNt= f! [0        [2        [        [        4 a     GMö  f = f! [        [        4 a     GN•f = f! , (       d  f       GNœ= f! [:         a     GN¬f = f! , (       d  f       GN= f! [:         a     GN&f = f! , (       d  f       GNñ= f! [:         a     GNf = f! [:         a!  n5[N        RQ                  StU55         Sn5A5GN:Sn5A5ff = f)uz/Collect Top 10 CPU and RAM consuming processes.ÚSC_PAGE_SIZEi   Ú
SC_CLK_TCKéd   r   rm   r   r   r   zbtime rT   Nz/procz/proc/z/statÚignore)ÚerrorsrS   rÞ   Ú(r   rÃ   é   rÔ   rÑ   é   é   rÝ   Úcpu_timer   rp   )ÚpidÚpid_dirÚproc_dirÚnamerþ   Ú	ram_bytesÚ
start_timeÚcpu_percent)Útop_cpuÚtop_ramc                ó   • U S   $ ©Nr  © ©rˆ   s    r*   Ú<lambda>Ú!collect_process.<locals>.<lambda>ß  s	   € ¸aÀÒ>Nrk   T)r­   Úreverseé   c                ó   • U S   $ ©Nr  r
  r  s    r*   r  r  à  s   € ¸aÀºnrk   rÿ   r  z/statuszUid:z/iozread_bytes:zwrite_bytes:r<   z/cmdlineÚ rU   r  ÚnginxÚServiceÚNginxÚapacheÚhttpdÚApacheÚphpÚRuntimeÚPHPÚmysqlÚmariadbÚDatabaseÚMySQLÚpostgresÚ
PostgreSQLÚredisÚRedisÚdockerÚDockerÚfail2banÚFail2BanÚcronÚCronÚnodezNode.jsÚpythonÚPythonÚSystemÚread_io_bytesÚwrite_io_bytesr  r  r  )r  ÚtypeÚruntimesrŠ   rþ   r  r  r.  r/  rÝ   r  Údisk_io_rate)rþ   rÝ   r.  r/  )rþ   rÝ   ro   é<   zjust nowi  zm agoi€Q zh agozd agoÚidr0  rŠ   ÚcpuÚ%Úramé   z MBÚrunningÚupdatedÚstartedÚdiskIor2  z MB/sÚdescriptionz process running under r1  Údomainsc                ó   • U S   $ r	  r
  r  s    r*   r  r  Ž  s	   € °!°MÒ2Brk   rÓ   c                ó   • U S   $ r  r
  r  s    r*   r  r  �  s   € °!°K².rk   zProcess collector error: %s))r€   rv   Úsysconfr{   r$   r|   r}   r   r]   r   r    r!   Ú
IndexErrorr+   ÚlistdirÚisdigitr#   rå   ÚrfindÚfindr"   r   r‚   r[   ÚFileNotFoundErrorÚPermissionErrorÚsortedÚsetÚaddr%   Úreplacerj   r\   r…   rª   Ústrr�   Úcollect_processrä   rƒ   r„   )6r  r  rç   Ú	page_sizeÚclk_tckÚbtimer'   r(   r&   Ú
candidatesr   rÿ   r  Ústat_contentÚrpar_idxÚ	name_partr  rë   ÚutimeÚstimeÚrssÚ	starttimerþ   r  Ústart_timestampr  rï   rð   Úcpu_diffÚtop_cpu_candidatesÚtop_ram_candidatesÚselected_pidsÚselected_candidatesÚcÚcurrent_proc_statsÚuidrò   r.  r/  Úiofr_   ÚcfÚp_nameÚ
short_nameÚp_typer1  r2  Úio_diffÚnext_proc_statsÚ	proc_listÚsÚelapsedr;  rœ   s6                                                         r*   rN  rN  ˆ  s<
  € ð €GØ€GÜ
�)Š)‹+€CðC6ð	ÜŸ
š
 >Ó2ˆIð	Ü—j’j Ó.ˆGð
 ˆÜ�7‰7�>‰>˜,×'Ñ'Ü�l C°'Ò:¸aÛ�DØ—‘ x×0Ó0ð!Ü$)¨$¯*©*«,×*<Ñ*<Ó*>¸qÑ*AÓ$B˜Eñ ñ ÷ ;ô “-ˆð ˆ
Ü�7‰7�>‰>˜'×"Ò"ÜŸ:š: g×.�Ø—?‘?×$Ó$Ü˜g›,�CØ!'¨ yÐ1�Hð+!Ü! X J¨eÐ"4°cÀ(ÒKÈqØ+,¯6©6«8¯>©>Ó+;˜L÷ Là#/×#5Ñ#5°cÓ#:˜Ø# r›>Ø(4°Y°hÐ(?˜IØ#,¯^©^¸CÓ-@À1Ñ-DÐ-EÐ#F˜DØ#/¸1±°Ð#>×#DÑ#DÓ#F™Dà#/×#5Ñ#5Ó#7˜DÜ.1°$«i¸!«m 4¨¢7À˜DØ#'¨¨ 8˜Dä˜t›9¨›?Ü$'¨¨R©£M˜EÜ$'¨¨R©£M˜EÜ"% d¨2¡h£-˜CÜ(+¨D°©H«˜Ià',¨u¡}˜HØ(+¨i©˜IØ.3°yÀ7Ñ7JÑ.K˜Oð +.˜Kß/Ò/°CÔ;KÓ4KÜ'7¸Ñ'< Ø,/°$°{Ñ2CÑ,C 	Ø+3°d¸:Ñ6FÑ+F Ø#,¨q£=Ü27¸ÀGÑ9KÈyÑ8XÐ[`Ñ8`ÐbcÓ2d Kà&×-Ñ-Ø'*Ø+2Ø,4Ø(,Ø,4Ø-6Ø.=Ø/:ñ	/÷ 	ò' +ñ# /öb Ø!¨bÑ1Ð1ô $ JÑ4NÐX\Ñ]Ð^aÐ_aÐbÐÜ# JÑ4LÐVZÑ[Ð\_Ð]_Ð`Ðä›ˆØ ÐØ#Ð&8Ô8ˆAØ�‰x˜}Õ,Ø×!Ñ! ! E¡(Ô+Ø#×*Ñ*¨1Ö-ñ 9ð  ÐÜ$ˆAØ�E‘(ˆCØ˜‘}ˆHð ˆCð
Ü˜X˜J gÐ.°¸HÒEÈÛ "˜ØŸ?™?¨6×2Ó2ð%Ü&)¨$¯*©*«,×*<Ñ*<Ó*>¸qÑ*AÓ&B ñ "ñ !#÷ Fð ˆMØˆNðÜ˜X˜J cÐ*¨C¸ÒAÀSÛ #˜ØŸ?™?¨=×9Ñ9Ü,/°·
±
³×0BÑ0BÓ0DÀQÑ0GÓ,HšMØ!Ÿ_™_¨^×<Ó<Ü-0°·±³×1CÑ1CÓ1EÀaÑ1HÓ-IšNñ	 !$÷ Bð ˆGðÜ˜X˜J hÐ/°¸XÒFÈ"Ø Ÿg™g›i×/Ñ/°¸Ó<×BÑBÓD�G÷ Gö
 Ü*¨7Ó3�æ '‘W¨Q¨v©YˆFð ˜6™Ÿ™Ó*ˆJØ˜*Ó$Ø"�Ø#˜9‘Ø˜ZÓ'¨7°jÓ+@Ø"�Ø$˜:‘Ø˜*Ó$Ø"�Ø!˜7‘Ø˜JÓ&¨)°zÓ*AØ#�Ø#˜9‘Ø˜zÓ)Ø#�Ø(˜>‘Ø˜JÓ&Ø#�Ø#˜9‘Ø˜ZÓ'Ø"�Ø$˜:‘Ø˜zÓ)Ø"�Ø&˜<‘Ø˜:Ó%Ø"�Ø"˜8‘Ø˜:Ó%Ø"�Ø%˜;‘Ø˜ZÓ'Ø"�Ø$˜:‘à!�Ø�ð ˆLßÒ CÔ+;Ó$;Ü'¨Ñ,�Ø $ {Ñ"3Ñ3�	Ø˜q“= _¸Ó%<Ø,¨t°OÑ/DÑDÈÐZ^Ð_oÑZpÑIpÑq�GÜ#& s¨G°iÑ,?Ó#@�Lð ØØ$ØŸ™ C¬¨S«Ó2Ø˜j™MØ˜{™^Ø ™oØ!.Ø"0Ø Ø  Ñ/Ø ,ñ'Ð˜sÔ#ñw %ðV ˆÛˆAØ�E‘(ˆCØÐ(Ó(à ! *¡Ø!$Ø%7¸Ñ%<¸_Ñ%MØ&8¸Ñ&=Ð>NÑ&Oñ	(� Ó$ð !" *¡Ø!$ñ(� Ó$ñ ÷   Ò¦JØ.ÐÜ�JŠJ�tÔÜ"Ó$Ð$à*Ðð ˆ	Ø(×.Ñ.Ö0‰FˆC�Ø˜A˜l™OÑ+ˆGØ˜‹|Ø$‘Ø˜4“Ü  ¨B¡Ó/Ð0°Ð6‘Ø˜5“Ü  ¨D¡Ó1Ð2°%Ð8‘ä  ¨EÑ!1Ó2Ð3°5Ð9�à×Ñð Ø”c˜#“hðà”s˜3“xðð ˜˜&™	ðð ˜˜&™	ð	ð
 ˜˜&™	ðð ˜!˜MÑ*Ð+¨1Ð-ðð ˜q Ñ/ðð œ%  +¡°+Ñ >ÀÓBÐCÀ3ÐGðð ˜Q˜{™^ðð ˜4ðð ˜:ðð ˜7ðð œU 1 ^Ñ#4¸Ñ#DÀaÓHÐIÈÐOðð  ! F¡) Ð,CÀAÀfÁIÀ;ÐOðð ˜A˜j™Mðð  ˜2ð!ö ñ 1ô< ˜Ñ(BÈDÑQÐRUÐSUÐVˆÜ˜Ñ(@È$ÑOÐPSÐQSÐTˆð Øñð øôE ¤
Ð+ó 	Ø‹Ið	ûô ¤
Ð+ó 	Ø‹Gð	ûô !+¬JÐ7ó !Ú ð!ú÷ ;Ö:ú÷& LÖKûôR .¬Ä
ÌJÐWó !Û ð!ûô> %/´
Ð#;ó %Ú $ð%ú÷ FÖEûô ó Úðú÷ BÖAûô ó Úðú÷
 GÖFûäó ÚðûôF ó 6Ü�	‰	Ð/°×5Ò5ûð6úsé  œ^ ³^ Á	1b Á:_
Â*^3Ã_
ÃA&b Ä1b Å_.Å_Å/D9_.Ê(b Ê<9b Ë9=b Ì7`9Í`'Í$*`Î`'Î`9Îb ÎaÎ-Aa
Ð.a
Ð;aÑb Ña?Ñ/a-Òa?ÒGb ÙD*b Þ^Þb Þ^Þb Þ^0Þ,b Þ/^0Þ0b Þ3_ß_
ß_ß_
ß

_ßb ß
_+	ß&_.ß.`àb à`àb à`$	à `'à#`$	à$`'à'
`6	à1`9à4b à6`9à9
aáb áaáb á

a	áaáb áaá
a*á&b á)a*á*b á-
a<	á7a?á:b á<a?á?
bâ	b âbâb â
b;âb6â6b;c            	     óž  • SSSSSSSSS	.n S
/SS/S/S/S.nU  Vs0 sH  o"S_M     nn[        / SQ5      nU(       Ga
  0 nUR                  5        HL  nUR                  SS9n[        U5      S:¼  d  M#  US   R	                  S5      (       d  M>  US   nUS   n	X•U'   MN     U R                  5        H”  u  p«Xµ;   a  X[   X:'   M  SnX¡;   a  X    H  nXÕ;   d  M
  X]   X:'   Sn  O   U(       a  M<  U
S:X  d  MD  UR                  5        H<  u  pïUR                  S5      (       d  M  UR	                  S5      (       d  M5  XóU
'   Sn  M’     M–     U$ s  snf )z1Collect health status of common systemd services.znginx.servicezapache2.servicezphp-fpm.servicezmysql.servicezredis-server.servicezdocker.servicezfail2ban.servicezcron.service)r  r  r  r  r"  r$  r&  r(  zhttpd.servicezmariadb.servicezmysqld.servicezredis.servicezcrond.service)r  r  r"  r(  Úinactive)Ú	systemctlz
list-unitsz--type=servicez--allz--no-legendz
--no-pageré   )Úmaxsplitr   z.servicer   FTr  z-fpm.service)r:   Ú
splitlinesr!   r"   rZ   rä   r]   )ÚservicesÚalt_servicesr  Ú
status_mapÚoutputÚactive_unitsr(   ÚfieldsÚ	unit_nameÚactive_stater­   ÚunitÚfoundÚalt_unitÚactive_unitÚstates                   r*   Úcollect_servicesr€  š  s‡  € ð !Ø#Ø Ø Ø'Ø"Ø&Øñ	€Hð #Ð#Ø#Ð%5Ð6Ø!Ð"Ø Ð!ñ	€Lñ 08Ó8©x t˜
Ò"©x€JÐ8äÒmÓn€FßØˆØ×%Ñ%Ö'ˆDØ—Z‘Z¨�ZÐ+ˆFÜ�6‹{˜aÕ F¨1¡I×$6Ñ$6°z×$BÓ$BØ" 1™I�	Ø% a™y�Ø*6˜YÓ'ñ (ð "Ÿ™Ö)‰IˆCØÓ#Ø".Ñ"4�
“à�ØÓ&Ø$0Ô$5˜Ø#Õ3Ø.:Ñ.D˜J™OØ$(˜EÙ!ñ	 %6÷
 �u ¨¥Ø.:×.@Ñ.@Ö.BÑ*˜Ø&×1Ñ1°%×8Ó8¸[×=QÑ=QÐR`×=aÓ=aØ.3 s™OØ$(˜EÚ!ó	 /Cñ *ð" Ðùò; 9s   œE
c            
     ó�  • Sn [         R                   " 5       n[           [        b  U[        -
  U :  a  [        sSSS5        $ SSS5        [        R
                  " S5      (       d  / $  [        / SQ5      nU(       d  / $ / n/ nUR                  5        Hj  nUR                  5       R                  S5      n[        U5      S:¼  d  M3  US   US   US	   p˜nUR                  UUU	SS
SS.5        UR                  U5        Ml     U(       Ga›  / SQU-   n
[        U
5      n0 nU(       a`  UR                  5        HL  nUR                  5       R                  S5      n[        U5      S	:X  d  M3  US   US   pí[        U5      XÍSS '   MN     / SQn[        U5      n0 nU(       aˆ  UR                  5        Ht  nUR                  5       R                  S5      n[        U5      S:X  d  M3  US   US   US	   nnnSU;   a"  UR                  S5      S   R                  5       OUnUUS.UU'   Mv     U Hz  nUS   SS nSnUR                  5        H6  u  nnUR                  U5      (       d  UR                  U5      (       d  M4  Un  O   UUS'   UU;   d  Md  UU   S   US'   UU   S   US'   M|     [           UqUqSSS5        U$ ! , (       d  f       GN}= f! , (       d  f       U$ = f! [         a_  n[         R#                  SU5        [           [        b  [        sSSS5        s SnA$  SSS5        O! , (       d  f       O= f/ s SnA$ SnAff = f)z,Collect details of active Docker containers.g     Àr@Nr$  )r$  Úpsz-aú--formatz{{.ID}}	{{.Names}}	{{.State}}Ú	r   r   rT   r   z0.0%Ú0B)r4  r  ÚstatusÚrestart_countr  Ú	ram_usage)r$  Úinspectrƒ  z{{.Id}}	{{.RestartCount}}rÑ   )r$  rì   z--no-streamrƒ  z"{{.ID}}	{{.CPUPerc}}	{{.MemUsage}}rÁ   )r5  r7  r4  r‡  r5  r  r7  rˆ  z2Docker collector failed, falling back to cache: %s)r€   Ú_docker_cache_lockr   r   r3   r4   r:   rr  r    r!   r"   r[   r#   rä   r]   r%   rƒ   r„   )Úttlrç   Úcontainers_jsonÚcontainers_listÚidsr(   r)   Úcidr  r  Úinspect_cmdÚinspect_outputÚrestart_countsÚfull_idÚrcountÚ	stats_cmdÚstats_outputÚdocker_statsr5  ÚmemÚmem_usedr`  Úshort_idÚkidÚvalrœ   s                             r*   Úcollect_dockerr�  Í  s  € ð
 €CÜ
�)Š)‹+€Cæ	ÜÑ)¨sÔ5GÑ/GÈ3Ó.NÜ%÷ 
×	Ñ	ô �<Š<˜×!Ñ!Øˆ	ðGÜ&Ò'lÓmˆÞØˆIàˆØˆØ#×.Ñ.Ö0ˆDØ—J‘J“L×&Ñ& tÓ,ˆEÜ�5‹z˜Q�Ø#(¨¡8¨U°1©X°u¸Q±x˜5�Ø×&Ñ&ØØ Ø#Ø%&Ø#)Ø!%ñ(ô ð —
‘
˜3–ñ 1÷ âYÐ\_Ñ_ˆKÜ)¨+Ó6ˆNØˆNÞØ*×5Ñ5Ö7�DØ ŸJ™J›L×.Ñ.¨tÓ4�EÜ˜5“z Q•Ø*/°©(°E¸!±H Ü7:¸6³{˜¨s° |Ó4ñ	 8ò oˆIÜ'¨	Ó2ˆLØˆLÞØ(×3Ñ3Ö5�DØ ŸJ™J›L×.Ñ.¨tÓ4�EÜ˜5“z Q•Ø(-¨a©°%¸±(¸EÀ!¹H #˜S˜Ø@CÀsÃ
 3§9¡9¨S£>°!Ñ#4×#:Ñ#:Ô#<ÐPS˜à#&Ø#+ñ-˜ SÓ)ñ 6ó %�Ø˜T™7 3 B˜<�Ø�Ø .× 4Ñ 4Ö 6‘H�C˜Ø—~‘~ h×/Ñ/°8×3FÑ3FÀs×3KÓ3KØ!$˜Ùñ !7ð &,��/Ñ"à˜|Õ+Ø'3°HÑ'=¸eÑ'D�A�mÑ$Ø%1°(Ñ%;¸EÑ%B�A�k“Nñ %ö  Ø!0ÐØ!$Ð÷  ð Ð÷O 
Ö	ú÷H  Ôð Ðûäó Ü�	‰	ÐFÈÔLÞÜ!Ñ-Ü)÷  ÖØ-÷  ×Öúð �	ûðús“   žJ8Á(K Á>AK ÃBK Å&A4K ÇBK É6K Ê	 K Ê)K
Ê.	K Ê8
KË

KËK ËK Ë
MË&M ÌL(Ì	M ÌMÌ	M Ì(
L6	Ì2M Ì:MÍ Mc                 ó	  • Sn [         R                   " 5       n[           [        b  U[        -
  U :  a  [        sSSS5        $ SSS5        SSKJn  Sn/ n / nU Hì  n [        U5      nUR                  5       (       d  M&  SU;   aB  UR                  S5       H+  nUR                  5       (       d  M  UR                  U5        M-     Mn  [        UR                  S5      5      SS	  H]  nUR                  5       (       d  M  S
UR                  ;  d  M,  SUR                  R                  5       ;  d  ML  UR                  U5        M_     Mî     USS  GH  n
 [#        SSSSSS[%        U
5      /5      nU(       Gaæ  SnSnUR'                  5        GH   nUR)                  S5      (       a¥  UR+                  SS5      S   R-                  5       n[.        R0                  " SU5      nU(       a!  UR3                  S5      R-                  5       nM|  [.        R0                  " SU5      nU(       a!  UR3                  S5      R-                  5       nM»  UnM¿  UR)                  S5      (       d  M×  UR+                  SS5      S   R-                  5       n UR5                  US5      nUR7                  5       S-   nGM#     SnS[%        U
5      ;   a  SOSnSnUS:X  an  [.        R0                  " S [%        U
5      R;                  S!S"5      5      nU(       a7  UR3                  S5      n[        S#U S$35      nUR                  5       (       a  S%nUR                  [%        U
5      UUUS&.5        GM  GM     [           UqUqSSS5        U$ ! , (       d  f       GN;= f! [        [        4 a"  n	[        R!                  SXi5         Sn	A	GM\  Sn	A	ff = f! [8         a    Un GMC  f = f! [        [        4 a"  n	[        R!                  S'X©5         Sn	A	GM°  Sn	A	ff = f! , (       d  f       U$ = f! [8         a_  n	[        R!                  S(U	5        [           [        b  [        sSSS5        s Sn	A	$  SSS5        O! , (       d  f       O= f/ s Sn	A	$ Sn	A	ff = f))zDCollect SSL certificate expire dates, issuers and auto-renew status.g      Œ@Nr   )Údatetime)z/etc/letsencrypt/livez/etc/ssl/certsÚletsencryptz**/fullchain*z**/*.pemé   Úprivkeyr­   z*SSL path read permission denied for %s: %sr  ÚopensslÚx509z-nooutz-issuerz-enddatez-inrÃ   zissuer=Ú=rT   rÞ   z\bO\s*=\s*([^,]+)z\bCN\s*=\s*([^,]+)z	notAfter=z%b %d %H:%M:%S %Y %ZÚZFÚcustomz/etc/letsencrypt/live/([^/]+)Ú\rÁ   z/etc/letsencrypt/renewal/z.confT)r|   ÚexpireÚissuerÚ
auto_renewzFailed to read SSL cert %s: %sz/SSL collector failed, falling back to cache: %s)r€   Ú_ssl_cache_lockr   r   rŸ  r   Úis_dirÚglobÚis_filer[   rx   r  r\   rH  rz   rƒ   r„   r:   rM  rr  r]   r!   r    rV   ÚsearchÚgroupÚstrptimeÚ	isoformatr%   rL  )r‹  rç   rŸ  Ú	cert_dirsÚcertsÚfound_pathsÚ	directoryÚbaseÚprœ   Úcertrv  rª  Úenddater(   Ú
raw_issuerÚmÚm_cnÚenddate_strÚdtr«  ÚproviderÚ	cert_nameÚrenewal_confs                           r*   Úcollect_sslrÄ  &  sÂ  € ð
 €CÜ
�)Š)‹+€Cæ	ÜÑ&¨C´/Ñ,AÀSÓ+HÜ"÷ 
�‰õ "Ø;€IØ€EðLØˆÛ"ˆIðÜ˜I“�Ø—{‘{—}‘}ÙØ  IÓ-Ø!ŸY™Y Ö7˜ØŸ9™9Ÿ;›;Ø'×.Ñ.¨qÖ1ó 8ô " $§)¡)¨JÓ"7Ó8¸¸"Ó=˜ØŸ9™9Ÿ;›;¨9¸A¿F¹FÕ+BÀuÐTU×TZÑTZ×T`ÑT`ÓTbÕGbØ'×.Ñ.¨qÖ1ó >ñ #ð"    Ô$ˆDð,Ü% y°&¸(ÀIÈzÐ[`ÔbeÐfjÓbkÐ&lÓm�ßØ&�FØ"�GØ &× 1Ñ 1× 3˜ØŸ?™?¨9×5Ñ5Ø)-¯©°C¸Ó);¸BÑ)?×)EÑ)EÓ)G˜JÜ "§	¢	Ð*>À
Ó K˜AÞ Ø)*¯©°«×)9Ñ)9Ó);¢ä')§y¢yÐ1FÈ
Ó'S Þ#'Ø-1¯Z©Z¸«]×-@Ñ-@Ó-B¢Fà-7¢FØ!Ÿ_™_¨[×9Ó9Ø*.¯*©*°S¸!Ó*<¸RÑ*@×*FÑ*FÓ*H˜Kð6Ø%-×%6Ñ%6°{ÐDZÓ%[ Ø*,¯,©,«.¸3Ñ*>£ñ! !4ð( "'�JØ0=ÄÀTÃÓ0J™}ÐPX�HØ $�IØ =Ó0ÜŸIšIÐ&FÌÈDË	×HYÑHYÐZ^Ð`cÓHdÓe˜ÞØ()¯©°«
˜IÜ+/Ð2KÈIÈ;ÐV[Ð0\Ó+]˜LØ+×3Ñ3×5Ñ5Ø-1 
à—L‘LÜ # D£	Ø")Ø"(Ø&0ñ	"÷ òE ñ %ö^ Ø#ˆOØ!ˆO÷ ð ˆ÷[ 
Žûô. $¤WÐ-ó Ü—	‘	ÐFÈ	ÔWÞûðûô6 $-ó 6Ø*5¤ð6ûô( $¤WÐ-ó Ü—	‘	Ð:¸DÔFÞûðú÷ Œ_ð ˆûäó Ü�	‰	ÐCÀSÔIÞÜÑ*Ü&÷ Ž_Ø*÷ �_Ž_úð �	ûðús  žM6ÁP Á NÁ=P Á?-NÂ0NÃP Ã3NÃ>NÄNÄ0NÅP ÅD
OÉ!#OÊ%N=Ê*B/OÍP Í'PÍ,	P Í6
NÎN:ÎN5Î.P Î5N:Î:P Î=OÏ	OÏOÏOÏPÏ!O>Ï7P Ï>PÐP Ð
PÐP ÐP Ð
RÐ"Q<Ð>Q$Ñ	Q<ÑRÑ	Q<Ñ$
Q2	Ñ.Q<Ñ6RÑ<Rc                 óâ  • [         R                   " 5       n Sn [        R                  R                  S5      (       Gas  [	        SSSS9 nU Hñ  nUR                  5       R                  5       n[        U5      S:¼  d  M2  US   nUR                  S5      =(       a    US	   R                  5       (       + =(       dT    UR                  S
5      =(       a    US	   R                  5       (       + =(       d    UR                  S5      =(       a    SU;  nU(       d  MË  [        US   5      n[        US   5      nXU-   S-  -  nMó     SSS5        Sn	[        b#  [        u  p«X-
  nUS:”  a  [        SX-
  U-  5      n	[        c#  X4q[         R                  " S5        [        5       $ X4q[        U	S-  S5      $  g! , (       d  f       Nx= f! [          a   n["        R%                  SU5         SnAgSnAff = f)z$Collect global Disk IO rate in MB/s.r   z/proc/diskstatsr   r   r   rÓ   r   ÚsdrÞ   ÚvdÚnvmer¹  r-   rÒ   i   Nr   ro   r8  zDisk IO collector error: %s)r€   rv   r|   r}   r   r    r!   r"   r]   rD  r#   r   r…   r�   Úcollect_disk_ior‚   r%   rƒ   r„   )rç   Útotal_bytesr'   r(   r)   rÉ   Úis_physical_devÚsectors_readÚsectors_writtenr2  Ú
last_bytesÚ	last_timerð   rœ   s                 r*   rÉ  rÉ  …  sÀ  € ô �)Š)‹+€CØ€Kð!6Ü�7‰7�>‰>Ð+×,Ò,ÜÐ'¨°wÒ?À1Û�DØ ŸJ™J›L×.Ñ.Ó0�EÜ˜5“z RÕ'Ø# A™h˜à Ÿ^™^¨DÓ1×K¸#¸b¹'¿/¹/Ó:KÔ6K÷ HØ Ÿ^™^¨DÓ1×K¸#¸b¹'¿/¹/Ó:KÔ6K÷Hà Ÿ^™^¨FÓ3×F¸À3¹ð (÷
 +˜?Ü+.¨u°Q©x«=˜LÜ.1°%¸±(«m˜OØ'¸?Ñ,JÈcÑ+QÑQšKñ ÷ @ð ˆLÜÑ+Ü(8Ñ%�
Ø™O�	Ø˜q“=Ü#& s¨[Ñ-EÈÑ,RÓ#S�Lô  Ñ'Ø$/Ð#5Ð Ü—
’
˜4Ô Ü&Ó(Ð(à +Ð1ÐÜ˜¨Ñ5°qÓ9Ð9ð= -ðB ÷A @Õ?ûô< ó 6Ü�	‰	Ð/°×5Ð5Øûð6úsC   ™0G Á	1F3Á>BF3Ä*F3ÅAG ÆG Æ3
GÆ=G Ç
G.ÇG)Ç)G.c           
     ó”  • [         [        [        [        [        [
        [        [        [        S.	n0 n[        [        U5      S9 nUR                  5        VVs0 sH  u  pEUR                  U5      U_M     nnn [        X`S9 H  nXg   n UR                  5       X$'   M     UR                  5        HP  u  ptXB;  d  M  UR'                  5       (       d  [         R#                  SU5        SX$'   M=   UR                  5       X$'   MR     SSS5        S	n	 [(        R*                  R-                  S
5      (       a?  [/        S
SSS9 n
[1        U
R3                  5       R5                  5       S   5      n	SSS5        O [7        U	5      US'   U$ s  snnf ! [         a&  n[         R#                  SXH5        SX$'    SnAGM2  SnAff = f! [$         a    [         R#                  SU 5         GN?f = f! [         a&  n[         R#                  SXH5        SX$'    SnAGM^  SnAff = f! , (       d  f       GN= f! , (       d  f       NÃ= f! [         a     NÒf = f)zªExecute all collectors concurrently using a ThreadPoolExecutor with global timeout.

Individually catches collector exceptions so a failure does not block/affect others.
)	r5  r7  ÚdiskÚnetworkÚprocessrs  r$  ÚsslÚdisk_io)Úmax_workers©r0   z&Collector %s failed with exception: %sNz8Metrics collection exceeded global timeout of %s secondszCollector %s timed outzCollector %s failed late: %sr   z/proc/uptimer   r   r   r   Úuptime)r�   r²   rÎ   ró   rN  r€  r�  rÄ  rÉ  r   r"   rä   Úsubmitr   r9   r%   rƒ   ÚwarningÚTimeoutErrorÚdonerv   r|   r}   r   r   r~   r!   r#   )r0   Ú
collectorsÚresultsÚexecutorr  ÚfuncÚfuturesÚfuturerœ   rØ  r'   s              r*   Úcollect_allrã  ±  s÷  € ô ÜÜÜ"Ü"Ü$Ü ÜÜ"ñ
€Jð !€GÜ	¬¨J«Ò	8¸HØAK×AQÑAQÔASÔTÑAS±:°4�8—?‘? 4Ó(¨$Ò.ÑASˆÑTð		]Ü& wÔ@�Ø‘�ð)Ø$*§M¡M£O�G“Mñ Að $ŸM™MžO‰LˆFØÕ"Ø—{‘{—}‘}Ü—K‘KÐ 8¸$Ô?Ø$(�G“Mð-Ø(.¯©«˜›ñ ,÷ 
9ð8 €FðÜ�7‰7�>‰>˜.×)Ñ)Ü�n c°GÒ<ÀÜ˜qŸz™z›|×1Ñ1Ó3°AÑ6Ó7�÷ =Ð<ð *ô
 ˜F›€GˆHÑà€NùóI Uøô !ó )Ü—K‘KÐ HÈ$ÔTØ$(�G—M�Mûð)ûô ó 	]Ü�K‰KÐRÐT[×\ð	]ûô %ó -ÜŸ™Ð$BÀDÔNØ(,˜Ÿ˜ûð-ú÷/ 
9Ö	8ú÷> =Õ<ûäó ÙðúsÌ   ÁHÁFÁ6HÁ:F=ÂF
ÂF=Â!HÂ=1HÃ/G$ÄHÄ/H: Ä?+H)Å*H: ÆHÆ

F:ÆF5Æ.F=Æ5F:Æ:F=Æ= G!ÇHÇ G!Ç!HÇ$
HÇ.HÈHÈHÈHÈ
H&È)
H7È3H: È7H: È:
IÉIc                ó¨  • [         R                  SU 5        [        R                  5       (       dÏ   [        R                  " 5       n[        [        U S-
  S5      S9n[           UqSSS5        [        R                  " 5       U-
  n[        SX-
  5      n[        [        US-  5      5       H4  n[        R                  5       (       a    O[        R                  " S5        M6      [        R                  5       (       d  MÎ  gg! , (       d  f       N¡= f! [         a6  n[         R                  S	U5        [        R                  " S
5         SnANiSnAff = f)z0Daemon thread loop that keeps the cache updated.z3Metrics cache updater thread started (interval=%ss)rT   ç      @r×  Ngš™™™™™¹?r   g      à?z!Error in metrics updater loop: %sç      @)rƒ   ÚinfoÚ_stop_eventÚis_setr€   rã  r†   Ú_cache_lockr   r…   Úranger#   r�   r%   Úerror)Úintervalr  Údatarl  Ú
sleep_timeÚ_rœ   s          r*   Ú_update_looprñ  ë  sî   € ä‡H�HÐBÀHÔMÜ× Ñ ×"Ñ"ð	ÜŸš›ˆJÜ¤s¨8°a©<¸Ó'=Ñ>ˆDÞà!%�÷ ô —i’i“k JÑ.ˆGÜ˜S (Ñ"4Ó5ˆJäœ3˜z¨A™~Ó.Ö/�Ü×%Ñ%×'Ñ'ÙÜ—
’
˜3–ò 0ô × Ñ ×"Õ"÷ •ûô ó 	Ü�I‰IÐ9¸3Ô?Ü�JŠJ�s�O‰Oûð	ús6   ±1D Á"D Á%A"D ÃD Ä 
DÄ
D Ä
EÄ,EÅEc                ó   • [            [        b#  [        R                  5       (       a
   SSS5        g[        R	                  5         [
        R                  " [        U 4SSS9q[        R                  5         SSS5        g! , (       d  f       g= f)z8Start the background thread updater if it isn't running.NÚWolfMetricsUpdaterT)ÚtargetÚargsr  Údaemon)	rê  r   Úis_aliverè  ÚclearÚ	threadingÚThreadrñ  Ústart)rí  s    r*   Ústart_updaterrü    si   € ö 
ÜÑ&¬?×+CÑ+C×+EÑ+EØ÷ 
ˆô 	×ÑÔÜ#×*Ò*ÜØ�Ø%Øñ	
ˆô 	×ÑÔ÷ 
�Žús   ‡"A?²AA?Á?
Bc                 óf   • [         R                  5         [        b  [        R                  SS9  Sqgg)z#Stop the background thread updater.Ng       @r×  )rè  rJ  r   r^   r
  rk   r*   Ústop_updaterrþ    s/   € ô ‡O�OÔÜÑ"Ü×Ñ SÐÑ)Ø‰ð #rk   c                 óÐ   • [            [        (       a  [        R                  5       sSSS5        $  SSS5        [        R	                  S5        [        SS9$ ! , (       d  f       N,= f)zHRetrieve metrics from the cache, or collect them synchronously if empty.Nz6Metrics cache empty; performing synchronous collectionræ  r×  )rê  r   Úcopyrƒ   r„   rã  r
  rk   r*   Úget_metricsr    sG   € æ	ßŠ>Ü!×&Ñ&Ó(÷ 
‰Ø÷ 
ô
 ‡I�IÐFÔGÜ˜sÑ#Ð#÷ 
�ús   ‡AÁ
A%)Úreturnzdict[int, str])r8   z	list[str]r  z
str | None)r_   rM  r  rM  )r  r
   )r  zlist[dict[str, Any]])r  zdict[str, str])r  r   )rå  )r0   r   r  r
   )rí  r#   r  ÚNone)é   )r  r  )5Ú
__future__r   Úloggingrv   rV   r3   Úsocketr€   rù  Úpathlibr   Útypingr   Úconcurrent.futuresr   r   Úloggerr   rƒ   r   Ú__annotations__ÚLockrê  r   ÚEventrè  r   r   rŠ  r   r   r¬  r   r   r   r   r+   r:   rj   r�   r²   rÎ   ró   rN  r€  r�  rÄ  rÉ  rã  rñ  rü  rþ  r  r
  rk   r*   Ú<module>r     s>  ðÞ "ã Û 	Û 	Û Û Û Û Ý Ý ß ?å á�Ó€ð "$€�Ó #Ø�nŠnÓ€Ø+/€Ð(Ó /Ø�oŠoÓ€ð 37Ð Ð/Ó 6ØÐ �EÓ Ø—^’^Ó%Ð à/3€Ð,Ó 3Ø€�Ó Ø—.’.Ó"€ð =A€Ð9Ó @Ø48€Ð1Ó 8Ø.0Ð Ð+Ó 0Ø/3Ð Ð,Ó 3ôô"ô(9ô|;ô|/ôd7ôtPôfOôd0ôfVôr\ô~'öX7ôtö, ô õ$rk   