
    ɧdM                    d	   d Z ddlm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- dd l*m.Z. dd!l*m/Z/ dd"l*m0Z0 ej1        d#k    rddl2Z2ndZ2g d$Z3d%Z4ej5        6                    d& ej7                    z            Z8 e9ed'          Z: e9ed(          Z; e<            Z= ej>        d)          Z? ej@                    ZAdaBe+rd*nd+ZCejD        d,k    ZEd-ZFe2e
jG        ZHn( e2jI        d.d/ eJe
jG                  i          ZKeKjH        ZHe2	dZLdZMd0ZNd1ZOn5 G d2 d3e2jI                  ZP eQ            R                    ePjS                   ejT        ejU        ejV        ejW        ejX        ejY        ejZ        ejZ        ej[        ej\        ej]        ej^        d4Z_ej`        eja        ejb        ejc        ejd        eje        ejf        ejg        ejh        eji        ejj        d5Zk ed6g d7          Zl ed8g d9          Zm ed:g d;          Zn ed<d=          Zo ed>eojp        d?z             Zq ed@g dA          Zr edBdCdDs                    erjp                  z             Zt edEg dF          Zu edGg dH          ZvdI ZwdJ ZxdK Zye"dL             Zze=dMfdNZ{	  ezdO           n1# e|$ r)  ej}                       edPdQ          dRdRdR          a~Y nw xY wdZ	 ddSlmZ n1# e$ r) ddlZ ej        ddMT          Z e9edU          rd}dVZY nw xY we(e3                    dW  ee          D                        dX ZdY ZdZ Zd[ Zd\ Zd] Zd^ Zd_ Zd` Zej5        6                    da          sej5        6                    db          rdc Zndd Zej        Z G de dfe|          Z G dg dh          Z e            Zd~djZdk Zdl Zej        ZddnZ G do dp          ZddqZdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Z G d{ d|e<          ZdS )zLinux platform implementation.    )divisionN)defaultdict)
namedtuple   )_common)_psposix)_psutil_linux)_psutil_posix)NIC_DUPLEX_FULL)NIC_DUPLEX_HALF)NIC_DUPLEX_UNKNOWN)AccessDenied)NoSuchProcess)ZombieProcess)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)PY3)FileNotFoundError)PermissionError)ProcessLookupError)b)
basestring)      )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_supplyz/proc/%s/smapsproc_ioprio_getproc_cpu_affinity_get
SC_CLK_TCKi    littlei   AddressFamilyAF_LINK   r#   c                       e Zd ZdZdZdZdZdS )
IOPriorityr   r   r<   r#   N)__name__
__module____qualname__r&   r'   r(   r)        /lib/python3.11/site-packages/psutil/_pslinux.pyr>   r>   x   s&        rC   r>   )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)rs   rsssizer{   shared_cleanshared_dirtyprivate_cleanprivate_dirty
referenced	anonymousr|   	pmmap_extzaddr perms  pio)ri   rj   rk   rl   
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)
isinstancer"   osreadlinksplitendswithr   )rs   s    rD   r   r      s    dJ''-----;tD ::fa D }}\"" +=d+C+C DSDzKrC   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)rw   	modes_maprv   s      rD   file_flags_to_moder      sw     c2;RYEIUbkBK7")CDEDr{ )||Ca((<<d##DKrC   c                     |                      dd          } d}|rd| z  }nd| z  }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/%sz/sys/block/%s/device)r   r   accessF_OK)nameincluding_virtualrs   s      rD   is_storage_devicer      sO     <<S!!D -%%,9T27###rC   c                    t          d| z            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.
    %s/statr   N)r   nicer   idler   irqsoftirq   steal	   guest
   
guest_nice	scputimes)r   readliner   lenappendr   r   )procfs_pathfvaluesfieldsvlens        rD   set_scputimes_ntupler     s    
Y,	-	- *##%%abb)* * * * * * * * * * * * * * *KKKFv;;Dqy gqy grz $l###;//IIIs   /AAATc                 
   	 |rt          |           nt          |           5 }|                                                                cddd           S # 1 swxY w Y   dS # t          t
          f$ r |t          ur|cY S  w xY w)zReturn file content.
    fallback: the value returned in case the file does not exist or
              cannot be read
    binary: whether to open the file in binary or text mode.
    N)r   r   readstripIOErrorOSError_DEFAULT)fnamefallbackbinaryr   s       rD   catr     s    #)?[y/?/? 	$16688>>##	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$W   8# 	OOO	s4    A" &AA" AA" AA" "B B/procr   zuser system idle        )prlimit)	use_errnor   c                     G d dt           j                  } |            }|0t                              | |d t          j        |                    }ne |            }|d         |_        |d         |_        t                              | |t          j        |          t          j        |                    }|dk    r5t          j                    }t          |t          j
        |                    |j        |j        fS )Nc                   2    e Zd Zdej        fdej        fgZdS )prlimit.<locals>.StructRlimitrlim_currlim_maxN)r?   r@   rA   ctypes
c_longlong_fields_rB   rC   rD   StructRlimitr   K  s+        '):;'):;=rC   r   r   r   )r   	Structurelibcr   byrefr   r   	get_errnor   r   strerror)pid	resource_limitsr   currentretnewerrnos           rD   r   r   J  s   = = = = =v/ = = = #lnnG 	Nll3	4g9N9NOO #lnn%ay%ayllFL$5$5v|G7L7LN N ax 9(**eR[%7%7888$g&677rC   c                 d    g | ]-}|                     d           |                                +|.S )RLIM)
startswithisupper.0rL   s     rD   
<listcomp>r   c  s6    FFFqf!5!5F!))++FFFFrC   c                    | d         }||                      dd          z   }	 | d         }| d         }| d         }n# t          $ r |cY S w xY w	 t          dt                      z            }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 )a  Fallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable:" column, 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

    XXX: on recent kernels this calculation differs by ~1.5% than
    "MemAvailable:" as it's calculated slightly differently, see:
    https://gitlab.com/procps-ng/procps/issues/42
    https://github.com/famzah/linux-memavailable-procfs/issues/2
    It is still way more realistic than doing (free + cached) though.
       MemFree:   Cached:r   s   Active(file):s   Inactive(file):   SReclaimable:z%s/zoneinfos   lowr   Nr<   g       @)getKeyErrorr   r   r   r   r   intr   PAGESIZEmin)memsra   r   lru_active_filelru_inactive_fileslab_reclaimabler   watermark_lowlineavail	pagecaches              rD   calculate_avail_vmemr   k  s   . Ddhhz1---H/0 !34 01   (9(99::    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::s4   < A
AA. .A=<A=AC**C.1C.c                     g } i }t          dt                      z            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         }n# t          $ r t          |          }Y nw xY w|dk     rd}|                     d           ||k    r|}t          ||z
  |d          }| rJd	                    |           dt          |           dk    rdndd}t          j        |t                     t          ||||||
||||	|          S ) a  Report virtual memory stats.
    This implementation matches "free" and "vmstat -s" cmdline
    utility values and procps-ng-3.3.12 source was used as a reference
    (2016-09-18):
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c
    For reference, procps-ng-3.3.10 is the version available on Ubuntu
    16.04.

    Note about "available" memory: up until psutil 4.3 it was
    calculated as "avail = (free + buffers + cached)". Now
    "MemAvailable:" column (kernel 3.14) from /proc/meminfo is used as
    it's more accurate.
    That matches "available" column in newer versions of "free".
    
%s/meminfor      r   Ns	   MemTotal:r   s   Buffers:rd   r   r   re   s   Shmem:s
   MemShared:rf   s   Active:rb   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:rc   s   Slab:s   MemAvailable:r^   round_, z) memory stats couldn't be determined and waswerez	 set to 0)r   r   r   r   r   r   r   r   r   joinr   warningswarnRuntimeWarningr\   )missing_fieldsr   r   r   r   r]   ra   rd   re   rf   rb   rc   rg   r`   r   r_   msgs                    rD   virtual_memoryr    sR     ND	\O$5$55	6	6 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ax  t|+%& + + +$T**+ qy +k*** u} UU]U1===G  +IIn%%%%((A-9EE699; 	c>***wd7FFDB B B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 H21H2c                  D   i } t          dt                      z            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          d	t                      z            }|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}t          j
        |t                     dx}
}ddd           n# 1 swxY w Y   nG# t          $ r:}dt          |          z  }t          j
        |t                     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	%s/vmstats   pswpin    r$   s   pswpoutzK'sin' and 'sout' swap memory stats couldn't be determined and were set to 0zP'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (%s))r   r   r   r   r   cextlinux_sysinfor   r   r  r	  r
  r   strr   sswap)r   r   r   r   r]   ra   _unit_multiplierr`   r_   sinsoutr  errs                 rD   swap_memoryr    s   D	\O$5$55	6	6 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o&7&7788  	 	C$   ??9-- ?djj..q122Q6=CC__Z00 ?tzz$//233a7$>D t E
8c>222d%	 	 	 	 	 	 	 	 	 	 	 	 	 	 	    57:3xx@c>***dddddd4 =dGS$???sN   ;A))A-0A-5B /B87B8G 3B7F66F:=F:
H0HHc                  N   t                      } t          |            t          d| z            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 rB   floatCLOCK_TICKSr   s     rD   r   zcpu_times.<locals>.<listcomp>_  s#    555eAhh$555rC   )r   r   r   r   r   r   r   _fields)r   r   r   r   s       rD   	cpu_timesr   S  s     "##K%%%	Y,	-	- &##%%& & & & & & & & & & & & & & &Ac)+,,q001F55f555Ffs   'A##A'*A'c                     t                      } t          |            g }t          d| z            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 rB   r  r   s     rD   r   z!per_cpu_times.<locals>.<listcomp>q  s#    AAAQ%(([0AAArC   N)
r   r   r   r   r   r   r   r   r  r   )r   cpusr   r   r   r   entrys          rD   per_cpu_timesr%  c  s%    "##K%%%D	Y,	-	- 
	

 	# 	#Dv&& ##i&7"8"81"< <=AA&AAA!6*E"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   BCCCc                  N   	 t          j        d          S # t          $ r d} t          dt	                      z            5 }|D ].}|                                                    d          r| dz  } /	 ddd           n# 1 swxY w Y   | dk    rt          j        d          }t          dt	                      z            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   
%s/cpuinfos	   processorr   Nzcpu\dr   r   )r   sysconf
ValueErrorr   r   lowerr   recompiler   r   match)numr   r   searchs       rD   cpu_count_logicalr1  w  s   z/000   (9(99:: 	a  ::<<**<88 1HC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !8 	!Z))F9'8'8899 !Q ! !D::c??1-D||D)) !q!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !8 	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          dt                      z            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)r4  r3  s   	:r   )setglobr   addr   r   r   r   r+  r   r   r   r   sumr   )lsp1p2rs   r   resultmappingcurrent_infor   keyvalues              rD   cpu_count_coresrA    s3    
B 
EB	JB	".2 % % 	%!FF16688>>##$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%WWF{  GL	\O$5$55	6	6 3! 	3 	3D::<<%%''D 3$\2 L899   D! ??#ABB 3!%FA!6!6JC(+E

L%	33 3 3 3 3 3 3 3 3 3 3 3 3 3 3" !!""F>TsI   :BB	B	-E8DE8
D$!E8#D$$AE88E<?E<c                  2   t          dt                      z            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         rD   	cpu_statsrH    sX   	Y!2!22	3	3 q
 		 		Dw'' 7"4::<<?33)) 7 a11

,, 7"%djjll1o"6"6 O "               Hj/8= = =s   C
C55C9<C9c            
      H   g } t          dt                      z            5 }|D ]e}|                                                    d          r<|                     t          |                    dd          d                              f	 ddd           n# 1 swxY w Y   | S )z<Return current CPU frequency from cpuinfo if available.
    r(  s   cpu mhz   :r   N)r   r   r+  r   r   r  r   )r   r   r   s      rD   _cpu_get_cpuinfo_freqrK    s     C	\O$5$55	6	6 :! 	: 	:Dzz||&&z22 :

5D!!4!4Q!788999	:: : : : : : : : : : : : : : : Js   A)BBB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 ]\  }}t          |          t          |           k    r	| |         }nt           ||d          d          }|,t           ||d          d          }|t          d	          t          |          d
z  }t          t           ||d                              d
z  }t          t           ||d                              d
z  }|                    t          j        |||                     |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,  r0  group)rL   s    rD   <lambda>zcpu_freq.<locals>.<lambda>  s&    RYy!%<%<%B%B%D%D!E!E rC   )r?  scaling_cur_freqNr   cpuinfo_cur_freqz!can't find current frequency filei  scaling_max_freqscaling_min_freq)rK  r6  sortr   rs   r  	enumerater   r   NotImplementedErrorr   r   r   scpufreq)	cpuinfo_freqspathsr   pjoinirs   currmax_min_s	            rD   cpu_freqr`    s   
 .//IDEE CIABB 	 	

EE
FFF '' 	; 	;GAt5zzS/// K %Q'55'9::TJJJ = 55'9::TJJJ =-;= = =t99t#Ds55'9::;;<<tCDs55'9::;;<<tCDJJw'dD99::::
rC   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   rX  r   s     rD   r   zcpu_freq.<locals>.<listcomp>  s'    MMM B++MMMrC   )rK  rB   rC   rD   r`  r`    s      NM5J5L5LMMMMrC   c                       e Zd ZdS )_Ipv6UnsupportedErrorN)r?   r@   rA   rB   rC   rD   rd  rd    s        DrC   rd  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 )Connectionsaw  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)allrh  tcp4ri  rj  udp4rk  rl  inetinet4inet6)socketAF_INETSOCK_STREAMAF_INET6
SOCK_DGRAMAF_UNIXtmap_procfs_path)selfrn  ri  ro  rk  rl  s         rD   __init__zConnections.__init__   s     v~v'9:);<v~v'89):;-$dD1$<GG$<GGG4t,D\D\
 
	 !rC   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   r8   )r   listr   listdirrz  r   r   r   r   r   r    r   r   EINVALENAMETOOLONGr   )r{  r   inodesrt   inoder  s         rD   get_proc_inodeszConnections.get_proc_inodes7  s@   T""*4+<+<+<cccBCC 	9 	9B9 $2C2C2CSSS""!MNN  ##J// 9!!""IcrcNE5M((#s2ww888% &'9:       9, HHHH9 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updater  r   r    r   )r{  r  r   s      rD   get_all_inodeszConnections.get_all_inodesQ  ss    66 	 	C
d223778888%'9?K     s   (=AAc           
      (   |                      d          \  }}t          |d          }|sdS t          r|                    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            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
        :   rB   asciiNr8   z>4Iz<4I)r   r   r   encoders  rt  LITTLE_ENDIAN	inet_ntopbase64	b16decoderv  structpackunpackr*  r   rd  r   addr)r  familyipports       rD   decode_addresszConnections.decode_addressa  s   " ::c??D4}}  	2 	$7##BV^# 	 D%ff.>r.B.B44R4.HII%ff.>r.B.BCC!"%%B  G)EEFM%,D,DEEEG GBB  )EEFM%,D,DEEEG GB    $ // |B%%%s   BE !E<Nc              #   
  K   |                      d          r!t          j                            |           sdS t	          | t
                    5 }|                                 t          |d          D ]\  }}	 |                                dd         \
  }}	}
}}}}}}}n&# t          $ r t          d| d|d|          w xY w||v r||         d	         \  }}nd
\  }}|||k    rx|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.6N	bufferingr   r   error while parsing ; malformed line r   r   Nr8   )r   r   rs   existsr   BIGFILE_BUFFERINGr   rV  r   r*  RuntimeErrorrs  ru  TCP_STATUSESr   	CONN_NONErf  r  rd  )filer  type_r  
filter_pidr   linenor   r  laddrraddrstatusr  r   rt   s                  rD   process_inetzConnections.process_inet  sA      == 	bgnnT&:&: 	Ft'8999  	IQJJLLL )!Q I I1

SbS) BAueVQ1aEE! 1 1 1&, DD&&&$$01 1 11 F? 	' %UmA.GC&GC IjC.? I 22 3!-f!5!(!2! + : :5& I I + : :5& I I0 ! ! ! !vueUFCHHHHH=I 	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	IsO   *E8:'B"!E8"#CAE86EE8
EE8EE88E<?E<c           
   #   0  K   t          | t                    5 }|                                 |D ]}|                                }	 |dd         \  }}}}}}}	n)# t          $ r d|vrY :t          d| d|          w xY w|	|v r	||	         }
ndg}
|
D ]f\  }}|||k    rt          |          d	k    r	|d
         }nd}t          j        t          |                    }d}t          j
        }|||||||fV  g	 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  r  Nr   r8    )r   r  r   r   r*  r  r   r   socktype_to_enumr   r  )r  r  r  r  r   r   tokensr  r  r  pairsr   rt   rs   r  r  s                   rD   process_unixzConnections.process_unix  s      t'8999 !	LQJJLLL L L)281+/Aq!Qq%%! ) ) )$ ! &, DD$$() ) )	) F? ) #5MEE'LE$ L LGC! L*2C L v;;!+ &#)":DD#%D ' 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B (D*B  A=DDDc                    || j         vr7t          d|dd                    d | j         D                                 t                      | _        ||                     |          }|sg S n|                                 }t                      }| j         |         D ]\  }}}| j        d|}|t          j	        t          j
        fv r|                     |||||          }	n|                     ||||          }	|	D ]U\  }
}}}}}}|rt          j        |
|||||          }nt          j        |
||||||          }|                    |           Vt#          |          S )Nzinvalid z kind argument; choose between r  c                 ,    g | ]}t          |          S rB   )reprr   s     rD   r   z(Connections.retrieve.<locals>.<listcomp>  s    0L0L0LQa0L0L0LrC   z/net/)r  )ry  r*  r  r   rz  r  r  r5  rs  rt  rv  r  r  r   pconnsconnr7  r  )r{  kindr   r  r   
proto_namer  r  rs   r9  rt   r  r  r  	bound_pidconns                   rD   retrievezConnections.retrieve  s   ty  	P* $dii0L0L$)0L0L0L&M&M&MO P P P+-- 	+))#..F 	 ((**Fee)-4 	 	%J"&"3"3"3ZZ@D&.&/:: :&&&%C ' A A &&&&S ' : :FH  BFE5% <"=VUE5)/1 1DD #=VUE5)/< <D CyyrC   r  )r?   r@   rA   __doc__r|  r  r  staticmethodr  r  r  r  rB   rC   rD   rf  rf    s        	 	! ! !.  4    0& 0& \0&d %I %I %I \%IN #L #L #L \#LJ     rC   rf  rp  c                 6    t                               |           S )z$Return system-wide open connections.)_connectionsr  )r  s    rD   net_connectionsr    s      &&&rC   c                     t          dt                      z            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
%s/net/devNr<   r  r   r   )	r   r   	readlinesrfindr  r   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                          rD   net_io_countersr  
  so    
</"3"33	4	4               Gabb	 9 9

3qy$$$t**$$$FUF|!!##eaijj!''))//11& c6**!																#Z|9Ns   A  AAc                     t           j        t          t           j        t          t           j        t          i} t                                                      }i }|D ]}	 t          j
        |          }t          j        |          }t          j        |          \  }}t          j        || |         ||          ||<   c# 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).N)r  DUPLEX_FULLr   DUPLEX_HALFr   DUPLEX_UNKNOWNr   r  keys
cext_posix
net_if_mtunet_if_is_runningnet_if_duplex_speedr   	snicstatsr   r   ENODEVr   )	
duplex_mapnamesr   r   mtuisupduplexspeedr  s	            rD   net_if_statsr  /  s    "O"O%'9;J ""$$E
C P P	P'--C/55D 4T::MFE  )$
60BE3OOCII  	 	 	yEL( c







	 Js   ?B==
C6%C11C6Fc                    d }d }t           j                            dt                      z            r |            }nHt           j                            d          r |            }nt	          dt                      z            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          dt                      z            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                   \  }}}}	}
}}}}}}nM|dk    r5|d         }t          t
          |dd                    \  }}}
}d	x}	x}x}x}}nt          d
|z            |||
|||	||||f
V  d S )N%s/diskstats   r#   r<   r$         r  r   z!not sure how to interpret line %r)r   r   r  r   r   r   r  r*  )r   r  r   r   flenr   readsreads_mergedrbytesrtimewriteswrites_mergedwbyteswtimer  rq   s                   rD   read_procfsz%disk_io_counters.<locals>.read_procfsR  s     " ~(9(99:: 	"aKKMME	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	; 	;DZZ\\Fv;;Drz MayF1I69#vad|6L6L4vufmE1i Mtrz May69#vad|6L6L4feV]E1i May03C0D0D-vvvKLLLLL}yy !Dt!KLLL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   r  walkrs   r  r   r   r   r   basenamer  r   )blockrootr  filesr   r   r   r  r  r  r  r  r  r  r  rq   s                   rD   
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''--36sF3B3K3H3H1feV]E1iUFFFElM9F F F F F	F
	F 
	Fs   9C		CCr  r  zC%s/diskstats nor /sys/block filesystem are available on this system)r   rs   r  r   rW  r   DISK_SECTOR_SIZE)perdiskr   r	  genr  r$  r   r  r  r  r  r  r  r  r  rq   s                   rD   disk_io_countersr  N  s-   ); ); );VF F F 
w~~n'8'8899 *kmm		%	% *jll!&(()* * 	* G A A(-	&ufffeUL9 	066 	 """"u%}iA NrC   c                   8    e Zd ZdZddgZd Zd Zd Zd Zd Z	d	S )
RootFsDeviceFinderaE  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     rD   r|  zRootFsDeviceFinder.__init__  s4    gcll!Xc]]
Xc]]


rC   c                 .   t          dt                      z            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|z  c cd d d            S 	 d d d            d S # 1 swxY w Y   d S )Nz%s/partitionsr<   r$   r   r   r#   /dev/%s)	r   r   r  r   r   isdigitr   r  r  )r{  r   r   r   r  r  r   s          rD   ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions  sx   ):)::;; 
	0qabb) 	0 	0v;;? *0)*;*;*=*=GF1I4*0)*;*;*=*=GF1I4ayDJ& 05DJ+> 0 0(4///
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0	0
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0 
	0s   CD
;D

DDc                 6   d| j         d| j        d}t          |          5 }|D ]Y}|                    d          rB|                                                    d          d         }|rd|z  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=r<   r  )r  r  r   r   r   
rpartition)r{  rs   r   r   r   s        rD   ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block  s    04


DJJJGt__ 	0 0 0??:.. 0::<<22:>>qAD 0(4///	0 	0 	0 	0 	0 	0 	0 	00	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   AB?BBBc                    | j         d| j        }t          j        d          }|D ]}	 t	          |          }|5  |                                                                }||k    rOt          j        	                    t          j        
                    |                    }d|z  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  r6  iglobr   r   r   r   rs   r  dirnamer   )r{  needler  r  r   datar   s          rD   ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block  sT    JJJ

3
344 
	0 
	0D	0dOO  0 06688>>++Dv~ 0!w//0E0EFF(4/	0 0 0 0 0 0 0 0 0 000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 %   
	0 
	0s#   CA-CC		C		
CCc                    d }|C	 |                                  }n-# t          t          f$ r}t          |           Y d }~nd }~ww xY w|C	 |                                 }n-# t          t          f$ r}t          |           Y d }~nd }~ww xY w|C	 |                                 }n-# t          t          f$ r}t          |           Y d }~nd }~ww xY w|!t          j                            |          r|S d S d S r  )	r  r   r   r   r  r"  r   rs   r  )r{  rs   r  s      rD   findzRootFsDeviceFinder.find  sJ    	//11W%   c







 	--//W%   c







 	//11W%   c







  	t 4 4 	K	 	 	 	sD    AA  AA   B
1BB
B% %C6C

CN)
r?   r@   rA   r  	__slots__r|  r  r  r"  r$  rB   rC   rD   r  r    su          '"I# # #
0 0 00 0 00 0 0    rC   r  c           	         t                      }t                      }t          d|z            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	|z            }g }t          j        |          }|D ]v}	|	\  }
}}}|
d
k    rd}
|
dv r"t                                                      p|
}
| s|
dk    s||vrDdx}}t          j        |
|||||          }|                    |           w|S )z8Return mounted disk partitions as a list of namedtuples.z%s/filesystemsnodev	r   zfsNr   z	/etc/mtabz%s/self/mountsnoner  )z	/dev/rootrootfs)r5  r   r   r   r   r7  r   r   rs   isfilerealpathr  disk_partitionsr  r$  r   	sdiskpartr   )rm  fstypesr   r   r   fstypemounts_pathretlist
partitions	partitiondevice
mountpointoptsmaxfilemaxpathntuples                   rD   r.  r.    s1   eeG!##K	#k1	2	2 	'a 	' 	'D::<<D??7++ 'DJJLL)))) D))!,U? 'KK&&&	'	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' g G"'.."="= Gg&&{33g&&'7+'EFFG%k22J  	+4(
FDV 	F,, 	;'))..00:FF 	| vW4   '"6:vt#*G5 5vNs   BC		CCc            	         t          j        t                    } t          j        d          }|                    t          j        d                     t          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          |d
          }	n# t"          t$          t&          f$ r Y w xY wt          |dz   d          }
t          |dz   d          }t          |dz   d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           B|s*t          j        d          }t          t          |                    }|D ]}	 t          j                            |d          }t          t          |                    dz  }t          j                            |d          }t          |d
          }	n3# t"          t$          t&          f$ r}t)          |           Y d}~d}~ww xY wt          j        |dz             }t          d |D                       }d}d}
|D ]}t          j                            ||dz             }t          |d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    g | ]}|                     d           d         S r  r   r   r   s     rD   r   z(sensors_temperatures.<locals>.<listcomp>7  &    ???AGGCLLO???rC   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/_inputg     @@r   Fr   _maxNrQ  _crit_labelr  r   r   z /sys/class/thermal/thermal_zone*temptypez/trip_point*c                     g | ]O}d                      t          j                            |                              d           dd                   PS )r  r   r#   )r  r   rs   r  r   )r   ps     rD   r   z(sensors_temperatures.<locals>.<listcomp>w  sf     J J J9:  #xx  ##))#..qs3 5  5 J J JrC   _typecritical_temphigh)collectionsr   r  r6  extendsortedr5  r,  r-  subr   r  r   r   rs   r  r  r   r   r*  r   dict)r   	basenames
basenames2replr   altnamebasers   r   	unit_namerN  rL  labelr  
trip_pathstrip_points
trip_point	trip_types                     rD   sensors_temperaturesr_  $  s    
!$
'
'C	;<<I TYGHHIIIs??Y???@@AAI ?A AJ:?@@D # #((.55)# 	#T"""  @  @	(?DCII&&/G7<< 5 5v>>DD///II*- 		 		 		 H		 4&=4000tg~555D8Ob??? 	T{{V+    	   ??V3        	IugtX>????  (AI@AA	3y>>**	 $	A $	ADw||D&11D		**V3w||D&11U333		Wj1   c


 4.#899J J J>HJ J J K KKHD) ( (
w||D*w*>??r%@@@	
* ."27<<j76J#K#K,0 2  2  2HH&( .rw||D*w2FGG(,. . .D  $$$T{{V3% $ $ $#$ ((#(??V#;% ( ( (#'(( 	N!!2wh"?@@@@99st   A2EE*)E*-G  GGG((G76G7A0KK5K00K5O,,O;:O;PP#"P#c                     t          j        t                    } t          j        d          }|st          j        d          }t	          t          d |D                                 }|D ]}	 t          t          |dz                       }n-# t          t          f$ r}t          |           Y d}~Hd}~ww xY wt          t          j                            t          j                            |          d          d          }t          |d	z   d
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    g | ]}|                     d           d         S r>  r?  r   s     rD   r   z sensors_fans.<locals>.<listcomp>  r@  rC   rA  Nr   FrB  rE  r  rF  )rO  r   r  r6  rQ  r5  r   r   r   r   r   r   rs   r  r  r   r   sfanrS  )r   rT  rX  r   r  rY  rZ  s          rD   sensors_fansrc    sP    
!$
'
'C	:;;I G IEFF	s??Y???@@AAI 	< 	<	#dXo..//GG! 	 	 	#JJJHHHH	 RW__T%:%:FCC$& & &	D8Ob???Igl5'::;;;;99s   /BB9 B44B9c                  F   t                      fd} d t          j        t                    D             }|sdS t          j                            t          t          |          d                   } | |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    }n6t          |dz   d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 ]?}t          |          }|k    r&	 t          |          c S # t          $ r |cY c S w xY w@dS )zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        rQ  N)r   r   r*  )rZ  rs   r   nulls      rD   	multi_catz"sensors_battery.<locals>.multi_cat  sz      	 	DdT***Cd{ s88OOO!   JJJJJ
 ts   /A A c                 h    g | ]/}|                     d           sd|                                v -|0S )BATbattery)r   r+  r   s     rD   r   z#sensors_battery.<locals>.<listcomp>  sL     $ $ $!U8K8K $"$A $ $ $rC   Nr   z/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r   z	/capacityr8   rQ  z
AC0/onlinez	AC/onliner   /statusr  FrF  discharging)chargingfullTi  <   )objectr   r  POWER_SUPPLY_PATHrs   r  rQ  ZeroDivisionErrorr   r   r+  r   POWER_TIME_UNLIMITEDPOWER_TIME_UNKNOWNsbattery)rg  batsr  
energy_now	power_nowenergy_fulltime_to_emptyr_   power_pluggedonliner  secsleftrf  s               @rD   sensors_batteryr~    s    88D    $ $rz"344 $ $ $D t 7<<)6$<<?;;D }} J 	|~ I )~~ K Id%99::M  : 	j(;6GG  	 	 	GGG	 c$,r:::;;b= 	4
 MY
&55
&446 6F  !!TI%5AAAGGII]" 	!!MM++ 	! M  ./	 
.I 
.	2:	1D899HH  	2 	2 	21HHH	2	 .}r)**a< 	21H-GX}===s$   =C CC(F> >GGc                      g } t          j                    }|D ]C}|\  }}}}}}|s|dv rd}t          j        ||pd|||          }	|                     |	           D| S )z:Return currently connected users as a list of namedtuples.)z:0.0z:0	localhostN)r  usersr   suserr   )
r3  rawlistitemr   ttyhostnametstampuser_processr   nts
             rD   r  r    s    GjllG 
 
9=6c8V\3  	~% 	#"H]4hDDrNrC   c                  L   dt                      z  } t          |           5 }|D ]b}|                    d          rKt          |                                                                d                   }|a|c cddd           S ct          d| z            # 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 %s)r   r   r   r  r   r   	BOOT_TIMEr  )rs   r   r   r   s       rD   	boot_timer  (  s     (((D	T		 3a 	 	Dx(( DJJLL..00344	

3 3 3 3 3 3 3 3 *T13 3 	33 3 3 3 3 3 3 3 3 3s   ABBB Bc                  p    d t          j        t          t                                          D             S )z7Returns a list of PIDs currently running on the system.c                 T    g | ]%}|                                 t          |          &S rB   )r  r   r   s     rD   r   zpids.<locals>.<listcomp>=  s+    LLLq		LCFFLLLrC   )r   r  r!   r   rB   rC   rD   r  r  ;  s.    LLBJq):):';';<<LLLLrC   c                    t          j        |           sdS 	 t                      d| d}t          |          5 }|D ]R}|                    d          r;t          |                                d                   }|| k    c cddd           S St          d|z            # 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   rk  s   Tgid:r   Nz'Tgid' line not found in %s)
r   
pid_existsr   r   r   r   r   r*  EnvironmentErrorr  )r   rs   r   r   tgids        rD   r  r  @  s[    s## !u	! &5%6%6%6%6<DT"" Ga + +Dx00 +"4::<<?33  $s{**G G G G G G G G+
 !!>!EFFFG G G G G G G G G G !*- 	! 	! 	!$&&=   	!s;   #B0 AB#B0 B##B''B0 *B'+B0 0!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   /statN   )r<   r   )	r   r  r   r   r  r   r   r   r    )r   r   r   r   r!  rpardsetppids           rD   ppid_mapr  `  s!    C!##Kvv  	[[[###>??  1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 IOError exceptions
    into NoSuchProcess and AccessDenied.
    c                 X   	  | g|R i |S # t           $ r t          | j        | j                  t          $ r t          | j        | j                  t          $ rJ t          j        	                    | j
        d| j                  st          | j        | j                   w xY wr  )r   r   r   _namer    r   r   r   rs   r  rz  )r{  argskwargsfuns      rD   wrapperz wrap_exceptions.<locals>.wrapperz  s    	3t-d---f--- 	5 	5 	5tx444! 	6 	6 	6$*555  	 	 	7>>T->->->"IJJ :#DHdj999 	s
    BB))	functoolswraps)r  r  s   ` rD   wrap_exceptionsr  v  s:     _S     NrC   c                      e Zd ZdZg 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d Zed             Zed             Zed             Zej                            d ej                    z            red             Zed             Zed             Zed5d            Zed             Zed             Zer:e ej        d           ej        d           ej        d          f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'             Z+e,red(             Z-ed)             Z.e/ed5d*            Z0ed+             Z1ed,             Z2ed6d.            Z3ed/             Z4ed0             Z5e ej        d1          fd2            Z6e ej        d3          fd4            Z7dS )7ProcesszLinux process implementation.)r   r  _ppidrz  _cachec                 V    || _         d | _        d | _        t                      | _        d S r  )r   r  r  r   rz  )r{  r   s     rD   r|  zProcess.__init__  s+    

+--rC   c                 L    t          j        | j        d| j                   dS )z+Raise NSP if the process disappeared on us.r   N)r   r  rz  r   r{  s    rD   _assert_alivezProcess._assert_alive  s,     	4,,,dhh788888rC   c                 .   t          | j        d| j        d          5 }|                                }ddd           n# 1 swxY w Y   |                    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<   |S )aZ  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 substract 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  Nr     (r   r<   r   r   r  r  r$   ttynr   utime   stime   children_utimer  children_stime   create_time$   cpu_num'   blkio_ticks)r   rz  r   r   r  r$  r   )r{  r   r!  r  r   r   r   s          rD   _parse_stat_filezProcess._parse_stat_file  sn    ):):):DHHHEFF 	!6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 zz$DIIdOOa',-dQhii&&((Fq	HQiFayGbzGbzG &r
 &r
#BZMI#BZM
   AAA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   rk  N)r   rz  r   r   r{  r   s     rD   _read_status_filezProcess._read_status_file  s     4+<+<+<dhhhGHH 	A6688	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAc                     t          | j        d| j        dt                    5 }|                                                                cd d d            S # 1 swxY w Y   d S )Nr   z/smapsr  )r   rz  r   r  r   r   r  s     rD   _read_smaps_filezProcess._read_smaps_file  s     $*;*;*;TXXXF#46 6 6 	$9:6688>>##	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   &AA!Ac                     | j                             |            | j                            |            | j                            |            d S r  )r  cache_activater  r  r  s    rD   oneshot_enterzProcess.oneshot_enter  sM    ,,T222--d333,,T22222rC   c                     | j                             |            | j                            |            | j                            |            d S r  )r  cache_deactivater  r  r  s    rD   oneshot_exitzProcess.oneshot_exit  sM    ..t444//555..t44444rC   c                 f    |                                  d         }t          rt          |          }|S )Nr   )r  r   r   )r{  r   s     rD   r   zProcess.name  s0    $$&&v. 	 $<<DrC   c                    	 t          | j        d| j        d          S # t          t          f$ r t
          j                            | j        d| j                  rY dS t          | j                  st          | j        | j
                  t          | j        | j
        | j                  t          $ r t          | j        | j
                  w xY w)Nr   z/exer  )r   rz  r   r   r    r   rs   lexistsr  r   r  r   r  r   r   r  s    rD   exezProcess.exe  s    	54+<+<+<dhhhGHHH!#56 
	J 
	J 
	J w$*;*;*;TXXFGG Jrr!$(++ J'$*==='$*djIII 	5 	5 	5tx444	5s   ! ?C#A2C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   r8   r   )r   rz  r   r   r   r   r   )r{  r   r!  sepcmdlines        rD   r  zProcess.cmdline  s   $*;*;*;TXXXFGG 	16688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	I f--6ff3== 	9D**S// &= 	&S\\Q. 	&3$; 	&jjooGr  c                     t          | j        d| j        d          5 }|                                }d d d            n# 1 swxY w Y   t	          |          S )Nr   z/environ)r   rz  r   r   r   )r{  r   r!  s      rD   environzProcess.environ  s    $*;*;*;TXXXFGG 	1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_nrry  s      rD   terminalzProcess.terminal  s_    T**,,W566(**	< 	 	 	44	s   A 
AAz/proc/%s/ioc           	          | j         d| j        d}i }t          |          5 }|D ]T}|                                }|r<	 |                    d          \  }}t          |          ||<   D# t          $ r Y Pw xY wU	 d d d            n# 1 swxY w Y   |st          d|z            	 t          |d         |d         |d         |d         |d	         |d
                   S # t          $ r"}t          |d         d|d|          d }~ww xY w)Nr   z/ios   : z%s file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharr   z field was not found in z; found fields are )
rz  r   r   r   r   r   r*  r  r   r   )r{  r   r   r   r   r   r@  r  s           rD   io_counterszProcess.io_counters  s   "&"3"3"3TXXX>E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  @"#6#>???E8$8$=)>*8$8$    E E E -0VVVUUUFF"D E E EEsM   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          rD   r   zProcess.cpu_times<  s    &&((fWo&&4fWo&&4v&6788;Fv&6788;Fvm,--;~~vNNNrC   c                 P    t          |                                 d                   S )zWhat CPU the process is on.r  r   r  r  s    rD   r  zProcess.cpu_numF  s#     4((**95666rC   Nc                 B    t          j        | j        || j                  S r  )r   wait_pidr   r  )r{  timeouts     rD   waitzProcess.waitK  s     7DJ???rC   c                     t          |                                 d                   }t          pt                      }|t          z  |z   S )Nr  )r  r  r  r  r  )r{  ctimebts      rD   r  zProcess.create_timeO  s@    d++--m<== %)++#r))rC   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                 <    g | ]}t          |          t          z  S rB   )r   r   r   s     rD   r   z'Process.memory_info.<locals>.<listcomp>i  s#    EEEqQ("EEErC   r  )r   rz  r   r   r   rx   )	r{  r   vmsr~   rf   textlibr!  dirtys	            rD   memory_infozProcess.memory_infoZ  s     $*;*;*;TXXXFGG 	F1EEAJJLL,>,>,@,@!,DEEE 5CfdCu	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F CfdCu===s   AA--A14A1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  }t          ||||fz    S )Nr  )r  r  r8  r  r   findallry   )	r{  _private_re_pss_re_swap_re	basic_mem
smaps_datarz   r{   r|   s	            rD   memory_full_infozProcess.memory_full_infop  s     ((**I ..00J c#{22:>>??@@4GCc#wz::;;<<tCCs3 0 0 < <==>>EDY#sD)99::rC   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}nXt          rt          |          }|                                }|                    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 )aP  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: http://goo.gl/fmebo

            /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
          $ r0 |d                             d          rY t          d|z            w xY w|                                |fV  d S )N   r   rJ  r   r  s   VmFlags:z#don't know how to interpret line %r)r   r   popr   r   r*  r   )r  current_blockr!  r   r   s        rD   
get_blocksz'Process.memory_maps.<locals>.get_blocks  s*     ! I ID!ZZa00F!!9--d33 I,0022D9999%,,T2222I.1&)nnt.CDOO) I I I%ay33K@@ I (&0 2ACG2H 'I 'I !II %((**D111111s   )!B%C2C   
r   Nr  r  z[anon]r   r   s   Rss:s   Size:s   Pss:s   Shared_Clean:s   Shared_Dirty:s   Private_Clean:s   Private_Dirty:s   Referenced:s
   Anonymous:s   Swap:)r  r   r  r*  r   r   r   r   r   r   r   )r{  r  r!  r  r9  
first_liner  headerhfieldsr  permsoffsetr  r  rs   s                  rD   memory_mapszProcess.memory_maps  s+   2 2 2( ((**D 	JJu%%EB1J'LM *
5- @ @   ,,tQ//'<C9D%eTT! ' ' '2$ :D%eTTT'  *#DD ,%d||::<<Dl33 *.t44*#DSDz		4LL&--HHWa((HHXq))HHWa((HH-q11HH-q11HH.22HH.22HH^Q//HH]A..HHXq))     Is   4	A>>BBc                    	 t          | j        d| j        d          S # t          t          f$ rO t          | j                  st          | j        | j                  t          | j        | j        | j	                  w xY w)Nr   z/cwd)
r   rz  r   r   r    r  r   r  r   r  r  s    rD   cwdzProcess.cwd  s    	F4+<+<+<dhhhGHHH!#56 	F 	F 	Fdh'' F#DHdj999#DHdj$*EEE	Fs
   ! A Bs   ctxt_switches:\t(\d+)c                    |                                  }|                    |          }|s t          d| j        d| j        d          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  rW  rz  r   r   pctxswr   )r{  	_ctxsw_rer!  ctxsws       rD   num_ctx_switcheszProcess.num_ctx_switches  s     %%''!!$'' 	@%% %%%txxx12 2 2 >#eAh--U1X???rC   s   Threads:\t(\d+)c                 z    |                                  }t          |                    |          d                   S Nr   )r  r   r  )r{  _num_threads_rer!  s      rD   num_threadszProcess.num_threads  s6    
 %%''?**4003444rC   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          $ r d}Y uw 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  r<   r  r  r  )r   r  rz  r   rU  r   r   r   r   r$  r   r  r  r   pthreadr   r   r  )r{  
thread_idsr3  
hit_enoent	thread_idr   r   str   r  r  r;  s               rD   threadszProcess.threads  s   Z0A0A0A4888 LMM

# 	# 	#I!!!4888YYY8E '' *1))B* * * * * * * * * * * * * * *$    "
	 BGGDMMA%&&'BXXd^^F&*%%3E&*%%3E_S^^UEBBFNN6"""" 	!   s6   B&''BB&B	B&!B	"B&&B54B5c                 4    t          j        | j                  S r  )r  getpriorityr   r  s    rD   nice_getzProcess.nice_get  s     %dh///rC   c                 6    t          j        | j        |          S r  )r  setpriorityr   )r{  r@  s     rD   nice_setzProcess.nice_set  s    %dh666rC   c                 4    t          j        | j                  S r  )r  r6   r   r  s    rD   cpu_affinity_getzProcess.cpu_affinity_get"  s    -dh777rC   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  r  ranger   r   r%  )r{  _rer!  r.  s       rD   _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8rC   c           	         	 t          j        | j        |           d S # t          t          f$ r}t          |t                    s|j        t          j        k    r|                                 }t          t          t          t                                                    }|D ]4}||vrt	          d|d|          ||vrt	          d|d|          5 d }~ww xY w)Nzinvalid CPU number z; choose between zCPU number z! is not eligible; choose between )r  proc_cpu_affinity_setr   r   r*  r   r   r  r  tupler  r   r%  )r{  r#  r  eligible_cpusall_cpuscpus         rD   cpu_affinity_setzProcess.cpu_affinity_set0  s!   *48T:::::Z(   c:.. E#)u|2K E$($;$;$=$=M$U3}+?+?%@%@AAH# E Eh. 9",*$'CC!8#9 #9 9 m3 E",*03]]!D#E #E EE s    CB+CCc                     t          j        | j                  \  }}t          t	          |          }t          j        ||          S r  )r  r5   r   enumr>   r   pionicer{  ioclassr@  s      rD   
ionice_getzProcess.ionice_getF  s?    !1$(;;NGU .$W--?7E222rC   c                     |d}|r"|t           t          fv rt          d|z            |dk     s|dk    rt          d          t          j        | j        ||          S )Nr   z%r ioclass accepts no valuer  zvalue not in 0-7 range)r)   r&   r*  r  proc_ioprio_setr   r&  s      rD   
ionice_setzProcess.ionice_setM  s}      J%68I$JJ J !>!HIIIqy ;EAI ; !9:::''5AAArC   c                    | j         dk    rt          d          	 |t          | j         |          S t          |          dk    rt          dt	          |          z            t          | j         ||           d S # t
          $ rO}|j        t          j        k    r4t          | j                   r t          | j         | j
        | j                   d }~ww xY w)Nr   z)can't use prlimit() against PID 0 processr<   z4second argument must be a (soft, hard) tuple, got %s)r   r*  r   r   r  r   r   ENOSYSr  r   r  r  )r{  r   r   r  s       rD   rlimitzProcess.rlimitY  s    
 x1} N !LMMM 	9"48Y777 6{{a' 5(%'+F||45 5 5 DHi88888   9, DH1E1E  ($*djIIIs   A= AA= =
CA
CCc                     |                                  d         }t          r|                                }t                              |d          S )Nr  ?)r  r   r   PROC_STATUSESr   )r{  letters     rD   r  zProcess.statuss  sC    &&((2 	%]]__F  ---rC   c                 (   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          $ r d}Y ^w xY wd# t          t          f$ r d}Y zt           $ 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   r~  Fr  z/fdinfo/r   r   T)r   r  rz  r   r   r   r   r   r   r   r   r   rr   r   r   r    r   r   r  r  r   r  )r{  r3  r  r  rt   r  rs   r   posrw   rv   r;  r  s                rD   
open_fileszProcess.open_files{  s   
):):):DHHHEFF
 &	/ &	/B$($5$5$5txxxDD$/~~& ??3'' /M$,?,? / )))4888RR9D/(.. 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"B "Bv.... - * * * &*


*5 &'9:   !
   9, HHHH9 22 #JJJHHHH>  	!   sa   FE:A4DE:D 	 E:#D 	$E::F
	F
G9%	G9.G4	$G43G44G9rp  c                 n    t                               || j                  }|                                  |S r  )r  r  r   r  )r{  r  r   s      rD   connectionszProcess.connections  s0    ##D$(33
rC   c                 d    t          t          j        | j        d| j        d                    S )Nr   r~  )r   r   r  rz  r   r  s    rD   num_fdszProcess.num_fds  s.    2:D,=,=,=txxxHIIJJJrC   c                 P    t          |                                 d                   S )Nr  r  r  s    rD   r  zProcess.ppid  s!    4((**62333rC   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         rD   uidszProcess.uids  X    %%''!)!1!1$!7!7!:i}SYYIE

CCCrC   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                     |                                  }|                    |          d         \  }}}t          j        t	          |          t	          |          t	          |                    S r  )r  r  r   pgidsr   )r{  _gids_rer!  r>  r?  r@  s         rD   gidszProcess.gids  rB  rC   r  rp  )8r?   r@   rA   r  r%  r|  r  r  r   r  r  r  r  r  r   r  r  r  r  r   rs   r  getpidr  r   r  r  r  r  	HAS_SMAPSr,  r-  r  r  r  r  r  r  r  r  HAS_CPU_AFFINITYr  r  r"  HAS_PROC_IO_PRIORITYr(  r+  r   r.  r  r5  r7  r9  r  rA  rF  rB   rC   rD   r  r    sL       ''CCCI. . .9 9 9    _B    _ $ $  _$
3 3 3
5 5 5
   _5 5 5"   _0 ) ) _)
   _ 
w~~mibikk122 E		E 	E 
	E< O O _O 7 7 _7 @ @ @ _@ * * _* > > _>&  '	 'BJ'?@@"
#677#$899	; 	; 	; 
	; 	;8 ' D	A	 A	 
A	F F F _F #-2:.G#H#H@ @ @ _@ *4"*5H*I*I 5 5 5 _5   _6 0 0 _0 7 7 _7  !		8 	8 
	8 %"*%HII	9 	9 	9 	9 
	 	 
	&  B		3 	3 
	3 
	B 	B 
	B  		 	 	 
	2 . . _. - - _-^    _
 K K _K 4 4 _4 &BJ'DEE D D D _D
 &BJ'DEE D D D _D D DrC   r  r  rG  )F)r  
__future__r   r  rO  r   r  r6  r   r,  rs  r  sys	tracebackr  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   _compatr   r   r   r    r!   r"   version_infor$  __extra__all__rq  rs   r  rH  rI  hasattrrK  rJ  rp  r   r)  r  getpagesizer   r  r  	byteorderr  r
  	AF_PACKETr;   IntEnumr   r:   r&   r'   r(   r)   r>   globalsr  __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_PARKEDr1  r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r  r\   rh   rr   rx   r  ry   r}   r  r   r   r   r   r   r   r   r   	Exception	print_excr   r   resourceImportErrorr   CDLLr   rP  dirr   r  r  r   r%  r1  rA  rH  rK  r`  net_if_addrsrd  rf  r  r  r  r  
disk_usager  r  r.  r_  rc  r~  r  r  r  r  r  r  r  rB   rC   rD   <module>rl     s
  
 % $                  				 				   



      # # # # # # " " " " " "             # # # # # # ) ) ) ) ) ) $ $ $ $ $ $ $ $ $ $ $ $ ' ' ' ' ' ' ! ! ! ! ! ! " " " " " " " " " " " "             $ $ $ $ $ $ " " " " " "       + + + + + +                   ( ( ( ( ( ( ' ' ' ' ' ' " " " " " " " " " " " "       & & & & & & $ $ $ $ $ $ ' ' ' ' ' '             v KKKKD	6 	6 	6" . GNN+ibikk9::	wt%677 74!899 688 bj&&!:!##	 'BB4 )   $GG DL"+SS1A-B-B!CE EM#G  -OO    T\    GIIZ+,,, 
			 		"				$								!						 " 
"





 

 

 



!





 * 	
 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I;

;(:;;CcJJIIIK  8        8 8 8MMM6;tt,,,DwtY 8	8 	8 	8 	88<  HFFCCIIFFFH H H1 1 1hwB wB wBt2@ 2@ 2@t     (  :' ' 'T= = =*   7>>;<< 'N
=>>'N   BN N N &	 	 	 	 	I 	 	 	k k k k k k k k\ {}}' ' ' '
" " "J  8  
\ \ \ \~G G G G G G G GT% % % %Zn n nb  @Y> Y> Y>B  $3 3 3&M M M
! ! !@  ,  *xD xD xD xD xDf xD xD xD xD xDs$   =M	 	+M76M7=N +N21N2