
    Pi3K                       d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
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 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ddlm'Z' ddlm(Z( ddlm)Z) ddlm*Z* ddlm+Z+ g dZ,d Z-ej.        /                    d! ej0                     d"          Z1ej.        /                    d! ej0                     d#          Z2 e3ed$          Z4 e3ed%          Z5 ej6        d&          Z7 ej8                    Z9ej:        d'k    Z; e<            Z=d(Z> ej?        d)d* e@e
jA                  i          ZBeBjC        ZC G d+ d,ej?                  ZD eE            F                    eDjG                   ejH        ejI        ejJ        ejK        ejL        ejM        ejN        ejN        ejO        ejP        ejQ        ejR        d-ZSejT        ejU        ejV        ejW        ejX        ejY        ejZ        ej[        ej\        ej]        ej^        d.Z_d/ Z`d0 Zad1 Zbe$d2             Zc	  ecd3          e_d        n<# ee$ r4Zf e d4ef             ed5d6          d7d7d7          e_d        Y dZf[fndZf[fww xY wejd        Zdd8 Zgd9 Zhd: Zi e3ed;          rejj        Zjejk        Zkd< Zld= Zmd> Znd? Zod@ ZpdA Zqej.        /                    dB          sej.        /                    dC          rdD ZrndE Zrejs        Zs G dF dGee          Zt G dH dI          Zu eu            Zvd^dKZwdL ZxdM Zyejz        Zzd_dOZ{ G dP dQ          Z|d_dRZ}dS Z~dT ZdU ZdV ZdW ZdX ZdY ZdZ Zd[ Z G d\ d]          ZdS )`zLinux platform implementation.    N)defaultdict)
namedtuple   )_common)_ntuples)_psposix)_psutil_linux)ENCODING)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN)AccessDenied)NoSuchProcess)ZombieProcess)bcat)cat)debug)decode)get_procfs_path)isfile_strict)memoize)memoize_when_activated)open_binary)	open_text)parse_environ_block)path_exists_strict)supports_ipv6)usage_percent)PROCFS_PATHIOPRIO_CLASS_NONEIOPRIO_CLASS_RTIOPRIO_CLASS_BEIOPRIO_CLASS_IDLECONN_ESTABLISHEDCONN_SYN_SENTCONN_SYN_RECVCONN_FIN_WAIT1CONN_FIN_WAIT2CONN_TIME_WAIT
CONN_CLOSECONN_CLOSE_WAITCONN_LAST_ACKCONN_LISTENCONN_CLOSINGz/sys/class/power_supply/proc//smaps/smaps_rollupproc_ioprio_getproc_cpu_affinity_get
SC_CLK_TCKlittlei   AddressFamilyAF_LINKc                       e Zd ZdZdZdZdZdS )
IOPriorityr   r         N)__name__
__module____qualname__r    r!   r"   r#        c/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/psutil/_pslinux.pyr9   r9   d   s&        OOr@   r9   )RSDTtZXxKWIP)0102030405060708090A0Bc                     t          | t                    s
J |             t          j        |           } |                     d          d         } |                     d          rt          |           s
| dd         } | S )zWrapper around os.readlink(). r   
 (deleted)N)
isinstancestrosreadlinksplitendswithr   paths    rA   r`   r`      s    dC  &&$&& ;tD ::fa D }}\"" +=d+C+C DSDzKr@   c                 (   t           j        dt           j        dt           j        di}|| t           j        t           j        z  t           j        z  z           }| t           j        z  r|                    ddd          }|                    dd          }|S )zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    rwzw+ar   zr+)r_   O_RDONLYO_WRONLYO_RDWRO_APPENDreplace)flags	modes_mapmodes      rA   file_flags_to_moderq      sw     c2;RYEIUbkBK7")CDEDr{ )||Ca((<<d##DKr@   c                     |                      dd          } d}|rd|  }nd|  d}t          j        |t          j                  S )zReturn True if the given name refers to a root device (e.g.
    "sda", "nvme0n1") as opposed to a logical partition (e.g.  "sda1",
    "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram")
    return True.
    /!Tz/sys/block/z/device)rm   r_   accessF_OK)nameincluding_virtualrd   s      rA   is_storage_devicery      sX     <<S!!D +#T##*T***9T27###r@   c                    t          |  d          5 }|                                                                dd         }ddd           n# 1 swxY w Y   g d}t          |          }|dk    r|                    d           |dk    r|                    d           |d	k    r|                    d
           t          d|          S )zReturn a namedtuple of variable fields depending on the CPU times
    available on this Linux kernel version which may be:
    (user, nice, system, idle, iowait, irq, softirq, [steal, [guest,
     [guest_nice]]])
    Used by cpu_times() function.
    /statr   N)usernicesystemidleiowaitirqsoftirq   steal	   guest
   
guest_nice	scputimes)r   readlinera   lenappendr   )procfs_pathfvaluesfieldsvlens        rA   _scputimes_ntupler      s    
***	+	+ *q##%%abb)* * * * * * * * * * * * * * *KKKFv;;Dqyygqyygrzzl###k6***s   /AAA/proczignoring exception on import: r   zuser system idle        c                    | d         }||                      dd          z   }	 | d         }| d         }| d         }n6# t          $ r)}t          |j        d          d           |cY d}~S d}~ww xY w	 t	          t                       d	          }n# t          $ r |cY S w xY wd}|5  |D ]U}	|	                                }	|	                    d
          r*|t          |	
                                d                   z  }V	 ddd           n# 1 swxY w Y   |t          z  }||z
  }
||z   }|t          |dz  |          z  }|
|z  }
|
|t          |dz  |          z
  z  }
t          |
          S )ay  Fallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable", see:
    https://blog.famzah.net/2014/09/24/.

    This code reimplements the algorithm outlined here:
    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
        commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

    We use this function also when "MemAvailable" returns 0 (possibly a
    kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
    In that case this routine matches "free" CLI tool result ("available"
    column).

    XXX: on recent kernels this calculation may differ by ~1.5% compared
    to "MemAvailable:", as it's calculated slightly differently.
    It is still way more realistic than doing (free + cached) though.
    See:
    * https://gitlab.com/procps-ng/procps/issues/42
    * https://github.com/famzah/linux-memavailable-procfs/issues/2
       MemFree:   Cached:r   s   Active(file):s   Inactive(file):   SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfos   lowr   r:   g       @)getKeyErrorr   argsr   r   OSErrorstrip
startswithintra   PAGESIZEmin)memsfreefallbacklru_active_filelru_inactive_fileslab_reclaimableerrr   watermark_lowlineavail	pagecaches               rA   calculate_avail_vmemr      s   < Ddhhz1---H	/0 !34 01   x{ > > >	
 	
 	
 ?,,77788    M	
 6 6 	6 	6D::<<Dv&& 6TZZ\\!_!5!55	66 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 XM= E"33IY]M222I	YE	$4s$:M J JJJEu::s@   < 
A/A*$A/*A/3B B! B!(ADDDc                     g } i }t          t                       d          5 }|D ]7}|                                }t          |d                   dz  ||d         <   8	 ddd           n# 1 swxY w Y   |d         }|d         }	 |d         }n'# t          $ r d}|                     d	           Y nw xY w	 |d
         }||                    dd          z  }n'# t          $ r d}|                     d           Y nw xY w	 |d         }	nA# t          $ r4 	 |d         }	n'# t          $ r d}	|                     d           Y nw xY wY nw xY w	 |d         }
n'# t          $ r d}
|                     d           Y nw xY w	 |d         }nS# t          $ rF 	 |d         |d         z   |d         z   }n'# t          $ r d}|                     d           Y nw xY wY nw xY w	 |d         }n# t          $ r d}Y nw xY w	 |d         }|dk    rt          |          }n# t          $ r t          |          }Y nw xY w|dk     rd}|                     d           n||k    r|}||z
  }t          ||z
  |d          }| rZd	                    d
                    |           t          |           dk    rdnd          }t          j        |t          d            t          j        ||||||
||||	|          S )!a7  Report virtual memory stats.
    This implementation mimics procps-ng-3.3.12, aka "free" CLI tool:
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
    The returned values are supposed to match both "free" and "vmstat -s"
    CLI tools.
    /meminfor      r   Ns	   MemTotal:r   s   Buffers:buffersr   r   cacheds   Shmem:s
   MemShared:shareds   Active:actives	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:inactives   Slab:s   MemAvailable:	availableround_z6{} memory stats couldn't be determined and {} set to 0z, waswerer:   
stacklevel)r   r   ra   r   r   r   r   r   r   formatjoinr   warningswarnRuntimeWarningntpsvmem)missing_fieldsr   r   r   r   totalr   r   r   r   r   r   slabr   usedpercentmsgs                    rA   virtual_memoryr   2  s[    ND	))333	4	4 4 	4 	4DZZ\\F!&)nnt3DOO	44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ED){# ) ) )i((((()0j! 	$((+Q///  ( ( (h'''''(,i , , ,	,-(FF 	, 	, 	,F!!(+++++	,,(j! ( ( (h'''''(.% 	. 	. 	.	._%'(()* H
  	. 	. 	.H!!*-----	.	.H~   
/%& A::
 )..E  + + +$T**+ qyyk****	 5=DUU]U1===G  9FMMIIn%%((A--EE6
 
 	c>a88889  s   ;A++A/2A/B !B43B48C !C>=C>D 
E	DE	!E E	EE	E	E !E:9E:>F 
GF-,G-!GGGGGG$ $G32G37H H10H1c                  >   i } t          t                       d          5 }|D ]7}|                                }t          |d                   dz  | |d         <   8	 ddd           n# 1 swxY w Y   	 | d         }| d         }n5# t          $ r( t          j                    \  }}}}}}}||z  }||z  }Y nw xY w||z
  }t          ||d          }		 t          t                       d	          }|5  dx}
}|D ]}|                    d
          r/t          |                    d          d                   dz  dz  }
nC|                    d          r.t          |                    d          d                   dz  dz  }|
| n(d}|dz  }t          j
        |t          d           dx}
}ddd           n# 1 swxY w Y   n=# t          $ r0}d| d}t          j
        |t          d           dx}
}Y d}~nd}~ww xY wt          j        ||||	|
|          S )zReturn swap memory metrics.r   r   r   r   Ns
   SwapTotal:s	   SwapFree:r   z/vmstats   pswpin       s   pswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r:   r   zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 ())r   r   ra   r   r   cextlinux_sysinfor   r   r   r   r   r   r   sswap)r   r   r   r   r   r   _unit_multiplierr   r   sinsoutr   r   s                 rA   swap_memoryr     s   D	))333	4	4 4 	4 	4DZZ\\F!&)nnt3DOO	44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ]#L!      373E3G3G01aE4  
 4<DD%222G?,,55566  	 	C$   ??9-- ?djj..q122Q6=CC__Z00 ?tzz$//233a7$>D?t'7E
 E88c>a@@@@d%	 	 	 	 	 	 	 	 	 	 	 	 	 	 	    7037 7 7 	 	c>a8888dddddd8 9UD$d;;;sN   ;A))A-0A-5B /B87B8G	 3B>F==GG	
H&G>>H	heap_infoc                  D   t                      } t          |  d          5 }|                                                                }ddd           n# 1 swxY w Y   |dt	          t
          j        j                  dz            }d |D             }t          j        | S )zReturn a named tuple representing the following system-wide
    CPU times:
    (user, nice, system, idle, iowait, irq, softirq [steal, [guest,
     [guest_nice]]])
    Last 3 fields may not be available on all Linux kernel versions.
    r{   Nr   c                 <    g | ]}t          |          t          z  S r?   floatCLOCK_TICKS.0rI   s     rA   
<listcomp>zcpu_times.<locals>.<listcomp>   s#    555eAhh$555r@   )r   r   r   ra   r   r   r   _fields)r   r   r   r   s       rA   	cpu_timesr     s     "##K	***	+	+ &q##%%& & & & & & & & & & & & & & &ACM122Q667F55f555F=&!!s   'AAAc                     t                      } g }t          |  d          5 }|                                 |D ]}|                    d          rl|                                }|dt          t          j        j                  dz            }d |D             }t          j        | }|	                    |           |cddd           S # 1 swxY w Y   dS )zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    r{   s   cpur   c                 <    g | ]}t          |          t          z  S r?   r   r   s     rA   r   z!per_cpu_times.<locals>.<listcomp>  s#    AAAQ%(([0AAAr@   N)
r   r   r   r   ra   r   r   r   r   r   )r   cpusr   r   r   r   entrys          rA   per_cpu_timesr     s    "##KD	***	+	+ 
q	

 	# 	#Dv&& #C(=$>$>$B BCAA&AAAv.E"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   BCCCc                  N   	 t          j        d          S # t          $ r d} t          t	                       d          5 }|D ].}|                                                    d          r| dz  } /	 ddd           n# 1 swxY w Y   | dk    rt          j        d          }t          t	                       d          5 }|D ]7}|
                    d	          d         }|                    |          r| dz  } 8	 ddd           n# 1 swxY w Y   | dk    rY dS | cY S w xY w)
z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNr   /cpuinfos	   processorr   Nzcpu\dr{    )r_   sysconf
ValueErrorr   r   lowerr   recompiler   ra   match)numr   r   searchs       rA   cpu_count_logicalr     s   z/000   O--77788 	A  ::<<**<88 1HC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !88Z))Fo//66677 !1 ! !D::c??1-D||D)) !q!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !8844


-s]    +D$2B 4D$ B	D$B	;D$;D?D$D	D$D		D$D$#D$c                  P   t                      } d}d}t          j        |          pt          j        |          D ]b}t          |          5 }|                     |                                                                           ddd           n# 1 swxY w Y   ct          |           }|dk    r|S i }i }t          t                       d          5 }|D ]}|                                                                }|s&	 |d         ||d         <   n# t          $ r Y nw xY wi }P|
                    d          r+|                    d	d
          \  }	}
t          |
          ||	<   	 ddd           n# 1 swxY w Y   t          |                                          }|pdS )z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNr   r   	   cpu cores   physical id)r   r   s   	:r   )setglobr   addreadr   r   r   r   r   r   ra   r   sumr   )lsp1p2rd   r   resultmappingcurrent_infor   keyvalues              rA   cpu_count_coresr  4  s4    
B 
EB	JB	".2 % % 	%!FF16688>>##$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%WWF{{ GL	))333	4	4 / 	/ 	/D::<<%%''D /<H$=GL899     D!!?@@ /!ZZ22
U$'JJS!	// / / / / / / / / / / / / / /" !!""F>TsI   :BB	B	-E8DE8
D$!E8#D$$AE88E<?E<c                  2   t          t                       d          5 } d}d}d}| D ]}|                    d          r(t          |                                d                   }ny|                    d          r(t          |                                d                   }n<|                    d          r't          |                                d                   }||| nddd           n# 1 swxY w Y   d}t          j        ||||          S )z*Return various CPU stats as a named tuple.r{   Ns   ctxtr   s   intrs   softirqr   )r   r   r   r   ra   r   	scpustats)r   ctx_switches
interruptssoft_interruptsr   syscallss         rA   	cpu_statsr  ^  sO   	))000	1	1 Q
 	 	Dw'' 7"4::<<?33)) 7 a11

,, 7"%djjll1o"6"6(#/*!              " H=z?HMMMs   C
C55C9<C9c                      t          t                       d          5 } d | D             cddd           S # 1 swxY w Y   dS )z7Return current CPU frequency from cpuinfo if available.r   c                     g | ]R}|                                                     d           )t          |                    dd          d                   SS )s   cpu mhz   :r   )r   r   r   ra   )r   r   s     rA   r   z)_cpu_get_cpuinfo_freq.<locals>.<listcomp>x  s_     
 
 
zz||&&z22
$**T1%%a())
 
 
r@   N)r   r   )r   s    rA   _cpu_get_cpuinfo_freqr  u  s    	))333	4	4 

 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   8<<z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	         t                      } t          j        d          pt          j        d          }|                    d            g }t          j        j        }t          |          D ]O\  }}t          |          t          |           k    r| |         dz  }nt           ||d          d          }|st           ||d	          d          }|Vd
| d}t          |d          dk    r*|
                    t          j        ddd                     d}t          |          t          |          dz  }t          t           ||d                              dz  }	t          t           ||d                              dz  }
|
                    t          j        ||
|	                     Q|S )zReturn frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc                 j    t          t          j        d|                                                     S )Nz[0-9]+)r   r   r   group)rI   s    rA   <lambda>zcpu_freq.<locals>.<lambda>  s&    RYy!%<%<%B%B%D%D!E!E r@   )r  i  scaling_cur_freqNr   cpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
r   z!can't find current frequency filescaling_max_freqscaling_min_freq)r  r   sortr_   rd   r   	enumerater   r   r   r   r   scpufreqNotImplementedErrorr   )cpuinfo_freqspathsretpjoinird   curronline_pathr   max_min_s              rA   cpu_freqr&    s   
 .//	:
 
 DYBCC 	 	

EE
FFF '' 	7 	7GAt5zzS//// %Q'$.EE$(:;;dKKK| EE$(:;;dKKK<"J"J"J"JK;666%??

3<S##>#>??? =C-c222t99t#DtEE$(:;;<<==DDtEE$(:;;<<==DDJJs|D$556666
r@   c                  2    d t                      D             S )z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        c                 :    g | ]}t          j        |d d           S )r   )r   r  r   s     rA   r   zcpu_freq.<locals>.<listcomp>  s&    KKKaQS))KKKr@   )r  r?   r@   rA   r&  r&    s      LK3H3J3JKKKKr@   c                       e Zd ZdS )_Ipv6UnsupportedErrorN)r<   r=   r>   r?   r@   rA   r*  r*    s        Dr@   r*  c                   r    e Zd ZdZd Zd Zd Zed             Zed
d            Z	ed
d            Z
d
d	ZdS )NetConnectionsaw  A wrapper on top of /proc/net/* files, retrieving per-process
    and system-wide open connections (TCP, UDP, UNIX) similarly to
    "netstat -an".

    Note: in case of UNIX sockets we're only able to determine the
    local endpoint/path, not the one it's connected to.
    According to [1] it would be possible but not easily.

    [1] http://serverfault.com/a/417946
    c                 L   dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        d f}|||||f||f|f|f||f|f|f|f||||f||f||fd| _        d | _        d S )Ntcptcp6udpudp6unix)allr.  tcp4r/  r0  udp4r1  r2  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfr4  r/  r5  r1  r2  s         rA   __init__zNetConnections.__init__  s     v~v'9:);<v~v'89):;-$dD1$<GG$<GGG4t,D\D\
 
	 !r@   c                    t          t                    }t          j        | j         d| d          D ]}	 t          | j         d| d|           }|                    d          r<|dd          d d         }||                             |t          |          f           q# t          t          f$ r Y t          $ rI}|j        t          j        k    rY d }~|j        t          j        k    rt          |           Y d }~Ђ d }~ww xY w|S )Nrs   /fd/fd/zsocket:[r   )r   listr_   listdirr@  r`   r   r   r   FileNotFoundErrorProcessLookupErrorr   errnoEINVALENAMETOOLONGr   )rA  pidinodesfdinoder   s         rA   get_proc_inodeszNetConnections.get_proc_inodes  sA   T""* 1<<C<<<== 	9 	9B9 D$5!E!E!E!E!E!EFF  ##J// 9!!""IcrcNE5M((#s2ww888% &'9:       9,,HHHH9 222#JJJHHHH s)   B%%D
8	D
D$DDD
c                     i }t                      D ]H}	 |                    |                     |                     ,# t          t          t
          f$ r Y Ew xY w|S N)pidsupdaterR  rI  rJ  PermissionError)rA  rO  rN  s      rA   get_all_inodeszNetConnections.get_all_inodes  ss    66 	 	C
d223778888%'9?K     s   (=AAc           
         |                      d          \  }}t          |d          }|sdS |                    d          }|t          j        k    r`t
          r1t          j        |t          j        |          ddd                   }nt          j        |t          j        |                    }nt          j        |          }	 t
          rCt          j        t          j	        t          j        dgt          j        d|          R            }nBt          j        t          j	        t          j        dgt          j        d|          R            }n%# t          $ r t                      st          d w xY wt!          j        ||          S )	a  Accept an "ip:port" address as displayed in /proc/net/*
        and convert it into a human readable form, like:

        "0500000A:0016" -> ("10.0.0.5", 22)
        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)

        The IP address portion is a little or big endian four-byte
        hexadecimal number; that is, the least significant byte is listed
        first, so we need to reverse the order of the bytes to convert it
        to an IP address.
        The port is represented as a two-byte hexadecimal number.

        Reference:
        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
        :   r?   asciiNrF  z>4Iz<4I)ra   r   encoder9  r:  LITTLE_ENDIAN	inet_ntopbase64	b16decoder<  structpackunpackr   r   r*  r   addr)re  familyipports       rA   decode_addresszNetConnections.decode_address
  s}   " ::c??D4}}  	2YYwV^## D%ff.>r.B.B44R4.HII%ff.>r.B.BCC!"%%B  	)EEFM%,D,DEEE BB
  )EEFM%,D,DEEE B    $ :/T9	
 xD!!!s   BE "E6Nc              #     K   |                      d          r!t          j                            |           sdS t	          |           5 }|                                 t          |d          D ]\  }}	 |                                dd         \
  }}	}
}}}}}}}n)# t          $ r d|  d| d|}t          |          dw xY w||v r||         d         \  }}nd	\  }}|||k    r{|t          j        k    rt          |         }nt          j        }	 t                              |	|          }	t                              |
|          }
n# t"          $ r Y w xY w||||	|
||fV  	 ddd           dS # 1 swxY w Y   dS )
z.Parse /proc/net/tcp* and /proc/net/udp* files.6Nr   r   error while parsing ; malformed line r   r   NrF  )rb   r_   rd   existsr   r   r  ra   r   RuntimeErrorr9  r;  TCP_STATUSESr   	CONN_NONEr,  ri  r*  )filerf  type_rO  
filter_pidr   linenor   r   laddrraddrstatusrQ  r   rN  rP  s                   rA   process_inetzNetConnections.process_inet=  sI      == 	bgnnT&:&: 	Ft__ #	IJJLLL )!Q !I !I	6

SbS) BAueVQ1aEE " 6 6 6.t . .". .%). .  's++56 F?? %UmA.GC&GC)jC.?.? 222!-f!5!(!2! . = =eV L L . = =eV L L0 ! ! ! !vueUFCHHHHHC!I#	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	I #	IsO   *E43'BE4&CAE46E
	E4

EE4EE44E8;E8c           
   #   $  K   t          |           5 }|                                 |D ]}|                                }	 |dd         \  }}}}}}}	n+# t          $ r d|vrY :d|  d|}
t	          |
          w xY w|	|v r	||	         }ndg}|D ]e\  }}|||k    rt          |          dk    r|d	         nd
}t          j        t          |                    }d
}t          j	        }|||||||fV  f	 ddd           dS # 1 swxY w Y   dS )zParse /proc/net/unix files.r      r   rl  rm  rn  Nr   rF   )
r   r   ra   r   rp  r   r   socktype_to_enumr   rr  )rs  rf  rO  ru  r   r   tokensr   rt  rQ  r   pairsrN  rP  rd   rx  ry  s                    rA   process_unixzNetConnections.process_unixh  s      t__ 	LJJLLL L L	,281+/Aq!Qq%%! , , ,$ NtNNdNN  's+++, F?? #5MEE'LE$ L LGC!-*2C2C -0[[A-=-=vbzz2 ' 8U D D !#!(!2!65$vsKKKKKL%L	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	Ls6   -D ADA;!D#A;;A<DD	D	c                 N   t                      | _        ||                     |          }|sg S n|                                 }t	                      }| j        |         D ]\  }}}| j         d| }|t          j        t          j        hv r| 	                    |||||          }	n| 
                    ||||          }	|	D ]U\  }
}}}}}}|rt          j        |
|||||          }nt          j        |
||||||          }|                    |           Vt          |          S )Nz/net/)ru  )r   r@  rR  rX  r   r?  r9  r:  r<  rz  r  r   pconnsconnr   rG  )rA  kindrN  rO  r  
proto_namerf  rt  rd   r   rP  rw  rx  ry  	bound_pidconns                   rA   retrievezNetConnections.retrieve  sh   +--?))#..F 	 ((**Fee)-4 	 	%J'::j::D&.&/:::&&&%C '   &&tVV&LLFH  BFE5% 9RufMMDD9FE5% D  Cyyr@   rT  )r<   r=   r>   __doc__rB  rR  rX  staticmethodri  rz  r  r  r?   r@   rA   r,  r,    s        	 	! ! !.  4    0" 0" \0"d (I (I (I \(IT !L !L !L \!LF     r@   r,  r6  c                 6    t                               |           S )z$Return system-wide open connections.)_net_connectionsr  )r  s    rA   net_connectionsr    s    $$T***r@   c                     t          t                       d          5 } |                                 }ddd           n# 1 swxY w Y   i }|dd         D ]}|                    d          }|dk    sJ t	          |                      |d|                                         }||dz   d                                                                         }t          t          |          \  }}}	}
}}}}}}}}}}}}|||||	||
|f||<   |S )zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z/net/devNr:   rZ  r   r   )	r   r   	readlinesrfindreprr   ra   mapr   )r   linesretdictr   colonrw   r   
bytes_recvpackets_recverrindropin_fifoin_framein_compressedin_multicastin
bytes_sentpackets_senterroutdropout_fifoout_collisionsout_carrierout_compressedouts                          rA   net_io_countersr    sy    
o''111	2	2 a              Gabb	 $
 $


3qyyy$t**yyyFUF|!!##eaikk"((**0022* V'	
 	
 Ns   A  AAc                  *   t           j        t          t           j        t          t           j        t          i} t                                                      }i }|D ]}	 t          j	        |          }t          j
        |          }t          j        |          \  }}d                    |          }d|v }	t          j        |	| |         |||          ||<   }# t          $ r/}
|
j        t           j        k    r t%          |
           Y d}
~
d}
~
ww xY w|S )z)Get NIC stats (isup, duplex, speed, mtu).,runningN)r   DUPLEX_FULLr   DUPLEX_HALFr   DUPLEX_UNKNOWNr   r  keys
net_if_mtunet_if_flagsnet_if_duplex_speedr   r   	snicstatsr   rK  ENODEVr   )
duplex_mapnamesr  rw   mturn   duplexspeedoutput_flagsisupr   s              rA   net_if_statsr    s    	///J
 ""$$E
C  	/$''C%d++E 4T::MFE 88E??L%Dj(%l CII  	 	 	yEL((#JJJJJJJJ		 Js   ?C
D!%DDFc                    d }d }t           j                            t                       d          r |            }nJt           j                            d          r |            }n t                       d}t	          |          i }|D ]C}|\
  }}}	}
}}}}}}| st          |          s!|
t          z  }
|t          z  }||	|
||||||f	||<   D|S )zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c               3     K   t          t                       d          5 } |                                 }d d d            n# 1 swxY w Y   |D ]}|                                }t	          |          }|dk    rF|d         }t          |d                   }t          t
          |dd                   \
  }}}	}
}}}}}}n|dk    s|dk    r2|d         }t          t
          |dd                   \  }}}}	}
}}}}}}nO|dk    r5|d         }t          t
          |dd                    \  }}}
}d	x}	x}x}x}}nd
|}t          |          |||
|||	||||f
V  d S )N
/diskstats   r;   r:   r         r|  r   znot sure how to interpret line )r   r   r  ra   r   r   r  r   )r   r  r   r   flenrw   readsreads_mergedrbytesrtimewriteswrites_mergedwbyteswtimer   	busy_timer   s                    rA   read_procfsz%disk_io_counters.<locals>.read_procfs	  s     " /++77788 	"AKKMME	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	; 	;DZZ\\Fv;;DrzzayF1I69#vad|6L6L4vufmE1itrzzay69#vad|6L6L4feV]E1iay03C0D0D-vvvKLLLLL}yy@@@ oo%u	; ; ; ; ;/	; 	;s   AA	Ac               3   \  K   t          j        d          D ]} t          j        t           j                            d|                     D ]\  }}}d|vrt          t           j                            |d                    5 }|                                                                                                }d d d            n# 1 swxY w Y   t           j        	                    |          }t          t          |d d                   \
  }}}	}
}}}}}}||||	||
||||f
V  ސd S )N
/sys/blockstatr   )r_   rH  walkrd   r   r   r   r   ra   basenamer  r   )blockrootr   filesr   r   rw   r  r  r  r  r  r  r  r  r  s                   rA   
read_sysfsz$disk_io_counters.<locals>.read_sysfs7  s     Z-- 	F 	FE"$'"',,|U*K*K"L"L 
F 
Fa&&rw||D&99:: 6aVVXX^^--3355F6 6 6 6 6 6 6 6 6 6 6 6 6 6 6w''-- 47sF3B3K3H3H1feV]E1iUFFFElM9F F F F F
F	F 	Fs   9C		CCr  r  z6/diskstats nor /sys/block are available on this system)r_   rd   ro  r   r  ry   DISK_SECTOR_SIZE)perdiskr  r  genr   r  r   rw   r  r  r  r  r  r  r  r  r  s                    rA   disk_io_countersr    s;   
+; +; +;\F F F 
w~~**66677 	'kmm		%	% 'jll       	 "#&&&G A A ).	&ufffeUL9 	066 	 """"u%}iA Nr@   c                   8    e Zd ZdZddgZd Zd Zd Zd Zd Z	d	S )
RootFsDeviceFinderaF  disk_partitions() may return partitions with device == "/dev/root"
    or "rootfs". This container class uses different strategies to try to
    obtain the real device path. Resources:
    https://bootlin.com/blog/find-root-device/
    https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/.
    majorminorc                     t          j        d          j        }t          j        |          | _        t          j        |          | _        d S Nrs   )r_   r  st_devr  r  )rA  devs     rA   rB  zRootFsDeviceFinder.__init__w  s4    gcll!Xc]]
Xc]]


r@   c                 .   t          t                       d          5 }|                                dd          D ]}|                                }t	          |          dk     r*|d                                         rt          |d                   nd }|d                                         rt          |d                   nd }|d         }|| j        k    r || j        k    r|rd| c cd d d            S 	 d d d            d S # 1 swxY w Y   d S )Nz/partitionsr:   r   r   r   r;   /dev/)	r   r   r  ra   r   isdigitr   r  r  )rA  r   r   r   r  r  rw   s          rA   ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions|  sv   /++88899 
	.Qabb) 	. 	.v;;??*0)*;*;*=*=GF1I4*0)*;*;*=*=GF1I4ayDJ&&5DJ+>+> .-t~~--
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	.	.
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	. 
	.s   CD
;D

DDc                 6   d| j          d| j         d}t          |          5 }|D ]Y}|                    d          rB|                                                    d          d         }|rd| c cd d d            S Z	 d d d            d S # 1 swxY w Y   d S )Nz/sys/dev/block/rZ  z/ueventzDEVNAME=r:   r  )r  r  r   r   r   
rpartition)rA  rd   r   r   rw   s        rA   ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block  s   AAAdjAAAt__ 	. . .??:.. .::<<22:>>qAD .-t~~--	. 	. 	. 	. 	. 	. 	. 	..	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   AB?BBBc                    | j          d| j         }t          j        d          }|D ]}	 t	          |          }|5  |                                                                }||k    rOt          j        	                    t          j        
                    |                    }d| cd d d            c S 	 d d d            n# 1 swxY w Y   # t          $ r Y w xY wd S )NrZ  z/sys/class/block/*/devr  )r  r  r   iglobr   r   r   r_   rd   r  dirnamerI  )rA  needler  rs  r   datarw   s          rA   ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block  sS   J----
344 
	. 
	.D	.dOO  . .6688>>++Dv~~!w//0E0EFF-t~~	. . . . . . . . . .%. . . . . . . . . . . . . . . %   
	. 
	.s#   CA-CC		C		
CCc                    d }|<	 |                                  }n&# t          $ r}t          |           Y d }~nd }~ww xY w|<	 |                                 }n&# t          $ r}t          |           Y d }~nd }~ww xY w|<	 |                                 }n&# t          $ r}t          |           Y d }~nd }~ww xY w|!t
          j                            |          r|S d S d S rT  )r  r   r   r  r  r_   rd   ro  )rA  rd   r   s      rA   findzRootFsDeviceFinder.find  s(   <//11   c







<--//   c







<//11   c







 t 4 4K s@    
>9>A 
A<#A77A<B 
B:!B55B:N)
r<   r=   r>   r  	__slots__rB  r  r  r  r  r?   r@   rA   r  r  m  su          '"I# # #
. . .. . .. . .    r@   r  c                    t                      }t                      }| st          | d          5 }|D ]}|                                }|                    d          s(|                    |                                           S|                    d          d         }|dk    r|                    d           	 ddd           n# 1 swxY w Y   |dk    r?t          j        	                    d          r t          j        
                    d          }n"t          j        
                    | d	          }g }t          j        |          }|D ]l}	|	\  }
}}}|
d
k    rd}
|
dv r"t                                                      p|
}
| s|
r||vr@t          j        |
|||          }|                    |           m|S )z8Return mounted disk partitions as a list of namedtuples.z/filesystemsnodev	r   zfsNr   z	/etc/mtabz/self/mountsnoner}  >   	/dev/rootrootfs)r   r   r   r   r   r   ra   r_   rd   isfilerealpathr   disk_partitionsr  r  r   	sdiskpartr   )r3  fstypesr   r   r   fstypemounts_pathretlist
partitions	partitiondevice
mountpointoptsntuples                 rA   r  r    s   eeG!##K 
++33344 		+ + +zz||w// +KK

---- "ZZ--a0FE***+		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ 		+ g"'.."="=g&&{33g&&+'C'C'CDDG%k22J 
 
	+4(
FDVF,,,'))..00:FF 	 V722vz64@@vNs   BCCCc            	         t          j        t                    } t          j        d          }|                    t          j        d                     t          d |D                       }t          j        d          }t          j        d          }|D ]1}|                    d|          }||vr|	                    |           2|D ][}	 |dz   }t          t          |                    dz  }t          j                            t          j                            |          d	          }t!          |                                          }	n# t$          t&          f$ r Y w xY wt          |d
z   d          }
t          |dz   d          }t!          |dz   d                                          }|
&	 t          |
          dz  }
n# t&          $ r d}
Y nw xY w|&	 t          |          dz  }n# t&          $ r d}Y nw xY w| |	         	                    |||
|f           ]|s;t          j        d          }t          t)          |                    }|D ]}	 t          j                            |d          }t          t          |                    dz  }t          j                            |d          }t!          |                                          }	n-# t$          t&          f$ r}t+          |           Y d}~d}~ww xY wt          j        |dz             }d |D             }d}d}
|D ]}t          j                            ||dz             }t!          |d                                          }|dk    r3t          t          j                            ||dz             d          }n8|dk    r2t          t          j                            ||dz             d          }
|
&	 t          |
          dz  }
n# t&          $ r d}
Y nw xY w|'	 t          |          dz  }# t&          $ r d}Y w xY w| |	         	                    d||
|f           	t-          |           S )a  Return hardware (CPU and others) temperatures as a dict
    including hardware name, label, current, max and critical
    temperatures.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    - /sys/class/thermal/thermal_zone* is another one but it's more
      difficult to parse
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*c                 D    h | ]}|                     d           d         S r   r   ra   r   s     rA   	<setcomp>z'sensors_temperatures.<locals>.<setcomp>  &    ;;;AQ;;;r@   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg     @@rw   _maxNr  _crit_labelr}  z /sys/class/thermal/thermal_zone*temptypez/trip_point*c                     h | ]O}d                      t          j                            |                              d           dd                   PS )r   r   r;   )r   r_   rd   r  ra   )r   ps     rA   r  z'sensors_temperatures.<locals>.<setcomp>8  s[        ))!,,22377!<==  r@   _typecritical_temphigh)collectionsr   rG  r   extendsortedr   r   subr   r   r   r_   rd   r   r  r   r   r   r   r   r   dict)r  	basenames
basenames2replrw   altnamebaserd   current	unit_namer  r  labelr   
trip_pathstrip_points
trip_point	trip_types                     rA   sensors_temperaturesr*    s    
!$
'
'C	;<<I TYGHHIII;;;;;<<I ? J :@AAD # #((.55)##T"""  @  @	(?DDJJ''&0G7<< 5 5v>>DD		))II$ 		 		 		 H		 D6MD111w666D8Ob1117799T{{V+     ??V3        	IugtX>????  ,AI@AA	3y>>**	 (	A (	ADw||D&11T

++f4w||D&11IIOO--		Z(   c


 4.#899J #  K HD) ( (
w||D*w*>??r22288::	
**#T:+?@@4     HH &((T:+?@@4  D #$$T{{V3% $ $ $#$'(#(??V#;% ( ( (#'( ( 	N!!2wh"?@@@@99st   BEE'&E';GGG#G66HH"B K##L4LL6P		PPP11Q Qc                     t          j        t                    } t          j        d          }|st          j        d          }t	          d |D                       }|D ]}	 t          t          |dz                       }n&# t          $ r}t          |           Y d}~Ad}~ww xY wt          t          j                            t          j                            |          d                                                    }t          |dz   d	                                          }| |                             t!          j        ||                     t%          |           S )
a  Return hardware fans info (for CPU and other peripherals) as a
    dict including hardware label and current speed.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*c                 D    h | ]}|                     d           d         S r	  r
  r   s     rA   r  zsensors_fans.<locals>.<setcomp>k  r  r@   r  Nrw   r  r}  r  )r  r   rG  r   r  r   r   r   r   r   r_   rd   r   r  r   r   r   sfanr  )r  r  r"  r#  r   r$  r%  s          rA   sensors_fansr.  Z  sM    
!$
'
'C	:;;I G IEFF	;;;;;<<I 8 8	$th//00GG 	 	 	#JJJHHHH	 RW__T%:%:FCCDDJJLL	D8Ob1117799Ichug66777799s   "B
B%B  B%c                  v   t                      fd} d t          j        t                    D             }|sdS t          j                            t          t          |                    } | |dz   |dz             } | |dz   |dz             } | |dz   |d	z             } | |d
z             }||	 d|z  |z  }n;# t          $ r d}Y n-w xY wt          t          |dz   d                    }|dk    rdS d} | t          j                            t          d          t          j                            t          d                    }	|	|	dk    }nGt          |dz   d          
                                                                }
|
dk    rd}n|
dv rd}|rt          j        }nw|B|@	 t          |t          |          z  dz            }nO# t          $ r t          j        }Y n7w xY w|%t          |dz            }|dk     rt          j        }nt          j        }t!          j        |||          S )a  Return battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966.
    c                      | D ]Q}t          |          }|k    r8	 t          |          c S # t          $ r |                                cY c S w xY wRdS )zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        r  N)r   r   r   r   )r  rd   r  nulls      rA   
multi_bcatz#sensors_battery.<locals>.multi_bcat  s      	' 	'Dtd+++Cd{{'s88OOO! ' ' '99;;&&&&&' 
 ts   /AAc                 h    g | ]/}|                     d           sd|                                v -|0S )BATbattery)r   r   r   s     rA   r   z#sensors_battery.<locals>.<listcomp>  sK       << #,qwwyy"8"8 	
"8"8"8r@   Nz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r   z	/capacityrF  r  z
AC0/onlinez	AC/onliner   /statusr}  dischargingF>   fullchargingTi  <   r   )objectr_   rH  POWER_SUPPLY_PATHrd   r   r   ZeroDivisionErrorr   r   r   r   r   POWER_TIME_UNLIMITEDabsPOWER_TIME_UNKNOWNr   sbattery)r2  batsr  
energy_now	power_nowenergy_fulltime_to_emptyr   power_pluggedonlinery  secsleftr1  s               @rA   sensors_batteryrJ  y  s    88D     -..  D
  t 7<<)3t9955D D=0$2FGGJ
4,.~0EFFI*TN2D>4IJJKJt&::;;M :#9	j(;6GG  	 	 	GGG	 c$,r:::;;b==4
 MZ
&55
&44 F !TI%33399;;AACC]""!MM+++ M  ./		I$9	2:I6=>>HH  	2 	2 	21HHH	2		"}r)**a<<1H-<=999s$   7C   CC3"G G/.G/c                      g } t          j                    }|D ]9}|\  }}}}}t          j        ||pd|||          }|                     |           :| S )z:Return currently connected users as a list of namedtuples.N)r   usersr   suserr   )	r   rawlistitemr|   ttyhostnametstamprN  nts	            rA   rL  rL    sf    GjllG  +/(c8VSYtS[D(FC@@rNr@   c                  H   t                       d} t          |           5 }|D ]^}|                    d          rGt          |                                                                d                   c cddd           S _d|  }t          |          # 1 swxY w Y   dS )zAReturn the system boot time expressed in seconds since the epoch.r{   s   btimer   Nzline 'btime' not found in )r   r   r   r   r   ra   rp  )rd   r   r   r   s       rA   	boot_timerU    s    &&&D	T		  a 	6 	6Dx(( 6TZZ\\//11!45555               614113                   s   ABBBBc                      t                                          t                    } d t          j        |           D             S )z7Returns a list of PIDs currently running on the system.c                 T    g | ]%}|                                 t          |          &S r?   )r  r   r   s     rA   r   zpids.<locals>.<listcomp>  s+    <<<q		<CFF<<<r@   )r   r]  r
   r_   rH  rc   s    rA   rU  rU    s9    ##H--D<<BJt,,<<<<r@   c                    t          j        |           sdS 	 t                       d|  d}t          |          5 }|D ]R}|                    d          r;t          |                                d                   }|| k    c cddd           S Sd| }t          |          # 1 swxY w Y   dS # t          t          f$ r | t                      v cY S w xY w)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Frs   r6  s   Tgid:r   Nz'Tgid' line not found in )
r   
pid_existsr   r   r   r   ra   r   r   rU  )rN  rd   r   r   tgidr   s         rA   rY  rY    sO    s## !u	! &''66#666DT"" &a + +Dx00 +"4::<<?33  $s{**& & & & & & & &+
 9$88 oo%& & & & & & & & & & $ 	! 	! 	!$&&=   	!s;   #B2 AB%B2 B%%B))B2 ,B)-B2 2!CCc                     i } t                      }t                      D ]}	 t          | d| d          5 }|                                }ddd           n# 1 swxY w Y   |                    d          }||dz   d                                         }t          |d                   }|| |<   # t          t          f$ r Y t          $ r}t          |          |d}~ww xY w| S )zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    rs   r{   N   )r:   r   )r   rU  r   r   r  ra   r   rI  rJ  rW  r   )	r  r   rN  r   r  rpardsetppidr   s	            rA   ppid_mapr`    sJ    C!##Kvv  	88c88899  Qvvxx                              ::d##Dq

#))++DtAw<<DCHH "#56 	 	 	D 	- 	- 	-s##,	- Js@   B2AB2A	B2A	 B22C#	C#CC#c                 F     t          j                    fd            }|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c                    | j         | j        }}	  | g|R i |S # t          $ r}t          ||          |d }~wt          $ r*}|                                  t          ||          |d }~wt          $ rU}|                                  t          j	        
                    | j         d| d          st          ||          | d }~ww xY w)Nrs   r{   )rN  _namerW  r   rJ  _raise_if_zombier   rI  r_   rd   ro  r@  )rA  r   kwargsrN  rw   r   funs         rA   wrapperz wrap_exceptions.<locals>.wrapper5  s	   HdjT	3t-d---f--- 	3 	3 	3sD))s2! 	4 	4 	4!!###T**3  	 	 	!!### 7>>T%6"C"C"C"C"CDD 8#C..C7	s+    
C8C%A**C7ACC)	functoolswraps)rf  rg  s   ` rA   wrap_exceptionsrj  0  s:    
 _S    $ Nr@   c                      e Zd ZdZg dZd Zd Zd Zd Ze	fdZ
eed                         Zeed	                         Zeed
                         Zd Zd Zed             Zed             Zed             Zed             Zed             Zej                            d ej                     d          red             Zed             Zed             Zed=d            Zed>d            Zed             Z e!se"rHd Z#e e$j%        d           e$j%        d           e$j%        d          fd             Z&ed!             Z'ne Z'e"red"             Z(ed#             Z)e e$j%        d$          fd%            Z*e e$j%        d&          fd'            Z+ed(             Z,ed)             Z-ed*             Z.e/r)ed+             Z0 e$j%        d,          fd-Z1ed.             Z2e3red/             Z4ed0             Z5 e6e7d1          red=d2            Z8ed3             Z9ed4             Z:ed?d6            Z;ed7             Z<ed8             Z=e e$j%        d9          fd:            Z>e e$j%        d;          fd<            Z?dS )@ProcesszLinux process implementation.)_cache_ctimerc  _ppidr@  rN  c                 d    || _         d | _        d | _        d | _        t	                      | _        d S rT  )rN  rc  ro  rn  r   r@  )rA  rN  s     rA   rB  zProcess.__init__W  s2    

+--r@   c                     	 t          | j         d| j         d          }|                    d          }||dz   |dz            }|dk    S # t          $ r Y dS w xY w)Nrs   r{   r\  r:   r;      ZF)r   r@  rN  r  r   )rA  r  r]  ry  s       rA   
_is_zombiezProcess._is_zombie^  s    	"4,>>tx>>>??D ::d##D$(TAX-.FT>!  	 	 	55	s   A 
AAc                 n    |                                  r t          | j        | j        | j                  d S rT  )rs  r   rN  rc  ro  rA  s    rA   rd  zProcess._raise_if_zombien  s9    ?? 	B$*djAAA	B 	Br@   c                 L    t          j        | j         d| j                    dS )z+Raise NSP if the process disappeared on us.rs   N)r_   r  r@  rN  ru  s    rA   _raise_if_not_alivezProcess._raise_if_not_aliver  s-     	4$11tx1122222r@   c                     	 t          |          S # t          t          f$ rQ t          j                            | j         d| j                   r!|                                  |t          ur|cY S  w xY wr  )
r`   rI  rJ  r_   rd   lexistsr@  rN  rd  UNSET)rA  rd   r   s      rA   	_readlinkzProcess._readlinkx  s    	D>>!!#56 	 	 	w$"3@@dh@@AA $%%'''5((#OOO	s    AA31A3c                 "   t          | j         d| j         d          }|                    d          }||                    d          dz   |         }||dz   d                                         }i }||d<   |d	         |d
<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   	 |d         |d<   n$# t          $ r t          d           d	|d<   Y nw xY w|S )aY  Parse /proc/{pid}/stat file and return a dict with various
        process info.
        Using "man proc" as a reference: where "man proc" refers to
        position N always subtract 3 (e.g ppid position 4 in
        'man proc' == position 1 in here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        rs   r{   r\     (r   r:   Nrw   r   ry  r_  r   ttynr   utime   stime   children_utimer  children_stime   create_time$   cpu_num'   blkio_ticksz&can't get blkio_ticks, set iowait to 0)r   r@  rN  r  r  ra   
IndexErrorr   )rA  r  r]  rw   r   r  s         rA   _parse_stat_filezProcess._parse_stat_file  sU    t(::48:::;; zz$DIIdOOa'$./dQhjj!''))Fq	HQiFayGbzGbzG &r
 &r
#BZMI	#!'C 	# 	# 	#:;;;!"C	#
 
s   C+ +DDc                     t          | j         d| j         d          5 }|                                cddd           S # 1 swxY w Y   dS )zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        rs   r6  N)r   r@  rN  r   rA  r   s     rA   _read_status_filezProcess._read_status_file  s     D-AAAAABB 	a6688	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAc                     t          | j         d| j         d          5 }|                                                                cd d d            S # 1 swxY w Y   d S )Nrs   r0   )r   r@  rN  r   r   r  s     rA   _read_smaps_filezProcess._read_smaps_file  s     D-@@@@@AA 	$Q6688>>##	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   &AAAc                     | j                             |            | j                            |            | j                            |            d S rT  )r  cache_activater  r  ru  s    rA   oneshot_enterzProcess.oneshot_enter  sM    ,,T222--d333,,T22222r@   c                     | j                             |            | j                            |            | j                            |            d S rT  )r  cache_deactivater  r  ru  s    rA   oneshot_exitzProcess.oneshot_exit  sM    ..t444//555..t44444r@   c                 P    t          |                                 d                   S )Nrw   )r   r  ru  s    rA   rw   zProcess.name  s#     d++--f5666r@   c                 P    |                      | j         d| j         dd          S )Nrs   z/exer}  r  r{  r@  rN  ru  s    rA   exezProcess.exe  8    ~~ 1148111B  
 
 	
r@   c                    t          | j         d| j         d          5 }|                                }d d d            n# 1 swxY w Y   |s|                                  g S |                    d          rdnd}|                    |          r
|d d         }|                    |          }|dk    r,t          |          dk    rd|v r|                    d          }|S )Nrs   z/cmdlinerZ   r   rF  r   )r   r@  rN  r   rd  rb   ra   r   )rA  r   r  sepcmdlines        rA   r  zProcess.cmdline  s'   $+@@dh@@@AA 	Q6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	!!###I f--6ff3== 	9D**S// &==S\\Q..3$;;jjooG   AAAc                     t          | j         d| j         d          5 }|                                }d d d            n# 1 swxY w Y   t	          |          S )Nrs   z/environ)r   r@  rN  r   r   )rA  r   r  s      rA   environzProcess.environ  s    $+@@dh@@@AA 	Q6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	"4(((r  c                     t          |                                 d                   }t          j                    }	 ||         S # t          $ r Y d S w xY w)Nr~  )r   r  r   get_terminal_mapr   )rA  tty_nrr?  s      rA   terminalzProcess.terminal  s_    T**,,W566(**	< 	 	 	44	s   A 
AAr/   /ioc           	      >   | j          d| j         d}i }t          |          5 }|D ]T}|                                }|r<	 |                    d          \  }}t          |          ||<   D# t          $ r Y Pw xY wU	 d d d            n# 1 swxY w Y   |s| d}t          |          	 t          j	        |d         |d         |d         |d         |d	         |d
                   S # t          $ r*}|j        d         d| d|}t          |          d d }~ww xY w)Nrs   r  s   : z file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharr   z field was not found in z; found fields are )r@  rN  r   r   ra   r   r   rp  r   pior   r   )	rA  fnamer   r   r   rw   r  r   r   s	            rA   io_counterszProcess.io_counters   s   (8848888EFU## 6q 
6 
6D::<<D 66*.**U*;*;KD%
 ,/u::F4LL	  * % % %$H%6
66 6 6 6 6 6 6 6 6 6 6 6 6 6 6  (///"3'''0w8$8$=)>*8$8$    0 0 0x{ . .e . .#). .  !oo4/0sM   B	 A+B	+
A85B	7A88B		BB+<C( (
D2%DDc                 |   |                                  }t          |d                   t          z  }t          |d                   t          z  }t          |d                   t          z  }t          |d                   t          z  }t          |d                   t          z  }t          j        |||||          S )Nr  r  r  r  r  )r  r   r   r   	pcputimes)rA  r   r  r  r  r  r   s          rA   r   zProcess.cpu_times#  s    &&((fWo&&4fWo&&4v&6788;Fv&6788;Fvm,--;}5..&
 
 	
r@   c                 P    t          |                                 d                   S )zWhat CPU the process is on.r  r   r  ru  s    rA   r  zProcess.cpu_num/  s#     4((**95666r@   Nc                 6    t          j        | j        |          S rT  )r   wait_pidrN  )rA  timeouts     rA   waitzProcess.wait4  s     7333r@   Fc                     | j         4t          |                                 d                   t          z  | _         |r| j         S | j         t	                      z   S )Nr  )rn  r   r  r   rU  )rA  	monotonics     rA   r  zProcess.create_time8  sY     ;d++--m<==K K  	; {Y[[((r@   c           	      $   t          | j         d| j         d          5 }d |                                                                d d         D             \  }}}}}}}d d d            n# 1 swxY w Y   t          j        |||||||          S )Nrs   z/statmc              3   D   K   | ]}t          |          t          z  V  d S rT  )r   r   r   s     rA   	<genexpr>z&Process.memory_info.<locals>.<genexpr>W  s>       8 8&'A!8 8 8 8 8 8r@   r|  )r   r@  rN  r   ra   r   pmem)	rA  r   vmsrssr   textlibr  dirtys	            rA   memory_infozProcess.memory_infoI  s     D-@@@@@AA 	Q8 8+,::<<+=+=+?+?+C8 8 84CfdCu	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 xS&$T5AAAs   AA--A14A1c                    dx}x}}t          | j         d| j         d          5 }|D ]}|                    d          r.|t	          |                                d                   dz  z  }E|                    d          r+t	          |                                d                   dz  }|                    d          r*t	          |                                d                   dz  }	 d d d            n# 1 swxY w Y   |||fS )	Nr   rs   r1   s   Private_r   r      Pss:   Swap:)r   r@  rN  r   r   ra   )rA  usspssswapr   r   s         rA   _parse_smaps_rollupzProcess._parse_smaps_rollup^  sR     ! C #$>>tx>>>  
; ; ;D{33 ;s4::<<?33d::11 ;!$**,,q/22T922 ;"4::<<?33d:;
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; 
; d##s   CC;;C?C?s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                    |                                  }t          t          t          |                    |                              dz  }t          t          t          |                    |                              dz  }t          t          t          |                    |                              dz  }|||fS )Nr   )r  r   r  r   findall)rA  _private_re_pss_re_swap_re
smaps_datar  r  r  s           rA   _parse_smapszProcess._parse_smapsu  s    * ..00J c#{22:>>??@@4GCc#wz::;;<<tCCs3 0 0 < <==>>EDd##r@   c                 "   t           rI	 |                                 \  }}}nG# t          t          f$ r |                                 \  }}}Y nw xY w|                                 \  }}}|                                 }t          j        ||||fz    S rT  )HAS_PROC_SMAPS_ROLLUPr  rJ  rI  r  r  r   pfullmem)rA  r  r  r  	basic_mems        rA   memory_full_infozProcess.memory_full_info  s    $ 59%)%=%=%?%?NCdd*,=> 9 9 9%)%6%6%8%8NCddd9 "&!2!2!4!4S$((**I<c3-=!=>>s   " )AAc                    d }|                                  }|s|                                  g S |                    d          }g }|                    d          }|g} |||          D ]\  }}|                    dd          }	 |\  }	}
}}}}n# t          $ r |dgz   \  }	}
}}}}Y nw xY w|sd}nQt          |          }|                                }|                    d          rt          |          s
|dd	         }t          |	          t          |
          ||	                    d
d          |	                    dd          |	                    dd          |	                    dd          |	                    dd          |	                    dd          |	                    dd          |	                    dd          |	                    dd          |	                    dd          f}|
                    |           |S )a  Return process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c              3     K   i }| D ]}|                     d d          }|d                             d          s.|                                |fV  |                    |           a	 t	          |d                   dz  ||d         <   # t
          t          f$ r3 |d                             d          rY d|}t          |          d w xY w|                                |fV  d S )N   r   r  r   r   s   VmFlags:z!don't know how to interpret line )ra   rb   popr   r   r   r  r   )r  current_blockr  r   r   r   s         rA   
get_blocksz'Process.memory_maps.<locals>.get_blocks  s     ! < <D!ZZa00F!!9--d33 <,0022D9999%,,T2222<.1&)nnt.CDOO *J7 < < <%ay33K@@ ) ("Nd"N"NC",S//t;< %((**D111111s   )!B,C9C   
r   Nr  r}  z[anon]r[   r\   s   Rss:s   Size:r  s   Shared_Clean:s   Shared_Dirty:s   Private_Clean:s   Private_Dirty:s   Referenced:s
   Anonymous:r  )r  rd  ra   r  r   r   r   rb   r   r   r   )rA  r  r  r  r   
first_liner  headerhfieldsre  perms_offset_dev_inoderd   rO  s                   rA   memory_mapszProcess.memory_maps  s9   2 2 2& ((**D  %%'''	JJu%%EB1J'LM *
5- @ @     ,,tQ//N?F<D%$! N N N?F"~<D%$N *#DD!$<<D::<<D}}\22 *;M< < *  $DSDz4LL5MMHHWa((HHXq))HHWa((HH-q11HH-q11HH.22HH.22HH^Q//HH]A..HHXq)) 		$Is   	BB,+B,c                 P    |                      | j         d| j         dd          S )Nrs   z/cwdr}  r  r  ru  s    rA   cwdzProcess.cwd  r  r@   s   ctxt_switches:\t(\d+)c                    |                                  }|                    |          }|s"d| j         d| j         d}t	          |          t          j        t          |d                   t          |d                             S )NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in rs   z1/status; the kernel is probably older than 2.6.23r   r   )r  r  r@  rN  r  r   pctxswr   )rA  	_ctxsw_rer  ctxswr   s        rA   num_ctx_switcheszProcess.num_ctx_switches  s     %%''!!$'' 	+.%. .(,. . .  &c***z#eAh--U1X777r@   s   Threads:\t(\d+)c                 z    |                                  }t          |                    |          d                   S Nr   )r  r   r  )rA  _num_threads_rer  s      rA   num_threadszProcess.num_threads  s6     %%''?**4003444r@   c                     t          j        | j         d| j         d          }|                                 g }d}|D ]'}| j         d| j         d| d}	 t          |          5 }|                                                                }d d d            n# 1 swxY w Y   n# t          t          f$ r d}Y |w xY w||
                    d          dz   d          }|                    d	          }t          |d
                   t          z  }	t          |d                   t          z  }
t          j        t!          |          |	|
          }|                    |           )|r|                                  |S )Nrs   z/taskFz/task/r{   Tr\  r:   r   r  r  )r_   rH  r@  rN  r  r   r   r   rI  rJ  r  ra   r   r   r   pthreadr   r   rw  )rA  
thread_idsr   
hit_enoent	thread_idr  r   str   r  r  r  s               rA   threadszProcess.threads  s   Z4#4 F Ftx F F FGG

# 	# 	#I(KK48KK9KKKE '' *1))B* * * * * * * * * * * * * * *%'9:    "
	 BGGDMMA%''(BXXd^^F&*%%3E&*%%3E[Y>>FNN6"""" 	'$$&&&s6   B&''BB&B	B&!B	"B&&B<;B<c                 4    t          j        | j                  S rT  )r   proc_priority_getrN  ru  s    rA   nice_getzProcess.nice_get"  s     %dh///r@   c                 6    t          j        | j        |          S rT  )r   proc_priority_setrN  )rA  r  s     rA   nice_setzProcess.nice_set+  s    %dh666r@   c                 4    t          j        | j                  S rT  )r   r3   rN  ru  s    rA   cpu_affinity_getzProcess.cpu_affinity_get2  s    -dh777r@   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	      f   |                                  }|                    |          }|rRt          t          t	          |d         d                   t	          |d         d                   dz                       S t          t          t          t                                                    S )Nr   r   )r  r  rG  ranger   r   r   )rA  _rer  r   s       rA   _get_eligible_cpuszProcess._get_eligible_cpus6  s     ))++DKK%%E 9E#eAhqk"2"2Ca4D4Dq4HIIJJJE#moo"6"677888r@   c           	         	 t          j        | j        |           d S # t          t          f$ r}t          |t                    s|j        t          j        k    r|                                 }t          t          t          t                                                    }|D ]:}||vrd|d|}t	          |          d ||vrd| d| }t	          |          |; d }~ww xY w)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )r   proc_cpu_affinity_setrN  r   r   r]   rK  rL  r   tupler  r   r   )rA  r   r   eligible_cpusall_cpuscpur   s          rA   cpu_affinity_setzProcess.cpu_affinity_setA  s-   *48T:::::Z(   c:.. ;#)u|2K2K$($;$;$=$=M$U3}+?+?%@%@AAH# ; ;h..!6s !6 !6$1!6 !6   #-S//t;m33!<c !< !<,9!< !<   #-S//s: 4 #s    C%B1C  C%c                     t          j        | j                  \  }}t          |          }t	          j        ||          S rT  )r   r2   rN  r9   r   pionice)rA  ioclassr  s      rA   
ionice_getzProcess.ionice_get[  s7    !1$(;;NGU ))G;w...r@   c                     |d}|r.|t           j        t           j        hv r|d}t          |          |dk     s|dk    rd}t          |          t	          j        | j        ||          S )Nr   z ioclass accepts no valuer|  zvalue not in 0-7 range)r9   r#   r    r   r   proc_ioprio_setrN  )rA  r
  r  r   s       rA   
ionice_setzProcess.ionice_seta  s    } &,,%   !=== oo%qyyEAII. oo%''5AAAr@   prlimitc                 t   | j         dk    rd}t          |          	 |t          j        | j         |          S t	          |          dk    rd|}t          |          t          j        | j         ||           d S # t
          $ r/}|j        t          j        k    r|                                   d }~ww xY w)Nr   z)can't use prlimit() against PID 0 processr:   z2second argument must be a (soft, hard) tuple, got )	rN  r   resourcer  r   r   rK  ENOSYSrd  )rA  	resource_limitsr   r   s        rA   rlimitzProcess.rlimitr  s    
 x1}}A oo%>#+DHi@@@ 6{{a''5*05 5  )oo-$TXy&AAAAA   9,, ))+++s   A> AA> >
B7*B22B7c                     |                                  d         }|                                }t                              |d          S )Nry  ?)r  r   PROC_STATUSESr   )rA  letters     rA   ry  zProcess.status  s;    &&((2  ---r@   c                 @   g }t          j        | j         d| j         d          }d}|D ]}| j         d| j         d| }	 t	          |          }|                    d          r1t          |          r!| j         d| j         d| }	 t          |          5 }t          |	                                
                                d                   }t          |	                                
                                d         d          }	d d d            n# 1 swxY w Y   t          |	          }
t          j        |t          |          t          |          |
|	          }|                    |           T# t          t           f$ r d}Y jw xY wp# t          t           f$ r d}Y t"          $ rK}|j        t$          j        k    rY d }~|j        t$          j        k    rt+          |           Y d }~Ԃ d }~ww xY w|r|                                  |S )	Nrs   rD  FrE  z/fdinfo/r   r   T)r_   rH  r@  rN  r`   r   r   r   r   r   ra   rq   r   	popenfiler   rI  rJ  r   rK  rL  rM  r   rw  )rA  r   r  r  rP  rs  rd   r   posrn   rp   r  r   s                rA   
open_fileszProcess.open_files  s   
d/??$(???@@
 &	/ &	/B'<<$(<<<<D$/~~& ??3'' /M$,?,? /"/HH$(HHBHHD/(.. D!"%ajjll&8&8&:&:1&=">">C$'

(:(:(<(<Q(?$C$CED D D D D D D D D D D D D D D  2%88!$ #b''3s88T5" "  v.... ./AB * * * &*


*3 &'9:   !
   9,,HHHH9 222#JJJHHHH>  	'$$&&&sa   FE?A4DE?D 	 E?#D 	$E??FFH1	H:H $H ?H  Hr6  c                 n    t                               || j                  }|                                  |S rT  )r  r  rN  rw  )rA  r  r  s      rA   r  zProcess.net_connections  s0    ''dh77  """
r@   c                 d    t          t          j        | j         d| j         d                    S )Nrs   rD  )r   r_   rH  r@  rN  ru  s    rA   num_fdszProcess.num_fds  s0    2:!2BBTXBBBCCDDDr@   c                 P    t          |                                 d                   S )Nr_  r  ru  s    rA   r_  zProcess.ppid  s!    4((**62333r@   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r  )r  r  r   puidsr   )rA  _uids_rer  real	effectivesaveds         rA   uidszProcess.uids  X    %%''!)!1!1$!7!7!:iyTC	NNCJJ???r@   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r  )r  r  r   pgidsr   )rA  _gids_rer  r%  r&  r'  s         rA   gidszProcess.gids  r)  r@   rT  Fr6  )@r<   r=   r>   r  r  rB  rs  rd  rw  rz  r{  rj  r   r  r  r  r  r  rw   r  r  r  r  r_   rd   ro  getpidr  r   r  r  r  r  r  HAS_PROC_SMAPSr  r   r   r  r  r  r  r  r  r  r  r  HAS_CPU_AFFINITYr  r   r  HAS_PROC_IO_PRIORITYr  r  hasattrr  r  ry  r  r  r   r_  r(  r-  r?   r@   rA   rl  rl  K  s       ''  I. . ." " " B B B3 3 3 (-      # #  _#J    _ $ $  _$3 3 3
5 5 5
 7 7 _7 
 
 _

   _2 ) ) _)
   _ 
w~~/yry{{///00 #0	 	0  	0 
 	0D 	
 	
 _	
 7 7 _7 4 4 4 _4 ) ) ) _)  B B _B$  C' C'	$ 	$ 	$. 
 #
#;<<BJ233RZ 455	$ 	$ 	$ 
	$8 
		? 		? 
		? 		? ' H	E	 E	 
E	N 
 
 _

 "
#<==8 8 8 _8 *4"*5H*I*I 5 5 5 _5
   _4 0 0 _0 7 7 _7  &		8 	8 
	8 !bj!DEE		9 		9 		9 		9 
	 	 
	.  B		/ 	/ 
	/
 
	B 	B 
	B wx## 		 	 	 
	6 . . _. - - _-^    _
 E E _E 4 4 _4 &BJ'DEE @ @ @ _@
 &BJ'DEE @ @ @ _@ @ @r@   rl  r/  r.  )r  r`  r  enumrK  rh  r   r_   r   r  r9  rb  sysr   r   r   r}  r   r   r   r   r	   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __extra__all__r<  rd   ro  r0  r1  r  r4  r3  r2  r   r   getpagesizer   	byteorderr^  r;  rz  r  IntEnumr   	AF_PACKETr6   r7   r9   globalsrV  __members__STATUS_RUNNINGSTATUS_SLEEPINGSTATUS_DISK_SLEEPSTATUS_STOPPEDSTATUS_TRACING_STOPSTATUS_ZOMBIESTATUS_DEADSTATUS_WAKE_KILLSTATUS_WAKINGSTATUS_IDLESTATUS_PARKEDr  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   rq  r`   rq   ry   r   r   	Exceptionr   r   r   r   r   	heap_trimr   r   r   r  r  r  r&  net_if_addrsr*  r,  r  r  r  r  
disk_usager  r  r  r*  r.  rJ  rL  rU  rU  rY  r`  rj  rl  r?   r@   rA   <module>rM     s1  
 % $             				 				    



  # # # # # # " " " " " "                   # # # # # #       $ $ $ $ $ $ $ $ $ $ $ $ ' ' ' ' ' ' ! ! ! ! ! ! " " " " " " " " " " " "                         $ $ $ $ $ $ " " " " " "       + + + + + +                   ( ( ( ( ( ( ' ' ' ' ' ' " " " " " " " " " " " "	 	 	$ .  < < < <=='J		'J'J'JKK wt%677 74!899  bj&&4)  iV%5!6!67  
        		  ' ( ( ( 
			 		"				$								!						 " 
"





 

 

 



!





 (  (
 
 
$ $ $& 	+ + 	+0O%%g..CMM O O O	E
23
2
2333?JJ{,>??S#NNCMMMMMMO M	< < <~~ ~ ~B4< 4< 4<p 74 II" " "  &  :' ' 'TN N N.
 
 
 7>>;<< /L*A A /L# # # #NL L L  	 	 	 	 	I 	 	 	i i i i i i i iX ">## + + + +
, , ,^  B  
f f f fRH H H H H H H HV$ $ $ $Xs s sl  >W: W: W:~        = = =! ! !B  ,  6R
@ R
@ R
@ R
@ R
@ R
@ R
@ R
@ R
@ R
@s   J K*K

K