
    Xi1Q                    ^   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) g dZ*dZ+ej,        -                    d  ej.                     d!          Z/ej,        -                    d  ej.                     d"          Z0 e1ed#          Z2 e1ed$          Z3 ej4        d%          Z5 ej6                    Z7ej8        d&k    Z9 e:            Z;d'Z< ej=        d(d) e>e
j?                  i          Z@e@jA        ZA G d* d+ej=                  ZB eC            D                    eBjE                   ejF        ejG        ejH        ejI        ejJ        ejK        ejL        ejL        ejM        ejN        ejO        ejP        d,ZQejR        ejS        ejT        ejU        ejV        ejW        ejX        ejY        ejZ        ej[        ej\        d-Z] ed.g d/          Z^ ed0g d1          Z_ ed2g d3          Z` ed4d5          Za ed6eajb        d7z             Zc ed8g d9          Zd ed:d;d<e                    edjb                  z             Zf ed=g d>          Zg ed?g d@          ZhdA ZidB ZjdC Zke"dD             Zl	  eldE           n7# em$ r/Zn edFen             edGdH          dIdIdI          aoY dZn[nndZn[nww xY wdJ ZpdK ZqdL ZrdM ZsdN ZtdO ZudP ZvdQ ZwdR Zxej,        -                    dS          sej,        -                    dT          rdU ZyndV Zyejz        Zz G dW dXem          Z{ G dY dZ          Z| e|            Z}dod\Z~d] Zd^ Zej        Zdpd`Z G da db          ZdpdcZdd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Z G dm dn          ZdS )qzLinux platform implementation.    N)defaultdict)
namedtuple   )_common)_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"        g/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/psutil/_pslinux.pyr8   r8   d   s&        OOr?   r8   )RSDTtZXxKWIP)0102030405060708090A0Bsvmem)total	availablepercentusedfreeactiveinactivebufferscachedsharedslabsdiskio)	
read_countwrite_count
read_byteswrite_bytes	read_time
write_timeread_merged_countwrite_merged_count	busy_time	popenfile)pathfdpositionmodeflagspmemz"rss vms shared text lib data dirtypfullmem)usspssswappmmap_grouped)ro   rsssizerw   shared_cleanshared_dirtyprivate_cleanprivate_dirty
referenced	anonymousrx   	pmmap_extzaddr perms  pio)re   rf   rg   rh   
read_charswrite_chars	pcputimes)usersystemchildren_userchildren_systemiowaitc                     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   ro   s    r@   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)rs   	modes_maprr   s      r@   file_flags_to_moder      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)r   r   accessF_OK)nameincluding_virtualro   s      r@   is_storage_devicer      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|          adS )zSet 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)r   nicer   idler   irqsoftirq   steal	   guest
   
guest_nice	scputimes)r   readliner   lenappendr   r   )procfs_pathfvaluesfieldsvlens        r@   set_scputimes_ntupler      s	    
***	+	+ *q##%%abb)* * * * * * * * * * * * * * *KKKFv;;Dqyygqyygrzzl###;//IIIs   /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   r9   g       @)getKeyErrorr   argsr   r   OSErrorstrip
startswithintr   PAGESIZEmin)memsr]   fallbacklru_active_filelru_inactive_fileslab_reclaimableerrr   watermark_lowlineavail	pagecaches               r@   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          ||||||
||||	|          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:r`   r   r   ra   s   Shmem:s
   MemShared:rb   s   Active:r^   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:r_   s   Slab:s   MemAvailable:rZ   round_z6{} memory stats couldn't be determined and {} set to 0z, waswerer9   
stacklevel)r   r   r   r   r   r   r   r   r   formatjoinr   warningswarnRuntimeWarningrX   )missing_fieldsr   r   r   r   rY   r]   r`   ra   rb   r^   r_   rc   r   r\   r[   msgs                    r@   virtual_memoryr   Y  sY    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  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 0r9   r   zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 ())r   r   r   r   r   cextlinux_sysinfor   r   r   r   r   r   r   sswap)r   r   r   r   rY   r]   _unit_multiplierr\   r[   sinsoutr   r   s                 r@   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 =dGS$???sN   ;A))A-0A-5B /B87B8G	 3B>F==GG	
H&G>>Hc                  N   t                      } t          |            t          |  d          5 }|                                                                }ddd           n# 1 swxY w Y   |dt          t          j                  dz            }d |D             }t          | 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.0rH   s     r@   
<listcomp>zcpu_times.<locals>.<listcomp>"  s#    555eAhh$555r?   )r   r   r   r   r   r   r   _fields)r   r   r   r   s       r@   	cpu_timesr    s     "##K%%%	***	+	+ &q##%%& & & & & & & & & & & & & & &AI-..223F55f555Ffs   'A##A'*A'c                     t                      } t          |            g }t          |  d          5 }|                                 |D ]y}|                    d          rb|                                }|dt          t          j                  dz            }d |D             }t          | }|	                    |           z|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     r@   r   z!per_cpu_times.<locals>.<listcomp>4  s#    AAAQ%(([0AAAr?   N)
r   r   r   r   r   r   r   r   r   r   )r   cpusr   r   r   r   entrys          r@   per_cpu_timesr  &  s)    "##K%%%D	***	+	+ 
q	

 	# 	#Dv&& #C	(9$:$:Q$> >?AA&AAA!6*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   )r   sysconf
ValueErrorr   r   lowerr   recompiler   r   match)numr   r   searchs       r@   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   r   r   sumr   )lsp1p2ro   r   resultmappingcurrent_infor   keyvalues              r@   cpu_count_coresr#  W  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   r   r   	scpustats)r   ctx_switches
interruptssoft_interruptsr   syscallss         r@   	cpu_statsr*    sW   	))000	1	1 Q
 	 	Dw'' 7"4::<<?33)) 7 a11

,, 7"%djjll1o"6"6(#/*!              " Hj/8  s   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   r   )r   r   s     r@   r   z)_cpu_get_cpuinfo_freq.<locals>.<listcomp>  s_     
 
 
zz||&&z22
$**T1%%a())
 
 
r?   N)r   r   )r   s    r@   _cpu_get_cpuinfo_freqr.    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)rH   s    r@   <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   ro   r   	enumerater   r   r   r   r   scpufreqNotImplementedErrorr   )cpuinfo_freqspathsretpjoiniro   curronline_pathr   max_min_s              r@   cpu_freqrE    s   
 .//	:
 
 DYBCC 	 	

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

7#3Cc#B#BCCC =C-c222t99t#DtEE$(:;;<<==DDtEE$(:;;<<==DDJJw'dD99::::
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     r@   r   zcpu_freq.<locals>.<listcomp>  s'    OOO! C--OOOr?   )r.  r>   r?   r@   rE  rE    s      PO7L7N7NOOOOr?   c                       e Zd ZdS )_Ipv6UnsupportedErrorN)r;   r<   r=   r>   r?   r@   rI  rI    s        Dr?   rI  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)allrM  tcp4rN  rO  udp4rP  rQ  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfrS  rN  rT  rP  rQ  s         r@   __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 )Nr   /fd/fd/zsocket:[r   )r   listr   listdirr_  r   r   r   r   FileNotFoundErrorProcessLookupErrorr   errnoEINVALENAMETOOLONGr   )r`  pidinodesrp   inoder   s         r@   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updaterp  rh  ri  PermissionError)r`  rn  rm  s      r@   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>   asciiNre  z>4Iz<4I)r   r   encoderX  rY  LITTLE_ENDIAN	inet_ntopbase64	b16decoder[  structpackunpackr  r   rI  r   addr)r  familyipports       r@   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	
 |B%%%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   Nre  )r   r   ro   existsr   r   r9  r   r  RuntimeErrorrX  rZ  TCP_STATUSESr   	CONN_NONErK  r  rI  )filer  type_rn  
filter_pidr   linenor   r   laddrraddrstatusro  r   rm  rp   s                   r@   process_inetzNetConnections.process_inetb  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   r  r  r  Nr   re   )
r   r   r   r  r  r   r   socktype_to_enumr   r  )r  r  rn  r  r   r   tokensr   r  ro  r   pairsrm  rp   ro   r  r  s                    r@   process_unixzNetConnections.process_unix  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/)r  )r   r_  rp  rv  r  r^  rX  rY  r[  r  r  r   pconnsconnr  rf  )r`  kindrm  rn  r>  
proto_namer  r  ro   r  rp   r  r  r  	bound_pidconns                   r@   retrievezNetConnections.retrieve  so   +--?))#..F 	 ((**Fee)-4 	 	%J'::j::D&.&/:::&&&%C '   &&tVV&LLFH 	 	BFE5% "=FE5% DD #=FE5% D 	 Cyyr?   rr  )r;   r<   r=   __doc__ra  rp  rv  staticmethodr  r  r  r  r>   r?   r@   rK  rK    s        	 	! ! !.  4    0& 0& \0&d (I (I (I \(IT !L !L !L \!LF     r?   rK  rU  c                 6    t                               |           S )z$Return system-wide open connections.)_net_connectionsr  )r  s    r@   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/devNr9   rx  r   r   )	r   r   	readlinesrfindreprr   r   mapr   )r   linesretdictr   colonr   r   
bytes_recvpackets_recverrindropin_fifoin_framein_compressedin_multicastin
bytes_sentpackets_senterroutdropout_fifoout_collisionsout_carrierout_compressedouts                          r@   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   rj  ENODEVr   )
duplex_mapnamesr>  r   mturs   duplexspeedoutput_flagsisupr   s              r@   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:   r9   r         r  r   znot sure how to interpret line )r   r   r  r   r   r   r  r  )r   r  r   r   flenr   readsreads_mergedrbytesrtimewriteswrites_mergedwbyteswtimer   rm   r   s                    r@   read_procfsz%disk_io_counters.<locals>.read_procfs0  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   rg  walkro   r   r   r  r   r   basenamer  r   )blockrootr   filesr   r   r   r  r  r  r  r  r  r  r  rm   s                   r@   
read_sysfsz$disk_io_counters.<locals>.read_sysfs^  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   ro   r  r   r;  r   DISK_SECTOR_SIZE)perdiskr  r  genr   r  r  r   r  r  r  r  r  r  r  r  rm   s                    r@   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 Nr   )r   r  st_devr  r  )r`  devs     r@   ra  zRootFsDeviceFinder.__init__  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/partitionsr9   r   r   r   r:   /dev/)	r   r   r  r   r   isdigitr   r  r  )r`  r   r   r   r  r  r   s          r@   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/rx  z/ueventzDEVNAME=r9   r   )r  r  r   r   r   
rpartition)r`  ro   r   r   r   s        r@   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 )Nrx  z/sys/class/block/*/devr   )r  r  r  iglobr   r  r   r   ro   r  dirnamerh  )r`  needler  r  r   datar   s          r@   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 rr  )r  r   r   r  r  r   ro   r  )r`  ro   r   s      r@   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__ra  r  r  r  r  r>   r?   r@   r  r    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  r   r   ro   isfilerealpathr   disk_partitionsr  r  r   	sdiskpartr   )rR  fstypesr   r   r   fstypemounts_pathretlist
partitions	partitiondevice
mountpointoptsntuples                 r@   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"6:vtDD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   r   r   s     r@   	<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     @@r   _maxNr4  _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   ro   r  r   )r   ps     r@   r(  z'sensors_temperatures.<locals>.<setcomp>_  s[        ))!,,22377!<==  r?   _typecritical_temphigh)collectionsr   rf  r  extendsortedr  r  subr   r   r   r   ro   r   r  r   r   r   r  r  r   dict)r>  	basenames
basenames2replr   altnamebasero   current	unit_namer5  r3  labelr   
trip_pathstrip_points
trip_point	trip_types                     r@   sensors_temperaturesrG    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     r@   r(  zsensors_fans.<locals>.<setcomp>  r)  r?   r*  Nr   r-  r  r4  )r6  r   rf  r  r8  r   r   r   r   r   r   ro   r   r  r   r   r   sfanr:  )r>  r;  r?  r@  r   rA  rB  s          r@   sensors_fansrK    sM    
!$
'
'C	:;;I G IEFF	;;;;;<<I < <	$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gl5'::;;;;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.
        r4  N)r   r   r  r   )r=  ro   r>  nulls      r@   
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     r@   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	/capacityre  r4  z
AC0/onlinez	AC/onliner   /statusr  dischargingF>   fullchargingTi  <   r   )objectr   rg  POWER_SUPPLY_PATHro   r   r   ZeroDivisionErrorr   r   r   r  r   POWER_TIME_UNLIMITEDabsPOWER_TIME_UNKNOWNsbattery)rO  batsr  
energy_now	power_nowenergy_fulltime_to_emptyr[   power_pluggedonliner  secsleftrN  s               @r@   sensors_batteryrg    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-GX}===s$   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tstamprm  nts	            r@   ri  ri    sf    GjllG  +/(c8VS]4hDD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   r   r  )ro   r   r   r   s       r@   	boot_timerr  
  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     r@   r   zpids.<locals>.<listcomp>  s+    <<<q		<CFF<<<r?   )r   r{  r	   r   rg  r   s    r@   rs  rs    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).
    Fr   rS  s   Tgid:r   Nz'Tgid' line not found in )
r   
pid_existsr   r   r   r   r   r  r   rs  )rm  ro   r   r   tgidr   s         r@   rv  rv     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().
    r   r   N   )r9   r   )r   rs  r   r  r  r   r   rh  ri  ru  r   )	r>  r   rm  r   r
  rpardsetppidr   s	            r@   ppid_mapr}  A  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 )zlDecorator which translates bare OSError and 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)Nr   r   )rm  _nameru  r   ri  _raise_if_zombier   rh  r   ro   r  r_  )r`  r   kwargsrm  r   r   funs         r@   wrapperz wrap_exceptions.<locals>.wrapper\  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)r  r  s   ` r@   wrap_exceptionsr  W  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_ctimer  _ppidr_  rm  c                 d    || _         d | _        d | _        d | _        t	                      | _        d S rr  )rm  r  r  r  r   r_  )r`  rm  s     r@   ra  zProcess.__init__~  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)Nr   r   ry  r9   r:      ZF)r   r_  rm  r  r   )r`  r
  rz  r  s       r@   
_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 rr  )r  r   rm  r  r  r`  s    r@   r  zProcess._raise_if_zombie  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.r   N)r   r  r_  rm  r  s    r@   _raise_if_not_alivezProcess._raise_if_not_alive  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   rh  ri  r   ro   lexistsr_  rm  r  UNSET)r`  ro   r   s      r@   	_readlinkzProcess._readlink  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.
        r   r   ry     (r   r9   Nr   r   r  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_  rm  r  r  r   
IndexErrorr   )r`  r
  rz  r   r   r>  s         r@   _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.
        r   rS  N)r   r_  rm  r  r`  r   s     r@   _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 )Nr   r/   )r   r_  rm  r  r   r  s     r@   _read_smaps_filezProcess._read_smaps_file  s     D-@@@@@AA 	$Q6688>>##	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   &AAAc                     | j                             |            | j                            |            | j                            |            d S rr  )r  cache_activater  r  r  s    r@   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 rr  )r  cache_deactivater  r  r  s    r@   oneshot_exitzProcess.oneshot_exit  sM    ..t444//555..t44444r?   c                 P    t          |                                 d                   S )Nr   )r   r  r  s    r@   r   zProcess.name  s#     d++--f5666r?   c                 P    |                      | j         d| j         dd          S )Nr   z/exer  r4  r  r_  rm  r  s    r@   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 )Nr   z/cmdliner   r   re  r   )r   r_  rm  r  r  r   r   r   )r`  r   r
  sepcmdlines        r@   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 )Nr   z/environ)r   r_  rm  r  r   )r`  r   r
  s      r@   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   )r`  tty_nrr^  s      r@   terminalzProcess.terminal  s_    T**,,W566(**	< 	 	 	44	s   A 
AAr.   /ioc           	      4   | 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          |d         |d         |d         |d         |d	         |d
                   S # t          $ r*}|j
        d         d| d|}t          |          d d }~ww xY w)Nr   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_  rm  r   r   r   r   r  r  r   r   r   )	r`  fnamer   r   r   r   r"  r   r   s	            r@   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8$8$=)>*8$8$    0 0 0x{ . .e . .#). .  !oo4/0sM   B	 A+B	+
A85B	7A88B		BB+7C# #
D-%DDc                 r   |                                  }t          |d                   t          z  }t          |d                   t          z  }t          |d                   t          z  }t          |d                   t          z  }t          |d                   t          z  }t          |||||          S )Nr  r  r  r  r  )r  r   r   r   )r`  r   r  r  r  r  r   s          r@   r  zProcess.cpu_timesJ  s    &&((fWo&&4fWo&&4v&6788;Fv&6788;Fvm,--;~~vNNNr?   c                 P    t          |                                 d                   S )zWhat CPU the process is on.r  r   r  r  s    r@   r  zProcess.cpu_numT  s#     4((**95666r?   Nc                 B    t          j        | j        || j                  S rr  )r   wait_pidrm  r  )r`  timeouts     r@   waitzProcess.waitY  s     7DJ???r?   Fc                     | j         4t          |                                 d                   t          z  | _         |r| j         S | j         t	                      z   S )Nr  )r  r   r  r   rr  )r`  	monotonics     r@   r  zProcess.create_time]  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          |||||||          S )Nr   z/statmc              3   D   K   | ]}t          |          t          z  V  d S rr  )r   r   r   s     r@   	<genexpr>z&Process.memory_info.<locals>.<genexpr>|  s>       8 8&'A!8 8 8 8 8 8r?   r  )r   r_  rm  r   r   rt   )	r`  r   vmsrz   rb   textlibr
  dirtys	            r@   memory_infozProcess.memory_infon  s     D-@@@@@AA 	Q8 8+,::<<+=+=+?+?+C8 8 84CfdCu	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 CfdCu===s   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   r   r0   s   Private_r   r      Pss:   Swap:)r   r_  rm  r   r   r   )r`  rv   rw   rx   r   r   s         r@   _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)r`  _private_re_pss_re_swap_re
smaps_datarv   rw   rx   s           r@   _parse_smapszProcess._parse_smaps  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          ||||fz    S rr  )HAS_PROC_SMAPS_ROLLUPr  ri  rh  r  r  ru   )r`  rv   rw   rx   	basic_mems        r@   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Y#sD)99::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 )r   r   popr   r   r  r  r   )r  current_blockr
  r   r   r   s         r@   
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  r  r   r  r  r   r   r   r   r   r   )r`  r  r
  r  r  
first_liner  headerhfieldsr  perms_offset_dev_inodero   rl  s                   r@   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 )Nr   z/cwdr  r4  r  r  s    r@   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 r   z1/status; the kernel is probably older than 2.6.23r   r   )r  r  r_  rm  r;  r   pctxswr   )r`  	_ctxsw_rer
  ctxswr   s        r@   num_ctx_switcheszProcess.num_ctx_switches  s     %%''!!$'' 	+.%. .(,. . .  &c***~c%(mmSq]];;;r?   s   Threads:\t(\d+)c                 z    |                                  }t          |                    |          d                   S Nr   )r  r   r  )r`  _num_threads_rer
  s      r@   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 )Nr   z/taskFz/task/r   Try  r9   r   r  r  )r   rg  r_  rm  r8  r   r  r   rh  ri  r  r   r   r   r   pthreadr   r   r  )r`  
thread_idsr  
hit_enoent	thread_idr  r   str   r  r  r#  s               r@   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_S^^UEBBFNN6"""" 	'$$&&&s6   B&''BB&B	B&!B	"B&&B<;B<c                 4    t          j        | j                  S rr  )r   proc_priority_getrm  r  s    r@   nice_getzProcess.nice_getG  s     %dh///r?   c                 6    t          j        | j        |          S rr  )r   proc_priority_setrm  )r`  r"  s     r@   nice_setzProcess.nice_setP  s    %dh666r?   c                 4    t          j        | j                  S rr  )r   r2   rm  r  s    r@   cpu_affinity_getzProcess.cpu_affinity_getW  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  rf  ranger   r   r  )r`  _rer
  r  s       r@   _get_eligible_cpuszProcess._get_eligible_cpus[  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_setrm  r   r  r   rj  rk  r  tupler  r   r  )r`  r  r   eligible_cpusall_cpuscpur   s          r@   cpu_affinity_setzProcess.cpu_affinity_setf  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 rr  )r   r1   rm  r8   r   pionice)r`  ioclassr"  s      r@   
ionice_getzProcess.ionice_get  s7    !1$(;;NGU ))G?7E222r?   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)r8   r"   r   r  r   proc_ioprio_setrm  )r`  r  r"  r   s       r@   
ionice_setzProcess.ionice_set  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 processr9   z2second argument must be a (soft, hard) tuple, got )	rm  r  resourcer$  r   r   rj  ENOSYSr  )r`  	resource_limitsr   r   s        r@   rlimitzProcess.rlimit  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 )Nr  ?)r  r   PROC_STATUSESr   )r`  letters     r@   r  zProcess.status  s;    &&((2  ---r?   c                 6   g }t          j        | j         d| j         d          }d}|D ]}| j         d| j         d| }	 t	          |          }|                    d          r,t          |          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          |t          |          t          |          |
|	          }|                    |           O# t          t          f$ r d}Y ew xY wk# 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 )	Nr   rc  Frd  z/fdinfo/r   r   T)r   rg  r_  rm  r   r   r   r   r   r   r   r   rn   r   rh  ri  r   rj  rk  rl  r   r  )r`  r  r  r  rp   r  ro   r   posrs   rr   r#  r   s                r@   
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 ,	H 5G;$G;:G;;H rU  c                 n    t                               || j                  }|                                  |S rr  )r  r  rm  r  )r`  r  r>  s      r@   r  zProcess.net_connections  s0    ''dh77  """
r?   c                 d    t          t          j        | j         d| j         d                    S )Nr   rc  )r   r   rg  r_  rm  r  s    r@   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  r  s    r@   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   )r`  _uids_rer
  real	effectivesaveds         r@   uidszProcess.uids  X    %%''!)!1!1$!7!7!:i}SYYIE

CCCr?   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r   )r  r  r   pgidsr   )r`  _gids_rer
  r9  r:  r;  s         r@   gidszProcess.gids  r=  r?   rr  FrU  )@r;   r<   r=   r  r  ra  r  r  r  r  r  r  r   r  r  r  r  r  r   r  r  r  r  r   ro   r  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*  r  r1  r  r4  r|  r<  rA  r>   r?   r@   r  r  r  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 O O _O 7 7 _7 @ @ @ _@ ) ) ) _)  > > _>$  C' C'	$ 	$ 	$. 
 #
#;<<BJ233RZ 455	$ 	$ 	$ 
	$8 
		; 		; 
		; 		; ' H	E	 E	 
E	N 
 
 _

 "
#<==< < < _< *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		3 	3 
	3
 
	B 	B 
	B wx## 		 	 	 
	6 . . _. - - _-^    _
 E E _E 4 4 _4 &BJ'DEE D D D _D
 &BJ'DEE D D D _D D Dr?   r  rC  rB  )r  r~  r6  enumrj  r  r  r   r  r&  rX  r  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   __extra__all__rY  ro   r  rD  rE  r  rH  rG  rF  r
  r   getpagesizer   	byteorderr|  rX  r  r  IntEnumr   	AF_PACKETr5   r6   r8   globalsrt  __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-   r  rX   rd   rn   rt   r   ru   ry   r   r   r   r   r   r   r   r   	Exceptionr   r   r   r   r   r  r  r  r#  r*  r.  rE  net_if_addrsrI  rK  r  r  r  r  
disk_usager  r  r  rG  rK  rg  ri  rr  rs  rv  r}  r  r  r>   r?   r@   <module>r`     s+	  
 % $             				 				    



  # # # # # # " " " " " "             # # # # # #       $ $ $ $ $ $ $ $ $ $ $ $ ' ' ' ' ' ' ! ! ! ! ! ! " " " " " " " " " " " "                         $ $ $ $ $ $ " " " " " "       + + + + + +                   ( ( ( ( ( ( ' ' ' ' ' ' " " " " " " " " " " " "	 	 	$ .  < < < <=='J		'J'J'JKK wt%677 74!899  bj&&4)  iV%5!6!67  
        		  ' ( ( ( 
			 		"				$								!						 " 
"





 

 

 



!





 , 	
 K K K	L 	L *     J<<<> >	 z&>??:j$,1G"GHH
J J JK K
 J-*?!@!@@B B	 j 6 6 6 7 7 J{" " "# #	  (
 
 
$ $ $& 	0 0 	00K!!!! K K K	E
23
2
2333;

;(:;;CcJJIIIIIIK< < <~~ ~ ~B4@ 4@ 4@x     (  :' ' 'T  2
 
 
 7>>;<< /P*A A /P# # # #NP P P  	 	 	 	 	I 	 	 	k k k k k k k k\ ">## + + + +
, , ,^  B  
f f f fRH H H H H H H HV$ $ $ $Xs s sl  >W> W> W>~        = = =! ! !B  ,  6P
D P
D P
D P
D P
D P
D P
D P
D P
D P
Ds   L& &M+%MM