
    /hP                       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, e-e	d           r(e,.                    d!  e/e          D                        d"Z0ej1        2                    d# ej3                     d$          Z4ej1        2                    d# ej3                     d%          Z5 e-ed&          Z6 e-ed'          Z7 ej8        d(          Z9 ej:                    Z;da<ej=        d)k    Z>d*Z? ej@        d+d, eAe
jB                  i          ZCeCjD        ZD G d- d.ej@                  ZE eF            G                    eEjH                   ejI        ejJ        ejK        ejL        ejM        ejN        ejO        ejO        ejP        ejQ        ejR        ejS        d/ZTejU        ejV        ejW        ejX        ejY        ejZ        ej[        ej\        ej]        ej^        ej_        d0Z` ed1g d2          Za ed3g d4          Zb ed5g d6          Zc ed7d8          Zd ed9edje        d:z             Zf ed;g d<          Zg ed=d>d?h                    egje                  z             Zi ed@g dA          Zj edBg dC          ZkdD ZldE ZmdF Zne$dG             Zo	  eodH           n7# ep$ r/Zq e dIeq             edJdK          dLdLdL          arY dZq[qndZq[qww xY wdM ZsdN ZtdO ZudP ZvdQ ZwdR ZxdS ZydT ZzdU Z{ej1        2                    dV          sej1        2                    dW          rdX Z|ndY Z|ej}        Z} G dZ d[ep          Z~ G d\ d]          Z e            Zdrd_Zd` Zda Zej        ZdsdcZ G dd de          ZdsdfZdg Zdh Zdi Zdj Zdk Zdl Zdm Zdn Zdo Z G dp dq          ZdS )tzLinux platform implementation.    N)defaultdict)
namedtuple   )_common)_psposix)_psutil_linux)_psutil_posix)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_CLOSINGprlimitc                 d    g | ]-}|                     d           |                                +|.S )RLIM)
startswithisupper.0xs     B/var/www/html/venv/lib/python3.11/site-packages/psutil/_pslinux.py
<listcomp>r8   A   s6    FFFqf!5!5F!))++FFFF    z/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#    r9   r7   rD   rD   k   s&        OOr9   rD   )RSDTtZXr6   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)rx   rsssizer   shared_cleanshared_dirtyprivate_cleanprivate_dirty
referenced	anonymousr   	pmmap_extzaddr perms  pio)rn   ro   rp   rq   
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   rx   s    r7   r   r      s    dC  &&$&&&;tD ::fa D }}\"" +=d+C+C DSDzKr9   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)r|   	modes_mapr{   s      r7   file_flags_to_moder      sw     c2;RYEIUbkBK7")CDEDr{ )||Ca((<<d##DKr9   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_virtualrx   s      r7   is_storage_devicer      sX     <<S!!D +#T##*T***9T27###r9   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        r7   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   rE   g       @)getKeyErrorr   argsr   r   OSErrorstripr2   intr   PAGESIZEmin)memsrf   fallbacklru_active_filelru_inactive_fileslab_reclaimableerrr   watermark_lowlineavail	pagecaches               r7   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||z
  |z
  |z
  }|dk     r||z
  }	 |d         }|dk    rt          |          }n# t          $ r t          |          }Y nw xY w|dk     rd}|                     d           n||k    r|}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:ri   r   r   rj   s   Shmem:s
   MemShared:rk   s   Active:rg   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:rh   s   Slab:s   MemAvailable:rc   round_z6{} memory stats couldn't be determined and {} set to 0z, waswererE   
stacklevel)r   r   r   r   r   r   r   r   r   formatjoinr   warningswarnRuntimeWarningra   )missing_fieldsr   r   r   r   rb   rf   ri   rj   rk   rg   rh   rl   re   r   rd   msgs                    r7   virtual_memoryr   `  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~    4<& 7*Daxx t|
/%& A::
 )..E  + + +$T**+ qyyk****	 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H+ +II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 0rE   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   r2   r   r   r   r   r   sswap)r   r   r   r   rb   rf   _unit_multiplierre   rd   sinsoutr   r   s                 r7   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 rJ   floatCLOCK_TICKSr4   s     r7   r8   zcpu_times.<locals>.<listcomp>-  s#    555eAhh$555r9   )r   r   r   r   r   r   r   _fields)r   r   r   r   s       r7   	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 rJ   r  r4   s     r7   r8   z!per_cpu_times.<locals>.<listcomp>?  s#    AAAQ%(([0AAAr9   N)
r   r   r   r   r2   r   r   r   r  r   )r   cpusr   r   r   r   entrys          r7   per_cpu_timesr  1  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   lowerr2   recompiler   r   match)numr   r   searchs       r7   cpu_count_logicalr  E  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   r2   r   r   sumr   )lsp1p2rx   r   resultmappingcurrent_infor   keyvalues              r7   cpu_count_coresr(  b  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   r2   r   r   r   	scpustats)r   ctx_switches
interruptssoft_interruptsr   syscallss         r7   	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  r2   r  r   )r5   r   s     r7   r8   z)_cpu_get_cpuinfo_freq.<locals>.<listcomp>  s_     
 
 
zz||&&z22
$**T1%%a())
 
 
r9   N)r   r   )r   s    r7   _cpu_get_cpuinfo_freqr3    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)r6   s    r7   <lambda>zcpu_freq.<locals>.<lambda>  s&    RYy!%<%<%B%B%D%D!E!E r9   )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)r3  r  sortr   rx   r   	enumerater   r   r   r   r   scpufreqNotImplementedErrorr   )cpuinfo_freqspathsretpjoinirx   curronline_pathr   max_min_s              r7   cpu_freqrJ    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::::
r9   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?  r4   s     r7   r8   zcpu_freq.<locals>.<listcomp>  s'    OOO! C--OOOr9   )r3  rJ   r9   r7   rJ  rJ    s      PO7L7N7NOOOOr9   c                       e Zd ZdS )_Ipv6UnsupportedErrorN)rG   rH   rI   rJ   r9   r7   rN  rN    s        Dr9   rN  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)allrR  tcp4rS  rT  udp4rU  rV  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfrX  rS  rY  rU  rV  s         r7   __init__zNetConnections.__init__  s     v~v'9:);<v~v'89):;-$dD1$<GG$<GGG4t,D\D\
 
	 !r9   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   listdirrd  r   r2   r   r   FileNotFoundErrorProcessLookupErrorr   errnoEINVALENAMETOOLONGr   )re  pidinodesry   inoder   s         r7   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updateru  rm  rn  PermissionError)re  rs  rr  s      r7   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
        :   rJ   asciiNrj  z>4Iz<4I)r   r   encoder]  r^  LITTLE_ENDIAN	inet_ntopbase64	b16decoder`  structpackunpackr  r   rN  r   addr)r  familyipports       r7   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   Nrj  )r   r   rx   existsr   r   r>  r   r  RuntimeErrorr]  r_  TCP_STATUSESr   	CONN_NONErP  r  rN  )filer  type_rs  
filter_pidr   linenor   r   laddrraddrstatusrt  r   rr  ry   s                   r7   process_inetzNetConnections.process_inetm  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   rj   )
r   r   r   r  r  r   r   socktype_to_enumr   r  )r  r  rs  r  r   r   tokensr   r  rt  r   pairsrr  ry   rx   r  r  s                    r7   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   rd  ru  r{  r  rc  r]  r^  r`  r  r  r   pconnsconnr  rk  )re  kindrr  rs  rC  
proto_namer  r  rx   r   ry   r  r  r  	bound_pidconns                   r7   retrievezNetConnections.retrieve  so   +--?))#..F 	 ((**Fee)-4 	 	%J'::j::D&.&/:::&&&%C '   &&tVV&LLFH 	 	BFE5% "=FE5% DD #=FE5% D 	 Cyyr9   rw  )rG   rH   rI   __doc__rf  ru  r{  staticmethodr  r  r  r  rJ   r9   r7   rP  rP    s        	 	! ! !.  4    0& 0& \0&d (I (I (I \(IT !L !L !L \!LF     r9   rP  rZ  c                 6    t                               |           S )z$Return system-wide open connections.)_net_connectionsr  )r  s    r7   net_connectionsr    s    $$T***r9   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/devNrE   r}  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                          r7   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
cext_posix
net_if_mtunet_if_flagsnet_if_duplex_speedr   r   	snicstatsr   ro  ENODEVr   )
duplex_mapnamesrC  r   mtur|   duplexspeedoutput_flagsisupr   s              r7   net_if_statsr    s    	///J
 ""$$E
C  	'--C+D11E 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   rF   rE   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   rv   r   s                    r7   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   rl  walkrx   r   r   r  r   r   basenamer  r   )blockrootr   filesr   r   r   r  r  r  r  r  r  r  r  rv   s                   r7   
read_sysfsz$disk_io_counters.<locals>.read_sysfsi  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   rx   r  r   r@  r   DISK_SECTOR_SIZE)perdiskr  r  genr   r  r
  r   r  r  r  r  r  r  r  r  rv   s                    r7   disk_io_countersr  6  s;   
+; +; +;\F F F 
w~~**66677 	'kmm		%	% 'jll       	 "#&&&G A A ).	&ufffeUL9 	066 	 """"u%}iA Nr9   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   )re  devs     r7   rf  zRootFsDeviceFinder.__init__  s4    gcll!Xc]]
Xc]]


r9   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/partitionsrE   r   r   r   rF   /dev/)	r   r   r  r   r   isdigitr   r  r   )re  r   r   r   r  r   r   s          r7   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/r}  z/ueventzDEVNAME=rE   r  )r  r   r   r2   r   
rpartition)re  rx   r   r   r   s        r7   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 )Nr}  z/sys/class/block/*/devr  )r  r   r  iglobr   r  r   r   rx   r  dirnamerm  )re  needler  r  r   datar   s          r7   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 rw  )r  r   r   r
  r  r   rx   r  )re  rx   r   s      r7   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)
rG   rH   rI   r  	__slots__rf  r  r
  r  r  rJ   r9   r7   r  r    su          '"I# # #
. . .. . .. . .    r9   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   r2   r  r   r   rx   isfilerealpathr   disk_partitionsr  r  r   	sdiskpartr   )rW  fstypesr   r   r   fstypemounts_pathretlist
partitions	partitiondevice
mountpointoptsntuples                 r7   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   r4   s     r7   	<setcomp>z'sensors_temperatures.<locals>.<setcomp>)  &    ;;;AQ;;;r9   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg     @@r   _maxNr9  _crit_labelr  z /sys/class/thermal/thermal_zone*temptypez/trip_point*c                     h | ]O}d                      t          j                            |                              d           dd                   PS )r   r   rF   )r   r   rx   r  r   )r5   ps     r7   r-  z'sensors_temperatures.<locals>.<setcomp>j  s[        ))!,,22377!<==  r9   _typecritical_temphigh)collectionsr   rk  r  extendsortedr  r  subr   r  r   r   rx   r   r  r   r   r   r  r  r   dict)rC  	basenames
basenames2replr   altnamebaserx   current	unit_namer:  r8  labelr   
trip_pathstrip_points
trip_point	trip_types                     r7   sensors_temperaturesrL    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,  r4   s     r7   r-  zsensors_fans.<locals>.<setcomp>  r.  r9   r/  Nr   r2  r  r9  )r;  r   rk  r  r=  r   r   r   r   r   r   rx   r   r  r   r   r   sfanr?  )rC  r@  rD  rE  r   rF  rG  s          r7   sensors_fansrP    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                  \   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        }nj|5|3	 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.
        r9  N)r   r   r  r   )rB  rx   rC  nulls      r7   
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)r2   r  r4   s     r7   r8   z#sensors_battery.<locals>.<listcomp>  sK       << #,qwwyy"8"8 	
"8"8"8r9   Nz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r   z	/capacityrj  r9  z
AC0/onlinez	AC/onliner   /statusr  dischargingF>   fullchargingTi  <   r   )objectr   rl  POWER_SUPPLY_PATHrx   r   r   ZeroDivisionErrorr   r   r   r  r   POWER_TIME_UNLIMITEDPOWER_TIME_UNKNOWNsbattery)rT  batsr  
energy_now	power_nowenergy_fulltime_to_emptyrd   power_pluggedonliner  secsleftrS  s               @r7   sensors_batteryrk    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:	1D899HH  	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tstamprr  nts	            r7   rm  rm  
  sf    GjllG  +/(c8VS]4hDDrNr9   c                  P   t                       d} t          |           5 }|D ]b}|                    d          rKt          |                                                                d                   }|a|c cddd           S cd|  }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   r2   r  r   r   	BOOT_TIMEr  )rx   r   r   rC  r   s        r7   	boot_timerw    s     &&&D	T		  a 	 	Dx(( DJJLL..00344	

                24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 rJ   )r  r   r4   s     r7   r8   zpids.<locals>.<listcomp>+  s+    <<<q		<CFF<<<r9   )r   r  r
   r   rl  r   s    r7   rx  rx  (  s9    ##H--D<<BJt,,<<<<r9   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   rX  s   Tgid:r   Nz'Tgid' line not found in )
r   
pid_existsr   r   r2   r   r   r  r   rx  )rr  rx   r   r   tgidr   s         r7   r{  r{  .  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 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   )rE   r   )	r   rx  r   r  r  r   r   rm  rn  )rC  r   rr  r   r  rpardsetppids           r7   ppid_mapr  O  s&    C!##Kvv  	88c88899  Qvvxx                              ::d##Dq

#))++DtAw<<DCHH "#56 	 	 	 D	 Js4   B2AB2A	B2A	 B22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   )rr  _namerz  r   rn  _raise_if_zombier   rm  r   rx   r  rd  )re  r   kwargsrr  r   r   funs         r7   wrapperz wrap_exceptions.<locals>.wrapperj  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   ` r7   wrap_exceptionsr  e  s:    
 _S    $ Nr9   c                      e Zd ZdZg dZd Zd Zd Z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             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)             Z. e"j#        d*          fd+Z/e	d,             Z0e1re	d-             Z2e	d.             Z3 e4e5d/          re	d;d0            Z6e	d1             Z7e	d2             Z8e	d<d4            Z9e	d5             Z:e	d6             Z;e	 e"j#        d7          fd8            Z<e	 e"j#        d9          fd:            Z=dS )=ProcesszLinux process implementation.)_cacher  _ppidrd  rr  c                 V    || _         d | _        d | _        t                      | _        d S rw  )rr  r  r  r   rd  )re  rr  s     r7   rf  zProcess.__init__  s+    

+--r9   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   r~  rE   rF      ZF)r   rd  rr  r  r   )re  r  r  r  s       r7   
_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 rw  )r  r   rr  r  r  re  s    r7   r  zProcess._raise_if_zombie  s9    ?? 	B$*djAAA	B 	Br9   c                 L    t          j        | j         d| j                    dS )z+Raise NSP if the process disappeared on us.r   N)r   r  rd  rr  r  s    r7   _raise_if_not_alivezProcess._raise_if_not_alive  s-     	4$11tx1122222r9   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   r~     (r   rE   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   rd  rr  r  r  r   
IndexErrorr   )re  r  r  r   r   rC  s         r7   _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   rX  N)r   rd  rr  r  re  r   s     r7   _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   rd  rr  r  r   r  s     r7   _read_smaps_filezProcess._read_smaps_file  s     D-@@@@@AA 	$Q6688>>##	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   &AAAc                     | j                             |            | j                            |            | j                            |            d S rw  )r  cache_activater  r  r  s    r7   oneshot_enterzProcess.oneshot_enter  sM    ,,T222--d333,,T22222r9   c                     | j                             |            | j                            |            | j                            |            d S rw  )r  cache_deactivater  r  r  s    r7   oneshot_exitzProcess.oneshot_exit  sM    ..t444//555..t44444r9   c                 P    t          |                                 d                   S )Nr   )r   r  r  s    r7   r   zProcess.name  s#     d++--f5666r9   c                     	 t          | j         d| j         d          S # t          t          f$ rG |                                  t          j                            | j         d| j                   rY dS  w xY w)Nr   z/exer  )	r   rd  rr  rm  rn  r  r   rx   lexistsr  s    r7   exezProcess.exe  s    		t0AA48AAABBB!#56 	 	 	!!### w$"3@@dh@@AA rr	s   ! AA97A9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   rj  r   )r   rd  rr  r  r  r   r   r   )re  r   r  sepcmdlines        r7   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   rd  rr  r  r   )re  r   r  s      r7   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   )re  tty_nrrc  s      r7   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 )rd  rr  r   r   r   r   r  r  r   r   r   )	re  fnamer   r   r   r   r'  r   r   s	            r7   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   )re  r   r  r  r  r  r   s          r7   r  zProcess.cpu_timesG  s    &&((fWo&&4fWo&&4v&6788;Fv&6788;Fvm,--;~~vNNNr9   c                 P    t          |                                 d                   S )zWhat CPU the process is on.r  r   r  r  s    r7   r  zProcess.cpu_numQ  s#     4((**95666r9   Nc                 B    t          j        | j        || j                  S rw  )r   wait_pidrr  r  )re  timeouts     r7   waitzProcess.waitV  s     7DJ???r9   c                     t          |                                 d                   }t          pt                      }|t          z  |z   S )Nr  )r  r  rv  rw  r  )re  ctimebts      r7   r  zProcess.create_timeZ  s@    d++--m<== %)++#r))r9   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 rw  )r   r   r4   s     r7   	<genexpr>z&Process.memory_info.<locals>.<genexpr>s  s>       8 8&'A!8 8 8 8 8 8r9   r  )r   rd  rr  r   r   r}   )	re  r   vmsr   rk   textlibr  dirtys	            r7   memory_infozProcess.memory_infoe  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   r<   s   Private_r   r      Pss:   Swap:)r   rd  rr  r2   r   r   )re  r   r   r   r   r   s         r7   _parse_smaps_rollupzProcess._parse_smaps_rollupz  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)re  _private_re_pss_re_swap_re
smaps_datar   r   r   s           r7   _parse_smapszProcess._parse_smaps  s    * ..00J c#{22:>>??@@4GCc#wz::;;<<tCCs3 0 0 < <==>>EDd##r9   c                    t           rI	 |                                 \  }}}nG# t          t          f$ r |                                 \  }}}Y nw xY w|                                 \  }}}|                                 }t          ||||fz    S rw  )HAS_PROC_SMAPS_ROLLUPr  rn  rm  r  r  r~   )re  r   r   r   	basic_mems        r7   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
          $ r3 |d                             d          rY d|}t          |          d w xY w|                                |fV  d S )N   r   r2  r   r   s   VmFlags:z!don't know how to interpret line )r   r   popr   r   r  r2   )r  current_blockr  r   r   r   s         r7   
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) < < <%ay33K@@ ) ("Nd"N"NC",S//t;< %((**D111111s   )!B%C2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   )re  r  r  r  r   
first_liner  headerhfieldsr  perms_offset_dev_inoderx   rp  s                   r7   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                 @    t          | j         d| j         d          S )Nr   z/cwd)r   rd  rr  r  s    r7   cwdzProcess.cwd  s&    4,==tx===>>>r9   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  rd  rr  r@  r   pctxswr   )re  	_ctxsw_rer  ctxswr   s        r7   num_ctx_switcheszProcess.num_ctx_switches  s     %%''!!$'' 	+.%. .(,. . .  &c***~c%(mmSq]];;;r9   s   Threads:\t(\d+)c                 z    |                                  }t          |                    |          d                   S Nr   )r  r   r  )re  _num_threads_rer  s      r7   num_threadszProcess.num_threads  s6     %%''?**4003444r9   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   Tr~  rE   r   r  r  )r   rl  rd  rr  r=  r   r  r   rm  rn  r  r   r  r  r   pthreadr   r   r  )re  
thread_idsr"  
hit_enoent	thread_idr  r   str   r  r  r(  s               r7   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 rw  )r  getpriorityrr  r  s    r7   nice_getzProcess.nice_get<  s     %dh///r9   c                 6    t          j        | j        |          S rw  )r  setpriorityrr  )re  r'  s     r7   nice_setzProcess.nice_setE  s    %dh666r9   c                 4    t          j        | j                  S rw  )r   r>   rr  r  s    r7   cpu_affinity_getzProcess.cpu_affinity_getL  s    -dh777r9   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  rk  ranger   r   r  )re  _rer  r  s       r7   _get_eligible_cpuszProcess._get_eligible_cpusP  s     ))++DKK%%E 9E#eAhqk"2"2Ca4D4Dq4HIIJJJE#moo"6"677888r9   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_setrr  r   r  r   ro  rp  r  tupler  r   r  )re  r	  r   eligible_cpusall_cpuscpur   s          r7   cpu_affinity_setzProcess.cpu_affinity_set[  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 rw  )r   r=   rr  rD   r   pionice)re  ioclassr'  s      r7   
ionice_getzProcess.ionice_getu  s7    !1$(;;NGU ))G?7E222r9   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)rD   r#   r    r  r   proc_ioprio_setrr  )re  r  r'  r   s       r7   
ionice_setzProcess.ionice_set{  s    } &,,%   !=== oo%qyyEAII. oo%''5AAAr9   r/   c                 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 processrE   z2second argument must be a (soft, hard) tuple, got )	rr  r  resourcer/   r   r   ro  ENOSYSr  )re  	resource_limitsr   r   s        r7   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   )re  letters     r7   r  zProcess.status  s;    &&((2  ---r9   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   rh  Fri  z/fdinfo/r   r   T)r   rl  rd  rr  r   r2   r   r   r   r   r   r   rw   r   rm  rn  r   ro  rp  rq  r   r  )re  r"  r  r  ry   r  rx   r   posr|   r{   r(  r   s                r7   
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 rZ  c                 n    t                               || j                  }|                                  |S rw  )r  r  rr  r  )re  r  rC  s      r7   r  zProcess.net_connections  s0    ''dh77  """
r9   c                 d    t          t          j        | j         d| j         d                    S )Nr   rh  )r   r   rl  rd  rr  r  s    r7   num_fdszProcess.num_fds  s0    2:!2BBTXBBBCCDDDr9   c                 P    t          |                                 d                   S )Nr  r  r  s    r7   r  zProcess.ppid  s!    4((**62333r9   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r   )r  r  r   puidsr   )re  _uids_rer  real	effectivesaveds         r7   uidszProcess.uids  X    %%''!)!1!1$!7!7!:i}SYYIE

CCCr9   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r   )r  r  r   pgidsr   )re  _gids_rer  r8  r9  r:  s         r7   gidszProcess.gids  r<  r9   rw  rZ  )>rG   rH   rI   r  r  rf  r  r  r  r  r   r  r  r  r  r  r   r  r  r  r  r   rx   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  r0  r  r3  r  r;  r@  rJ   r9   r7   r  r    s       ''CCCI. . ." " " 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r9   r  rA  )F)r  r  r;  enumro  r  r  r   r  r%  r]  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   r   r   __extra__all__rF  r<  dirr^  rx   r  rB  rC  r  rE  rD  r  r  getpagesizer   rv  	byteorderr  r  IntEnumr   	AF_PACKETrA   rB   rD   globalsry  __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  ra   rm   rw   r}   r  r~   r   r   r   r   r   r   r   r   r   	Exceptionr   r   r   r   r   r  r  r  r(  r/  r3  rJ  net_if_addrsrN  rP  r  r  r  r  
disk_usager  r  r  rL  rP  rk  rm  rw  rx  r{  r  r  r  rJ   r9   r7   <module>r_     s~	  
 % $             				 				    



  # # # # # # " " " " " "             # # # # # # ) ) ) ) ) )       $ $ $ $ $ $ $ $ $ $ $ $ ' ' ' ' ' ' ! ! ! ! ! ! " " " " " " " " " " " "                         $ $ $ $ $ $ " " " " " "       + + + + + +                   ( ( ( ( ( ( ' ' ' ' ' ' " " " " " " " " " " " "	 	 	 78Y FFCCIIFFF   .  < < < <=='J		'J'J'JKK wt%677 74!899  bj&&!:!##	)  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 B BJ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  ,  6w	D w	D w	D w	D w	D w	D w	D w	D w	D w	Ds   M N%NN